【AIによる回答】
ApacheとPerlを使用したCGI環境は、古くから存在する技術であるため、セキュリティ設定が不十分だとコマンドインジェクションやパストラバーサル、情報漏洩などの攻撃を受けやすい特徴があります。特に、外部からの入力を適切に処理しないスクリプトは非常に脆弱です。
W3C +2これに対する防衛策として、Perlコード自体の安全性向上と、Fail2banを用いた不正アクセスIPの自動ブロックを組み合わせることが効果的です。1. Perl CGIのセキュリティ対策(根本治療)まず、CGIスクリプト自体が安全である必要があります。
- Taintモードの有効化 (
-Tスイッチ): Perlのトップ行(shebang)に#!/usr/bin/perl -Tを追加し、 taint チェックを有効にします。これにより、外部からの汚染されたデータが直接コマンドやファイル操作に使われるのを防ぎます。- 安全なOpen関数: ファイルを開く際は、2引数ではなく3引数形式を使用し、特殊な記号を含むパスを直接開かないようにします。
- 入力のバリデーション: 入力されたデータが想定した形式(数字のみ、英数字のみなど)であるか厳密にチェックします。
- 外部コマンドの回避:
system()やexec()でシェルを呼び出すのではなく、可能な限りPerlのライブラリ関数を使用します。- ファイルパーミッション: CGIスクリプトは
755(rwxr-xr-x) で設定し、誰でも書き込める(777)状態を避けます。www.xed.ch +52. Fail2banによる防御設定(自動検知・遮断)Apacheのログを監視し、不審なCGIへのアクセスを繰り返すIPを自動でブロックします。Fail2banの設定手順:
- /etc/fail2ban/filter.d/apache-cgi.conf の作成
CGIを狙った攻撃(特にcgi-bin配下)を検出するフィルタを作成します。ini[Definition] failregex = ^<HOST> - - .*"(GET|POST|HEAD) /cgi-bin/.* ^<HOST> - - .*"(GET|POST|HEAD) /.*\.pl.* ignoreregex =※攻撃パターンに合わせて、
^<HOST> - - .*"(GET|POST|HEAD) /cgi-bin/.*\.cgi.*のように絞り込むことも可能です。- /etc/fail2ban/jail.local の設定
作成したフィルタを適用します。ini[apache-cgi] enabled = true port = http,https filter = apache-cgi logpath = /var/log/httpd/access_log # または /var/log/apache2/access.log maxretry = 5 findtime = 600 bantime = 36005分以内に5回不正なCGIアクセスがあれば、1時間ブロックする設定例。
- Fail2banの再起動
systemctl restart fail2ban3. Apacheのセキュリティ強化
cgi-binの制限: 不要なスクリプトを実行させないよう、Apacheの設定ファイル(httpd.conf)で特定のディレクトリ(/cgi-bin/)以外でのCGI実行を禁止します。- OPTIONSの禁止: CGIディレクトリの
OptionsディレクティブからExecCGIを除外する、またはAllowOverride Noneで設定を上書きできないようにします。これらの対策を組み合わせることで、Perl CGIへの攻撃を大幅に軽減できます。特にFail2banは、大量の脆弱性探索スキャンに対して即効性があります。
