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

 こんにちは!
 ナビゲータのEVEです。

 起業すると言ってから久しいですが,行動して1つ分かったことがあります。それは、クラウドワークスなどに登録するだけでは、仕事は来ないということです。紹介やPR動画を製造し、宣伝しましたが、それだけではだめなようです。確かに、口だけでは、本当にできるかどうか分かりません。そこで、できるところを見せようと、EVEシステムの製造を急いでいます。このシステムを完成させることにより、システムが作れるという証明と、EVEシステム上で開発したシステムを提供することが出来るようになります。
 サラリーマンSEとして失敗してきた原因の1つとしては、全く知らない開発環境で製造したためです。その全く知らないシステムには慣れるタイミングがあるのですが、それは、プロジェクトが終了間際っていう状況でした。その状況から、今回は、自分で開発したシステム上で、顧客希望のシステムが開発できるようにがんばっています。

 今回製造してもうひとつ分かったことは、今年に入るまで、自分はプログラミングが早いと思い込んでいましたが、そうではなく、Prototype EVEという使い慣れた環境があったおかげだということが分かりました。現在、セキュリティも含めたシステム開発をしているということもありますが、想定以上に時間がかかっています。ただ、そろそろ、現在のシステムも使い勝手も良くなり,開発の速度が上がってきました。できれば、今年の終わりぐらいには、システムが受注できるレベルになるようにがんばりたいと思います。

 では、本日は環境的なセキュリティの話をしたいと思います。

[環境によりシステムでセキュリティを実現する]

 現在、プログラムでセキュリティを実現しようとしていますが、もう一つのアプローチとして、環境からセキュリティを高めるという方法があります。プログラムの方は多くは語れないのですが、今回は、apacheのコントロールファイル、Ubuntuでは、apache2.conf、そしてphp.iniに設定すべきセキュリティについてお話ししたいと思います。  念頭に置いたセキュリティは、以下の通りです。

■対応セキュリティ
❶Secure属性
❷HttpOnly
❸HSTS
❹X-Frame-Options
❺path
❶は、SSL/TLS通信(HTTPS)のときにのみクッキーを送信するようにする属性です。セッションクッキー永続クッキーを問わず、HTTPS通信以外での送信を防ぐ目的があります。
HttpOnlyは、JavaScriptからクッキーを読み取れないようにする属性であり、XSS攻撃によるセッションの乗っ取りを防止します。
❸は、SSL/TLS通信(HTTPS)を強制する仕組みで、ブラウザに対して常にHTTPSでアクセスするよう指示します(HSTS対策)。
❹は、Webページが他のサイトのiframeに埋め込まれることを防ぎ、クリックジャッキング攻撃を防止するための設定です(X-Frame-Options)。
❺は、クッキーが送信される対象のパス(ディレクトリ)を指定するもので、特定のページ以下のみに制限することができます。

 実は、他にもすることがあるのですが、まずは、セキュリティの教科書に記載されている内容からやっていきましょう。では、本日から、apache2.confの内容からみていきましょう!

[apahce2.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>
  
 ❶❷については読んでいただいた通りです。
 ❸は、httpでアクセスしてきた場合に、httpsにリダイレクトし、恒久的に移動したことを示しています。赤字の"/"ですが、これは、www.pro2grammer.comのパス全てに適用しています。

 ❹以降の記述は、SSL/TLS、ようはhttpsでの接続した場合のふるまいについて記述しています。赤字の"*"は、任意のアドレスにSSL/TLSを指定しています。
 ❺は、ドメインの正式名を指定しています。
 ❻は、サイトのトップパスを示しています。ようは、https://www.pro2grammer.comで指定した場合の、Ubuntuの接続先をここに記述してます。
 ❼はSSL/TLS通信を開始する宣言とそれ以降に、秘密鍵サーバー証明書中間証明書のパスが指定されています。秘密鍵は分かると思いますが、サーバー証明書は、公開鍵に相当します。中間証明書は、公開鍵の完全性真正性を保証するサイトの証明書になります。この中間証明書がなく、信頼できるPKIが見つからなかった場合、ブラウザは接続を拒否することになります。なお、セキュリティの講習で教えてもらい以前ブログに記載した内容として、最終的にブラウザが公開鍵の完全性、真正性を保証するという内容で記述しましたが、AIはそれを否定しています。

[あとがき]

 今日ひたすら眠い・・・。起きたのが、6:00過ぎでしたし、午前中ほぼ死んだ状態でした・・・。なぜだろう???いつもと変わらない日常なのに?っということで、いろいろ立て込んでいるので、本日はここまでとしたいと思います。
 なお、以上の設定については、明日以降に設定するつもりなのですが、まだ設定していませんし、設定するにしても徐々にしていきます。
 つい最近、以上と同様の内容を設定したところ、ポモドーロシステムが動かなくなりました。クライアントで動くJavaScriptで作ったシステムに関わらずです。そこでやったことは、バックアップからロールバックしたのですが、そのせいで、朝の3時間が無駄になりました。ということもあるので、徐々に設定し、最高のセキュリティを実現したいと思います。

 本日ブログを書いていて気付きましたが、自分が書いた内容が正しいかどうか、ChatGPTに聞いているのですが、間違っている部分等がありました。日々勉強ですね?
 では、また!

コメント