この記事では.htaccessというサーバーの動作を設定しているファイルの書き換えを行います。間違いがあると、エラーが発生しWordPressが表示できなくなったり、ページ移動に影響が出てしまうため、必ずエラーが発生した際に元に戻せるようにバックアップを取るか、作業に慣れている方にお願いするようにしましょう。
こんにちは!TEDASKのToshiです。
今回はセキュリティに関する記事です。
WordPressを運営していて直接被害を受けないと気にすることが少ないセキュリティ対応ですが、このサイトでもWordPressのプラグインでセキュリティ対応をする方法を記事に書いていますが、WordPressのプラグインだけよりもより強固なものにするために、セキュリティヘッダーの対応をおすすめしています。
今回はそもそもセキュリティヘッダー対応がされているかのチェックから、セキュリティヘッダー対応の設定方法について共有したいと思います。
ヘッダーセキュリティのチェック方法
セキュリティヘッダーを対応しているかどうかを調べるサイトはいくつかありますが、日本語のサイトで私自身も普段から確認で使っているサイトをご紹介します。
HTTPヘッダーセキュリティチェッカー| ラッコツールズ
SEOをするために関連キーワードチェックで利用した事がある人も多いかと思いますが、ラッコツールのサービスにHTTPヘッダーセキュリティチェッカーがあります。
使い方は簡単で、チェックしたいURLを入力して「確認する」をクリックするだけです。

もしセキュリティヘッダー対応をしていない場合は、画像のようにすべて×になるはずです。
WordPressのセキュリティプラグインだけでは不十分なのか?
セキュリティヘッダー対応をしていないが、WordPressのセキュリティプラグインで対応している場合は不十分なのか?と思う人もいるかと思います。
この質問に対しては、「セキュリティヘッダー対応をすれば、より強固なセキュリティ対応ができる」という回答になります。
あくまでイメージとしての説明になりますが、ページにアクセス(HTTPリクエスト)があった場合、まずサーバーでアクセスを受け取るのですが、もし今回のセキュリティヘッダー対応をしていて攻撃にあった場合は、この段階で(設定の範囲で、攻撃の種類によっては)サイトを守ることができます。
もしセキュリティヘッダー対応をしていない場合でかつ、WAFというサーバー側で攻撃を感知して防御する仕組みを使っていない場合は、そのままWordPressに処理が移ります。
そしてWordPressのセキュリティプラグインやWordPressのテンプレートなどでセキュリティの対応がされていれば、この段階(WordPressの処理の中)で防御が掛かります。
もっとも、WordPressのセキュリティプラグインでサーバー側で防御をする設定が出来るものもあるので、一概には防御のタイミングはWordPressの処理の中とは言えませんが、イメージとしては、セキュリティヘッダー対応をすることで最初の段階で攻撃を防ぐ可能性を上げることができる、と思ってください。
セキュリティヘッダー対応の設定方法

セキュリティヘッダー対応を全て行うと、画像のようにすべて○になります。
これから対応方法を共有しますが、一部の対応についてはサイトの使い勝手が悪くなるものもあるため、最終的にはサイトに合わせた設定が必要です。また、設定自体しない方が良いものもありますので、一通り説明を読んでいただければと思います。
まずは、コード全体です。
Header set Strict-Transport-Security "max-age=31536000; preload" Header always set Public-Key-Pins "pin-sha256=\"<YOUR-FINGER-PRINT>\"; pin-sha256=\"<YOUR-FINGER-PRINT>/c=\"; max-age=31536000;" Header always append X-Frame-Options SAMEORIGIN Header always set X-XSS-Protection "1; mode=block" Header always set X-Content-Type-Options "nosniff" Header always set Content-Security-Policy "upgrade-insecure-requests" Header always set X-Permitted-Cross-Domain-Policies none Header always set Expect-CT "max-age=7776000, enforce" # Header always set Feature-Policy "geolocation 'self'; microphone 'none'; camera 'none'" Header always set Permissions-Policy "geolocation=(self); midi=();notifications=(self);push=(self);sync-xhr=();accelerometer=();gyroscope=(); magnetometer=();payment=();camera=();microphone=();usb=();xr=();speaker=(self);vibrate=();fullscreen=(self);"
このコードはWordPressであれば、index.phpやwp-config.phpなどが配置されているディレクトリにある「.htaccess」の先頭に書きます。
設定項目は基本的にHeaderから始まります。
ラッコツールのHTTPヘッダーセキュリティチェッカーの順序に合わせて記述しています。
注意は2つ目の「Public-Key-Pins」の設定で<YOUR-FINGER-PRINT>の部分はご自身で調べて書き換える必要があるので、コードを丸コピしたい場合は、このPublic-Key-Pinsの部分だけ省いて設定してしまっても良いかと思います。
また、一番最後の「Permissions-Policy」はラッコツールではチェックしていませんが、他のサイトのチェッカーではチェック項目に含まれるため入れています。(Feature-Policyは実は古い設定です。後述しています。)
一つずつ説明していきます。
Strict-Transport-Security
Strict-Transport-SecurityはSSLを強制するための設定です。
当然ですが、サイトがHTTPS化(SSL対応)していることが前提です。
Header set Strict-Transport-Security "max-age=31536000; preload"
コードはこのままコピーして大丈夫です。
Public-Key-Pins(※設定注意)
Public-Key-Pinsは公開鍵を事前に設定しておくことで、SSL証明が偽造かどうかを判断させるための設定です。
Header always set Public-Key-Pins "pin-sha256=\"<YOUR-FINGER-PRINT>\"; pin-sha256=\"<YOUR-FINGER-PRINT>/c=\"; max-age=31536000;"
記述は上記の通りになりますが、<YOUR-FINGER-PRINT>の部分(sha256のフィンガープリント)については自分で調べて設定する必要があります。
調べ方は、Google Chromeで、セキュリティヘッダーを設定したいサイトにアクセスします。

右クリック「検証」をクリックして、デベロッパーツールを表示したら、矢印をクリックして「Security」をクリックします。もし「Security」のメニューがなければ、3つ○のアイコンをクリックして「more tools」をクリックすると「Security」があるはずです。

「Vew certificate」をクリックします。

そうすると、SHA-256 フィンガープリントというのが表示されますので、「公開鍵」の英数字の羅列があるので、それをコピーします。
コピーした値を、先ほどの<YOUR-FINGER-PRINT>の部分に書き換えればOKです。
Header always set Public-Key-Pins "pin-sha256=\"1234567890abcdefghijklmnopqrstuvwxyz\"; pin-sha256=\"1234567890abcdefghijklmnopqrstuvwxyz/c=\"; max-age=31536000;"
といった感じです。
ただし、このPublic-Key-Pinsの設定は注意が必要です。
この今入力した値は、SSL証明の更新のタイミングで公開鍵も当然書き換わります。
なので、その更新のタイミングを忘れて放置してしまうとサイトが表示されなくなる可能性があります。
しかも、先程の画像の「有効期間」を見てほしいのですが、更新が1年ではなく90日なのが分かります。現在自分のサイトで無料でSSLが使えている場合はこのLet’s EncryptというSSL証明を利用している場合がほとんどで、この場合3ヶ月ごとにPublic-Key-Pinsの設定をしないといけません。1つのサイトだけであればまだ良いでしょうが、複数サイトを運営している場合は、かなり大変です。
そのため、SSL証明の更新が1年の有料のSSLでない限りは、このPublic-Key-Pinsは設定しない方が良いとされています。(手間や更新忘れでアクセスできなくなるリスクの方が大きいため)
ですので、ラッコツールでは×になってしまいますが、気にせず設定はしない方が良いかと思います。
X-Frame-Options
X-Frame-Optionsは、Web サイトが iframe や frame 要素内に表示されることを許可するかどうかを制御します。
iframeの上に別のサイトのリンクなどを埋め込んで他のサイトに飛ばしたり、クリックさせるのをクリックジャッキングといいますが、iframeを埋め込めるのは自分のドメインのみとすることで、不正を防止することができます。
Header always append X-Frame-Options SAMEORIGIN
このままコピーで大丈夫です。
X-XSS-Protection
これはXSS(クロスサイトスクリプティング)防止のための設定です。XSSはフォームなどから悪意のあるJavaScriptを埋め込んで、意図的に別サイトに誘導するなどの攻撃です。
ただこのX-XSS-Protectionは古いブラウザの対応のため今は意味がないらしく、現在は「Content-Security-Policy」の設定が有効とされています。
Header always set X-XSS-Protection "1; mode=block"
設定するのであれば、このままコピーで大丈夫です。
X-Content-Type-Options
コンテンツタイプのなりすましを防ぐための対応です。
Header always set X-Content-Type-Options "nosniff"
このままコピーで大丈夫です。
Content-Security-Policy
Content-Security-Policyを設定することで、ブラウザがWebページ内で読み込むことができるリソース(スクリプト、画像、スタイルなど)の出所を制限することができます。これにより、クロスサイトスクリプティング(XSS)攻撃などのリスクを軽減することができます。
Header always set Content-Security-Policy "upgrade-insecure-requests"
このままコピーで大丈夫です。
X-Permitted-Cross-Domain-Policies none
かつてAdobe flashが使われていたときのセキュリティ対策で、サイトでAdobe製品を使っていない場合は、noneで禁止して構いませんが、例えばサイト上でPDFを表示するのにAdobe Readerなどを使っている場合は、設定しない方が良いです。
Header always set X-Permitted-Cross-Domain-Policies none
Expect-CT
SSL/TLS証明書が本物かどうかを確認して検知する設定です。
Header always set Expect-CT "max-age=7776000, enforce"
Feature-Policy (※設定不要)
Feature-Policyはウェブサイトで利用できる機能を制限するための設定ですが、現在は次のPermissions-Policyが現行版になっており、Feature-Policyは現在は廃止されいるため、設定は不要です。
Permissions-Policy
Feature-Policyの現行版で、ウェブサイトで利用できる機能を制限するための設定ですここの設定は、下手に禁止してしまうと、使えない機能が出てきてしまうため、サイトに応じた設定が必要になります。
Header always set Permissions-Policy "geolocation=(self); midi=();notifications=(self);push=(self);sync-xhr=();accelerometer=();gyroscope=(); magnetometer=();payment=();camera=();microphone=();usb=();xr=();speaker=(self);vibrate=();fullscreen=(self);"
設定した場合は特に、埋め込み地図やプッシュ通知機能などを使っている場合は必ず動作確認をしましょう。
まとめ
今回はセキュリティヘッダー対応について、ざっと説明してきました。
WordPressは攻撃の対処にされやすいため、セキュリティ対応はある程度知っておくと良いと思います。とはいえ一番のセキュリティ対策は、WordPressを最新の状態にしておくこと、プラグインやテーマを更新して最新の状態にしておくことです。
その上で、ひとつ上のセキュリティ対応をしてみてください。
ちなみに今回はラッコツールを利用しましたが、最新のセキュリティヘッダーチェックはこちらのサイトもおすすめです。
設定についてのご相談はコメントやお問い合わせフォームからご連絡ください。
以上、「【セキュリティ対策】WordPressではヘッダーセキュリティの設定をしよう!」でした!
コメント