Apache2の設定ファイルについて
はじめにApache2の設定ファイルについて理解しておきます。
WEB検索にてApacheのセキュリティ対策と検索するとApache導入後に自動生成される「/etc/apache2/apache2.conf」に定義してと書いてあります。
私のようにSSL化に伴い、設定ファイルを作成した場合は作成したファイルにセキュリティ対策を定義します。
/etc/apache2/sites-available/ドメイン名.conf
「/etc/apache2/apache2.conf」と「/etc/apache2/sites-available/ドメイン名.conf」の違いとしては、
- 全般的な設定は/etc/apache2/apache2.confに定義してね
- サイトごとの設定をしたい場合は作成した設定ファイルに定義してね
って感じになります。
基本的に1サーバー1ドメインって形になるので、自動生成ファイルに記述していくことになるかと思います。
エラーが出る場合
これから紹介する対策を設定ファイルに定義した際にエラーが出る場合は下記のコマンドを実行してくださーい。
Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration
エラー内容
Apache内でHTTPヘッダーの操作が許可されていませんよー。という内容
対策
下記コマンドでHTTPヘッダの有効化。
sudo a2enmod headers
クリックジャギング
クリックジャギングとは
悪意のあるウェブページや広告をユーザーが踏むことで、意図しない操作を実行してしまう攻撃です。
具体的にはiframeタグやリンクなどを挿入し、既存のコンテンツの上に透過した悪意のあるコンテンツを重ねることで悪意のあるコードを実行させてしまう手法です。
ユーザーからすると通常のボタンを押しただけなのに個人情報が盗まれてしまうという事象が発生します。
対策
HTTPヘッダーによる対策を実施します。
X-Frame-Options とはブラウザが特定のタグを許可するかどうかの設定です。
- DENY:どのサイトからも埋め込まれないようにする。
- SAMEORIGIN:同じオリジン(同じドメイン・プロトコル・ポート番号)のサイトからのみ埋め込まれるようにする。
- ALLOW-FROM:特定のURLからのみ埋め込まれるようにする。
※今は非推奨らしい
個人的には複数のサーバー(ロードバランサー)等で運用することが多いと思うので、SAMEORIGINを設定するケースが多いと思いますー。
Apacheの場合は以下のファイルに追記します。
X-Frame-Options: DENY
HTMLページに設定する場合は以下のように設定します。
※WEBサーバーに設定するのが推奨とのこと。
<meta http-equiv="X-FRAME-OPTIONS" content="DENY" />
XSS
XSSとは
悪意のあるスクリプトを注入し、ユーザーのブラウザで実行させることで、クッキー情報やセッションIDなどの個人情報を盗んだり、偽のWebページを表示してユーザーの意図しない行為を実施することができます。
具体的にはGETパラーメーターに悪意のあるウェブページのリンクを入れたりすることで実現できます。
考え方
基本的にアプリケーション側で文字列のエスケープ処理やサニタイズ処理を実施します。
Apacheでの対策
XSSフィルター機能を設定します。
XSSフィルター機能とはブラウザの機能であり、ウェブページに含まれるリクエストパラーメーターやHTMLタグなどの入力値を検査し、悪意のあるスクリプトがあれば削除/エスケープするなどの対策を実施します。
Header set X-XSS-Protection "1; mode=block"
CSP
CSPとは
Webページに埋め込まれる外部リソースの取り扱いを制限することを指します。
対策
Header set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; object-src 'none'; frame-ancestors 'none'"
CSPの設定後に以下のエラーが出る方はドメインも含む形で 'unsafe-eval'を設定してください。
ご自身のJSファイルが正規のものと判断させるために必要です。
Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self' 'unsafe-inline'".
ただし、Eval関数は文字列をJSの構文として扱うことが出来るので、推奨されません。
#実行されちゃう
let alert = alert('aiueo');
eval( "alert")
そのため、他にも追加で対策してください。
追加の対策として以下が考えられます。(N重にすることである程度は担保できるはずです。)
- XSSフィルター(サーバー側)
- 入力データの検証(アプリケーション側)
DOS/Ddos
DOS/DDOS
システムに対して大量のリクエストを送ることで正常なリクエストを中止/失敗させサービスを正常に運用させなくする攻撃です。
対策
mod_evasiveというモジュールを使用します。
Linuxのディストリビューションやバージョンによって記載するファイルが異なります。
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 10
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSLogDir "/var/log/mod_evasive"
DOSEmailNotify admin@yourdomain.com
DOSWhitelist 127.0.0.1
</IfModule>
画像の直リンク
直リンクされて困ること
案件によっては、画像やPDFなどに情報を詰め込んだデータを扱う事があると思います。(保険の明細や履歴書など)
そういったデータをバイナリ化してDBへ登録するのではなく、特定ディレクトリに保管する場合に関しては、そのディレクトリに直接アクセスされてしまうと個人情報が公開されてしまいます。
そのための対策ですよん。
対策
リファラを使って直アクセスの対策を実施。
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?ドメイン.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
一応、Apacheならではの.htaccessを使用したアクセス禁止方法もあります。
バージョン情報の非表示
バージョンを表示することで対象のバージョンに合わせた攻撃を実施される/バージョンのセキュリティホールを見抜くなどの脅威があります。
サーバーにてコマンドを打てばバージョンを確認できるので、バージョンは非表示にしましょう。
Apacheのバージョン非表示
ServerTokens Prod
PHPのバージョン非表示
/etc/php/{PHPのバージョン}/apache2/php.iniを編集。
expose_php=off