Apache 2.4 アクセス制御

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