うまいぼうぶろぐ

linuxとhttpdとperlのメモ

proftpdのmod_ifsessionでユーザごとにIP制限 (再挑戦)

以前試したときは複数のIfUserを記述するとうまく動作しなかったとメモったんだけど、記述方法を変えたら正常に動いた。どうもIfUser内のallow fromの書き方が悪かったぽい。bugなんか仕様なんかわかんないけど。

IfUser内のLIMITの設定

複数のアドレスを許可するときに、通常LIMIT内にはコンマで複数書くか、allow from を複数行かくか、どちらでも良い。が、IfUser内で設定する場合はallow from を複数行書くと正常に動作しなかった。以前うまくいかなかったのもこれが原因。

ここにも同じようなtopicが挙がってた。

OKな書き方
<IfUser hoge>
  <Limit LOGIN>
    Order allow,deny
    allow from 192.168.0.0/24, 10.0.0.0/24
    deny from all
  </Limit LOGIN>
</IfUser>
NGな書き方
<IfUser hoge>
  <Limit LOGIN>
    Order allow,deny
    allow from 192.168.0.0/24
    allow from 10.0.0.0/24
    deny from all
  </Limit LOGIN>
</IfUser>

Classによる設定

Classのfromは複数書いても、コンマで繋げても問題ないようだけど。。。。

<Class internal >
  From 192.168.0.0/24, 127.0.0.1
  From 10.0.0.0/24
</Class>

<IfUser hoge>
  <LIMIT LOGIN>
    AllowClass intenral
    DenyALl
  </LIMIT>
</IfUser>

別の問題が発生した。

ClassのFrom

複数のClassに同一のnetwork設定を書いてある場合、最初に書いたほうしか有効にならない?この設定で試したら、fugaユーザは10.0.0.0/24からは接続できずに、172.16.0.0/24のみになった。

<Class hogehoge >
  From 10.0.0.0/24
  From 192.168.0.0/24
</Class>

<Class fugafuga >
  From 10.0.0.0/24  ## これがClass hogehogeと重複していて無効になった?
  From 172.16.0.0/24
</Class>

<IfUser hoge>
  <Limit LOGIN>
    AllowClass hogehoge
    DenyALl
  </Limit>
</IfUser>

<IfUser fuga >
  <Limit LOGIN>
    AllowClass fugafuga
    DenyALl
  </Limit>
</IfUser>

まとめ

  • LIMIT自体はallow fromはコンマで書いても複数行書いても問題ない
  • IfUser内のLIMITで許可する場合, allow fromは1行で設定する必要あり
    • 複数のnetworkから許可する場合はコンマで接続して書く
    • allow fromを複数行で設定するとうまくいかない
  • IfUser内でClassを使用する場合は注意が必要
    • 複数のClassに重複するFrom設定が存在する場合、そのFrom設定は最初のClassでしか有効にならない

というわけで、userやnetworkが増えると見た目が汚くなりそうだけど、allow fromで設定したほうがよさげ。