見出し画像

【WordPress】脆弱性対策について|インフラエンジニアが解説

こんにちは、株式会SHIFT インフラサービスグループのAKです。

自身の家族が運営しているWebサイトの脆弱性対策を行いましたのでご紹介させて頂きます。

多くのWebサイトで使用されている、WordPressの一般的な脆弱性対策についての内容となります。サイトを運営される皆さまのご参考になりましたら幸いです。

1. 自身について


現在、SHIFTにてインフラエンジニアとしてサーバーの更改案件を担当させて頂いております。セキュリティ分野については、過去にWebサイトの脆弱性診断(Vulnerability Test)および、セキュリティ対策支援業務に携わった経験が少しございます。

セキュリティに関する略歴

画像

2. 脆弱性について


脆弱性(Vulnerability)とは、もろくて弱い性質や、コンピュータやシステムにおけるセキュリティ上の欠陥を指します。

一般的な説明として

脆弱性の概要

  • 脆弱性は「セキュリティホール」とも呼ばれます

  • 脆弱性が放置されると、不正アクセスやウイルス感染、情報漏えいなどの被害につながる可能性があります

  • 脆弱性は、クライアントとサーバのどちらのコンピュータでも発生する可能性があります

  • 脆弱性を塞ぐには、OSやソフトウェアのアップデート、セキュリティパッチの適用などが有効です

簡単な例え

脆弱性とは?

  • コンピューターやスマホ、インターネットの仕組みにある「スキ」や「弱点」のことです

  • このスキを悪い人(ハッカー)が見つけて、悪用すると…

    • ウイルスを送り込まれたり

    • 個人情報を盗まれたり

    • サイトが壊されたり …といった被害が起こる可能性があります

家でたとえると?

  • 家のドアや窓がちゃんと鍵がかかっていなかったり、壊れてたりすると、泥棒に入られちゃう危険があります

  • それと同じで、

    • ドア → ソフトウェアやアプリ

    • 鍵のかけ忘れ → セキュリティのミス(=脆弱性) という感じです

ハッカー(空き巣)も頑丈な家でなく、侵入しやすい家(Webサイト)を狙います。

大抵のお客様は、
「私の会社は、大丈夫だからお金、労力をかけて対策なんてしない。」

そう言っていたお客様は、数ヶ月後にコーポレートサイトを改竄されコスメのサイトにされてしまいました。

Webサイトの改ざん事件が身近でも起こっております。 もはや対岸の火事ではありません。

画像
フリー素材参照先:イラスト屋、イラストカット、 GIRLYDROP

3. 脆弱性のレベル


近年、Webサイトを公開する多くの会社は、脆弱性診断サービス等を受けられて 結果レポートを受け取ります。

簡単言えば健康診断の結果と同じでしょうか。 要治療、再検査の箇所をほっておけば必ずツケが回ってきます。

そのレポートで危険度に応じてレベル分けがされております。

レベル分けの指針としてCVSS(共通脆弱性評価システム)では以下の区分けになっております。
CVSS(共通脆弱性評価システム)とは、
報システムやソフトウェアの脆弱性(セキュリティ上の欠陥)の深刻度を示す、国際的な評価指標です。

画像

脆弱性診断の深刻度は0.0~10.0までのスコアで示され、数値が大きいほど深刻度が高いことを示しています。

近年、健康診断と同様に脆弱性検査を受けられる中小企業が増えてきました。ただ、検査された結果は、レベルに応じて早急に対策を進めることをお勧めします。

対策を進める上で

  • OSやアプリが古くバージョンアップが困難、リプレースまでに時間がかかる場合は、WAF(Web Application Firewall)等を前段に入れて緩和することも大切です。

  • サポート切れでセキュリティパッチが出ないアプリは、早急にリプレース計画の作成が必要です。

4. 脆弱性の検知方法について


脆弱性検知方法について、有料、無料のサービスがありますが、個人でご利用の場合、お勧めはどの環境で実施出来る無料診断サービスをお勧めします。

ご利用されているレンタルサーバのサービスとして付随していれば そちらを合わせてご利用されるとよいかと思います。

※会社(法人)でご利用の場合は、有償サービスをご利用することをお勧めします。また、判定後の対策については、対策スキルのあるベンダーへご相談ください。

今回利用するサービスについて

Security Headers

URL: https://securityheaders.com/

Security Headers は、HTTP セキュリティヘッダーの評価を行うサービスです。URL を入力するだけで、セキュリティに問題のある HTTP ヘッダーがあるか、また内容は何かを確認することが出来ます。 自身のサイトの HTTP セキュリティヘッダーを確認する時、他のサイトの HTTP セキュリティヘッダーを参考にしたい時に便利です。

サービスの制作者は、イギリス在住のセキュリティ研究者 Scott Helme 氏です。

SSL Server Test (Powered by Qualys SSL Labs)

URL: https://www.ssllabs.com/ssltest/index.html

SSL Server Testは、そのWebサイトのSSL設定が正しくできているか無料で利用できるサイトです。
Qualys SSL Labs社が無料で提供しております。
自身でWebサイトを構築される場合は、設定の抜け漏れ防止確認としてご利用されることをお勧めします。

5. 具体的な対策例のご紹介(無料診断を利用)


(環境やバージョン、対応時期により対応方法が異なる場合がございます。ご利用の際は、適宜ご判断ください)

先ず、以下のサイトで現状を確認します。 https://securityheaders.com/

こちらのサイトのご自身のサイトのURLを入力し、「Scan」ボタンを押して 診断を開始します。 ※注意: 「Hide results」に必ずチェックを入れてください。
入れないと結果がこのチェックサイト上に公開されます。

画像

結果は、D判定となりました。
判定基準は、A+からFまでありますが、今回は、Missing Headersの不備の数(4つ)ですのでDと判定されておりました。

レベルについてですが、
一般的に
A,A+・・・最もレベルが高い 銀行等で求められるレベル
B・・・製造業で求められるレベル
C・・・少し注意が必要で早めの対策が必要
D・・・重大な脆弱性あり、早急に対策が必要
F・・・公開を止めて直ちに対策をした方がいいレベル
となります。

今回は、 検知された以下のMissing Headersについて対策を行います。
(カッコ内に想定されるレベルを記載します)
・Strict-Transport-Security(B)
・Content-Security-Policy(B)
・Permissions-Policy(C)
・Referrer-Policy(D)

Wordpress のセキュリティ対策として レンタルサーバでも実施可能な「.htaccess」にコードを追記する方法で 対策を行っていきます。

管理サイトより(レンタルサーバにより操作方法は異なります。)

  1. レンタルサーバーコントロールパネルにログインします

  2. ファイルマネージャーを選択します

  3. httaccessを開きます(右クリック→ファイル編集→テキストエリア)

  4. 以下の対策内容を追加します

# BEGIN WordPress
 ・
 ・
 ・
</IfModule>

# Security Measures Start    →ここから
Header always set Strict-Transport-Security: "max-age=31536000; includeSubDomains"(※)
Header always set Content-Security-Policy "upgrade-insecure-requests"(※)
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
Header always set Permissions-Policy "geolocation=(); midi=();notifications=();push=();sync-xhr=();accelerometer=(); gyroscope=(); magnetometer=(); payment=(); camera=(); microphone=();usb=(); xr=();speaker=(self);vibrate=();fullscreen=(self);"  (※)
# Security Measures End     →ここまで

# END WordPress

※ (※)が今回追加した行となります。

Strict-Transport-Security の対策

「Header always set Strict-Transport-Security: "max-age=31536000; includeSubDomains"」 を追加します。
WebサーバがHTTPヘッダに設定する項目の一つで、ユーザが同一ドメインに対するアクセスした際にHTTPでアクセスしようとしても、ブラウザが強制的にHTTPSでアクセスを行う仕組みとなります。

Content-Security-Policy の対策

「Header always set Content-Security-Policy "upgrade-insecure-requests"」 を追加します。
こちらの対策で混在するコンテンツが存在している場合でもHTTPSで強制的に読み込ませることが可能です。つまり、混在するコンテンツエラーを回避することができます。

Permissions-Policy の対策

「Header always set Permissions-Policy "geolocation=(); midi=();notifications=();push=();sync-xhr=();accelerometer=(); gyroscope=(); magnetometer=(); payment=(); camera=(); microphone=();usb=(); xr=();speaker=(self);vibrate=();fullscreen=(self);"」 を追加します。
Permission Policyは、使用できるブラウザの機能を制御するセキュリティヘッダーです。

Referrer-Policy の対策

「Header always set Referrer-Policy: "no-referrer-when-downgrade"」 を追加します。
HTTPS(セキュリティ高) から HTTP(セキュリティ低) になる場合、リファラーを設定しなくなります。

対策後の結果は、「A+」となりましたので「.htaccess」での対策は完了とします。

画像

<<参考>>

SSLのセキュリティについても確認します。
自前のサーバでないと対策は出来ませんが、
現状把握のために確認を行なっております。

https://www.ssllabs.com/
こちらのサイトのご自身のサイトのURLを入力し、「Submit」ボタンを押して 診断を開始します。
※注意: 「Do not show the results on the boards」に必ずチェックを入れてください。
入れないと結果がこのチェックサイト上に公開されます。

今回は、「A+」ですので問題は、御座いませんが結果が悪ければ、レンタルサーバ先を変更することをご検討ください。

画像

6. 具体的な対策例のご紹介(WordPress不正ログイン対策)


(環境やバージョン、対応時期により対応方法が異なる場合がございます。ご利用の際は、適宜ご判断ください)

WordPressで最優先で実施すべき対策としてWordPressの管理画面へアクセスのセキュリティ強化となります。
多くの方々が管理画面へ不正ログインされ、サイト改ざんの被害にあわれております。

今回は、WordPressの管理画面へのログイン強化として「二要素認証」と「ログインページへの認証設定」を導入します。

WordPressの管理画面へのログイン強化

二要素認証のプラグインの導入

WordPressの管理画面にログインし、メニューから「プラグイン」→「プラグインを追加」と進んでください。
プラグインの検索に「Two-Factor」と入力すると「Two-Factor」という名のプラグインが表示されます。
「今すぐインストール」をクリックしてインストールします。

インストールが完了したら「有効化」をクリックし、プラグインを有効化します。

二要素認証のプラグインの設定

各ユーザ毎に実施します。 WordPress管理画面>ユーザー>プロファイルの順にクリックします。

メールの「Enableメール」にチェックを入れてください。
※認証アプリをご利用方は、Authenticator Appの「Enable Authenticator App」を有効にしてQRコードをアプリにてスキャンください。

画像

設定が終わりましたら次回からログイン毎にワンタイムパスワードが通知されますのでそれを入力します。
メールアドレスのハッキングによるアカウントロックもあるため、複数のアカウントを登録をお勧めします。

ログインページへの認証設定

二要素認証は設定しましたが、攻撃対象となる「wp-login.php」にダイレクトにアクセス出来てしまいます。
Basic認証をつけてそのまま表示出来ないようにします。
(今回は、WebサイトがHTTPS化されており簡易に行うためBasic認証としております。場合によりDigest認証をご利用ください)

鍵ファイルを作成します。(Mac or Linuxの場合)

$ htpasswd -c .htpasswd sonota999
New password:
Re-type new password:
Adding password for user sonota999

$ more .htpasswd
sonota999:ここに暗号化されたパスワードが記載

作成された「.htpasswd」ファイルをpublic_html配下へコピーします。

次にレンタルサーバの管理画面より「.htaccess」を開いて以下を追加します。(ユーザ名は適宜変更ください)

<Files wp-login.php>
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /home/ユーザ名/.htpasswd
Require valid-user
</Files>

ログアウトしてから「wp-login.php」へアクセスしたときにログインダイアログが表示されたら設定は完了です。
上記で設定したユーザ、パスワードにてアクセスしてください。

7. 定期的な対策の重要性


近年、サイバー攻撃はますます巧妙かつ複雑になってきており、システムやアプリケーションに潜む脆弱性を突かれるケースが増えています。
一度問題が発生すると、情報漏えいやサービス停止、さらには企業の信用問題にまで発展する可能性があるため、日ごろからの対策が非常に重要です。

そのため、定期的にシステムの状態を確認し、必要なセキュリティパッチの適用や設定の見直しを行うことがリスク低減につながります。
あわせて、実施した対策の記録や振り返りを通じて、継続的に改善していくことが、安定した運用のためには欠かせません。

繰り返しになりますが、「対岸の火事」ではありません。
今、そこにある危機です。

「継続したセキュリティ対策のPDCA」を運用して行きましょう!

閲覧ありがとうございました。
この記事が、皆様のご参考となりましたら幸いです。


執筆者プロフィール:AK
50歳を機に、長年くらしてきた地方を離れて関東へ移住し、地方SIerから転職してきました。これまで主にサーバ構築に携わってきました。
新しい環境で改めて学べることに喜びを感じ、成長して行きたい思っております。どうぞよろしくお願いいたします!


✉ この記事の執筆者へコメントを届けてみませんか?🖊
「役に立ちそう!」「参考になった!」「思考が整理できた」など
記事を読んだ感想をぜひコメント欄へお寄せください。
次回の執筆テーマの参考にさせていただきます!
ご質問も大歓迎です◎

✅SHIFTへのお問合せはお気軽に

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/

PHOTO:UnsplashConny Schneider


コメント

ログイン または 会員登録 するとコメントできます。
【WordPress】脆弱性対策について|インフラエンジニアが解説|SHIFT Group 技術ブログ
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1