WordPressサイトにHTTPセキュリティヘッダーを設定する方法をまとめた備忘録記事です。
管理画面のサイトヘルスに「推奨セキュリティヘッダーがインストール済みではありません」という表示があって少し気になっていたため設定してみました(プラグイン『Really Simple SSL』が出力?)。
HTTPレスポンスヘッダーをセキュリティ目的で利用する”HTTPセキュリティヘッダー”は、適切に設定することで自分のサイトが攻撃に利用されるのを防いだり、訪問者の安全性を高めることができるようです。
設定は.htaccessファイルにコードを少し追加するだけで簡単なため、やっておくのも良いかもしれません。
設定方法について
- Webツール「Security Headers」でサイトの状態を確認
- .htaccessファイルをダウンロード
- .htaccessファイルにレスポンスヘッダー用のコードを追記
- .htaccessファイルをアップロード
- Webツール「Security Headers」でサイトの状態を再確認


端的に言えば、htaccessにコードを追記するだけです 😉
ということでやっていきましょう。
サイトの状態チェック
HTTPセキュリティヘッダーの状態を分析してくれるWebツール『Security Headers』『HTTPヘッダーセキュリティチェッカー』などを使用してチェック!


.htaccessをダウンロード
まずは、FTPクライアントソフトを使って.htaccessをサーバーからダウンロードする。
FTPクライアントソフト
『FileZilla』や『ffftp』などのソフトを利用。
ダウンロードする.htaccessについて
ダウンロードするのは、WordPressがインストールされているルートフォルダ(ルートディレクトリ)にある.htaccessファイル。
「wp-admin」や「wp-content」フォルダと同じ階層の.htaccessファイル。
コードを追記
テキストエディター
Windows10のメモ帳も[BOM無し+LF]に対応したようだけど、使い勝手があまり良くないので他のエディタを使ったほうがいいかも。
簡単なコードを追記(コピペ)するだけので『TeraPad』や『サクラエディタ』あたりが軽くて便利。


追記するコードの候補
Content-Security-Policy
Header always set Content-Security-Policy "upgrade-insecure-requests"
HTTPとHTTPSのコンテンツが混在しているページで、強制的にHTTPSで読み込ませてセキュリティを強化する。


X-Content-Type-Options
Header always set X-Content-Type-Options "nosniff"
ファイル形式を誤認する可能性のあるMIME Sniffingを使わず、Content-Typeで判定することを強制することで、不正なスクリプトの実行を防止する。


X-XSS-Protection
Header always set X-XSS-Protection "1; mode=block"
クロスサイト・スクリプト攻撃(XSS攻撃)を防ぐためのXSS Filter機能。
[”1; mode=block”]で、機能を有効化、攻撃を検知したらブロックする。
Expect-CT
Header always set Expect-CT "max-age=7776000, enforce"
SSL証明書の信頼性・透明性を高める。
Referrer-Policy
Header always set Referrer-Policy: "no-referrer-when-downgrade"
セキュリティ水準が低下する[HTTPS→HTTP]のリファラーの送信をブロックする。
X-Frame-Options
Header always append X-Frame-Options SAMEORIGIN
Webブラウザがサイトをframe、iframe、embed、objectの中に表示する許可設定。同一ドメインのみに限定することでクリックジャッキングを防ぐ。
追記例
- .htaccessの末尾に追
- (一部を除いて)本当はどこでも良いけど分かりやすいため
- .htaccessの最後の行には「改行(空行)」が1行以上必要
- 文字コードは「BOM無し(UTF-8N)」、改行コードは「LF」で保存
上記7項目を全て追加
# Security Headers Header always set Strict-Transport-Security: "max-age=31536000" env=HTTPS Header always set Content-Security-Policy "upgrade-insecure-requests" Header always set X-Content-Type-Options "nosniff" Header always set X-XSS-Protection "1; mode=block" Header always set Expect-CT "max-age=7776000, enforce" Header always set Referrer-Policy: "no-referrer-when-downgrade" Header always append X-Frame-Options SAMEORIGIN # End Security Headers
Content-Security-PolicyとExpect-CTを除外
# Security Headers Header always set Strict-Transport-Security: "max-age=31536000" env=HTTPS Header always set X-Content-Type-Options "nosniff" Header always set X-XSS-Protection "1; mode=block" Header always set Referrer-Policy: "no-referrer-when-downgrade" Header always append X-Frame-Options SAMEORIGIN # End Security Headers
「Content-Security-Policy」は、その名のとおりサイトコンテンツのセキュリティポリシーを指定するもので、設定難易度は高い模様。単に「upgrade-insecure-requests」を指定するだけならリスクは低いと思うが、万一が怖いので除外した。
「Expect-CT」は、SSL証明書関連の設定。こちらも設定に問題が発生した場合のリスクが高そうなので外した。


上記2項目は、設定の複雑さと情報量の多さでいまいち把握できてないので怖いです。一般的な設定で自分のサイトが問題なく動くのかという相性問題もあるので無難ぽいところだけやってみました。
サイトが真っ白になって何も表示されなくなるのがトラウマになってる!
.htaccessファイルをアップロード
.htaccessファイルの編集が終わったらサーバーの元の場所にアップロード。
上記した編集時の注意点やアップロードする場所の間違いに注意したい。
サイトの状態を再確認
.htaccessファイルをアップロードしたら分析サイトでHTTPセキュリティヘッダーの設定が適用されているか再確認!
『Security Headers』『HTTPヘッダーセキュリティチェッカー』で確認したところ、設定は正常に反映されているようだった。
ちなみに、設定を変更・無効したい場合は、.htaccessファイルに書き込んだ内容を修正・削除すればいい。


設定おつかれさまでした!
なんか微妙なB評価に留まっているので、「Content-Security-Policy」と「Expect-CT」もそのうちやってみようかと思います。
参考サイト
コード関連






情報関連


プラグインで代替
HTTPヘッダーの設定が可能なプラグインもあるようです。.htaccessファイルの編集が面倒な場合はプラグイン利用も選択肢になると思います。

