当サイトには広告が含まれます
スポンサーリンク
WordPress

WordPressサイトにHTTPセキュリティヘッダーを設定する方法

WordPressサイトにHTTPセキュリティヘッダーを設定する方法をまとめた備忘録記事です。

管理画面のサイトヘルスに「推奨セキュリティヘッダーがインストール済みではありません」という表示があって少し気になっていたため設定してみました(プラグイン『Really Simple SSL』が出力しているようでした)。

HTTPレスポンスヘッダーをセキュリティ目的で利用する”HTTPセキュリティヘッダー”は、適切に設定することで自分のサイトが攻撃に利用されるのを防いだり、訪問者の安全性を高めることができるようです。

設定は.htaccessファイルにコードを少し追加するだけで簡単なため、やっておくのも良いかもしれません。

【最終更新:2022年11月】
「HTTP Strict Transport Security (HSTS)」、「Permissions Policy」などについて追記・更新しました。

スポンサーリンク
スポンサーリンク

設定方法について

【設定の流れ】
  1. Webツール「Security Headers」でサイトの状態を確認
  2. .htaccessファイルをダウンロード(ついでにバックアップ)
  3. .htaccessファイルにレスポンスヘッダー用のコードを追記
  4. .htaccessファイルをアップロード
  5. Webツール「Security Headers」でサイトの状態を再確認

端的に言えば、.htaccessにコードを追記するだけです。 ということでやっていきましょう。

サイトの状態チェック

まずは、HTTPセキュリティヘッダーの状態を分析してくれるWebツール『Security Headers』『HTTPヘッダーセキュリティチェッカー』などを使用して、サイトの状態をチェック!

Just a moment...
HTTPヘッダーセキュリティチェッカー:HTTPレスポンスヘッダからセキュリティ状況を確認 | ラッコツールズ🔧
ウェブサイトが、セキュリティ対策に有効的な下記の項目を含む推奨HTTPレスポンス...
securityheaders.comでF判定

何も設定していないと低評価のF判定

.htaccessをダウンロード

まずは、FTPクライアントソフトを使って.htaccessをサーバーからダウンロードする。

不測の事態に備えて元の.htaccessのバックアップを作成しておく。

FTPクライアントソフト

『FileZilla』や『ffftp』などのソフトを利用。

403 Forbidden
GitHub - ffftp/ffftp: FTPクライアントソフトウェアです。
FTPクライアントソフトウェアです。. Contribute to ffftp/...

.htaccessについて

ダウンロードするのは、WordPressがインストールされているルートフォルダ(ルートディレクトリ)にある.htaccessファイル

「wp-admin」や「wp-content」フォルダと同じ階層の.htaccessファイル。

記述するコード

Windows10のメモ帳も[BOM無し+LF]に対応したようだけど、使い勝手があまり良くないので他のエディタを使ったほうがいいかも。

簡単なコードを追記(コピペ)するだけので『TeraPad』や『サクラエディタ』あたりが軽くて便利。

ダウンロード - TeraPad
Sakura Editor
Japanese text editor for MS Windows
以下の情報は、2021年1月頃に調べたものを、2022年11月に更新した時点での情報です。
各設定の仕様変更や主要なブラウザでのサポートには変化があるため、設定時に確認してください。

Strict-Transport-Security

Header always set Strict-Transport-Security: "max-age=63072000; includeSubDomains; preload"

HTTPを使わずHTTPSを使って通信するようブラウザに指示(強制)する。「HTTP Strict Transport Security (HSTS)」。

「max-age」は秒で指定。「max-age=63072000」だと2年。「includeSubDomains」で全てのサブドメインに適用。「preload」はChromeのプリロードリストへの送信・登録。

Content-Security-Policy

Header always set Content-Security-Policy "upgrade-insecure-requests"

読み込む対象を指定・制限などできる設定。指定可能な設定要素の種類が多く、組み合わせによってはサイトの表示に問題が生じることもある模様。難易度高め。「CSP」とも。

「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

Expect-CTは2021年6月に失効・廃止となり不要になりました。
Header always set Expect-CT "max-age=7776000, enforce"

サイトのSSL証明書に間違いや不正がないかをパブリックCTログで確認するようブラウザに指示する。不正な発行を検知・防止することで信頼性・透明性を高める仕組み。

「max-age」で期間を秒指定。「enforce」でユーザーエージェント(ブラウザ)に認証透過性ポリシーに違反する接続を報告、拒否するよう指示する。

Referrer-Policy

Header always set Referrer-Policy: "strict-origin-when-cross-origin"

リファラに含まれる情報を制御する。

「strict-origin-when-cross-origin」だと、同一オリジン(同じドメイン)のリクエストを行う際はオリジン、パス、クエリ文字列を送信。オリジン間リクエストでは、プロトコルのセキュリティ水準が同じである場合 (HTTPS→HTTPS) にのみオリジンだけ送信。

Header always set Referrer-Policy: "no-referrer-when-downgrade"

「no-referrer-when-downgrade」だと、セキュリティ水準が同じか向上する場合(HTTP→HTTP、HTTP→HTTPS、HTTPS→HTTPS)にオリジン、パス、クエリ文字列を送信する。ASPにリファラを渡したい場合はこちら。

X-Frame-Options

Header always append X-Frame-Options SAMEORIGIN

Webブラウザがサイトをframe、iframe、embed、objectの中に表示する許可設定。「SAMEORIGIN」で同一ドメインのみに限定することでクリックジャッキングを防ぐ。

埋め込みが制限されるため、サイトを読み込む必要がある一部のウェブツールを利用できなくなる等のデメリットがある。

柔軟に対応する必要があるなら、埋め込みを許可するホストやIPなどを指定できるCSPでの「frame-ancestors」を使うことが推奨されている。

Permissions-Policy

Header always set Permissions-Policy: "camera=(),geolocation=(),gyroscope=(),magnetometer=(),microphone=(),midi=()"

サイトが使用できるブラウザの機能、APIを制御する。サイトがカメラやマイクを使えないようにしてセキュリティやプライバシーを強化する、など。

「camera=(),geolocation=(),gyroscope=(),magnetometer=(),microphone=(),midi=()」だと、カメラ、位置情報、ジャイロセンサー、磁気センサー、マイク、MIDIを無効にする。

制御できる機能は他にも多数あるので参考サイトで要確認。明らかに必要のない機能は無効にしておくといいかも。

記述例

.htaccessの編集について】
  • .htaccessの末尾に追記
    • (一部を除いて)本当はどこでも良いけど分かりやすいため
  • .htaccessの最後の行には「改行(空行)」が1行以上必要
  • 文字コードは「UTF-8」「BOMなし」、改行コードは「LF」で保存
# Security Headers
Header always set Strict-Transport-Security: "max-age=63072000; includeSubDomains; preload"
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 Referrer-Policy: "strict-origin-when-cross-origin"
Header always append X-Frame-Options SAMEORIGIN
Header always set Permissions-Policy: "camera=(),geolocation=(),gyroscope=(),magnetometer=(),microphone=(),midi=()"
# End Security Headers
「#」が先頭に付いている行はコメントアウト。省略・変更可。

上記コードを.htaccessファイルに追記して保存、サーバーの元の場所にアップロードすれば完了。

「Content Security Policy」と「Expect CT」は、設定をミスした場合のダメージが大きそうだったので、最初の設定時は除外していました。高難易度!
「Permissions-Policy」はひとまず「カメラ、位置情報、ジャイロセンサー、磁気センサー、マイク、MIDI」を無効にしておきました。

サイトの状態を再確認

.htaccessファイルをアップロードしたら分析サイトでHTTPセキュリティヘッダーの設定が適用されているか再確認!

Security HeadersでA+評価

『Security Headers』『HTTPヘッダーセキュリティチェッカー』で確認したところ、設定は正常に反映されているようだった。

ちなみに、設定を変更・無効にしたい場合は、.htaccessファイルに書き込んだ内容を修正・削除すればいい。

設定おつかれさまでした!

参考サイト

コード関連

Manually adding recommended security headers on WordPress - Really Simple Security
Not Found
ワードプレスのセキュリティ対策としてHTTPレスポンスヘッダ 設定方法「securityheaders」のA評価の手順
WEBページやワードプレスのセキュリティ対策に必要な「HTTPレスポンスヘッダ ...
WordPressで例えるHTTPセキュリティヘッダーまとめ | Otogeworks
2013年頃にはContent-Security-Policy(CSP)が使える...

情報関連

HTTPレスポンスヘッダによるセキュリティ対策 - Qiita
HTTPレスポンスヘッダにつけることでセキュリティレベルが向上するヘッダフィール...
HTTP ヘッダー - HTTP | MDN
HTTP ヘッダーにより、 HTTP リクエストやレスポンスでクライアントやサー...
Nginx設定の肝
では、主にコンピューターハードウエア・ソフトウエア・ネットワーク・ウェブ関係の技...

Google Transparency Report
コメントの通知/購読設定
受け取る通知
guest
0 Comments
古い順
新しい順 評価順
Inline Feedbacks
View all comments
タイトルとURLをコピーしました