環境によりセキュリティを実現する2 ~apache2.conf編~ [セキュリティ研究室]

 こんにちは!
 ナビゲータのEVEです。
 予定では、先月末に完成予定のログインシステムなのですが、まだ思った品質ではなく、αサイトに公開するにしても問題あるため、延期します。つい先日、Ajaxの本を借りてきたといいましたが、クライアント側製造にかなり苦戦しています。やっと、ここ数日で慣れてきた感じはありますが、もう少し、時間が必要なようです。そんな製造に関する問題点については、来週お話しするとして、本日は、先週の金曜日の続きで、環境によりセキュリティを実現する方法について検討を進めていきたいと思います。

[HTTPレスポンスヘッダーを追加する]

 先週は、apache2.confでセキュリティを実現する設定、項番❼まで解説をしました。本日は、項番❽から話を進めていきます。

【apache2.confの設定】
    # HTTP(ポート80)でのリクエストを処理する仮想ホスト。*は全てのIPアドレスを意味します。
    <VirtualHost *:80>
        # ❶この仮想ホストの正式なホスト名(FQDN)です。
        ServerName www.pro2grammer.com

        # ❷ServerName以外にこのホストが応答する別名(wwwなし)です。
        ServerAlias pro2grammer.com

        # ❸アクセスされたURLを恒久的にHTTPSへリダイレクトします(HTTP 301)。 / は全てのパスが対象です。
        Redirect permanent / https://www.pro2grammer.com/
    </VirtualHost>
    
    # ❹HTTPS設定(SSL設定)
    <VirtualHost *:443>
        # ❺サイトの正式名
        ServerName www.pro2grammer.com

        # ❻ドキュメントルート
        DocumentRoot /var/www/html

        # ❼SSL設定
        # SSL機能を有効にする(HTTPS通信を許可)
        SSLEngine on

        # サーバー証明書(公開鍵)
        SSLCertificateFile /etc/ssl/certs/xxxxxxxxxxxx.pem

        # 秘密鍵
        SSLCertificateKeyFile /etc/ssl/private/xxxxxxxxxxxx.key

        # 中間証明書
        SSLCertificateChainFile /etc/ssl/certs/xxxxxxxxxxxx.crt

        # ❽SSL設定
        <IfModule mod_headers.c>
            # ❾X-Content-Type-Options ヘッダーを追加(MIMEタイプの誤認識を防ぐ)
            Header always set X-Content-Type-Options "nosniff"

            # ❿X-XSS-Protection ヘッダーを追加(XSS攻撃の対策)
            Header always set X-XSS-Protection "1; mode=block"

            # ⓫Content-Security-Policy ヘッダーを追加(コンテンツポリシーを設定)
            Header always set Content-Security-Policy "default-src 'self';"

            # ⓬HSTS(HTTPSを強制->サブドメインには適用外)
            Header always set Strict-Transport-Security "max-age=31536000"

            # ⓭Cookie に Secure + HttpOnly + SameSite=Strict を追加(Set-Cookie ヘッダを編集)
            Header edit Set-Cookie ^(.*)$ $1; HttpOnly; Secure; SameSite=Strict

            # ⓮クリックジャッキング対策(iframe禁止)
            Header always set X-Frame-Options "DENY"
        </IfModule>
    </VirtualHost>

    # ⓯mod_evasive20モジュールをApacheサーバーに読み込む
    LoadModule evasive20_module modules/mod_evasive20.so
 

    # ⓰mod_evasive20を適用
    <IfModule mod_evasive20.c>
        # ⓱最大リクエスト数、秒数、ブロックする時間を設定
        EvRequestThreshold 10

        # ⓲リクエスト数を計算する時間の間隔
        EvRequestInterval 10

        # ⓳攻撃とみなされるリクエストがブロックされる時間の長さ
        EvBlockRequestDuration 300
    </IfModule>
  
 ❽のセクションでは、Apache に mod_headersモジュールが読み込まれている場合に実行される設定です。以下の❾~⓮のHTTPレスポンスヘッダーを追加することで、Webセキュリティを強化します。
 ❾は、MINEタイプの偽装を防ぎます。HTMLファイルに見える悪意のあるJavaScriptの実行を防ぎ、管理サイトで指定している以外のMINEタイプ以外を使用させないようにします。
 ❿では、クロスサイトスクリプティング(XSS)攻撃の検出とブロックをします。最近のブラウザはデフォルトでXSSの攻撃をブロックする作りとなっていますが、古いブラウザへの対応となります。
 ⓫では、許可するコンテンツのソースを制限します。外部からのスクリプトや画像の読み込みを防ぎ、XSS、インジェクション攻撃から守ります。
 ⓬では今後すべての通信をHTTPSで行うように指示します。この設定は、ユーザーがHTTPSで接続後、サーバーからレスポンスを受け取った時点から、1年という指定になっています。この設定以前に、ポート80で接続してきた場合、443にリダイレクトするように設定しておけば、常に、HTTPSで通信するようになります。
 ⓭では、JavaScriptからすべてのクッキーへのアクセスを禁止します。
 ⓮では、<iframe<で、管理サイトを別のサイトで表示することを禁止します。これにより、クリックジャッキングを防止します。

[DDos攻撃からサイトを守る]

 ⓰以降は、DDos攻撃ブルートフォース攻撃などを防止することを目的に設定します。
 ⓰では、⓱以降の機能を有効にするためのモジュールをインポートしています。  ⓱最大リクエスト数を制限しています。以上の記述は、10回以上のリクエストが、次の設定項目(⓲)で指定された時間内にあった場合、攻撃とみなすという設定になっています。
 ⓲は、⓱で解説した通りです。
 ⓳攻撃と判定されたリモートIPを300秒間(5分間)ブロックします。DDos攻撃の場合、1時間ぐらいブロックしたほうがいいかもしれません。

[あとがき]

 以上で、Ubuntuの場合は、apache2.confに設定すべき内容となります。RedHat系なら、httpd.confなのかもしれません。自分の環境をよく調べ、どこに設定するのか検討をしてください。
 なお、今回は、apache2.confに設定することを想定していますが、000-default.confdefault-ssl.confなどにも設定することは可能です。まだ管理サイトに設定しておらず、検討の途中なので、検討の結果次第により、000-default.conf、default-ssl.confに設定したほうがいいという結論になるかもしれません。検討結果については、後日ブログで報告します。  次回は、php.iniで実現するセキュリティについて、レポートしたいと思います。

 では、また!

コメント