【企業サイト構築用】WordPress設計ガイドライン

備忘録を兼ねて、企業サイト構築時に決めている設計方針・インストールしているプラグイン・セキュリティ対策をそれぞれまとめました。セキュリティ対策の項目を除き、構築時の細かい設定やプログラム実装についての説明は省略しています。
**（※）2018.01.13: セキュリティ対策について加筆・修正を行いました**

## 概要
実装する際の方針として、**WordPressと紐付ける必要のないファイルは、できるだけWordPressのファイル・フォルダと分けて構築する手法を採択しています。**これはサイト全体をWordPress依存にさせたくない、ということが大きな理由です。
また、関係ないファイルをWordPress内で管理させることによって、お客様やHTMLに詳しくない編集者が不用意にファイルを更新してしまうことを防ぐ意味もあります。8年以上WordPressと付き合ってきましたが、以下の設計方針が最も最適だと考えています。

## 設計方針
1. 複雑になる場合を除き、できるだけマルチサイト化ではなく、カスタム投稿で対応できるようにする。 
2. Wordpressの複数インストールする必要がある場合は、なるべくマルチサイト化で対応できるようにする。
3. CMS化の必要の無いページはWordPress管理に含めない。
4. WordPressのページ機能を使って静的ページ作成は原則行わない。
5. 下書きのプレビュー機能はかなりの確率で導入して欲しいと要望をもらうため、ブロク記事など文書量が多い更新を行う投稿・及びカスタム投稿には原則動作するようにする。
6. WordPressに関係ないファイルはThemeフォルダ内に入れない。
7. 共通パーツはWordPressでも、静的HTMLでも同じパーツを使う。
8. 静的HTML内で、部分的にWordPressの機能が必要な場合は、wp_load.php、またはWP-REST-APIを使って、WordPress本体に極力依存しないように実装する。

## 設定プラグイン一覧

### 必須
実装時に最低限設定しているプラグインです。どれも管理画面のユーザビリティに配慮するためのものです。記事の順番変更、複製など、導入時にほぼ100％求められる事項に対応できます。

* **[Duplicate Post](https://ja.wordpress.org/plugins/duplicate-post/)** <br>投稿の複製を投稿一覧から簡単に行えるようにする。
* **[Intuitive Custom Post Order](https://ja.wordpress.org/plugins/intuitive-custom-post-order/)** <br>投稿の並び替えをドラッグアンドドロップで簡単に行えるようにする。
* **[Media Library Categories](https://ja.wordpress.org/plugins/wp-media-library-categories/)** <br>ライブラリにカテゴリ情報を付与。
* **[WP Multibyte Patch](https://ja.wordpress.org/plugins/wp-multibyte-patch/)** <br>日本語のマルチバイト処理の強化するプラグイン。標準インストール済み。
* **[Enable Media Replace](https://ja.wordpress.org/plugins/enable-media-replace/)** <br>メディア画面で画像の差し替えを可能にするプラグイン。
* **[WP Admin UI Customize](http://wpadminuicustomize.com/ja/)** <br>管理画面メニューのカスタマイズ。権限ごとに表示を出し分けることも可能。
* **[User Admin Simplifier](https://ja.wordpress.org/plugins/user-admin-simplifier/)**<br>ユーザ権限ではなく、ユーザごとに表示させたいメニュー項目の表示・非表示を設定できる。

### オプション
カスタムフィールドの拡張やURLのカスタマイズまで、オプションとは書いていますが、どれも開発上で必須なプラグインです。特にAdvanced Custom Fieldsは非常に強力です。カスタムフィールドを使用して実装するケースでは迷わず導入することを推奨します。

* **[Custom Post Type UI](https://ja.wordpress.org/plugins/custom-post-type-ui/)**<br>カスタム投稿を簡単に作成する。
* **[Advanced Custom Fields](https://ja.wordpress.org/plugins/advanced-custom-fields/)**<br>標準のカスタムフィールドよりも、明快で分かりやすい形でカスタムフィールドを操作できるプラグイン。カスタムフィールドを使った実装したいケースではほぼ必須と言っていい。複数画像登録（ギャラリー機能）や、繰り返し入力（リピーターフィールド）など高度なフィールドを作成できる。ただし、全機能を利用できるようにするためにはPro版の購入が必要。
* **[Custom Post Type Permalinks](https://ja.wordpress.org/plugins/custom-post-type-permalinks/)**<br>カスタム投稿のパーマリンクを自動設定してくれるプラグイン。例えば<br>http://example.com/post_type/taxonomy/term<br>といったURLを「パーマリンク設定」画面で簡単に設定できるようになる。
* **[BackWPup – WordPress Backup Plugin](https://ja.wordpress.org/plugins/backwpup/)**<br>データベースの定期的なバックアップを設定できるプラグイン。セキュリティ対策としても使える

## 管理画面・ユーザアカウント
管理画面には、簡潔さと扱いやすさを求められます。お客様を混乱させないために、利用を想定しない機能やボタンは極力非表示・無効化することが望ましいです。

1. サイドバーメニューに操作をしないであろう項目は表示させない。特に企業サイト構築の場合、コメント機能などはほぼ必要とされないので、非表示、または無効化する。
2. 記事の投稿・更新操作に関係のないブロックを残しておくとユーザビリティが低下するので、標準で用意されているタグ・リンク・カスタムフィールド入力などは、理由がなければ非表示にする。
3. 純粋な「投稿」だけを使って記事を作成・更新する場合を除き、ダッシュボードから更新させるような機能は殆ど望まれないため、ダッシュボードに表示されている情報は「概要」を除いてすべて非表示、または削除する。
4. ユーザアカウントは、「開発用アカウント（管理者）」と、記事を投稿・編集できる「編集用アカウント（編集者）」の2アカウントを作成し、要求される場合を除き、クライアントには「編集用アカウント」のみを送付する。


## セキュリティ対策
Wordpressはその人気と汎用性故に、脆弱性を狙った攻撃を受ける可能性が非常に高いCMSです。コアアップデートなど基本的な対策をしていれば大きな問題にはならないかと思いますが、油断をしてアップデートもせず、放置をしておくと問題が起きる可能性が大です。 実装・公開時には以下の対応を行う事が望ましいです。

### コアアップデートは可能な限り行う
基本の基ですが、WordPress本体のコアアップデートは極力行うべきです。しかしプラグインが動作しない、長いことアップデートしていないので動作確認にコストがかかる...といったアップデートを躊躇してしまう問題もあるため、作業工数とタイミングを見て、適切にアップデートすることを推奨します。

### デフォルトユーザーの「admin」は削除
デフォルトで設定されるAdminアカウントを残しておくと、総当り攻撃（ブルートフォースアタック）の成功率を高めてしまいます。初期設定で作成されたadminアカウントは公開時には必ず削除してください。

なお、はてなブックマークからご指摘頂きましたが、最近のバージョンでは初期アカウント名が必ずadminと設定される仕様ではなくなりました。新しいバージョンを新規インストールされる場合は、アカウント名をadminではなく、別の名前に設定しましょう。

### パスワードの生成
難しく考える必要はないです。分かりやすく使い慣れたパスワードを捨てて、少なくとも公開前までには安全なパスワードに変更してください。
生成には以下のようなツールで、ランダム生成されたパスワードを使うことを推奨します。

[パスワード生成（パスワード作成）](http://www.luft.co.jp/cgi/randam.php)


### wp-config.php, wp-comments-post.phpへのアクセス禁止
攻撃を受けやすいファイルへのアクセスを禁止します。 
ルートに設置されているwp-config.php及びwp-comments-post.phpへのアクセスを禁止する記述です。

```text:.htaccess
<files wp-config.php>
order allow,deny
deny from all
</files>

<files wp-comments-post.php>
order allow,deny
deny from all
</files>
```

### xmlrpc.phpファイルへのアクセス禁止（または削除）
xmlrpc.phpファイルは、ピンバックや、スマホアプリなどからの更新を行うためのファイルです。しかし、通常の企業サイトでその更新スタイルを望まれたことは殆どありません。アクセス禁止、またはファイル自体の削除を行うことを推奨します。.htaccessでアクセス禁止にする場合は以下の記述を追加。

```text:.htaccess
<files xmlrpc.php>
order deny,allow
deny from all
</files>
```

### ログイン画面へのアクセス禁止
管理画面への承認されていないIPからのアクセスを禁止します。allow from 00.00.00.00には、任意のグローバルIPを記述して設定してください。管理画面へは、wp-login.phpからのアクセスと/wp-admin/ディレクトリからの二通りのアクセスが行えるため、それぞれに設定が必要です。なお、グローバルIPアドレスはお客様側のIP設定も必要なことを留意してください。

[アクセス情報【使用中のIPアドレス確認】](https://www.cman.jp/network/support/go_access.cgi)

#### wp-login.phpへのアクセス禁止
ルートに設置されているwp-login.phpへのアクセスを禁止します。.htaccessに以下を記述。

```text:.htaccess
<files wp-login.php>
order deny,allow
deny from all
allow from 00.00.00.00
</files>
```

#### /wp-admin/ディレクトリへのアクセス禁止
/wp-admin/ディレクトリへのアクセスを禁止します。/wp-admin/配下に.htaccessを作成し、以下を記述。

```text:.htaccess
order deny,allow
deny from all
allow from 00.00.00.00
```

### 不要ファイルの除去

* license.txt
* readme.html
* wp-config-sample.php

上記のようなWordPressの動作に関係ない不要ファイルは設置前に消去することを推奨します。

### 不要なプラグインは無効化・または削除する
動作に必要のないプラグインはリリース前に無効化、まったく必要のないものは削除することを推奨します。

### 不要なテーマファイルも削除する
PHPファイルで構成されるテーマファイルは攻撃対象になりえます。デフォルトでインストールされているtwentyシリーズは、そのインストール率の高さからセキュリティ的には危険なファイルです。
使用している場合はともかく、不要であれば極力削除することが望ましいです。

### 全ての自動アップデートを有効にする
通常WordPressのマイナーアップデート以外のアップデートは自動で行われず、手動で行う必要がありますが、テーマ、プラグインの自動アップデートの他、WordPress本体のメジャーアップデートを有効化する設定を行うことができます。プラグインで行う方法もありますが、ここではfunctions.phpを使って設定する方法を記述します。

```php:functions.php
add_filter('auto_update_plugin', '__return_true');　// プラグインの自動更新を有効化
add_filter('auto_update_theme', '__return_true');　// テーマの自動更新を有効化
add_filter('allow_major_auto_core_updates', '__return_true');　// メジャーアップグレードの自動更新を有効化
```

この方法はセキュリティ的に有効な対策ですが、自作や長らく更新されていないプラグインを使っている場合、アップデートの瞬間に使えなくなる可能性があるため、事前に検証を行うことを推奨します。

### 定期的にデータベースのバックアップを行う
万が一攻撃を受けて復旧せざるをえない場合を考え、バックアップデータをとっておくことが望ましいです。手動で行う方法はもちろんありますが、定期的に取ろうとなった場合工数がかかります。例えばBackWPupプラグインを導入すると、データーベースはもちろん、サイトデータ自体の定期バックアップが可能となります。

[BackWPup – WordPress Backup Plugin](https://ja.wordpress.org/plugins/backwpup/)

バックアップデータはFTPの他、DropboxやAmazonS3、MicrosoftAzureなどのクラウドストレージに転送保存することが可能です。もちろんプラグインに依存しないバックアップの実装も有効です。

----

### プラグインを使ったセキュリティ対策について
ネットを検索すると必ずと行っていいほどプラグインによるオールインワンのセキュリティ対策が上位にランクインします。導入コストが低く、知識がない人間にも簡単に扱えるのが強みですが、もっとも使われている無料版はソースコードが公開されているため、脆弱性の解析によって攻撃受ける可能性があります。また、無料プラグインの場合はその無料という性質の都合、アップデートも必ず行われるかの確証がありません。どのように運用していくか、導入コストなどを鑑みて導入判断を行う必要があります。
この手のプラグインはいくつもありますが、有名且つ情報が豊富なセキュリティプラグインの代表格としては以下が挙げられます。

* [All In One WP Security & Firewall](https://ja.wordpress.org/plugins/all-in-one-wp-security-and-firewall/)
* [SiteGuard WP Plugin](https://wordpress.org/plugins/siteguard/)


### セキュリティ対策の参考記事
公式ドキュメントにもブルートフォースアタックへの対策ドキュメントがあります。

* [ブルートフォース攻撃 - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E3%83%96%E3%83%AB%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%82%B9%E6%94%BB%E6%92%83)
* [WordPressで攻撃を受けやすいファイルとそのセキュリティー対策まとめ](http://nelog.jp/attacked-php-files)
* [WordPressの管理画面ログインURLの変更方法解説](http://blog.s-giken.net/140.html)