こんにちは、さち です。
先日、サーバーのセキュリティを高めるため、「ファイル」「ディレクトリ」へのアクセス制限を設定していました。
設定は「.htaccess」を使ってするのですが、結構複雑です……。次に設定を触る頃には忘れてしまっていそうなので、備忘録としてこの記事を残しておきます。
まえおき
「.htaccess」について
アクセス制限の指定には「.htaccess」を使います。
「.htaccess」はサーバーの色々な動作を設定できるファイルです。基本的な使い方は、以前こちらの記事で書いたので、よかったら併せて読んでみて下さい。
今回は、この「.htaccess」が持つ機能の「アクセス制限」ついて、詳しく見ていきます。
記述形式の違い
アクセス制限の記述には、「Apache 2.4以降」の形式と「Apache 2.2以前」の形式、2種類があります。
「2.4以降」は「2.2以前」の記述形式に対応していません。
ただし、モジュール(mod_access_compat)が組み込まれていれば、「2.4以降」でも「2.2以前」の記述形式を使えます。
「2.2以前」の時代に作られた「.htaccess」が効かなくなると、セキュリティ的に大変なことになるので、多くのレンタルサーバーでは「2.2以前」の記述形式も引き続き使えるようになっています。
しかし、「2.2以前」の記述形式がいつまで使えるかは不明なので、「2.4以降」に対応しているサーバーであれば、なるべく「2.4以降」の記述形式で書いた方が良いです。
サンプルコード
最初にアクセス制限のサンプルコードを載せます。
はじめて見るとよく分からないと思いますが、雰囲気だけ分かってもらえれば十分です。書き方については後で解説します。
下記の2種類のコードはどちらも、『IPアドレス が「192.0.2.1」「203.0.113.1」以外は、「.log」「.ini」ファイルへのアクセスを拒否』する記述です。
Apache 2.4以降
<FilesMatch "\.(log|ini)$"> <RequireAll> Require all denied Require ip 192.0.2.1 Require ip 203.0.113.1 </RequireAll> </FilesMatch>
Apache 2.2以前
<FilesMatch "\.(log|ini)$"> Order Deny, Allow Deny from all Allow from 192.0.2.1 Allow from 203.0.113.1 </FilesMatch>
【書き方1】 ファイル指定の記述
まずは、アクセスを制限する「ファイル」を指定する方法について書いていきます。
記述方法は、「Apache 2.4以降」と「Apache 2.2以前」どちらも同じです。
ファイル名をそのまま書く
指定するファイルの名前をそのまま書いて、アクセスを制限します。一番わかりやすいです。
<Files "ファイル名"> ここにアクセス制限の条件を書く </Files> # sample.html へのアクセスを拒否 <Files "sample.html"> Require all denied </Files>
HTML の「タグ」のような <Files>
を使います。
この <Files>
のようにサーバーに指示を与える記述を「ディレクティブ」と呼びます。
ワイルドカードを使う
ファイルの指定に、?
や *
の「ワイルドカード」を使うこともできます。
?
は任意の1文字、*
は0文字以上の文字列を意味です。
# .htaccess と .htpasswd へのアクセスを拒否 <Files ".ht*"> Require all denied </Files>
正規表現を使う
ファイルの指定いに、「正規表現」を使うこともできます。複数のファイルを指定したいときに便利です。
<FilesMatch "ファイルを指定する正規表現"> ここにアクセス制限の条件を書く </FilesMatch> # 拡張子が .log と .ini のファイルへのアクセスを拒否 <FilesMatch "\.(log|ini)$"> Require all denied </FilesMatch> # <Files> の場合は「~」を付けると正規表現になる <Files ~ "\.(log|ini)$"> Require all denied </Files>
<Files>
ディレクティブでも「正規表現」は使えますが、<FilesMatch>
ディレクティブを使うことが推奨されています。
「正規表現」の記述ルールについてはこちらの記事をどうぞ。
ディレクトリを指定する
下記のように書いた「.htaccess」をディレクトリに置くことで、それ以下の階層にアクセスできなくなります。
# 配置したディレクトリへのアクセスを拒否 Deny from all
ちなみに、前述の <Files>
のディレクトリ版のような <Directory>
<Location>
ディレクティブは、「.htaccess」では使えません。(「httpd.conf」では使えるが、多くのレンタルサーバーは未対応)
【書き方2】 アクセス制限する記述
アクセス制限を指定する記述方法は、「Apache 2.4以降」と「Apache 2.2以前」で違います。
多くのレンタルサーバーは、どちらも対応していると思いますが、ちゃんと動作するか必ず確かめて下さい。
「すべて」を許可/拒否
Apache 2.4以降
# すべてのアクセスを許可 Require all granted # すべてのアクセスを拒否 Require all denied # 使用例 <Files "sample.html"> Require all denied </Files>
Apache 2.2以前
# すべてのアクセスを許可 Allow from all # すべてのアクセスを拒否 Deny from all # 使用例 <Files "sample.html"> Deny from all </Files>
特定の「IPアドレス」を許可/拒否
下記の例にある、IPアドレス 末尾の /24
や /64
は「プレフィックス」と呼ばれるもので、変化しない IPアドレス の範囲(2進数表記時の上位桁数)をあらわします。(サブネットマスクのようなもの)
一般的なネットのプロバイダー(ISP)は基本的に「動的IPアドレス」で、別途固定契約をしていない限り IPアドレス が変わります。注意して下さい。
Apache 2.4以降
# 203.0.113.1 からのアクセスを許可 Require ip 203.0.113.1 # 192.0.2.1 からのアクセスを拒否 Require not ip 192.0.2.1 # 192.0.2.0~192.0.2.255 からのアクセスを拒否 Require not ip 192.0.2.0/24 # 2001:0db8:0:0:0:0:0:0~2001:0db8:0:0:ffff:ffff:ffff:ffff からのアクセスを許可 Require ip 2001:0db8:0:0::/64 # 使用例 <Files "sample.html"> Require not ip 192.0.2.0/24 </Files>
Apache 2.2以前
# 203.0.113.1 からのアクセスを許可 Allow from 203.0.113.1 # 192.0.2.1 からのアクセスを拒否 Deny from 192.0.2.1 # 192.0.2.0~192.0.2.255 からのアクセスを拒否 Deny from 192.0.2.0/24 # 2001:0db8:0:0:0:0:0:0~2001:0db8:0:0:ffff:ffff:ffff:ffff からのアクセスを許可 Allow from 2001:0db8:0:0::/64 # 使用例 <Files "sample.html"> Deny from 192.0.2.0/24 </Files>
特定の「ホスト名」を許可/拒否
Apache 2.4以降
# ホスト名 example.com からのアクセスを許可 Require host example.com # ホスト名 example.com からのアクセスを拒否 Require not host example.com # 使用例 <Files "sample.html"> Require not host example.com </Files>
Apache 2.2以前
# ホスト名 example.com からのアクセスを許可 Allow from example.com # ホスト名 example.com からのアクセスを拒否 Deny from example.com # 使用例 <Files "sample.html"> Deny from example.com </Files>
条件を組み合わせて使う
Apache 2.4以降
# [OR] いずれかの条件に当てはまれば許可 # (記述を省略した場合はこれになる) <RequireAny> ここにアクセス制限の条件を書く </RequireAny> # [AND] すべての条件に当てはまれば許可 <RequireAll> ここにアクセス制限の条件を書く </RequireAll> # [NOR] いずれかの条件に当てはまれば拒否 # (<RequireAll> の中でしか使えない) <RequireAll> ここにアクセス制限の条件を書く <RequireNone> ここにアクセス制限の条件を書く </RequireNone> </RequireAll> #【使用例】203.0.113.1 からのアクセスだけを許可 <Files "sample.html"> <RequireAll> Require all denied Require ip 203.0.113.1 </RequireAll> </Files> #【使用例】192.0.2.1 からのアクセスだけを拒否 <Files "sample.html"> <RequireAll> Require all granted Require not ip 192.0.2.1 </RequireAll> </Files>
複雑なことをしなければ、基本的に <RequireAll>
で間に合うと思います。
Apache 2.2以前
# Deny → Allow の順に判定 Order Deny, Allow # Allow → Deny の順に判定 Order Allow, Deny #【使用例】203.0.113.1 からのアクセスだけを許可 <Files "sample.html"> Order Deny, Allow Deny from all Allow from 203.0.113.1 </Files> #【使用例】192.0.2.1 からのアクセスだけを拒否 <Files "sample.html"> Order Allow, Deny Allow from all Deny from 192.0.2.1 </Files>
Order
は、「Allow(許可)」と「Deny(拒否)」の判定(評価)の順番を指定する記述ですが、なかなか難解なので、基本的に後に書いた方がデフォルトの動作だと思えばOKです。
Order Deny, Allow
は、これだけを記述した場合はデフォルトで「Allow(許可)」になります。つまり、「Deny(拒否)」の条件に当てはまらない限り「Allow(許可)」です。
逆に、Order Allow, Deny
は、これだけを記述した場合はデフォルトで「Deny(拒否)」になります。つまり、「Allow(許可)」の条件に当てはまらない限り「Deny(拒否)」です。
Deny
と Allow
の記述の順番を間違えると、意図とは違う制限になってしまう可能性があるので気をつけて下さい。
実際の使用例
Apache 2.4以降
# 192.0.2.1 と 192.0.2.10 以外は「.log」「.ini」ファイルへのアクセスを拒否 <FilesMatch "\.(log|ini)$"> <RequireAll> Require all denied Require ip 192.0.2.1 Require ip 192.0.2.10 </RequireAll> </FilesMatch> # 192.0.2.0~192.0.2.255 は sample.html へのアクセスを拒否 <Files "sample.html"> <RequireAll> Require all granted Require not ip 192.0.2.0/24 </RequireAll> </Files>
Apache 2.2以前
# 192.0.2.1 と 192.0.2.10 以外は「.log」「.ini」ファイルへのアクセスを拒否 <FilesMatch "\.(log|ini)$"> Order Deny, Allow Deny from all Allow from 192.0.2.1 Allow from 192.0.2.10 </FilesMatch> # 192.0.2.0~192.0.2.255 は sample.html へのアクセスを拒否 <Files "sample.html"> Order Allow, Deny Allow from all Deny from 192.0.2.0/24 </Files>
コメント