wordpress WordPress の wp-login.php をブルートフォースアタックから守る

2013年6月27日

以下のサイトで WordPress のセキュリティ(ブルートフォースアタック対策)に関する記事を見つけたのでメモ。

WordPress wp-login.php brute force attack

ブルートフォースアタック対策

次は記事で推奨されている内容。

  1. 強固なパスワードを使用する。
  2. デフォルトの管理者ユーザー名「admin」を使用しない。
  3. wp-admin フォルダや wp-login.php へのアクセスを .htaccess を使って制限する。
  4. sitecheck.sucuri.net」を利用してサイトをスキャンする。
  5. Google の「セーフ ブラウジング」を利用する。
  6. CloudFlare の DNS レベルのフィルタリングを利用する。
  7. WordPress のバックアップを取る。
  8. WordPress を常に最新に保つ。
  9. その他

以下は3番目の「wp-admin フォルダや wp-login.php へのアクセスを .htaccess を使って制限する」について。

wp-admin フォルダまたは wp-login.php への POST リクエストが自分のドメイン(または特定の IP アドレス)からでない場合は拒否するように、wp-admin フォルダ と wp-login.phpにベーシック認証を設定する。

wp-admin フォルダへのアクセスを .htaccess を使って制限

.htaccess に以下を記述して、自分のドメインからのアクセスのみを許可する。「example\.com」の部分を自分のドメインに変更する。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{HTTP_REFERER} !^http://(.*)?example\.com [NC]
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$
RewriteRule ^(.*)$ - [F]
</IfModule>
  • 現在のブルートフォースアタックは、POST リクエストを使って wp-login.php にアクセスしようとするのでそれを阻止する。
  • wp-login.php または wp-admin フォルダへの POST リクエストが自分のドメインからでない場合は、「403 Forbidden」を返す([F])。

特定の IP アドレスからのみ許可する場合は、以下を記述し、「123\.123\.123\.121」をその IP アドレスに変更する。複数ある場合は「RewriteCond %{REMOTE_ADDR} !^123\.123\.123\.121$」の行を追加する。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$
RewriteCond %{REMOTE_ADDR} !^123\.123\.123\.121$
RewriteRule ^(.*)$ - [R=403,L]
</IfModule>

参考:Lock down WordPress admin login with .htaccess

wp-login.php へのアクセスを .htaccess を使って制限

  • wp-admin ディレクトリにベーシック認証を設定
  • wp-login.php に同じ内容のベーシック認証を設定
  • wp-admin と wp-login.php のベーシック認証は同じユーザー名とパスワードになる。

wp-admin ディレクトリにベーシック認証を設定

wp-admin ディレクトリに .htaccess ファイルを作成して、以下を記述する。

  • AuthType:ベーシック(Basic)を指定。
  • AuthName: 認証をかける領域名の指定。 ダイアログに表示される(任意の)文字列を指定。
  • AuthUserFile:パスワードファイル(passwd)の指定。サーバのルートディレクトリからのフルパスで記述。
AuthType Basic
AuthName "Secure Area"
AuthUserFile "/home/xxxx/.htpasswds/public_html/wp-admin/passwd"
require valid-user

パスワードファイル(passwd)を作成して、上記で指定した(外からアクセスできない安全な位置)へ配置する。

  • パスワードについては、暗号化された状態で保存される必要がある。
  • パスワードは、crypt(“暗号化する文字列”, “任意の2文字”);で暗号化できるので、以下のように PHP ファイルに記述すると確認できる。
    <body>
    password: <?php echo crypt("mypassword", '1#'); ?>
    </body>
  • アカウント名とパスワードを「:(コロン)」で区切って記述する。
    (例)userx1:KBlkJenRWYwjU
  • 複数のアカウントを指定する場合には、改行をして次の行に記述。

wp-login.php にベーシック認証を設定

WordPress の .htaccess に、前述の wp-admin ディレクトリの .htaccess の内容をコピーして、<FilesMatch “wp-login.php”> と </FilesMatch> を記述してその間にペーストする。

<FilesMatch "wp-login.php">
AuthType Basic
AuthName "Secure Area"
AuthUserFile "/home/xxxx/.htpasswds/public_html/wp-admin/passwd"
require valid-user
</FilesMatch>

参考:Prevent unauthorized WordPress wp-admin and wp-login.php attempts