IPアドレス制限を設定したhtaccessファイルを設置しているのに、VPNを繋がずとも閲覧できてしまう不具合が発生していた。大きな範囲から検証していく。
(リファラ制限も記述に含んでいるが今回検証範囲ではないので説明は割愛)
SetEnvIf Referer "^http[s]*://~~~~~~~~" chk_url
order deny,allow
deny from all
allow from env=chk_url
allow from XXX.XXX.XXX.XXX
###サーバーレベルのチェック
- 対象サーバーがApacheである
- 設定ファイル(httpd.conf)でhtaccessの設定を許可している
- パーミッションが604あるいは644などサーバーで推奨された設定となっている
☞ 問題なし。設定ファイルは発見できなかったが親ディレクトリに既存のhtaccessが設置しており、問題なく動いている。
子ディレクトリに対して追加の設定がされていれば別だが、考えにくい。
####ファイルレベルのチェック
- 名前が「.htaccess」、前後にスペースが含まれていない
- 文字コードがUTF-8,改行コードLF(厳密にはUTF-8である必要はないが念のため)
- 内容に全角が含まれていない
- 最後に空行がある
☞ サーバーにアップされているファイルを確認した。問題なし。
####記述レベルのチェック
- 検証用に簡易なリダイレクト設定のhtaccessファイルに差替え、ファイル自体の挙動を確認
RewriteEngine on
RedirectMatch 301 .* http://example.com/
☞ 問題なく動くので、htaccessの記述に問題がある可能性が出てきた。
####念のためのチェック
- ブラウザのキャッシュの削除とハードの再読み込み
- 大文字と小文字
- allow/denyの記述変更
- 記述を大枠でコメントアウトして挙動を確認
- 親ディレクトリのhtaccessの影響を受けない別ディレクトリで挙動を確認
☞ 意味なし。
###何??
Apacheのバージョン2.4以降だとAllowディレクティブの記述が効かないからでした
社内サーバーも同じく2.4以降だったが、サーバーのモジュール設定で、2.4でもAllow系が使えるようになっていることもあるらしい。そのため、サーバーによっては無効な記述になることに気づかなかった……
Allowディレクティブの記述はdenyとallowがややこしかったが、Requireディレクティブではより明確な記法に統一されている。詳しくはリンク先参照。
SetEnvIf Referer "^http[s]*://~~~~~~" chk_url
<RequireAny>
Require all denied
Require ip XXX.XXX.XXX.XXX
Require env chk_url
</RequireAny>
学びを得た……
Apacheのバージョン違いで効かない記述があることもだが、
「アクセス制限」で検索してもAllow系の記述がよく出てくるので作成段階で気づかなかったことや、
Apacheの勉強用に購入していた書籍も古すぎて2.2と2.4のバージョンの違いについて載っていなかった
というのも教訓になった。ヨボ