はじめに
サーバのOSのバージョンアップと共に HTTPサーバApacheのバージョンが2.2から2.4に更新された時の話です。
なにが起きたのか
Apacheのバージョンアップによりアクセス制限の設定方法が変わったのは認識していたので、バージョンアップ後以下のように、「order/deny/allow」 を 「Requireディレクティブ」 に記述変更しました。
<Directory /var/www/html>
order deny,allow # 変更点
deny from all # 変更点
allow from 192.168.10. # 変更点
AuthType Basic
AuthName RegisterName
AuthUserFile /var/www/keys/basic.keys
Require valid-user
</Directory>
<Directory /var/www/html>
Require ip 192.168.10. # 変更点
AuthType Basic
AuthName RegisterName
AuthUserFile /var/www/keys/basic.keys
Require valid-user
</Directory>
しかし、指定ネットワークからのアクセスでBASIC認証が適用されなくなり、該当ページに指定ネットワークのすべてのユーザがアクセス可能な状況になってしまっていました。(セキュリティの機密性の侵害)
(指定ネットワーク外から許可ユーザのアクセスも可能な状況だった)
なぜ起きたのか
Apache2.2では、IP制限とBASIC認証の設定記述は別記述で、無関係と思っていました。(実際は、デフォルトで 「Satisfy All = AND条件」 の適用)
しかし Apache2.4では両方ともRequireディレクティブでの記述となっており、複数のRequireディレクティブは、デフォルトで 「RequireAny = OR条件」 の適用となってました。
そのため、単純な書き換えだけでは「IP制限 AND BASIC認証」ではなく「IP制限 OR BASIC認証」となってしまっており、どちらかの条件しか適用されてなかったのでした。
修正内容
下記のように「IP制限 AND BASIC認証」となるようにRequireAllディレクティブを追加
<Directory /var/www/html>
<RequireAll> # 変更点
Require ip 192.168.10.
AuthType Basic
AuthName RegisterName
AuthUserFile /var/www/keys/basic.keys
Require valid-user
</RequireAll> # 変更点
</Directory>
なぜおきてしまったのか
- Apache 2.2で、IP制限とBASIC認証の設定記述は関係なかったから関係ないだろう
- 併記の場合 ANDだろう
との 「思い込み」 と
- OSのバージョンアップだけでアプリケーションの変更は行わなかったこと
- BASIC認証を行わない他の箇所のorder/deny/allowの書き換えでは問題なかったこと
からの 「テスト不足」 だったのだと考えています。
次起こさないために
設定ファイルを書き換えた内容については、
- 影響範囲を踏まえたテスト項目の作成
- 事前の十分なテスト
を実施することが必要と考えています。
最後に
サーバの更新(メンテナンス)時間が業務時間外であり、幸いなことに、メンテナンス終了後の次の業務開始直後に気づいたので、ログを確認し、大きなインシデントにならなかったのが幸いでした。