Webサイトのお助け隊

.htaccessで特定のファイルへの直接アクセスを禁止する方法

72 views
約12分

.htaccess、神ファイルか?呪いのファイルか? 特定ファイルへの直接アクセスを禁止する方法

「サーバー、落ちてますよ」

クライアントからの電話で叩き起こされたのは、確か土曜の朝だった。寝ぼけ眼でサーバーの監視ツールを見て、俺は一瞬で目が覚めた。CPU使用率、100%。メモリ、スワップ領域まで食い尽くしてる。何だこれ。何が起きてる?

SSHでサーバーに飛び込んで、topコマンドを叩く。プロセスのリストを埋め尽くしていたのは、大量のhttpdプロセス。Apacheが、何かを必死に処理しようとして、無限にプロセスを生み出し続けてる。アクセスログをtailで覗いて、原因はすぐに分かった。

POST /xmlrpc.php HTTP/1.1
POST /xmlrpc.php HTTP/1.1
POST /xmlrpc.php HTTP/1.1
...

海外の、無数のIPアドレスから、xmlrpc.phpに対して、秒間数百というとんでもない数のPOSTリクエストが送りつけられていた。ブルートフォース攻撃だ。パスワードを片っ端から試す、典型的な攻撃。これが、サーバーを過呼吸にさせていた。

どうも。WordPressのセキュリティ対策で、こういう修羅場を何度もくぐり抜けてきたWeb屋です。

今日は、.htaccessの話。Apacheを使ってるサーバーなら、ほぼ間違いなくルートディレクトリにある、あの謎のファイル。こいつを使えば、さっきみたいなxmlrpc.phpへの攻撃も、ある程度は防げる。でも、使い方を間違えると、サイト全体が真っ白になる諸刃の剣でもある。

この記事では、.htaccessを使って、WordPressの特定のファイルへの直接アクセスを禁止する方法を、俺の実体験を交えながら、具体的に解説していく。もし君が、.htaccessを「WordPressが勝手に作るファイル」くらいにしか思ってないなら、最後まで読んだ方がいい。サイトを守るための、強力な武器になるはずだから。

.htaccessって、そもそも何者?

.htaccessは、ApacheっていうWebサーバーの挙動を、ディレクトリ単位で制御するための設定ファイルだ。こいつに特定の命令を書いておくと、そのディレクトリと、その配下のディレクトリ全部に、その命令が適用される。

例えば、

  • 特定のIPアドレスからのアクセスを拒否する
  • 特定のページをリダイレクトする
  • 特定のファイルへのアクセスを禁止する
  • ディレクトリ一覧の表示を無効にする

なんてことができる。WordPressだと、パーマリンクの設定をいい感じにするために、勝手に作ってくれる。でも、それだけじゃない。セキュリティ設定にも、めちゃくちゃ使えるんだ。

ただし、こいつは超強力だ。文法を1文字でも間違えたり、おかしな命令を書いたりすると、サイト全体が「500 Internal Server Error」になって、真っ白になる。だから、編集する前には、必ずバックアップを取ること。約束だぞ。

なんで、特定のファイルだけ狙われるんだ?

攻撃者は、闇雲に攻撃してくるわけじゃない。WordPressの仕組みをよく理解していて、一番「おいしい」ところ、一番「弱い」ところを狙ってくる。それが、これから紹介するファイルたちだ。

wp-config.php

言わずと知れた、最重要ファイル。データベースの接続情報(ホスト名、ユーザー名、パスワード、データベース名)が全部書いてある。これが漏れたら、サイトは乗っ取られたも同然。データベースに直接接続して、個人情報を抜き取ったり、記事を改ざんしたり、管理者アカウントを勝手に作ったり、やりたい放題だ。まあ、普通はサーバーの設定でPHPファイルの中身が見えることはないけど、万が一、何かの設定ミスでPHPが実行されずにテキストとして表示されたら…と考えると、ゾッとする。直接アクセスされる理由は、本来ないはずだ。

xmlrpc.php

俺が叩き起こされた原因のファイル。昔、スマホアプリとかからWordPressを更新するために使われてた機能の名残だ。今じゃ、ほとんどの人は使ってない。でも、こいつはユーザー名とパスワードを受け付ける入り口だから、ブルートフォース攻撃の格好の的になる。REST APIが主流の今、こいつは無用の長物であり、ただのリスクでしかない。しかも、こいつを使ったDDoS攻撃の踏み台にされることもある。自分のサイトが、他のサイトを攻撃する片棒を担がされるなんて、冗談じゃない。

wp-login.php

WordPressのログイン画面。これも、ブルートフォース攻撃の標的になる。特に、海外からのボットによる攻撃が絶えない。ログインURLを変更するプラグインもあるけど、.htaccessで特定のIPからしかアクセスできないようにする、っていうのも一つの手だ。

wp-adminディレクトリ

管理画面全体。ここも、ログインしてるユーザー以外がアクセスできる必要はない。IP制限をかけることで、不正なログイン試行を大幅に減らせる。

その他の狙われやすいファイル

  • readme.html: WordPressのバージョン情報が書かれている。バージョンが分かれば、そのバージョンに特有の脆弱性を狙いやすくなる。
  • license.txt, wp-config-sample.php: これらも、WordPressのバージョンを特定するヒントになり得る。

攻撃者は、こういう些細な情報から、攻撃の糸口を探るんだ。

具体的に、どう書けばいいんだ?

じゃあ、実際に.htaccessにどう書くか。コピペで使えるように、具体的なコードを載せておく。.htaccessは、WordPressをインストールした一番上の階層にあるはずだ。もしなければ、自分で作っていい。

注意: 編集する前には、必ず元の.htaccessをPCにダウンロードして、バックアップを取っておけよ!

wp-config.phpへのアクセスを禁止する

これは基本中の基本。WordPressが作るデフォルトの.htaccessには含まれてないから、自分で追記する必要がある。

<files wp-config.php>
order allow,deny
deny from all
</files>

これで、ブラウザからhttp://君のサイト.com/wp-config.phpにアクセスしても、403 Forbiddenエラーになって、中身を見られることはなくなる。

xmlrpc.phpへのアクセスを禁止する

Jetpackプラグインの一部機能とかで使ってる場合もあるから、自分のサイトで本当に不要か確認してからやること。でも、ほとんどの場合は不要なはずだ。

<files xmlrpc.php>
order allow,deny
deny from all
</files>

これだけで、あの忌々しいブルートフォース攻撃が、パタッと止まる。サーバーの負荷も、劇的に下がるはずだ。

wp-login.phpwp-adminをIP制限する

これは、自分のIPアドレスが固定されてる場合に使える、超強力な技だ。自分(と、許可した人)以外は、ログイン画面や管理画面に一切アクセスできなくなる。

まず、自分のIPアドレスを調べる。「自分のIP」とかでググればすぐ分かる。

order deny,allow
deny from all
allow from 123.45.67.89  # ← ここに自分のIPアドレス
allow from 192.168.1.0/24 # ← 特定のネットワーク範囲を許可

<files wp-login.php>
order deny,allow
deny from all
allow from 123.45.67.89
</files>

123.45.67.89の部分を、自分のIPアドレスに書き換える。複数のIPを許可したいなら、allow fromの行を増やしていけばいい。カフェとかで作業することが多いなら、ちょっと面倒かもしれないけど、セキュリティ的には最強クラスだ。

やらかした失敗談:正規表現ミスでサイトが全滅

俺も昔、やらかしたことがある。.htaccessで、特定の種類のファイルへのアクセスを一括で禁止しようとして、正規表現を使ったんだ。

<files ~ '.*\.(bak|config|sql|fla|psd|ini|log|sh|inc|swp|dist|src|scss|sass)$'>
order allow,deny
deny from all
</files>

バックアップファイルとか、設定ファイルとかにアクセスさせないための記述だ。一見、問題なさそうに見えるだろ? でも、この時はなぜか、正規表現の書き方を間違えていた。たったそれだけで、正規表現がうまく解釈されなくて、サイト全体が403 Forbiddenになった。クライアントのサイトだったから、マジで血の気が引いた。

すぐにFTPで接続して、.htaccessを元に戻して事なきを得たけど、あの時の冷や汗は忘れられない。.htaccessは、本当に、ちょっとしたミスが命取りになる。だから、バックアップは絶対に取れって、口を酸っぱくして言ってるんだ。

まとめ:.htaccessは、君の忠実な番犬になる

.htaccessは、確かに怖いファイルだ。でも、正しく使えば、これほど頼りになるセキュリティの番犬はいない。

  • wp-config.phpは、絶対に守れ。
  • xmlrpc.phpは、不要なら迷わず塞げ。
  • IP制限は、できるならやれ。最強だ。
  • 編集前には、必ずバックアップを取れ。

WordPressのセキュリティは、プラグインを入れるだけじゃ不十分だ。こういう、サーバーのレイヤーでの防御を組み合わせることで、初めて「安全」に近づける。

面倒くさいかもしれない。でも、サイトが改ざんされたり、サーバーが落ちたりした時の復旧作業は、もっと面倒くさい。というか、地獄だ。

この記事を読んだ君が、.htaccessをただの「謎のファイル」じゃなくて、「サイトを守る武器」として認識してくれたら、嬉しい。

追伸:WordPressのデフォルト.htaccess

ちなみに、WordPressがパーマリンクのために作る、デフォルトの.htaccessはこれだ。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

自分で追記するコードは、この# BEGIN WordPress# END WordPressの外側に書くのが作法だ。WordPressがこの中を勝手に書き換えることがあるからな。覚えておくといい。

FAQ:よくある質問

Q. Nginxサーバーを使ってるんだけど、.htaccessがない。どうすればいい?

A. いい質問だ。Nginxは、.htaccessをサポートしてない。代わりに、nginx.confっていうサーバー全体の設定ファイルに、同じようなことを書く。文法は違うけど、やってることは同じだ。例えば、wp-config.phpへのアクセスを禁止するなら、こう書く。

location ~ /wp-config\.php {
    deny all;
}

サーバーの設定ファイルを直接いじるから、.htaccessよりさらに慎重さが必要だ。ミスったら、サーバー全体が動かなくなる可能性もある。自信がないなら、サーバー管理者に相談した方がいい。

Q. IP制限したいけど、IPアドレスが頻繁に変わる。どうすればいい?

A. いわゆる動的IPってやつだな。その場合は、IPアドレスで制限するのは難しい。代わりに、Basic認証っていう、もう一段階パスワードをかける方法がある。.htaccessと、パスワードを保存する.htpasswdファイルを使って設定する。ログイン画面にアクセスしようとすると、まずブラウザの認証ダイアログが出て、それを突破しないとWordPressのログイン画面にすらたどり着けない、っていう二重の壁を作れる。設定方法はちょっと長くなるから、「.htaccess Basic認証」とかでググってみてくれ。

Q. .htaccessを編集したら、サイトが真っ白になった!どうすればいい?

A. 落ち着け。まず、深呼吸だ。バックアップは取ってあるよな? FTPソフトでサーバーに接続して、編集した.htaccessを削除するか、バックアップしておいた元のファイルで上書きする。それで、サイトは元に戻るはずだ。原因は、ほぼ100%、.htaccessの記述ミスだ。どこを間違えたか、冷静に見直してみることだ。

最後に:セキュリティは、想像力だ

攻撃者は、俺たちの想像の、斜め上を行く方法で攻撃してくる。だから、守る側も、想像力を働かせないといけない。「このファイルが漏れたら、どうなる?」「この機能が悪用されたら、何が起きる?」って、常に考える癖をつけることだ。

.htaccessは、その想像力を、具体的な形にするためのツールの一つだ。サイトを守るための、強力な武器になる。でも、それは、君が正しい知識を持って、慎重に使いこなしてこそ、だ。

この記事が、君の武器を研ぎ澄ます、一つのきっかけになってくれたら、嬉しい。


WordPressのセキュリティ、不安に思っていませんか?

「自分のサイトは大丈夫だろうか…」
「何から手をつければいいか分からない…」

もしあなたが少しでもそう感じているなら、専門家によるセキュリティ診断を受けてみることを強くお勧めします。

>> WordPressセキュリティ無料診断はこちら

上記のサイトでは、WordPressのプロがあなたのサイトの脆弱性を無料で診断してくれます。問題が見つかれば、具体的な対策方法についてもアドバイスをもらえます。手遅れになる前に、一度プロの目でチェックしてもらい、安心を手に入れましょう。

FacebookでシェアTwitterでシェアPinterestでシェア