Apacheを設計する際に気にすべきセキュリティや性能の設計観点を備忘録的にメモっておきます
セキュリティ
- 不要な情報への参照を禁止する
- ディレクトリリスティングの禁止
- Deny/Allowを使用したアクセス可能先の管理
- シンボリックリンクの制限
- ユーザディレクトリからのコンテンツ提供の禁止
- 不要コンテンツの削除(デフォルトコンテンツ)
- 攻撃&情報収集を防ぐ
- HTTPレスポンスヘッダ―の不要な情報削除(IPアドレス、バージョンなど)
- Traceメソッドの禁止(不要なメソッドのブロック)
- 起動ユーザを一般ユーザへ(ただしポート番号をウェルノウンポートにできない)
- SSI(Server Side Include)の使用禁止(任意コードの実行対策)
- 不要モジュールの削除(脆弱性の範囲を狭める)
mod_info
やWebDAV
などセキュリティリスクの上がるモジュールの利用禁止- リクエストボディサイズ制限(DDoS対策)
- タイムアウト / KeepAlive (DDoS対策)
- ただしタイムアウトは皇族のアプリケーションの処理時間を考慮すること
- 管理ポートへのアクセス制限 / Basic認証(やその他の認証)
性能
- 起動方法 (MPM)
- prefork: 1プロセス=1スレッド=1リクエスト(プロセス数がリクエスト数の限界)
- worker: 1プロセス=複数スレッド=複数リクエスト(スレッド数がリクエスト数の限界/moduleがスレッドセーフの必要あり)
- event: workerと同じだが、プロセス不足のときに新規プロセスを起動する/古いプロセスはTCPコネクション節約のために切断する (プロセス数がリクエスト数の限界)
- キャッシュの利用 (プロキシとしての利用の場合)
- ただしキャッシュされたコンテンツはアクセス制御を無視して応答を返す場合があるので注意
- キャッシュ汚染
- アクセスログの名前解決をさせない (都度名前解決がされる)
- 暗号化(SSL)はHTTPサーバより前で終わらせる
- 新規接続数(接続バックログ)のチューニング (tcp_max_syn_backlogと関連)