WordPressセキュリティー対策イメージ

WordPressのセキュリティ設定に関するブログ記事は山ほど見かけますが、今回はよく発生する改ざんについて「効果が高い」「比較的カンタンに出来る」「費用がかからない」という視点でピンポイントに対策したいと思います。

不正アクセスの目的と手口

そもそも何が目的で不正アクセスをしようとしてくるのか?
自分も含めいろいろな改ざん報告を見ると、

  • 改ざん者が関連しているウェブサイトへ誘導するスクリプトをこっそり書いていく
  • 投稿の本文の文中にサイトへの誘導リンクを書き込む
  • メールを自動送信するプログラムが書いてあるファイルをテーマディレクトリ内に置かれる

というケースが多いようです。

効率良く改ざんするための手順

それでは、上記の事を達成するのに効率が良いのはどんな方法か?
現実的に考えて、人間が手動で一つ一つのサイトにハッキングを試みるのはどう考えても効率が悪いです。そんな事をするくらいなら時給でアルバイトした方がよっぽどお金になります。
となると、改ざん行為をプログラムによって自動化する事を考えるでしょう。

では自動化するプログラムを書く立場で考えると、

目的の処理
  • なるべく多くの公開ページに反映されるようにスクリプトを埋め込む
  • メール送信機能など、自分の行いたい処理を書いたファイルを設置する
  • 投稿の本文の文中にサイトへの誘導リンクを書き込む
自動改ざんに向くターゲット
  • 書き込み対象ファイルの検出がしやすい
  • 世界中のどこからでも探しやすい
WordPressは…
  • テーマファイルのディレクトリ・ファイル名が決まっているので、header.php footer.php index.php あたりに書けば、公開ウェブサイトの多くのページに反映させられる
  • 管理画面にログインさえ出来れば、「外観」→「テーマ編集」などでファイルを書き換えたり追加出来る
  • テーマファイルなどを書き換える事が不可能な設定にされていても、ログイン出来ればとりあえず本文変更したり、新規投稿も概ね可能
  • 管理画面はWordPressがインストールされているディレクトリ/wp-admin/ にアクセスすればログイン画面が出るウェブサイトが多いので、そこにIDとパスワードを自動で総当りでアタックすれば突破しやすい
  • ウェブサイトがWordPressで作られているかどうかはプログラムで簡単に判別出来る
    → WordPressで作られているサイトのリストも自動で作りやすい

結論 : WordPressのサイトは狙いやすい!!

改ざん対策について

今までの流れを踏まえて考えると、例えばFTPでのIDとパスワードを始めとするサーバー情報が漏れて侵入されるというよりは、WordPressの管理画面にログインされて、そこから改ざん処理をされるので、その対策として手軽に出来そうな下記について順番に記載したいと思います。

  1. WordPressのログイン画面(管理画面)自体にアクセス制限を掛ける
  2. WordPressにログインされても改ざん出来ないようにする
  3. パスワードは難しいものにする
  4. 権限の高いユーザーアカウントをむやみに発行しない

【対策1】ログイン画面(管理画面)にアクセス制限を掛ける

ログイン画面や管理画面が狙われるのなら、そこに辿り着けないようにしておきます。
本当は接続先のIPアドレスを制限したりする方が確実なのですが、なるべく手軽に出来るやり方としては BASIC認証がおすすめです。BASIC認証を設定しておけば、WordPressのログイン画面を『表示するためのユーザー名とパスワード』が求められるわけです。

htaccessと.htpasswdによるBASIC認証

とりあえずBASIC認証のユーザー名とパスワードを記載した .htpasswdファイルを作成します。
これは「BASIC認証 .htpasswd 自動生成」などで検索すれば出てきますが、今回はとりあえず
こちらのサイト(htpasswd用パス作成ツール – phpspot)で説明します。

下記の画面で、[1]の部分にユーザー名とパスワード(勿論半角英数字)を入力して作成ボタンを押すと、[2]のようにすぐ下にユーザー名とパスワードが変換されたテキストが表示されます。

BASIC認証用のユーザー名とパスワードを入力して「作成」ボタンを押します

BASIC認証用のユーザー名とパスワードを入力して「作成」ボタンを押します

次に htpasswd.txt などの名前のファイルを作成し、その中に[2]で表示されるテキストを貼り付けて
FTPなどでサーバーにアップします。

アップ先は本当は公開ディレクトリでない方が望ましいですが、よくわからなければ最初はWordPressをインストールしたディレクトリで良いです。

アップした後にファイル名を .htpasswd に変更します。

次に ログイン画面にBASIC認証をかけます。
wp-login.phpがあるディレクトリにある .htaccess ファイルのバックアップをとった上で、.htaccessファイル(なければ新規作成)に下記を追記します。

サーバーのパス の部分は、公開URLではなくて、例えばffftpなどのFTPアプリケーションでサーバーに接続した時に表示されるパスです。

次に管理画面全体(/wp-admin/)にもBASIC認証をかけます。
以下の内容を記載した .htaccess ファイルを作成して、 /wp-admin/ にアップします。

これで管理画面にアクセスしようとすると

管理画面を表示するためのIDとパスワードを求められます。

管理画面を表示するためのIDとパスワードを求められます。

WordPressのログインは入力されたIDとパスワードが正しいかどうかデータベースにアクセスするので、突破は出来なかったとしても、サーバーに負荷がかかります。しかし、BASIC認証がかけてあると、その前の段階で一旦止めるので、サーバーの負荷対策にもなります。

【対策2】ログインされても改ざん出来ないようにする

管理画面から編集が出来ないようにする

WordPressは標準で管理画面からテーマファイルが編集出来るようになってますが、実際問題、侵入したらいろんなプログラム書き放題なのでよろしくないです。
なので、まずは管理画面からはテーマ編集が出来ないようにします。

WordPressをインストールしたディレクトリにある wp-config.php ファイルに下記を書き足すだけです。

/* 管理画面からのテーマやプラグインのの編集を出来ないようにする */
define('DISALLOW_FILE_EDIT', TRUE);

管理画面にアクセスすると「編集」メニューが消えているのが確認出来ると思います。

「外観」→「編集」がなくなります

「外観」→「編集」がなくなります

管理画面からテーマやプラグインの新規インストールを出来ないようにする

セキュリティー関連で名高い徳丸さん(@ockeghem)から
「DISALLOW_FILE_MODSをTRUEにすると、アップデートがあるかどうかも分からなくなるので、設定しないほうがよいと思います」「DISALLOW_FILE_MODSは管理画面を奪われた後の事後緩和策であり、侵入を許さない防御策のほうが優先度が高いという意味です。脆弱なプラグインやテーマによる侵入が多いという現状を考えると、即時のプラグイン等のアップデートは優先度が高いです」
とコメントいただきました。ありがとうございます。

編集出来ないようにした所で、悪意のあるプログラムのプラグインなどをインストール・有効化すれば好きな事が出来てしまいます。
なので、そもそも通常は管理画面からプラグインの新規追加などは出来ない状態にしておいた方が良いです。
これも同じく wp-config.php に書きます。

/* 管理画面からのテーマやプラグインのの新規インストール・アップデート・編集を出来ないようにする */
define('DISALLOW_FILE_MODS', TRUE);

これが書いてあれば、先の ‘DISALLOW_FILE_EDIT’ は無くても構いません。
ただ、プラグインのアップデートやWordPressのアップデートが効かなくなってしまうので、アップデートが入った時は下記のように、「# 」を追加して一時的に無効化して、アップデートが終わったらまた戻すようにしましょう。

/* 管理画面からのテーマやプラグインのの新規インストール・アップデート・編集を出来ないようにする */
# define('DISALLOW_FILE_MODS', TRUE);

【対策3】パスワードは難しいものにする

常識中の常識ですが、パスワードは複雑で文字数が多いものにしてください。パスワードの文字数が1文字増えるだけで総当り攻撃に必要なパスワードの数が飛躍的に増えるので、最低でも11文字以上にしておくと良いと思います。

このあたり専門ではないので推測ですが、

パスワードの桁数が増えると、総当りの回数が沢山必要になり時間がかかる
→ 一定の桁数でダメだったら他のサイトに攻撃対象を切り替えた方が突破出来る確立が上がり効率が良い
→ 一定の桁数で失敗したら、多い桁数で引き続き攻撃するのではなく、攻撃目標を変更する

というプログラムになってるのではないかなと思い、それなら桁数が多い方が圧倒的に安全。
で、パスワードで多そうなのは8文字とか10文字なので、その文字数で設定されているとすれば、11桁以上くらいが推奨かなと思ったわけですが…

まあ文字数が多くて複雑なのに越した事はないです。

もしかして全然的外れな推測でしたら指摘いただけると助かります。

[ 2014.11.25.10:38 追記 ]
@lilyfanjpさんから「パスワードは強度チェッカーがついてるので、それで確認する方が良いでしょう」といただきました。
ごもっともです(汗)。

【対策4】とりあえず admin アカウントは消しておきましょう

諸説ありますが、とりあえずデフォルトで作成されるアカウントIDという事で、自分がIDパスワード総当りのプログラムを組むとしたら、真っ先にユーザーID「admin」に対してパスワードの総当りをかけます。それがダメたったら、投稿者情報探してユーザーID引っ張ってくるとか、ドメイン名をユーザー名に割り当てパスワードは総当りにするとか…

なので、まぁパスワードを強固なものにしておけば破られはしませんが、とりあえず admin は狙われやすいので消しておくに越した事はないでしょう。

[ 2014.11.25.10:38 追記 ]
@lilyfanjpさんから「もはや初期アカウントはadmin決め打ちではないのでadminアカウント消しは最近のユーザーにとっては意味不明かも。」といただきました。
そうだったのですね…orz

【対策5】管理者アカウントは可能な限り少なく、アカウント管理はしっかり

対策2のように、管理画面に侵入されても編集や新規追加が出来ないようになっていればリスクは軽減出来ますが、そうなっていないWordPressが多いのではないかと思います。

しかし、編集や新規追加が出来るのは、元々管理者権限のアカウントだけなので、管理権限でないユーザーアカウントならば、侵入されてもリスクはかなり軽減されます。管理権限を必要としないユーザーに管理権限を付与するのはやめましょう。

ただ、本文欄やウィジェットにPHPが書き込めるプラグインを入れてると、侵入者は好きにプログラム書いて実行できてしまいます。
こうなると、例えば投稿者権限でログインされても、自動で様々な処理をするプログラムが埋め込めてしまうわけです。
なので、ウィジェットや本文欄にPHPを書くと実行出来るようなプラグインは自分でセキュリティーに穴を明けている事になるので、絶対に使ってはいけません。

また、何もプログラムを書き換えなくても、既に投稿された内容に、リンクを埋め込んで行くという手口もありますので、管理画面のアクセス制限やパスワードの複雑化を徹底して、ログインされないようにすると良いでしょう。

【対策6】WordPress、テーマ、プラグインは最新に

特にWordPress本体は常に最新にしましょう。

参考・あわせて読みたい記事

今回紹介したのはごく一部の対策です。以下の記事を参考にしています。
通信傍受系については今回触れていません。できればhttpsにした方が当然良いです。ただ、現実問題ウェブサイトのアクセスが多くなくてウェブサイトからの恩恵(収益)をあまり受けていない運営者が、SSLの取得費用や設定コストを出すのは難しく、また、通信を傍受して侵入されるというのは有名なサイトでない場合はブルートフォースアタックに比べてかなり低いであろうという視点から割愛しています。より強固にしたい場合は下記の記事など、いろいろ調べてみてください。

この記事を書いた人

kurudriveBizVektorコア開発者
名古屋で株式会社ベクトル というウェブ制作会社をしています。
普段はWordPressを使って企業サイトなどを制作しつつ、
WordPress関連のイベントにもよく顔を出しています。
[ 著書 ]
・いちばんやさしいWordPressの教本(共著)
・現場でかならず使われているWordPressデザインのメソッド(共著)
[ 最近のWordPressコミュニティでの活動 ]
2014 WordFesNagoya 実行委員 & セッションスピーカー
2013 WordCampTokyo セッションスピーカー(パネラー)
2013 WordFesNagoya 実行委員 & セッションスピーカー
2013 WordCrabFukui セッションスピーカー

スポンサーリンク