[うらうつ。総本部へ] [インデックスへ]
Wordpressのセキュリティ強化方法についてのメモ
■要約
当サイトで運用していたWordpressが不正アクセスによってマルウェアに感染し、「404
Error」になって、安全のため当該ページ(300記事くらい)をすべて削除したという話の続きです。
再発防止のための、WPのセキュリティ強化について記載しています(さくらインターネットの場合)。
■対策方法
1.サーバーそのもののセキュリティ強化
まずはサーバーにアップロードする環境やファイルそのもののセキュリティを堅牢にする。
*サーバーパスワードの変更
-
サーバーパスワードを、「英字(大文字・小文字)+数字+記号」の組み合わせの堅牢なものにする。
*SSL(セキュア)化
- サイトは、HTTPSで公開する(HTTPでは公開しない)。
*SFTP化
- ローカルからのファイル転送は、SFTPで行う(FTPでは行わない)。
*WAF(Webアプリケーションファイアーウォール)の設定
- サーバーコンパネの「セキュリティ」からすべての運用ドメインに対して設定する。
*海外IPの制限
- 海外からの不正アクセス防止の設定をサーバーコンパネから実施。
*直下フォルダのパーミッション設定を厳格にする
- .htaccessファイルやHTMLファイルはすべて「604」(600)にする。
2.サーバーに設置しているmovabletypeの脆弱性を塞ぐ
movabletypeを置いている環境だと、MTの脆弱性からWPを狙う、という事例もある。まずはMTの脆弱性を潰しておく。
*MTのXMLRPC機能を無効化する
- mt-xmlrpc.cgiを削除する(2021年10月に深刻な脆弱性が発覚。きわめて危険なので使用しない場合は「削除」を推奨)。
*トラックバックとコメント機能を無効化する
- mt-tb.cgiとmt-comments.cgiのパーミッションを「000」として、アクセスそのものを不可能にする。
*MTインストールフォルダ内のパーミッション設定を厳格化する
- すべての.cgiファイルのパーミッションを、「700」に変更する。
- インストールフォルダのパーミッションは、「705」に変更する。
3.Wordpressにセキュリティプラグインを導入する
様々なプラグインがあるが、日本語化されていて使用しやすいもの2つを例示する。
*All In One WP Security(以下、「A」とする)
- WP全体のセキュリティ強化を行うことができるプラグイン。ログインページの変更機能のほか、ファイアウォールなど充実。
*SiteGuard WP Plugin(以下、「B」とする)
- 管理画面ログインを中心としたセキュリティに特化したプラグイン。
4.Wordpressの堅牢化
ここからいよいよ、WP本体の堅牢化に着手していく。
(1)ユーザー名を隠す、パスワードは堅牢にする
WPは、「ユーザー名」と「パスワード」で基本的にログインできてしまうため、ユーザー名は秘匿することが望ましい。
*ユーザー名は、adminにしない
- そもそもユーザー名を、簡単に推測できる名称にしない。
*ニックネーム(投稿者名)は、ユーザー名やハンドルネームと別のものに変更する
- ニックネーム(投稿者名)は、ユーザー名から推測されにくいものに変更する。
- 可能であれば、ニックネームも記事上のハンドルネームからは推測できない、別のものに設定することが望ましい。プラグイン「Remove/hide
Author, Date, Category Like
Entry-Meta」を使用することで、記事上から投稿者名が表示されないようにすることも可能である(テーマによってはデフォルトで表示をしない設定ができるものもある)。
*投稿者名でのアーカイブは無効にする
- 投稿者名でのアーカイブがインデックスされないようにすることも望ましい。上記の通り、投稿者名が表示されないテーマや、プラグイン「Remove/hide
Author, Date, Category Like
Entry-Meta」などを使用することで、記事上からニックネームのリンクを物理的に無効化することで、投稿者名のアーカイブを第三者に検知されないようにすることで、ユーザー名が推測されることを予防する。
*ユーザー名の漏洩防止策を講じる
- プラグイン(B)により、アドレスバーに「/?author=数字」を入力することによるユーザー名の漏洩を防止する。
- オプションの「REST API無効化」も推奨(REST APIを使用してユーザー名を取得することが可能であるため)。
*パスワードを堅牢なものに変更する
- ログインパスワードを、「英字(大文字・小文字)+数字+記号」の組み合わせの堅牢なものにする。
- サーバーパスワードや、他のWebサービスで使用しているものとは根本的に別のもの(ランダムな文字列)にすることが望ましい。
(2)XMLRPC機能を無効化する
外部からWPにアクセスできてしまう便利さゆえに、脆弱性との戦いでもあるXMLRPC機能。使用しない場合は絶対に無効化したい。
*XMLRPC機能の無効化
- プラグイン(A)などで、XML-RPC機能を使用不可にすることで、外部からのDos攻撃、DDos攻撃やハッキングを防ぐ。
(3)WPを使用していることを隠す
WPを使用していることを可能な限り検知できないサイトの構成が望ましい。
*WPを設置するフォルダ名を工夫する
- ルートフォルダ直下に「wp」「wordpress」「blog」など、明らかにWPを設置していると分かるようなフォルダ構成は絶対に行わない。
*WPが生成するメタタグや、バージョン情報をサイトのページに表示されないようにする
-
プラグイン(A)を使い、WPが自動で生成するファイルから「WPで作成した」という痕跡を抹消することで、悪意のあるクローラーが「このサイトでWPを使用している」ことを検知できないようにする。
*データベースの堅牢化
-
プラグイン(A)によって、Wordpressのデフォルトのテーブル接頭辞である「wp_」をランダムな文字列に変更することで、WPのデータベースであることを自動的に検知しにくくし、データベースのテーブルが攻撃される確率を下げる。
(4)大切なファイルに部外者が容易にアクセスできなくする
WPの使用が検知され、攻撃を受けたとしても、部外者のアクセスが難しい構成を心がける。
*ファイルのパーミッション設定を変更する
設定するファイル |
説明 |
パーミッション |
root directory |
WPインストールフォルダ |
755 |
wp-includes/ |
WPインストールフォルダ直下 |
755 |
wp-content/ |
WPインストールフォルダ直下 |
755 |
wp-config.php |
設定ファイル |
600 |
.htaccess |
WPインストールフォルダ直下 |
644 |
wp-admin/ |
WPインストールフォルダ直下 |
755 |
wp-admin/index.php |
管理画面 |
644 |
wp-admin/js/ |
JSファイル |
755 |
wp-content/themes/ |
テーマ |
755 |
wp-content/plugins/ |
プラグイン |
755 |
*WPにおいて共通に配布されているファイルへのアクセスを禁止する
- プラグイン(A)によって、WPのインストールによってデフォルトで設置されるファイル群への部外者のアクセスをブロックすることでセキュリティを強化する。
*不正アクセスを試みているIPアドレスをブラックリストに入れ、アクセスをブロック
- WAFでの検知や、アクセスログ(エラーログ)で確認された不正アクセスを試みるIPアドレスをプラグイン(A)によって、ブロックする。
*ファイヤウォールを設定する
- プラグイン(A)によって、基本的なファイヤウォール保護を設定する。
- インデックスビューの無効化、不正なクエリ文字列のブロック、プロキシ経由のリクエスト拒否、XST、XSSといった攻撃からのブロックなども同時に設定が可能である。
- 偽装googlebotの拒否もできる。
*新規ユーザー登録画面の堅牢化
- 設定画面の、「だれでもユーザー登録ができるようにする」チェックボックスは必ずオフにしておく。
- プラグイン(A)によってユーザー登録を手動承認にしたり、登録ページのフォームにロボット防止のCAPTCHA(例えば計算問題など)が出てくるようにしたり、ロボットにしか見えないフォームである「ハニーポット」を設置することは、ユーザー登録が攻撃されることを防ぐ(後述のログイン画面の設定と同様)。
*ダッシュボードからのPHPファイル編集を無効化する
- プラグイン(A)によって、ダッシュボードからのPHPファイル編集(テーマのソース編集など)を不可能にする。不正ログインによるサイト改竄の可能性を低減する。
*コメント・トラックバック機能の抑制
- コメントやトラックバック機能はOFFにする。
- コメントフォームへの攻撃を防ぐため、コメントフォームにはプラグイン(A)を使用して、CAPTCHAを設定しておく。
(5)管理画面への不正アクセスを防ぐ
サイト管理の本家本丸、ログインページから管理画面への不正アクセスを未然に防ぐ。
*ログインページの名称を変更する
- プラグイン(AまたはB、あるいは両方)によって、管理画面を「wp-login.php」以外の文字列でアクセスするように設定する。
- プラグイン(A)では、cookieの設定により、特定のブラウザ以外から管理画面へのアクセスができないような設定を行うことも可能。
-
プラグイン(B)では、「管理者ページからログインページへリダイレクトしない」設定を追加することで、管理者ページ経由で変更後のログインページを知ることができなくなる(推奨)。
- ログインページの名称は、ログインページと分からないようなランダムな文字列とし、WPのログインページと分かるようなもの(login-、admin-,
wp-など)は避ける。
*ログインフォームへのCAPTCHAの設定
- ログインフォームにキャプチャ(追加のデータ入力フォーム)を組み込むことで、ブルートフォース攻撃を防止する。
- プラグイン(A)では、ログインフォームに「計算問題の答えを入力」を追加することが可能。
-
プラグイン(B)では、ログインフォームに「ひらがな入力」や「英数字入力」の画像認証を追加することができる(「ひらがな」は日本語圏外からの不正アクセスにはきわめて有効)。
*ログインフォームの2段階認証設定
- プラグイン「Google Authenticator」を使用することで、Google認証システムによる二段階認証でのログイン設定が可能。
*ログイン画面へのハニーポットの設定
- プラグイン(A)によって、ログイン画面にロボットにしか認識できない隠しフォームを追加することで、ロボットによる攻撃を防止する。
*ログインロックダウン設定を行う
-
プラグイン(A)を使い、例えば「5分で3回ログインに失敗したIPアドレスは以後180分アクセスが不能になる」といった強固な設定を行うことで、機械的なログインアタックを防ぐ。
*管理ページへのアクセスを制限する
- プラグイン(B)によって、ログインが行われていないIPから、wp-adimin/ 以降のファイルへのアクセスを404(Not
found)で返す設定を行い、管理ページへの不正アクセスをブロックする。
*指定NGワードによる管理ページへのログイン試行を検知し、以降のアクセスを拒否する
- プラグイン(A)によって、例えば「admin」などの指定NGワードを使用してログインを試みたIPからのアクセスを遮断する設定も可能。
*ログインエラーメッセージの統一化
- プラグイン(B)によって、ログインエラーメッセージを単一のものにして、不正アクセスによってログインができない理由を推測できないようにする。
(6)日常的なメンテナンスを怠らない
日常的なメンテナンスを常に心がけ、サイトのファイル構成を常に最新の状態に保っておく。
*WP本体、プラグイン、テーマは常に最新版にしておく
- WP本体、プラグイン、テーマがすべて自動的に最新版に更新されるように設定する。
- ダッシュボードの「更新」において、すべてのファイル(プラグインやテーマ)が最新であるかを定期的に確認する。
*使用していないプラグインやテーマは削除する
- 不活性のプラグインは管理画面から削除する(脆弱性を狙われた場合、ファイルが残っているだけで危険な場合もある)。
- 使用していないテーマは、FTPソフト等を使用してサーバーから削除する。
*使用していないユーザーIDは削除する
- 使用しなくなったユーザーIDは、ただちに削除する。また、可能な限り使いまわしをしない。
5.不正検知の仕組みを持っておく
日ごろから、アクセスの動向に関心を持って、不正検知が素早くできるように心がけたい。
*アクセスレポートを確認する
- 不自然なアクセス増加・減少が発生していないかを定期的に確認する。
- ユニークユーザー数の伸びに比して、ページビュー数やファイル転送容量が異常に増加している場合は何らかの攻撃を受けている可能性が高い。
-
またユニークユーザー数が過去数か月の平均値よりも大幅に減少している場合は、不正なファイルの検知によって、検索サイトからペナルティを受けている可能性もある。
*アクセスエラーログを確認する
-
どのようなファイルでアクセスエラーが発生しているかを確認する。短期間で見覚えのないファイルへのアクセスエラーが集中している場合は、何らかの攻撃を受けている可能性が高い。
*WAFの検知ログを確認する
- ブロックされたアクセスを追求することで、「怪しいアクセス」「危険なIPアドレス」を割り出し、当該のIPからのアクセスを遮断する準備を行う。
*Google Search Consoleに登録する
- 不正なハッキングがあるかを、検索の状況から確認することが可能。上記のアクセスレポートと合わせて活用したい。
上記の対策で、ぜひ「健康的」なサイト運営を!
結論として言えることは、「絶対に、デフォルト設定でWPを運営してはいけない」ということ。
そして、「永続的に管理できない場合は、WPでサイト構築をしないこと」。これに尽きる。
[うらうつ。総本部へ] [インデックスへ]