Hatena::ブログ(Diary)

GFSの興味ごととか このページをアンテナに追加 RSSフィード

February 11(Sat), 2012

[] Apacheでアクセス制限をする

Apacheでアクセス制限をしようと頑張った結果こうなりました.


1. やりたいこと


私がやりたかったのは以下のことです.

ここでのアクセス制限とは,192.168.0.0/24なら自由にアクセスできる,ただしそれ以外の場合はBASIC認証が必要というやつです.

また,/docroot/{foo,bar}は指定した拡張子(ここでは.htmlと.php)のみ外部から参照できます.


2. 勘違いしてたこと


アクセス制限がホスト制限と認証しかないということです.

<Directory>とか<Files>とかはただ単にその2種類の制限を操作するかどうかのif文でしかなかった,というのに気付くのにえらい時間がかかってしまいました.


3. アクセス制限書く

<Directory /docroot>
  Order Deny,Allow
  Deny from All
  Allow from 192.168.0.0/24

  AuthUserFile /path2pass
  AuthName "Nyan"
  AuthType Basic
  require valid-user

  Satisfy Any
</Directory>

4. 拡張子の制限を書く

<Directory /docroot/foo>
  <Files "*">
    Order Deny,Allow
    Deny from All
    Satisfy All
  </Files>
  <Files "">
    Order Deny,Allow
    Allow from All
    Satisfy Any
  </Files>
  <FilesMatch "\.(html|php)$">
    Order Deny,Allow
    Allow from All
    Satisfy Any
  </FilesMatch>
</Directory>

<Files>と<FilesMatch>は同時に適用&上書きされるらしいのでこう書きました.

ちなみに,""はttp://example.com/foo/の様にDirectoryIndexを省略した時用です.


5. モウヒトコエ

ただし上記のままではttp://example.com/fooの様に最後にバックスラッシュが付いていない場合にアクセスできません.

なぜなら<Files "*">にfooとしてマッチしてしまうからです.

そこで,<Files "*">を<Files "^(((([^f]*)*(f+[^o][^f]*)*)*)*(f+[^o][^f]*)*)*$">にしてもいいのですが,よくわからないのでfooを許可します.

  <Files "foo">
    Order Deny,Allow
    Allow from All
    Satisfy Any
  </Files>

6. 最後に

これだとttp://example.com/fooでアクセスできますが,ttp://example.com/foo/fooにもアクセスできてしまいます.

なので,次のやつを書きました.

<Location /foo/foo>
  Order Deny,Allow
  Deny from All
  Satisfy All
</Location>

<Location>は<Files>の後に評価されるので上書きされてアクセスが禁止されます.

これでだいたいうごくとおもいます.

ちゃんと動いていなかったり,もっと上手い方法がある,まちがってる,とか教えていただけるとうれしいです.

mod_rewriteとかでできそう?


あと,私が実際にやった環境ではVirtualHostがからんでたりするのでちょっと違うかもしれないです.


7. 関係ないこと

httpd.confを0から書くというのをやってみたらおもしろかったです.

Apache3.0になるとこの辺をもっときれいに書けるみたい?


参考書:Apache公式サイト

Apacheセキュリティ

Apacheクックブック

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/graighle/20120211/1328976217