今年の1月,正月休み明けにとあるブログのリニューアル作業を行った。それまでWordPress2.8という,2009年にリリースされた太古のバージョンを使っていた。たぶんセキュリティホールだらけだろうし,あまりに古くてプラグインも入れられない。OSもPHPもDBも9年間バージョンアップが止まったまま。今回,サーバを移転するのに合わせて最新版である4.9に入れ替えた。
All In One WP Securityをインストールする
WordPressはCMSとしてトップシェアを誇っているだけに,クラック事例も非常に多いという。実際に公開してから2週間のうちに不正ログインの試みが3件,集中アクセス攻撃? によるDBダウンが数十回と発生した。旧ブログではログの監視など誰もやってなかったので表面化してなかっただけかもしれないが,とにかくセキュリティを強化しなければ危なくてやってられない。
まずはWordPress用セキュリティプラグインとしては定番のAll In One WP Securityをインストールする。
このツールを使って,やることは
管理画面のURLを変える
WordPressの管理画面はデフォルトでblog名/wp-adminになっている。クラッカーはまずこのURLを入力し,適当なIDとパスワードで管理画面に侵入しようとする。だからURLを変えてしまおう。
Brute Forceタブをクリックし,[Enable Rename Login Page Feature:]をチェックし,[Login Page URL:]の枠内に新しい管理画面のURLを入力する。[Iriguchi]でも[Entrance]でも,覚えやすい名前をどうぞ。これで,クラッカーは管理画面の入り口が分からなくなる。
除外するユーザ名を登録する
上の対策をやっておけば,そう簡単に管理画面にたどり着くこともできないのだが,万が一に備えて,ありがちなユーザ名を除外リストに登録しておく。ここにあるユーザ名でログインしようとすると,即座にはねのけられる。[User Login]タブをクリックし,[Instantly Lockout Invalid Usernames:]をチェック。[Instantly Lockout Specific Usernames:]に除外ユーザー名を入力する。自分は
admin
root
user
wordpress
test
demo
info
anonymous
company
webmaster
postmaster
を登録した。つまり,こういうユーザ名をWordPressの管理者名として使ってはダメだということ。
ファイルのパーミッションを適切に設定する
WordPressはさまざまなファイルから構成されている。基本的には所有者が読み書き実行の権限を持ち,他のユーザは権限を制限しておくべきだ。[Filesystem Security]タブをクリックすると,主要ファイルのパーミッションが表示される。推奨されるパーミッションになっていない時は[Set Recommended Permissions]をクリックすると設定される。
ファイル改竄をモニタする
サーバー上に置かれているファイルが改竄され,マルウェアが組み込まれてしまうことがある。[Scanner]タブをクリックし,[Enable Automated File Change Detection Scan:]をチェック。[Scan Time Interval:]をチェックし,ファイルの状態をモニタする間隔を1日に変更。[File Types To Ignore:]をチェックし,改竄される危険性の少ないファイルの拡張子を登録する。
ここでは
jpeg jpg png gif css scss map po mo
特定ファイルへのアクセスを規制する
データベースのIDやパスワードなどが平文で記録されているwp-config.phpを外部から見られたら大変なことになるし,他にもPHPがアクセスしない領域,ユーザが直接操作しないはずのディレクトリなどがある。こういったエリアは.htaccessを使って外部から入れないようにしておく。
wp-config.phpがあるblogのルートに置く.htaccessは
<files wp-config.php> order allow,deny deny from all </files>
画像を置くフォルダであるwp-content/uploadsの.htaccessは
# Kill PHP Execution <Files *.php> deny from all </Files>
WordPressのプログラム本体が置かれているwp-includesはユーザが直接アクセスするべきではない,ので.htaccssに
# Block the include-only files. <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^wp-admin/includes/ - [F,L] RewriteRule !^wp-includes/ - [S=3] RewriteRule ^wp-includes/[^/]+\.php$ - [F,L] RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L] RewriteRule ^wp-includes/theme-compat/ - [F,L] </IfModule> # BEGIN WordPress # ここに記述しない # END WordPress
とする。
データベースのテーブル接頭語を変える
WordPressはMySQLを使っている。すべてのテーブル名がデフォルトではwp_から始まるようになっているので,ここも別の名前に変えてしまう。[Database Security]タブをクリックし,[Check this if you want the plugin to generate a random 6 character string for the table prefix]をチェックして[Change DB Prefix]をクリックすると,自動的に作られたランダムな6文字が接頭語になる。
MySQLで確認すると
+------------------------------+ | Tables_in_××××××_db | +------------------------------+ | ××efo_aiowps_events | | ××efo_aiowps_failed_logins | | ××efo_aiowps_global_meta | | ××efo_aiowps_login_activity | | ××efo_aiowps_login_lockdown | | ××efo_aiowps_permanent_block | | ××efo_commentmeta | | ××efo_comments | ・・・
となっている。
そのほかちょこちょこいじって,現時点でのセキュリティ強度は500点満点中210点となった。とりあえずは安心か。