興味のある所からお読み下さい
はじめに
WordPressでサイトを構築しているなら、セキュリティ対策はなるべく早くしておきましょう。WordPressはオープンソースのCMS(コンテンツマネージメントシステム)のため、ユーザーが多く、プログラムが公開されているため、脆弱性が発見されやすく、ハッカーの標的になりやすい特徴があります。
ひとたびセキュリティの穴が見つかると、そこを突く攻撃が一気に盛んになるからです。
- WordPress乗っ取りの手口はログインページからの「リスト型攻撃」と「総当たり攻撃」がある
- 不正ログイン阻止とソフトの脆弱性対策で「侵入の入口をふさぐ」を第一優先とし
- 次に侵入されたあとの改ざん阻止で「被害軽減」を計る
- さらに最悪の事態でも「サイトを復元」できる
※1)リスト型攻撃:別のサイトなどで流出した大量のIDとパスワードの一覧表(リスト)を使ってログインを試みる攻撃。同一のアカウント情報を別のインターネットサービスでも使い回す可能性が高いという習性を突いた攻撃
※2)総当たり攻撃:パスワードを力任せの総当たりで試す攻撃。ユーザー名とパスワードの組み合わせを自動生成して試す
WordPressの乗っ取り・改ざんを防ぐための対策法
プラグインを導入せずにできる、WordPressの乗っ取り・改ざんを防ぐための効果的なシンプルな対策法を備忘録としてまとめました。
- 不正ログインを阻止する(不正ログイン阻止編)
- 【A】ログインパスワードを長くて複雑なものにする
- 【A】他のサイトで使用したIDとパスワードの使い回しをしない
- 【A】ユーザー名とブログ上の表示名を別のものにする
- 【A】Edit Author Slugを導入する
- 【B】ログイン画面にアクセス制限(IPアドレス制限やBASIC認証)
- 【B】FTPのSSL/SSH暗号化通信とアクセス制限
- 本体やプラグインの脆弱性への対策(脆弱性対策編)
- 【A】WordPress本体やテーマ・プラグインは、常に最新版にしておく
- 【A】テーマやプラグインは、WordPress公式のものを利用する
- 【B】使用していないテーマやプラグインは削除する
- ログインされても改ざん出来ないようにする(改ざん阻止編)
- 【C】wp-config.phpファイルの保護
- 【C】/wp-admin/ディレクトリの保護
- 【C】データベーステーブルの接頭辞を、デフォルト値から変更する
- 万が一ハッキングされてもサイトを復元できる(サイト復元編)
- 【A】定期的にバックアップをとっておく
(※優先順序)A: 必要、B: できればしたほうがよい、C: 余裕があればしておくとよい
参考:「WordPress の安全性を高める」WordPress Codex 日本語版
不正ログイン・改ざんを防ぐWordPressのセキュリティ術|Norton
不正ログインを阻止する
【A】ログインパスワードを長くて複雑なものにする
WordPerssの仕様上、ハッカーは容易にそのユーザー名を知ることができます。それならば、ユーザ名がわかってしまうことは許容し、パスワード管理に注力することが得策と思います。それには強固なパスワードをつけることが第一優先であり、その他は副次的な対策である、と考えたほうがいいかもしれません。
長くて複雑なパスワードを設定することは、侵入させないためのセキュリティの基本中の基本です。パスワードは文字数が増えるほど、また使われている文字種(数字、英小文字、英大文字、記号など)が増えるほど、強度は高まります。
安全で覚えやすいID/パスワードの作り方
自分が覚えやすく、他人から推測されにくいID/パスワードを作る有効な手段が、ID/パスワードを作る際の「自分だけの秘密のルール」を作っておくことです。
そして、このルールに従って「サイトごとに異なるID/パスワードを設定」します。詳細は以下を参照してください。
WordPressインストール時のパスワード強度チェック
WordPress にはパスワードの「強度チェッカー」が内蔵されています。パスワードを登録・変更する際にはこれを活用し、強度が十分かどうか確認しましょう。
WordPressインストール後のパスワード変更時の強度チェック
パスワード変更時は「ダッシュボード」→「ユーザー」→「あなたのプロフィール」から、管理画面にパスワードを入力して「強度チェッカー」で判定します。
【A】他のサイトで使用したIDとパスワードの使い回しをしない
現在、多くのオンラインサービスに個人情報が登録され、ID/パスワードが主な認証手段となっています。多くの人は単純なID/パスワードを設定し、その上すべてのサイトで使い回しているのではないでしょうか。
この結果、ID/パスワードが1つ流出すると、すべてのサービスにログインすることが可能となる危険性をはらんでいます。
【A】ユーザー名とブログ上の表示名を別のものにする
WordPerssは、ログインユーザー名が外部に知られやすいという特性があります。WordPressが狙われやすい理由は、対策をしないと「ユーザー名が一目瞭然」となってしまうことです。
以下の手順で、ユーザー名とは別の執筆者名のみを公開するように設定します。
- ダッシュボードの「ユーザー」→「ユーザー一覧」とクリックし、表示されたユーザー名の下の「編集」をクリック。
- 「ニックネーム(必須)」にすでに設定されているユーザー名と別の名前を設定。「ブログ上の表示名」で、新しく作ったニックネームを選択して保存。
こうすることで、記事の執筆者名とログインIDを別個のものにできます。
【A】Edit Author Slugを導入する
上で説明した対策だけでは、「記事URL+/?author=1」と入力することで、設定によってはアドレスバーにユーザー名が表示されてしまいます。
Edit Author Slugプラグインは、投稿者アーカイブに表示される「Author Slug」の値を別の値に変更できるプラグインです。
このプラグインを使用することで、ユーザー名から自動で作成される「Author Slug」の値を別の文字列に変更しユーザー名を隠すことができるようになります。
Edit Author Slugプラグインのインストール
- ダッシュボードの「プラグイン」→「新規追加」とクリックし、検索ウィンドウに「Edit Author Slug」と入力してエンターを押します。
- Edit Author Slugが表示されたら、「いますぐインストール」をクリック。
- 「プラグインを有効化」をクリックしてインストール完了です。
詳細 インストールの詳細は下記を参照してください。
Author Slugをユーザー名とは別のものに変更
以下の手順で、Author Slugをユーザー名とは別のものに変更します。
- ダッシュボードの「ユーザー」→「あなたのプロフィール」をクリック。
- プロフィール最下段に「Edit Author Slug」という設定項目が追加されています。
- 「Custom」を選択 → ユーザー名とは別のAuthor Slug名(例:user-name)を入力し「プロフィールを更新」して設定は完了です。
これで、Author Slugをユーザー名とは別個のものにできました。変更結果は、ダッシュボードの「ユーザー」→「ユーザー一覧」で確認できます。
この2つの設定変更で、ユーザー名を表示しないようにでき、ユーザー名が外部から見られることを防げるようになりました。
【B】ログイン画面にアクセス制限(IPアドレス制限やBASIC認証)
パスワードリスト攻撃(リスト型攻撃)やブルートフォース攻撃(総当たり攻撃)による不正ログインは、必ずログインページにアクセスしなければなりません。
WordPressでログインページに該当するのが「wp-login.php」というファイルです。
なので、このファイルに対するアクセス制限を設定しておきましょう。
.htaccess によるIPアドレス制限
ログイン元のIPが一定である場合、ログインページファイルである「wp-login.php」のあるディレクトリの中に下記内容で .htaccess を設置します(xxxはIP)。
<Files "wp-login.php"> order deny,allow deny from all allow from xxx.xxx.xxx.xxx </Files>
.htaccess と .htpasswd によるBASIC認証
IP制限が難しい場合は、BASIC認証をかけます(IP制限との併用可)。「wp-login.php」のあるディレクトリの中に下記内容で .htaccess を設置します。
<Files "wp-login.php"> AuthName "ユーザー名とパスワードを入力してください" AuthType Basic AuthUserFile /(注1)/.htpasswd Require valid-user </Files>
(注1)サーバのルートディレクトリ「/」から始まる「サーバ内のフルパス」
(FTPソフトを使ってファイルをアップロードする際の表示で確認できます)
ユーザー名とパスワードを格納するファイル .htpasswd の作成方法およびBASIC認証については、下記ページを参照してください。
BASIC認証でアクセス制限をかける方法
【B】FTPのSSL/SSH暗号化通信とアクセス制限
FTPは、通信されるデータが平文のままで暗号化されていないので、第三者による盗聴(ファイルを覗き見る行為)の恐れがあり、FTPパスワードが盗聴され、サイトを改ざんされることもあります。
さらに、FTPサーバーへのアクセス制限を設定しFTP接続元を制限します。
FTPのSSL/SSH暗号化通信
SSL/SSH暗号化通信が使用できる場合は、サーバーへのログインやファイルアップロードは、FTP接続ではなく、FTPS(File Transfer Protocol over SSL/TLS)または SFTP(SSH File Transfer Protocol)を使ってサーバーへ接続を行います。
「wp-config.php」に以下を追記してSSLを強制させます。
define('FORCE_SSL_ADMIN', true);
※WordPressの標準機能では、SFTPには対応していないので、プラグインが必要です。
.ftpaccess によるIPアドレス制限
ログイン元のIPが一定である場合、サーバーの「/」直下など、アクセスを規制するディレクトリの中に下記内容で .ftpaccess を設置しFTP接続元を制限します(xxxはIP)。
<Limit ALL> order allow,deny allow from xxx.xxx.xxx.xxx deny from all </Limit>
本体やプラグインの脆弱性への対策
【A】WordPress本体やテーマ・プラグインは、常に最新版にしておく
WordPressでは、セキュリティやメンテナンスでの修正があった場合(バージョン4.6から4.6.1など、3桁目の番号が上がるとき)は管理者が何もしなくても自動更新が行われる仕組みがあります。
ただ、機能追加(1桁目や2桁目の番号が上がるとき)は標準では自動で更新されませんし、プラグインやテーマも自動では更新されませんので、管理画面に表示される更新通知を確認して更新することが必要になります。
【A】テーマやプラグインは、WordPress公式のものを利用する
公式ディレクトリに登録されているテーマ・プラグインは自動アップデートが可能なため常に最新版が利用できます。品質のよくないWordPressのプラグインやテーマをインストールしてしまうと、そこから攻撃されてしまう可能性があります。
どうしても使いたいものがある場合以外は、公式のものを使ったほうが良いでしょう。
下記いずれかに当てはまるテーマやプラグインはインストールするのをできるだけ避けたほうがよいです。
- WordPressの公式のプラグインやテーマ一覧からインストールできない
(公式の一覧は審査が行われているため、一定の品質は保たれている) - WordPress本体の最新バージョンに対応していない
(たとえ公式の一覧に載っているものでも、最新バージョンに対応していないものは予期しない不具合が起こる可能性がある) - ダウンロード数が少ないなど、有名なものではない
(沢山の人が使っているものであれば、ある程度品質は保たれていると推測できる)
【B】使用していないテーマやプラグインは削除する
本当に必要最小限のプラグインとテーマのみを導入し、使用していないテーマは削除しましょう。また、使用しないプラグインは「無効」ではなく「削除」します。
プラグインに脆弱性が存在した場合、その脆弱性が狙われる可能性があるからです。
ログインされても改ざん出来ないようにする
【C】wp-config.phpファイルの保護
データベースのアカウント情報が記載されている「wp-config.php」のファイルは、WordPressで最も大切なファイルの1つでが、外部に公開されているPHPスクリプトなのでこのファイルにアクセスしても何も起きません。
問題は、wp-config.phpに記述されたデータベースのユーザ名やパスワードが漏洩することです。この情報が、ハッカーの手に渡ってしまったら、データベースが直に操作されてしまう危険性があります。
.htaccess で外部からアクセス出来ないようにする
「wp-config.php」のあるディレクトリの中に下記内容で .htaccess を設置します。
<Files "wp-config.php"> order allow,deny deny from all </Files>
パーミッション設定を600に変更する
使用しているサーバーが共用のレンタルサーバーの場合、wp-config.phpのパーミッションを600(所有者しか読み書きできない設定)や400(所有者しか読み込みできない)にしてファイル保護するのは自己防衛策としてはありです。
【C】/wp-admin/ディレクトリの保護
投稿一覧、テーマ編集、ウィジェット、プラグインなどの管理画面(ダッシュボード)は /wp-admin/ 以下にあります。ただし admin-ajax.php のみプラグインで使っている物があるのでアクセス制限の対象から除外します。
.htaccess によるIPアドレス制限
ログイン元のIPが一定である場合、/wp-admin/ ディレクトリの中に下記内容で .htaccess を設置します。
order deny,allow deny from all allow from xxx.xxx.xxx.xxx <Files "admin-ajax.php"> order allow,deny allow from all satisfy any </Files>
.htaccess と .htpasswd によるBASIC認証
IP制限が難しい場合は、BASIC認証をかけます(IP制限との併用可)。/wp-admin/ ディレクトリの中に下記内容で .htaccess を設置します。
AuthName "ユーザー名とパスワードを入力してください" AuthType Basic AuthUserFile /(注1)/.htpasswd Require valid-user <FilesMatch "(admin-ajax.php)$"> satisfy any order allow,deny allow from all deny from none </FilesMatch>
(注1)サーバのルートディレクトリ「/」から始まる「サーバ内のフルパス」
(FTPソフトを使ってファイルをアップロードする際の表示で確認できます)
ユーザー名とパスワードを格納するファイル .htpasswd の作成方法およびBASIC認証については上述の「ログイン画面にアクセス制限」を参照してください。
【C】データベーステーブルの接頭辞を、デフォルト値から変更する
WordPressをインストールした際に、特に何も指定しなければ、作成されるデータベースのテーブルには「wp_」という接頭辞(プレフィックス)が付けられます。このままだと「テーブル名」が特定されてしまうので、セキュリティ上からも好ましくありません。
WordPressインストール時
インストール時であれば変更は手軽にできるので、しておいてもよいと思います。「データベーズ情報の入力」画面の「テーブル接続辞」(黄枠欄)にデフォルト値から変更する接頭辞を記述します。
WordPressインストール後に接頭辞を変更する場合
変更の手順は、次の3ステップです。作業前にはいつでも元に戻せるよう、必ずバックアップを取ってから作業してください。
- 接頭辞を書き換えるSQLの作成
- データベースの書き換え
- wp-config.phpの書き換え
万が一ハッキングされてもサイトを復元できる
【A】定期的にバックアップをとっておく
ウィルスや不正プログラムは日々進化しています。セキュリティ対策と同時に、万一ハッキング被害に遭った時のために、定期的にバックアップをとっておく事も必須となります。
データベースのバックアップ・復元を、WordPressのエクスポート/インポート機能の代わりに、MySQLのphpMyAdminを使って行う方法はこちらを参照してください。