WordPressのセキュリティ対策 Part1

まず、なにがどうなのかよく分からない。セキュリティ対策の基本は「何を何から守るのかをはっきりさせること」だと言われるのだが、それがどういうことになるのかがなんともはっきりしない。ただ、現象として分かっていることは、「どうやら最近ブログの管理ページへのログインを試みる攻撃があっちこっちで行われているらしい」ことだ。ログインに成功すれば、当然自分のサイトが書き換えられたり、あるいは削除されたりするだろう。

そういうわけで、とにかくログインされるようなことは防がなければならない。サーバーのセキュリティにも気を配れよな、という話もあるが、それは別に行っていくとして、とにかくWordPressのセキュリティ対策として行ったことを記録しておく。なにか役に立てば幸いである。

参考にしたサイト

具体的な組み込み方法などは、下記リンクをご覧いただきたい。それほど面倒ではないとは言え、こういうことに気を配らなければならないのはなかなか面倒な話だ。

何を何から守るのか

まずここから考えてみた。実際にはみんなどんな対策を行い、何を何から守ろうとしているのかを情報収集したのであるけれど。そこから見えてきたのは、こんなところだ。

  • 管理者権限を乗っ取って、サイトにログインして、最終的にはサイトの乗っ取りを行う
  • そのために、ユーザ名とパスワードを推測して総当たりで試して見る攻撃を行う。
  • WordPressのシステム上、デフォルトの管理者アカウント名は分かっているから、まずはここから攻めてみる。
  • いくつかの手段で、管理者以外のユーザ名を知ることができるので、それも使って総当たり攻撃をしてみる。

なかなか手が込んでいる。仮に自分のサイトに他人が不正にアクセスできてしまうと、朝起きてみたら自分のブログがアダルトサイトになっているかもしれない。あるいは、大量の迷惑メールを送るために使われているかもしれない。それは意図していないこととはいえ防がなければならない種類のことだろう。ということで、下記が私が取った対策。

攻撃が行われていることを検知する

管理ページにログインしようとしたときに、私にメールが届くように設定してみた。ログインに成功したのか失敗したのかも含めてメールが届く。当然自分がログインしてもメールが届く。実際にやってみると、昼夜を問わずなんらかのログインを試みられていることが分かる。

使ったプラグインは、『Login Alert Notification』というもの。これを見ているだけでも、なんらかの対策をしなければという気持ちになる。

攻撃のパターンはあるのか

それなら、攻撃にパターンはないのだろうか。パターンがあれば、そのパターンに応じた対策を行えば良い。分かっていることは、デフォルト管理者のユーザ名であるadminでログインを試みていること。ならば、adminユーザが存在することが危険なわけである。ユーザ名を変更できないのか?

ということで、したのような手順で変更してみた。

  • adminアカウントでログインする。
  • 新しく管理者アカウントを作成する
  • 作成できたら、adminアカウントからログアウトする。
  • 新しく作ったアカウントでログインする。
  • adminアカウントを削除する。もしadminアカウントで書いた記事やページがあれば新しい管理者アカウントに移行する。

上記のように書いたが、私は管理者アカウントでは記事やページは書かないことにしている。こうすることでそもそも管理者権限でログインしている時間を短くできる。また、管理者の投稿者アーカイブを開かれてしまったときにも、書いた記事やページがなければ管理者IDが漏れるリスクが減らせるようなのだ。投稿者アーカイブに関しては後述する。

そういうわけで、私は管理者の他に普段記事を書いたりコメントの承認をしたりするためのアカウントを作っている。権限は「編集者」にしている。

なお、複数のユーザでブログを管理しているような場合、すべてのユーザで上記作業をすることが必用だと思う。もちろんadminが最も狙われているのだが、admin以外のユーザも狙われる。また、後述するように既にユーザ名が攻撃者側に知られてしまっていることも考えなければならないからだ。

他のユーザ名でログインを試みられている?

ログイン記録メールを見ていると、どうやらadmin以外のユーザ名でもログインを試みられていることが分かる。そしてそのユーザ名はちゃんと存在するユーザ名だ。なぜばれてるのだろうか。

どうやら、WordPressにはユーザ名がURLから推測できてしまうことがあるのだ。具体的には下記二つ。もっとあったら教えてほしいな~。

  • 各投稿者(ユーザ)のアーカイブ。複数人でブログを運営しているような場合に、便利な機能。あの人の記事だけまとめて読みたいな、みたいなことができる。このページのURL内にユーザ名が隠れている。
  • 各記事にある投稿者名部分のリンク。このリンクをクリックすると上記投稿者アーカイブに飛ぶのだが、ここにもユーザ名が入っている。つまり、各記事には何らかの形でユーザ名が埋まっている。

ということで、ばれないようにするには、記事に埋め込まれているユーザ名を違うなにかに置き換えるような仕組みが必用だ。私が使ったのは、『Edit Author Slug』というプラグイン。これでユーザ名を見えなくすることができる。しかし、一度Googleなどの検索エンジンに取り込まれたり、そもそも攻撃者側に知られてしまっている場合にはもう防げない。もちろんやらないよりは良いのだろうけれど。

複数のユーザでブログを管理していたり、そもそも管理者用と投稿者用など複数のユーザでブログを管理しているような場合、念のためにすべてのユーザ名を変更し、ユーザ名を見えなくすることが必用だと思う。adminだけを変更してもその他のユーザは結局狙われ続ける。

最後に

実に大変だ。HTMLを完全手書きしていた時代ならばこんなことは考えなくて良かったが、今時そうも言っていられない。ということで、私のメモは終わるのだ。

JAWSでFireFoxを使っていて、なぜだかフリーズするぞ?

今年の春くらいから、IEではなくFireFoxをメインのブラウザとして使っている。特別な理由があるわけではない。ちょっと楽しそうだ、というだけだ。いろんなプラグインを組み込んだりすればもっと楽しいのだろうが、とりあえずは使い始めたのだ。

そうこうしていて、読み込んだページの中に突然なにもなくなってしまうような現象に遭遇した。この現象はJAWSを最新バージョンにアップデートすることで解消した。

これとは別に、ページは正常に読み込めているようだが、その後の操作がなにもできなくなってしまう現象に遭遇した。原因がまるで思い当たらない。アドオンマネージャを起動して、プラグインをすべて無効にすると正常に操作できる。それで調べていくとどうやらFlash Playerが有向になっていると問題が発生するようだ。

ということで、先日いろんな人に教えていただいたので、ここに纏めておく。JAWSユーザが同じ問題に遭遇して検索したときにひっかかるように。

Flash Playerのセキュリティ問題?

こんなページがあることを教えていただいた。
FirefoxでFlash、Youtubeが再生出来ない問題
なるほど、Flash Playerが、JAWSからの情報要求に対して応答しなかったのか?それなら納得できる。

スクリーンリーダーは、アプリケーションに対して読み上げに必要な情報を要求する。ところが、この要求に対して応答しなかったり、なにも情報を返さないと、スクリーンリーダーは読み上げができなかったりフリーズしたりすることになる。まさにこの現象だったようだ。

ということで、対処。

対処方法: 保護モードを無効化

Adobeによると推奨されている方法ではないが、確実に問題は発生しなくなる。セキュリティ上のリスクがあるから推奨していないのだろうが、Adobeが提示している他の方法は、現実的に行うことが難しい。ということで、以下の作業をやってみた。

  • 管理者権限のあるアカウントでログインする。
  • Flash Playerの設定ファイルであるmms.cfgを探す。
    mms.cfgの場所
    32bit版 Vista/7の場合
    C:\windows\system32\macromed\flash
    64bit版 Vista/7の場合
    C:\windows\syswow64\macromed\flash
  • 見つけたら、こいつをメモ帳で開く。おそらくExplorerとかでEnterキーを押すと、どのプログラムで開くかを聞いてくると思うので、メモ帳を選択。
  • ファイルの最後に書き行を追加。
    ProtectedMode = 0

これでFireFoxを起動して、適当にFlashが使われているページに行ってみよう。YouTubeとかは適当じゃないかな。

ということで、教えてくださった皆様ありがとうでした。

PHPでファイル送信を行う

ソフトウェアやその他のファイルをダウンロードするようなページを作ることを考える。サーバ上にファイルを置いてそのファイルへのリンクを作成すれば目的は達成できるだろう。が、例えばダウンロードしに来た人に名前やメールアドレスなどを入力してもらい、ある一定の条件をクリアした人だけにダウンロードをさせるようなサイトを考えたときには、入力とダウンロードを行うスクリプトなりCGIなりを考えなければならないだろう。

ということで、そこだけ取り出したコードを示してみよう。

一括送信方式

引数で指定したファイルを(URLではない)を一括送信する。PHPのマニュアルなどによく出ているものだ。


ほとんどの場合これで問題はない。が、私の場合300MBを超える巨大なファイルを送信したら、半分くらいでサーバが送信を停止してしまう現象に悩まされた。ブラウザから見るとファイルのダウンロードが中断したようになる。あるいは、正常にファイルがダウンロードできたように見える。いずれにしても正しい動きではない。

原因は、PHPのスクリプトが動作できる時間設定がデフォルトでは30秒に制限されているからだ。ダウンロードのスクリプトは巨大なファイルになると30秒では終了しない。そこで、set_time_limit()関数を使ってタイムアウトを適当な時間に設定する。2分くらいでよいだろうか。

さて、これで動作するようにはなった。ところが、ユーザがダウンロードのボタンを押してからブラウザになんらかの表示が現れるまでに時間がかかる。なんとかこれを改善する方法はないか。

ファイルを少しずつ送信する方式

ブラウザにファイル保存のダイアログや通知バーが表示されるのが遅くなるのは、PHPスクリプトが動作してreadfile)が呼ばれ、実際にブラウザに最初のデータが届くのに時間がかかっているからのようだ。readfile()関数は、指定された全データを一度読み込んで動作する。なので巨大なファイルではその読み込みに時間がかかる。そこで、ファイルの内容を少しずつ読み込みながら少しずつブラウザに送信してやれば問題は解決するのではないか?

結果はビンゴ。どうやらこれで問題は起こらないようだ。


1メガ単位で送信している。状況によってもっと小さくしても良いかもしれない。これで実用的な速度で使えるのではないだろうか。

mixiの日記とブログを同時に書く

ブログに書き残そうと思う内容と、mixiのみなさんにお伝えしたいことは一致しないことも多い。だが、一致していることもあるし、そもそも二つ同じことを書くのはかなり面倒だ。ということで、なんとか楽ができないかと思ってさがしてみた。

マイミクのMさんがご自身のブログとmixiの日記に同じ内容を投稿していらっしゃったのでできるんだろうとは思っていたが、私もちょっくらまねをしてみた。

私はMovable Type というブログ管理ソフトを自宅玄関にあるサーバにインストールしている。で、このMTで使えるmixi日記の自動作成プラグインを入れてみた。使ったのは
Mixisync
というやつ。インストールはなかなか簡単。設定もさくっと終わる。詳しくは先のリンクをどうぞ。

なお、コメントはブログには載らない。それはきっとその方がいいだろな。

mixiの絵文字リスト

mixiの絵文字リストを作った。コメント・メッセージ・日記を書くときに絵文字を書くことができるが、このとき入力欄には[m:数字]のように入力される。その数字がどんな絵になるかというリストだ。必要な人はすでに持っているかもしれないな。

“mixiの絵文字リスト” の続きを読む

やっと入ったWindows Vista SP1

3ヶ月くらい前から「重要な更新」がインストールできないと、私のコンピュータがのたまっていた。気持ち悪かったが、実害がなかったので放置していた。インストールできない更新プログラムは、ドライブの暗号化に関わるものだったからだ。

ところだが!どうしてもVista SP1に更新しなければならない用事ができた。で、おもむろにSP1への更新を始めたのだが、上記理由で失敗してしまう。何度やってもだめだ。BIOSをアップデートしようが、怪しいドライバを削除しようが、怪しいソフトを削除しようが、SP1への更新は失敗する。こりゃ困った。

ところで、このコンピュータにはハードディスクが三つ接続してある。一つは純粋にWindowsが入っている。二つ目にはUN*Xが入っていて、余った領域がWindowsのドライブにしてある。最後の三つ目はなんにも入っていない。ふと思い立ってWindows以外の二つを切り離して更新を始めてみた。

ビンゴ!大当たり!なんじゃこりゃ!あっさりと更新は終了。さっさと気がついておけばよかった!

Windows Update が正常にインストールできずに、インストール後の再起動中に突然リブートするようなら、これを疑ってみよう。とりあえず私は解決したようだ。

Vistaでの自動ログイン

久しぶりに技術メモだ。Vistaで、ログオン画面を表示せず、指定したユーザーでいきなりログオンしてしまう設定。特別な事情がない限り推奨されない。ちゃんとパスワードは設定すること、普通は「標準ユーザー」でアカウントは作成すること。

  1. Windows + R
  2. control userpasswords2 (enter)
  3. UACのダイアログが出たら「続行」で管理者に昇格。
  4. 「ユーザーがこのコンピュータを使うには、ユーザー名とパスワードの⼊⼒が必要(E)」のチェックを外して[OK]。
  5. 自動ログオンするユーザ名とパスワードを指定して[OK]。

なお、 Windows XP でもほぼ同等の操作。

wincvsのインストール

インストール手順

  • cd /usr/ports/devel/wincvs
  • make; make install
  • cd /etc/
  • vi rc.conf
  • ;; Add cvs_lockd_enable=YES
  • mkdir {repository_dir}
  • /usr/local/bin/wincvs -d … init

リポジトリのイニシャライズはrootで行う。root権限で使わないリポジトリなら’-n’オプションをつけてinitコマンドを実行する。

pserverを設定するときは、inetd.confにエントリーを追加。inetd.confにリポジトリを書く必要はない。機動パラメータは’authserver’である。

ちゃんとcvslockdは起動すること。