Apache 2.4 からアクセス制御の記述方法が変わったのでメモ。
Module mod_authz_core / Require Directive
公式見るのが一番確か。
ざっくりこんな感じ。
ディレクティブ | 内容 |
<RequireAll> ... </RequireAll> | ディレクティブ内の全ての条件に該当すれば許可する(拒否判定のみの条件は使えない) |
<RequireAny> ... </RequireAny> | ディレクティブ内の条件のいずれかに該当すれば許可する(省略時のデフォルト) |
<RequireNone> ... </RequireNone> | ディレクティブ内の条件のいずれかに該当すれば拒否する |
制御 Syntax: Require [not] entity-name [entity-name] ... | 内容 |
Require all granted | 全てアクセス許可 |
Require all denied | 全てアクセス拒否 |
Require env env-var [env-var] ... | 指定された環境変数のいずれかに該当した場合、アクセスが許可 |
Require method http-method [http-method] ... | 指定されたHTTPメソッドに該当した場合、アクセス許可 |
Require expr expression | https://httpd.apache.org/docs/2.4/expr.html |
Require user userid [userid] ... | 指定されたユーザに該当した場合、アクセス許可 |
Require group group-name [group-name] ... | 指定されたグループに該当した場合、アクセス許可 |
Require valid-user | 認証ユーザをアクセス許可 |
Require ip 10 172.20 192.168.2 | 指定されたIPアドレスに該当した場合、アクセス許可 |
Example
画像の直リンク禁止
2.2
# Referer Deny SetEnvIf Referer "http://www.eastforest.jp/esthome" authoritative_site <FilesMatch "\.(gif|jpg|jpeg|png)$"> Order deny,allow Deny from all Allow from env=authoritative_site </FilesMatch>
2.4
# Referer Deny <FilesMatch "\.(gif|jpg|jpeg|png)$"> SetEnvIf Referer "http://www.eastforest.jp/esthome" authoritative_site <RequireAny> Require env authoritative_site <RequireAny> </FilesMatch>
2.4(省略形)
# Referer Deny <FilesMatch "\.(gif|jpg|jpeg|png)$"> SetEnvIf Referer "http://www.eastforest.jp/esthome" authoritative_site Require env authoritative_site </FilesMatch>
IP制限
<Directory "/var/www/html"> <RequireAll> Require all granted Require not ip 10.xxx.xxx.xxx Require not ip 172.xx.xxx.xxx Require not ip 192.xx.xxx.xxx </RequireAll> </Directory>
上記の設定を"/usr/local/httpd/conf.d/"配下に設定ファイルを置いて、httpd.confの"include conf.d/*.conf"を有効にしてうまく行っていたが、バーチャルホストを有効にしたところうまく制御できなくなった。バーチャルホストを有効にするとhttpd-vhost.confの設定が優先されるためだと思うが…
ちなみに上記の設定を直接httpd-vhost.confの対象ディレクティブに記述するとちゃんと制御できます。あまりIP羅列をしたくない場合はfirewalldで制御した方がいいかも。
User-Agent 拒否
2.2
SetEnvIf User-Agent "ZmEu" deny_agent SetEnvIf User-Agent "Morfeus Fucking Scanner" deny_agent <Directory "/var/www/html"> Order deny,allow deny from env=deny_agent </Directory>
2.4
<Directory "/var/www/html"> SetEnvIf User-Agent "ZmEu" deny_agent SetEnvIf User-Agent "Morfeus Fucking Scanner" deny_agent <RequireAll> Require all granted Require not env deny_agent </RequireAll> </Directory>
さらにSetEnvlfは省略できる
<Directory "/var/www/html"> Require expr %{HTTP_USER_AGENT} !~ /ZmEu/ Require expr %{HTTP_USER_AGENT} !~ /"Morfeus Fucking Scanner"/ </Directory>
WordPress管理画面のアクセス制限
<Files "wp-login.php"> <RequireAny> Require ip xxx.xxx.xxx.xxx/xx </RequireAny> </Files> <Files "wp-config.php"> <RequireAny> Require all denied </RequireAny> </Files> <Directory "/var/www/html/esthome/wp-admin"> <RequireAny> Require ip xxx.xxx.xxx.xxx/xx </RequireAny> </Directory>
RequireAnyディレクティブはデフォルト設定なので省略できます。
<Files "wp-login.php"> Require ip xxx.xxx.xxx.xxx/xx </Files> <Files "wp-config.php"> Require all denied </Files> <Directory "/var/www/html/esthome/wp-admin"> Require ip xxx.xxx.xxx.xxx/xx </Directory>
参考
http://www.orangetakam.com/blog/archives/122
http://www.nofuture.tv/diary/20130813.html
http://ya.maya.st/d/201202c.html#d20120226