「WordPressのセキュリティを徹底強化」の対策の有効性を知る
このレシピは「WordPressのセキュリティを徹底強化 | CSSPRO」(2011年) で挙げられている対策について、現在(2016年時点)の有効性を記載しているものです。今でも参考にされている方が多い記事なので(2015年末に問い合わせが来たり)、挙げられている項目がどういうものかの理解の一助になればと思います。
No. | 対策 | 優先度 | 補足 |
---|---|---|---|
1 | 初めに (テーブルのプレフィックス変更) | C | 侵入された後の被害軽減策 |
2 | スパマー対策「Akismet」 | C | コメントやトラックバックを受け付けるサイトの場合 |
3 | 「SALT」 | - | 初期状態でも同等のセキュリティは確保できる |
4 | ログイン試行制限 | C | ログイン画面にアクセス制限が掛けられない場合 |
5 | パスワードチェック機能 | - | プラグインは不要 (標準機能有) |
6 | デフォルトユーザー名のadminは使わない | - | 現在は不要 (デフォルトがadminではない) |
7 | wp-config.phpファイルの保護 | - | .htaccessでの制限は価値が薄い |
8 | ディレクトリ一覧の非表示 | - | もしされていなければ必要 (普通はされている) |
9 | パスワード強度の確認 | - | プラグインは不要 (標準機能有) |
10 | WP_head部分からバージョン情報の削除 | C | WordPressを最新の状態に保つのが重要 |
11 | 複数ユーザーへの権限割り当て | - | 複数人で運営する場合検討 |
12 | フォルダへのアクセス権 | C | サーバーの推奨値にすることが必要 |
13 | wp-adminの保護 | B | IPアドレスによるアクセス制限などができるとよい |
14 | WordPressを定期的にバックアップ | A | 重要 |
15 | WordPress用のMySQL権限 | - | 侵入された後の被害軽減策。設定できない環境が多い |
16 | HTTPSの使用と信頼性の高いホスト会社の選択 | B / A | HTTPS(SSL)は可能であれば / 信頼性の高い業者を選ぶのは重要 |
17 | 常に最新バージョンへアップデートする | A | 重要 |
※ A: 必要、B: できればしたほうがよい、C: 余裕があればしておくとよい、- : 不要なことが多い
初めに (テーブルのプレフィックス変更) - 侵入された「後」の軽減策
WordPressをインストールする場合、現在のWordPressではインストール画面でデータベースのテーブルのプレフィックス(接頭辞)を変更することができます。
標準状態ではすべてのテーブルに「wp_」というプレフィックスが使われますが、これを変更しても「WordPressの侵入対策は脆弱性管理とパスワード管理を中心に考えよう | 徳丸浩の日記」の「テーブル名のプレフィックをデフォルトから変更することの効果」にある通り、価値はあまり高くありません (侵入された後の対策より、侵入される前の対策をしたほうがよい)。ただ、インストール時であれば変更は手軽にできるので、しておいてもよいと思います。
スパマー対策「Akismet」 - コメントやトラックバックを受け付けるサイトの場合
「Akismet」はWordPress開発元のAutomattic社が提供しているコメントスパムやトラックバックスパムを防止するプラグインです。必須でないケースもありますが、コメントやトラックバックを受け付けるサイトを運用している場合、このプラグインを用いてスパム対策を行うことは価値が高いです。
ただ、下記のように必要が無い(標準の設定で事足りる)場合もあります。
- コメントを承認制にする
(WordPress管理画面の「設定」 > 「ディスカッション」から「コメントの手動承認を必須にする」にチェック) - リンクが大量に含まれるコメントを自動スパム判定する
(WordPress管理画面の「設定」 > 「ディスカッション」から「○ 個以上のリンクを含んでいる場合は承認待ちにする」にチェック) - コメントをそもそも受け付けない
(WordPress管理画面の「設定」 > 「ディスカッション」から「新しい投稿へのコメントを許可する」のチェックを外す) - トラックバックをそもそも受け付けない
(WordPress管理画面の「設定」 > 「ディスカッション」から「新しい記事に対し他のブログからの通知 (ピンバック・トラックバック) を受け付ける」「新しい投稿へのコメントを許可する」のチェックを外す)
「SALT」 - 現在は初期状態でも可
SALTはWordPressのパスワードをデータベースに保管する前に行われる「ハッシュ」(「ぐちゃぐちゃにする」の意味。パスワードをそのまま保管せず、判別不能な文字列に変換する)に使われるものです。(認証方式ではないはずです…)
パスワードとソルトを合わせてハッシュすると、パスワードだけでハッシュした時より安全性が高まります。(仮にハッシュされたデータが攻撃者に渡ってしまっても解読されづらくなります)
元記事の通り https://api.wordpress.org/secret-key/1.1/salt/ にアクセスするとソルトを含めた各種設定を毎回ランダムな値で生成してくれるため、このコードをwp-config.phpにコピーして利用することができます。(ただ、これはブルートフォース攻撃を防ぐためのものではありません)
現在のWordPressでは「それぞれの値が初期状態の 'put your unique phrase here'
だった場合は64文字のランダム文字列を生成し直す」ということをしていて(※)コピーしなくても同等の強度のセキュリティは確保されるので、よくわからない場合は変更しなくても構いません。
※ wp-includes/pluggable.php
にある wp_salt()
。
ログイン試行制限 - ログイン画面にアクセス制限が掛けられない場合
ログイン画面にアクセス制限(IPアドレス制限や、Basic認証などの別認証)を掛けるほうが優先度と価値が高い対策にはなりますが、制限が難しい場合のログイン画面強化という意味では「ログインを何回も失敗したらログイン自体を試せなくする」という機能を追加するのは価値があると思います。(ブルートフォース攻撃と呼ばれる、パスワードを総当りで何度も試して強引に不正ログインを試みる攻撃を防ぐことができます)
ログイン試行制限については、SiteGuard WP Pluginに同等の機能(ログインロック)があり、これを利用するとよいと思います。
パスワードチェック機能 - プラグインは不要
パスワードチェックは現在のWordPressでは標準で提供されているため、プラグインを導入する必要はほとんどありません。
WordPressのパスワードチェックで「強力」となるパスワードを設定するようにしてください。
デフォルトユーザー名のadminは使わない - 現在は不要
現在のWordPressではデフォルトのユーザー名はadminではなくインストール時に任意に設定できるので特に何かする必要はありません。
ただ、ユーザー名はadminだったとしてもそうでなかったとしても、外部から簡単にわかります。
WordPressを設置したURLに ?author=1 と付けるとユーザーID=1のユーザーの作成者アーカイブページにリダイレクトされ、URLにユーザー名が表示されるためです。(特別な対策をしていない場合)
ユーザー名をどうにかするよりは、パスワードを強化するほうが価値が高い対策になります。
(雑な攻撃スクリプトは本当にadminで攻撃を仕掛けてくるのでadminというユーザー名を避けるのはよいことです。ただ、ログイン画面のアクセス制限をしたほうがもっとよいと思います)
wp-config.phpファイルの保護 - .htaccessで設定しても価値は薄い
wp-config.phpファイルはWordPressで最も大切なファイルの1つですが、「WordPressの侵入対策は脆弱性管理とパスワード管理を中心に考えよう | 徳丸浩の日記」の「.htaccess等で wp-config.php をアクセス制限することの効果」にある通り、優先度としては低い対策です。
使用しているサーバーが共用のレンタルサーバーの場合、wp-config.phpのパーミッションを600(所有者しか読み書きできない設定)や400(所有者しか読み込みできない)にするのは自己防衛策としてはありです。
ディレクトリ一覧の非表示 - 基本的に設定されていないサーバーはほとんどない
基本的には大手のレンタルサーバーでディレクトリ(フォルダ)やファイルの一覧が表示されてしまうことはほとんどないですが、設定されていなければしてください。
※ 元記事には「変更を行った特定のディレクトリの内のサブディレクトリへのアクセスを無効にします。」とありますが、「Options -Indexes」はフォルダ内にあるファイルやフォルダの一覧表示がされないだけで、アクセス制限をするわけではありません。これをすれば重要なファイルをどこに置いておいてもよい、ということではありません。(URLがばれれば見えてしまう)
パスワード強度の確認 - プラグインは不要
「パスワードチェック機能」と同様、標準機能で対応できます。
WP_head部分からバージョン情報の削除 - 他にわかる場所は何箇所もある
WordPressでは現在もHTMLソース上(<meta>
タグ)にバージョン情報が記されるようになっていますが、「ハッカーに使用バージョンを知られてしまうとハッキングの脆弱性も増してしまう」のが本当に成り立つのは、「WordPressの古いバージョンを使っている時」です。
本来は「WordPressを最新の状態に保つ」のが対策として必要なことで、バージョン情報を隠すことは根本的な対策というわけではありません。(「無駄なものが表示されたくない」というのはあると思いますが、別の問題だと思います)
バージョン情報を隠したとしても、外部からバージョン情報を知る方法はまだ他にも下記のようなものがあります。
- HTMLソースの
<link>
タグや<script>
タグを見る (CSSやJSを読み込むタグに「?ver=4.6」などの形でWordPressのバージョン情報が付加されている) - フィードのソースの
<generator>
タグを見る (https://wordpress.org/?v=4.6 などの形でWordPressのバージョン情報が付加されている) - WordPressが配置されたURLのreadme.htmlにアクセスする (バージョンが表記されている)
複数ユーザーへの権限割り当て - 複数人で運営する場合などは検討が必要
現在のWordPressには、マルチサイト用の権限を除くと「管理者」「編集者」「投稿者」「寄稿者」「購読者」の5つの権限グループがあり、それぞれにできること(権限)が割り当てられています。
複数人でサイト運営を行ったり、会員制のサイト運営を行うときは運用に合わせてどの権限グループにするか検討するのは大切なことです。
元記事で触れられている Adminimize は管理画面のメニュー項目を標準の状態からカスタマイズするためのプラグインです。標準でも、権限によって適切にメニュー項目の表示非表示の切り替えがされます。
(権限の詳細の説明は「用語説明の権限の項目」で行っています)
フォルダへのアクセス権 - サーバーの推奨値に
適切なアクセス権(パーミッション)を設定することは必要なことですが、過剰に制限すると正常に動作しなくなったり運用が難しくなる場合があります。パーミッションはサーバーによって推奨されるものが違いますので、サーバーのマニュアル等を参照するとよいと思います。
(例)
wp-adminの保護 - IPアドレス制限などができるとよい
wp-adminの保護については、IPアドレスなどでのアクセス制限ができるようでしたらそちらが確実です。難しい場合は、SiteGuard WP Pluginの「管理ページアクセス制限」というログインしていないユーザーにwp-adminのアクセス制限を掛ける機能があるので、そちらを利用するとよいです。
WordPressを定期的にバックアップ - 重要
バックアップは攻撃を受けた時の復旧に限らず、サーバーに何らかの障害が起こった場合の復旧などにとても重要です。WordPressには下記のような名の知れたバックアッププラグインがありますのでそちらを使用してもよいと思いますが、サーバー側でバックアップ機能が提供されていればそちらのほうがよりよいと思います。(より信頼性が高く、WordPressが動作しない状況でも対応できる)
WordPress用のMySQL権限 - できないことが多い
MySQLの権限については特にレンタルサーバーでは変更できないことが多いです(また、そもそもレンタルサーバーだとすでにある程度権限が制限されているので追加で制限する必要が無い場合が多い)。そもそも「推奨」とされているSELECT権限も不正に利用されればユーザーデータなどを取得されてしまいますし、DELETE権限が不正に利用されれば全テーブルのデータを削除することもできるので、MySQLの権限をどうにかするよりもまずは不正にSQLを実行されないよう対策をとったほうがよいです。(「本体やテーマ、プラグインを最新の状態に保つ」「品質の低いテーマ、プラグインを利用しない」など)
HTTPSの使用と信頼性の高いホスト会社の選択 - HTTPSは可能であれば。ホスト会社は重要
HTTPS(SSL)の使用は可能であればぜひ行ってください。通信が暗号化されるので、パスワードなどが漏洩する可能性を下げることができます。
サーバー側のセキュリティを任せることになるため、ホスト会社(レンタルサーバー事業者)をよく調べて選ぶことも重要な事柄です。
SSLを有効にするための証明書は基本的に有料ですが、無料で提供しているサーバーもあります。(「WordPressのセキュリティを高める - 管理画面やログイン画面をSSL化する」も確認してみてください)
常に最新バージョンへアップデートする - 重要
これは元記事通り非常に大切で、重要な事です。古いバージョンを使用しているということは、セキュリティに問題のある部分をそのままにしているということですので、最新の状態のソフトウェアを使用することを心掛けてください。(「WordPressのセキュリティを高める - WordPress本体やプラグイン、テーマのバージョンを最新の状態に保つ」も確認してみてください)
最後に
WordPressは日々便利な機能や安全性のための機能が追加されています。セキュリティのための対策も定期的に見直してみるとよいと思います。