WordPress セキュリティ
攻撃手法
コメントスパム
- 公開している内容と関係のない文字列がコメント欄に投稿され、ホームページへ大量に登録されてしまうこと
- 1 ページへの登録件数が万単位になると、サーバ負荷が高まり、自身だけではなく同サーバを利用しているユーザのコンテンツの表示も遅延することがある
管理画面の悪用
- WordPress の管理画面は wp-login.php というプログラムファイルを中心に構成
- 悪意のある第三者は不正な文字列をサーバへ送信することでプログラムの脆弱性を利用し、管理画面へログイン
プラグインの悪用
- 悪意のある第三者は不正な文字列をプラグインとなるプログラムに対して送信することでプログラムの脆弱性を利用し、不正なアクセスを行う
Pingback 機能の悪用
- WordPress には自身のホームページに対する言及を第三者のホームページ上で行われた場合、そのことを通知する、「Pingback」という仕組みがある
- この仕組みを悪用されたとしても、自身のホームページを書き換えられることはありませんが、知らないうちにどこかのサーバへの攻撃に加担してしまう可能性がある
ブルートフォースアタック / 辞書攻撃
対策
自動更新の確認
バージョン情報
注意事項
- バージョンアップとかでファイルが上書きされる可能性ある
- ?ver=X.X.X はバージョンアップ時にキャッシュされたファイルによる影響を防ぐ回避策
wordpress/wp-includes/version.php
# grep "\$wp_version" wordpress/wp-includes/version.php * @global string $wp_version $wp_version = '4.9.5';
HTML の meta タグ
確認
<meta name="generator" content="WordPress 4.9.5" />
削除
wordpress/wp-content/themes/xxx/functions.php」の文末に下記追記 ※ xxx は、利用中のテーマ・テンプレート
remove_action('wp_head','wp_generator');
CSS、JSのバージョン表記
確認
<link rel='stylesheet' id='twentyseventeen-style-css' href='https://example.com/wordpress/wp-content/themes/twentyseventeen/style.css?ver=4.9.5' type='text/css' media='all' />
削除
function vc_remove_wp_ver_css_js( $src ) { if ( strpos( $src, 'ver=' . get_bloginfo( 'version' ) ) ) $src = remove_query_arg( 'ver', $src ); return $src; } add_filter( 'style_loader_src', 'vc_remove_wp_ver_css_js', 9999 ); add_filter( 'script_loader_src', 'vc_remove_wp_ver_css_js', 9999 );
ユーザー名の表記を変更にする
- 「http://Webサイトアドレス/?author=1」と入力することにより、WebサイトアドレスにWebサイトにログインする際のユーザー名が表記されてしまう
- Web サイトの個別記事に表示されるユーザー名を任意のニックネームに変更するために「WordPress」が初期設定を変更してから、同様にWebサイトアドレスに表示されるユーザー名を任意のニックネームに変更するために、「WordPress」の「Edit Author Slug」というプラグインを導入
セキュリティプラグインの導入
- SiteGuard WP Plugin
アクセス制限
ダッシュボード
- /wp-admin
- ダッシュボードのフォルダ
- /wp-login.php
ダッシュボードログイン時にアクセスするファイル
接続元制限 or basic 認証
<Files wp-login.php> AuthUserFile /var/www/.htpasswd AuthGroupFile /dev/null AuthName "Please enter your ID and password" AuthType Basic require valid-user </Files>
<FilesMatch "wp-login.php|wp-admin"> Order deny, allow Deny from all Allow from xxx.xxx.xxx.xxx </FilesMatch>
<LocationMatch "wp-login.php|/top/wp-admin/(?!admin-ajax.php)"> Require ip 10.0.12.100 </LocationMatch>
- /wp-admin
XML-RPC API アクセス制限
- /xmlrpc.php
スマートフォンアプリや外部システムから、リモートで記事の投稿や画像のアップロードを行う際に利用される「XML-RPC WordPress API」に対する制限
<LocationMatch "wp-comments-post.php|xmlrpc.php|wp-config.php"> Require all denied </LocationMatch>
- /xmlrpc.php
REST API アクセス制限
- 「REST API」に対する国外IPアドレスからの接続を制限
- /wp-json
REST APIアクセス時に含まれるURL
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !^/wp-json/ RewriteRule . /index.php [L] </IfModule> # END WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{QUERY_STRING} rest_route= RewriteRule ^$ /? [R=404,L] </IfModule>
不使用のプラグインは削除
テーブルのプレフィックスを wp_ から変更しておく
認証用ユニークキーの設定
- wp-config.php ファイル内には「認証用ユニークキー」と呼ばれるものがある
- この認証キーはローカルに保存されるログイン情報の Cookie を暗号化してくれる役割がある
- 自動インストールの場合は気付かないうちに自動生成されますが、手動インストールなどで空になっている場合は設定を行なう
- 認証用ユニークキーは以下のサイトから生成が可能
wp-config.php へのアクセスを遮断
データベースへの接続情報が書かれた wp-config.php はセキュアである必要がある
外部からアクセスされないよう拒否設定が必要
<files wp-config.php> order allow,deny deny from all </files>
XML-RPC へのアクセスを遮断
XML 形式のデータを http でやり取りをする為の仕組みとして、XML-RPC がある
便利な一方で DDoS 攻撃などに悪用される恐れがあるので、管理画面以外からの記事投稿をするリモート投稿が利用する必要がない場合は、アクセスを遮断しておいたほうが安全
<Files xmlrpc.php> Order Deny,Allow Deny from all </Files>
wp-comments-post.php へのアクセスを遮断
コメントスパムによる書き込みを試行される恐れがある
コメント機能を利用しないサイトの場合は、wp-comments-post.php へのアクセスを遮断しておく
<files wp-comments-post.php> order allow,deny deny from all </files>
wp-cron.phpの無効化
予約投稿やスケジューリングに関するプラグインが利用していないサイトの場合、wp-cron.php へのファイルアクセスも無効化しておくと、より安心
無効化するには wp-config.php 内に下記のコードを追記
define('DISABLE_WP_CRON', 'true');
管理画面内での操作を制限
万一不正に侵入された場合、下記を wp-config.php に追記しておくことで管理画面からの「テーマの編集」「プラグイン追加」「プラグイン編集」が行えないようにできる
これにより管理画面からのPHP実行を防ぐことができる
define('DISALLOW_FILE_MODS',true);
Index ofを隠す
uploads 配下でのphp実行制限
- /wp-content/uploads/ は WordPress の画像をアップロードする為に書き込み権限があり、その中で PHP 実行をされないよう、/wp-content/uploads/.htaccess として下記を書いておくようにする
<Files *.php> deny from all </Files>
<LocationMatch "/top/wp-content/uploads/.*\.php$"> Require all denied </LocationMatch>
セキュリティ診断
ログの取得
- SiteGuard WP
- Activity Log
- Audit Log
自動バックアップ
- BackWPup
WordPress の脆弱性情報まとめ
- WordPress Security Category Archive
- Wordfence
- Hacked, dangerous & vulnerable WordPress plugins