【WP】WordPressの基本的なセキュリティ対策

# **2017/02/06 追記**

WordPressの **4.7.0** と **4.7.1** で深刻な脆弱性がありました。

+ [WordPress、更新版で深刻な脆弱性を修正　安全確保のため情報公開を先送り - ITmedia エンタープライズ](http://www.itmedia.co.jp/enterprise/articles/1702/03/news063.html)

**脆弱性を悪用したと思われる改ざん報告が急増しております。** :scream:
**該当バージョンを使っているだけで、容易に改ざんされてしまいます。** :scream:
**自動アップデート機能をOFFにしている方は、直ちに最新バージョンにアップデートしましょう。** :thumbsup:

今回の脆弱性については下記が詳説です。

+ [WordPress 4.7.1 の権限昇格脆弱性について検証した](http://blog.tokumaru.org/2017/02/wordpress-4.7.1-Privilege-Escalation.html)

改ざん情報については下記が詳説です。

+ [2月初めの複数の国内サイトの改ざんについてまとめてみた - piyolog](http://d.hatena.ne.jp/Kango/20170205/1486314605)

# **2020/07/28 追記**

勘違いされる方がいるので追記しますが、WordPress が危険なのではなく、サーバーにアップロードして一切アップデートしないシステムが危険なのです。
WordPress に限らず、Rails でも Laravel でも全てそうですが、脆弱性があってもアップデートしないシステムが危険なのです。
何のシステムであっても、サーバー上にアップロードするなら**必ず定期的にアップデートしてください。**

---

#**はじめに**

WordPressの基本的なセキュリティ関連の設定を簡単にまとめてみました。
当たり前ですが、<ins>**WordPress 本体とプラグインは常に最新のバージョン**</ins>にしてください。
<ins>**最新のバージョンに保つことが一番重要です。**</ins>
<ins>**最新のバージョンに保つことが一番重要です。**</ins>
<ins>**最新のバージョンに保つことが一番重要です。**</ins>
大事なことなので、3回言いました。
また、<ins>**パスワードは推測できない値に設定**</ins>してください。
また、<ins>**パスワードは推測できない値に設定**</ins>してください。
また、<ins>**パスワードは推測できない値に設定**</ins>してください。
大事なことなので、3回言いました。
<ins>**これから紹介する設定方法やプラグインを導入するよりも、WordPress 本体とプラグインを最新のバージョンに保つことと、パスワードを推測できない値（ランダムで文字数が多い）に設定することが一番重要です。**</ins>
これから紹介するプラグインで総当り攻撃を防ぐこともできますが、単純なパスワードに設定すると総当り攻撃を受けてログインされてしまいます。
パスワードの管理が大変という方は、1Passwordなどのパスワード管理ツールを利用するという方法もあります。
ここではパスワード管理ツールについては説明しませんので、気になる方はググってください。
パスワード管理ツールも様々で、100%安全とも断言できないと思いますので、利用される方は吟味してください。

ここで紹介しているプラグインやツールなどの導入・設定は自己責任で行ってください。

セキュリティ界隈でも著名な徳丸先生が書いた下記もご覧ください。

+ [WordPressの侵入対策は脆弱性管理とパスワード管理を中心に考えよう](http://blog.tokumaru.org/2015/12/wordpress-security.html)

むしろ、私が書いた内容より徳丸氏の記事を読んでくださいw

### ぎょーむをしているみなさまへ

<ins>**バージョンアップの通知をOFFにして、WordPressを導入してから一切アップデートしないのは絶対ダメ**</ins>です。
業務として請負っているなら、アップデートが必ず必要になる旨を説明し、作業費を請求して対応してください。
一度導入したら何もせずに終わりというものではありませんし、そんな単純な作業をやっているわけではありません。
きちんとアップデートして請求しましょう。
そもそも、自動アップデートをONにしていれば、WordPress 本体は勝手にアップデートされます。
（おそらくメジャーアップデートは手動でやる必要あり）

WordPress 本体よりも導入するプラグインを慎重に選ぶ必要があります。
WordPress には便利なプラグインがたくさんありますが、プラグインの開発が途中で止まると新しいバージョンの WordPress と互換性がなくなったり、プラグインに脆弱性があっても対応できなくなってしまいます。
プラグインの脆弱性を利用して、ハッキングされることもあります。
プラグインは、なるべく使わないことをおすすめします。
どうしてもプラグインを使いたい場合は、導入実績（有効インストール数）が多く、今も開発（最終更新が最近）されているプラグインを選ぶことをおすすめします。

この記事では、各種設定とプラグインを紹介します。

#**各種設定**

###**1．パーミッションの設定**

各ファイルのパーミッションは適切に設定する必要があります。
パーミッションの設定については、サーバー会社のサイトに詳しく記載されております。
参考サイト：[サイト改ざんへの対策をお願いいたします - ロリポップ！レンタルサーバー](http://lolipop.jp/security/)

|ファイル|パーミッション|
|:--|:--|
|.htaccess|604|
|wp-config.php|400|

###**2．データベーステーブルのプレフィックスの変更**

新たにWordPressをインストール場合は、wp-config.phpを開き、プレフィックスを変更します。

```php:デフォルトのwp-config.php
$table_prefix = 'wp_';
```

既に稼働中の場合は、データベースのテーブルネームを変更する必要があります。（稼働中ならそこまでしなくてもいいかも？）

参考サイト：[WordPressのセキュリティを徹底強化 | CSSPRO](http://csspro.digitalskill.jp/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB/%E3%83%AF%E3%83%BC%E3%83%89%E3%83%97%E3%83%AC%E3%82%B9/wordpress%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E5%BC%B7%E5%8C%96/)

###**3．「Akismet」プラグインの利用**

自動的にスパムコメントを分類してくれるプラグイン。
WordPressをインストールすると、デフォルトでインストールされています。
プラグインを「有効化」して設定をしてください。

参考サイト：[Akismetプラグイン(コメントスパム対策) - WordPressプラグインの一覧](http://www.adminweb.jp/wordpress-plugin/list/index1.html)

###**4．「admin」のユーザー名は削除または使用しない**

「admin」は「ブルートフォースアタック（総当たり攻撃）」の対象となるため、「admin」ユーザーは必ず削除。

###**5．ディレクトリ一覧の非表示**

Apacheなら「.htaccess」に下記を記述して、ディレクトリ一覧を非表示にします。
レンタルサーバーの設定によっては、「index.html」などがないディレクトリはファイルが一覧で表示されるため、下記を記述する。

```apache:.htaccess
Options –Indexes
```

※上述した`Options`を使用できるかは、サーバーの設定により異なります。
　ちなみに、さくらのレンサバでは使用できません。
　別のやり方は、「[ディレクトリ内にあるファイル一覧を表示させない](http://qiita.com/4cres/items/49834702831fab0d6cc0)」をご覧ください。


###**6．wp-login.phpへのアクセス制限**

> **一応、.htacessでアクセス制限する方法を2パターン紹介しますが、後述するプラグインで管理ページのアクセス制限をできるので設定される方は、プラグインの機能で設定する方が楽です。**

##### 6-1. 特定のIPアドレスのみアクセスを許可する

「.htaccess」に下記を記述して、特定のIPアドレスのみアクセスを許可する。
「11.11.11.11」や「22.22.22.22」はアクセスを許可するグローバルIPアドレスに変更してください。

WordPressのルートディレクトリ直下に設置。

```apache
<Files wp-login.php>
Order deny,allow
Deny  from all
Allow from 11.11.11.11
Allow from 22.22.22.22
</Files>
```

上記とは別に下記を記述した「.htaccess」のファイルを「wp-admin/」のディレクトリにも設置する。
「wp-admin」以下の下層のディレクトリ・ファイル全てにアクセス制限を掛けます。

```apache
Order deny,allow
Deny  from all
Allow from 11.11.11.11
Allow from 22.22.22.22
```

##### 6-2. 日本国外からのアクセスを制限する

「[IPアドレスで日本国外(海外/外国)からのアクセスを制限する.htaccess CGI's](http://www.cgis.biz/tools/access/)」のWebサイトでhtaccessを配布しております。

設置方法に関しては上記のWebサイトを確認してください。

ダウンロードしたhtaccessを設置するか、既にhtaccessがある場合は追記するかしてアクセス制限してください。

「wp-admin/」ディレクトリに設置するか、ルートディレクトリに設置するかでアクセス制限するディレクトリが異なります。

Webサイトが国内向けならルートディレクトリに設置して、日本国外の閲覧自体を制限してもよいかもしれません。

適宜設定してください。

#**導入するプラグイン**

導入すべきプラグインは一つで「SiteGuard WP Plugin」です。

###**「SiteGuard WP Plugin」の導入**

上述した徳丸氏の記事で紹介されている「[SiteGuard WP Plugin](http://www.jp-secure.com/cont/products/siteguard_wp_plugin/)」を導入することで様々なセキュリティ対策が行えます。
「SiteGuard WP Plugin」には下記の機能があります。

|機能|内容|
|:--|:--|
|管理ページアクセス制限|ログインしていない接続元から管理ディレクトリ（/wp-admin/）を守ります。|
|ログインページ変更|ログインページ名を変更します。|
|画像認証|ログインページ、コメント投稿に画像認証を追加します。|
|ログイン詳細エラー・メッセージの無効化|ログインエラー時の詳細なエラーメッセージに変えて、単一のメッセージを返します。|
|ログインロック|ログイン失敗を繰り返す接続元を一定期間ロックします。|
|ログインアラート|ログインがあったことを、メールで通知します。|
|フェールワンス|正しい入力を行っても、ログインを一回失敗します。|
|ピンバック無効化|ピンバックの悪用を防ぎます。|
|更新通知|WordPress、プラグイン、テーマの更新を、メールで通知します。|
|WAFチューニングサポート|WAF (SiteGuard Lite)の除外リストを作成します。|

「SiteGuard WP Plugin」の使い方は、[本家サイト](http://www.jp-secure.com/cont/products/siteguard_wp_plugin/)もしくはググると紹介しているページが幾つもありますので、そちらをご覧ください。

#**最後に**

+ [WordPressの侵入対策は脆弱性管理とパスワード管理を中心に考えよう](http://blog.tokumaru.org/2015/12/wordpress-security.html)

最初に紹介した徳丸先生の記事も読みましょう。こちらからは以上です。