- 更新日: 2016年3月14日
- WordPress
WordPressセキュリティ対策・wp-config.phpを真上の非公開ディレクトリに移動
ロリポップや GMO interQ のレンタルサーバーで WordPress が乗っ取られる被害が出ているらしいという記事を読んだので、Wordpress のセキュリティ対策を行いました。
【緊急警報!!】ロリポップとGMOのinterQのWordPressが軒並み乗っ取られてます | More Access! More Fun!
続) ロリポップのWordPress大量乗っ取りについての推測と対応 | More Access! More Fun!
記事を読んだ限り、wp-config.php が流出してデータベースの接続情報が攻撃者に渡り、データベースサーバーがクラックされる…ていう感じでしょうかね、よく分かりませんけど。ちなみに私はこれらのレンタルサーバーの利用者ではありません。
ロリポップから出されてる対応策が、あまり現実的ではありません。これで運用は面倒くさそうです。
【重要】WordPressをご利用のお客様へ / 新着情報 / お知らせ – レンタルサーバーならロリポップ!
wp-login.php へのアクセスをIPアドレスで制限しちゃうと、出先などで接続IPアドレスが変わるとアクセスできなくなります。また固定IPじゃないと、プロバイダから割り当てられるIPアドレスが定期的に変更されるので、いずれアクセスできなくなります。ワイルドカードを使って、緩いIP・ホスト名で制限するなら面倒くささは減るかもしれませんけど、セキュリティ度は下がります。
WordPress セキュリティ対策の基本方針
以上を考慮して、できる限り利便性を損なわない方針で、以下3つの WordPress のセキュリティ対策を行うことにしました。
- wp-config.php を1つ上の階層(非公開ディレクトリ)へ移動
- wp-config.php, .htaccess のパーミッションを変更
- wp-login.php に Basic 認証をかける
1, 2 で設定情報などの流出を防ぐ目的、3 で wp-login.php への直接のアクセスを防ぐ目的を意図しています。
運用時のデメリットとしては、wp-login.php から WordPress にログインする際に、Basic 認証 → WordPress ログイン認証と2ステップを踏むことになりますので、そこが若干面倒くさいです。しかしまあ Gmail の二段階認証と同じでセキュリティ優先の方針で。
また、もちろん Basic 認証自体を攻撃される可能性はあるのですが、運用時の利便性を保ちつつ攻撃者に少しでも手間をかけさせて諦めさせようというのが Basic 認証の意図となります。
私の環境をもとに、以下を前提として説明します。
- /home/user/public_html: 公開ディレクトリ(DocumentRoot)
- /home/user: 非公開ディレクトリ(http からアクセスできないディレクトリ)
- 公開ディレクトリ(/home/user/public_html)の直下に WordPress をインストールしている。つまり WordPress のインストールディレクトリは /home/user/public_html で、wp-config.php は /home/user/public_html/wp-config.php にある。
- WordPress の運用環境はレンタルサーバーで root 権限はないけど ssh は使える
私は使っているレンタルサーバーに ssh 接続してターミナルからコマンドで作業を行いました。ssh が使えない場合は、ffftp や FileZila などの FTP クライアントから、ファイル移動やパーミッション変更などの作業を行えます。
wp-config.php を1つ上の階層(非公開ディレクトリ)へ移動
wp-config.php を公開ディレクトリから1つ上の階層の非公開ディレクトリへと移動させます。
注: Version 2.6 から、wp-config.php ファイルを WordPress ディレクトリの真上のディレクトリに移動できるようになりました(参照)。
以上の記述がドキュメントにありますので、まずはデータベースのユーザー名やらパスワードが直書きしてある wp-config.php を非公開ディレクトリ(1つ上の階層)へ移動させます。(これが公開ディレクトリにあるのはまずいですね。)
1つ上の階層の非公開ディレクトリへ wp-config.php を移動。
1 2 3 |
$ mv /home/user/public_html/wp-config.php ../ |
これで終わり、簡単です。問題なく WordPress が動作するのを確認できました。ssh で作業しない場合は、FTPソフトで、wp-config.php を1つ上の階層の非公開ディレクトリへドラッグ&ドロップです。
以下補足。
公開ディレクトリのさらに下のディレクトリ、たとえば /home/user/public_html/wordpress/ に WordPress をインストールしている場合、wp-config.php を /home/user/wp-config.php(非公開ディレクトリ) に移動させると、/home/user/public_html/wordpress/(Wordpress インストールディレクトリ)からは、2階層上となりますので動作しないかもしれません。検証していないので分かりませんけど。
これで動かない場合は、wp-confg.php を /home/user/wp-config.php へ移動させた後、/home/user/public_html/wordpress/wp-config.php から include してやると良いかもです。
1 2 3 4 5 6 7 |
$ mv /home/user/public_html/wordpress/wp-config.php ../../ $ vi /home/user/public_html/wordpress/wp-config.php <?php include("../../wp-config.php"); ?> |
という感じで。これも検証していないので、動作しないかもしれませんが。
パーミッション変更
次に、設定ファイル wp-config.php や自分で作成した .htaccess などのファイルのパーミッションを変更します。
wp-config.php のパーミッションを404に変更。
1 2 3 4 5 |
$ chmod 404 /home/user/wp-config.php $ ls -la /home/user/wp-config.php -r-----r-- 1 user group **** ** ** **** /home/user/wp-config.php |
.htaccess のパーミッションを604に変更。
1 2 3 4 5 |
$ chmod 604 /home/user/public_html/.htaccess $ ls -la /home/user/public_html/.htaccess -rw----r-- 1 user group *** ** ** **** /home/user/public_html/.htaccess |
これで、ファイルが所属しているグループからのアクセスを拒否できます。これも同じく ssh で作業しない場合は、FTPクライアントからパーミッションを変更できます。
root 権限が使える環境(su, sudo が使える)なら、chown で wp-config.php の所属を apache:apache にしてパーミッションを 400 にしたほうがセキュリティ上がると思います。これも検証していないので動作が分かりませんけど。
【2013/09/04 追記】
Symlink Attacks の場合ですと、ファイル(wp-config.php)を apache 所有にしていても無意味ですので上記打ち消し線の箇所は訂正します。詳細は以下が詳しいです。
共用サーバにおけるSymlink Attacksによる攻撃とその対策について – さくらインターネット創業日記
wp-login.php に Basic 認証をかける
wp-login.php へ攻撃者が直接アクセスできるのを防ぐために、Basic 認証をかけます。
ファイル名:.htpasswd
ユーザー名:username
パスワード:password
Basic認証用の .htpasswd というファイルを作成します。.htpasswd ファイルは非公開ディレクトリにて作成します。username, password は任意の推測されにくいものに変更します。
1 2 3 4 5 6 |
$ htpasswd -c /home/user/.htpasswd username New password: Re-type new password: Adding password for user username |
2, 3行目、New password:, Re-type new password: の行に password を入力します。これで、非公開ディレクトリ(/home/user/)に .htpasswd ファイル(/home/user/.htpasswd)が作成できました。
続いて Basic認証をかけるディレクトリ・ファイルの設定を .htaccess の末尾に追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ vi /home/user/public_html/.htaccess # ...省略 # 以下をファイル末尾に追記 # wp-login.php を Basic 認証 <Files wp-login.php> AuthName "Input ID & Password" AuthType Basic AuthUserFile /home/user/.htpasswd Require valid-user </Files> |
以上で Basic 認証の設定は完了。Basic 認証(htpasswd)の設定は、レンタルサーバーの GUI 管理画面から設定できるところも多いと思います。ssh で作業しない場合は、そちらを利用すれば Basic 認証の設定が可能です。
“WordPressブログのURL/wp-login.php” にアクセスすると、まず Basic 認証が要求されるようになるので、Basic 認証で設定したユーザー・パスワードでログインします。その後、Wordpress 本体のログイン画面(wp-login.php)が表示されますので、Wordpress 本体のユーザー名・パスワードでログインします。
以上で、今回の WordPress セキュリティ対策は完了です。何か抜けてたり間違えていたら、コメントやTwitterなどでご連絡ください!
- – 参考リンク:wp-config.php を1つ上の階層に移動させる –
- wp-config.php の編集 – WordPress Codex 日本語版
- WordPress の wp-config.php をドキュメントルートから退避 | APOCRYPHA Online | あぽくりふぁおんらいん
- – 参考リンク:Basic認証(htpasswd) –
- WordPressのログイン画面にBasic認証をかけて二重ロックする | memocarilog
- htpasswd コマンドの使い方 – KUNITAKE’s Wiki
- – 株式会社エスロジカル – 技術ドキュメント Apache:htpasswd コマンド
- WordPress の関連記事
- WordPressをTwitter Bootstrapでレスポンシブデザイン対応
- WordPressブログに更新日を表示
- WordPressにOGP設定・プラグインなしでFacebook/Twitter Cards対応
- WordPressでパンくずリスト・複数の親子カテゴリーを表示
- WordPressでプライベートな非公開ブログを運用
- BackWPupでエラー ERROR: Dropbox API: (35)
- ブログ・WordPress記事をFacebookに自動投稿するIFTTT設定
- RSS Graffitiが終了…代替にはIFTTTが使える
- WordPressで親カテゴリーに属する子カテゴリーの一覧を出力
- wp_list_categoriesでリンクなしで投稿数ゼロのカテゴリを表示 – WordPress
- 初回公開日: 2013年8月29日
Leave Your Message!