読書とプログラミングを中心とした覚書ブログ

読書とプログラミングについて、日々経験したことを忘れないようにするため、極力ブログに記録を残すように頑張る。

ログインページの表示を自分だけ許可することでセキュリティ確保

 公開日     更新日  2014/11/27

     

enter-452718-2

WordPressのログインページは、他一般的なWEBサービス同様にURLが固定で決まっているので攻撃されやすい作りです。
また知名度的に利用者数が多いような場合は、なおいっそう攻撃を受ける確率は上がってくると思います。

そこで、とてもシンプルな方法ですが最低限の措置としてログインページの表示を許可する接続元を自分を含む限定範囲に絞り、範囲外からの接続時にログインページを表示させないように設定することで、セキュリティを確保します。

編集者を特定するDNSホスト名を確認

まず編集者である自分自身を特定する情報として、インターネット接続時に使用しているDNSホスト名を確認します
さすがに今はインターネットに直接つないでいるパソコンは早々ないと思いますので、自分の使っているIPアドレスやDNSホスト名をWindowsのみで自力で確認するのはちょっと面倒だと思います。

今回は、Googleにて「接続元IPアドレス 確認」あたりのキーワードで検索した上位にヒットした、確認くんを使ってみました。
リンクを開くと表示される情報のうち、必要なのはクライアントホスト名の表示結果です。

ログインを許可する範囲を絞る

クライアントホスト名の値が例えば、aaa.bbb.co.jpだとして、次のように省略しただけ対応する範囲が広がっていきますので、許可設定するときに一番都合が良い範囲の表記を選びます。

  • aaa.bbb.co.jp
    すべて指定するとIP一つだけ許可する設定。
    プロバイダによって都度ホスト名(およびIPアドレス)が変わるようだと、aaaの部分が不定でありいずれ使えなくなる。
  • .bbb.co.jp
    ※先頭に”.”(ピリオド)がある点に注意。
    bbb.co.jpまで一致するすべてのホスト名が対象。都度ホスト名が変わっても一致させることが可能。
  • .co.jp
    ※先頭に”.”(ピリオド)がある点に注意。
    同上。一致する条件をより広範囲に広げることが可能。
  • .jp
    ※先頭に”.”(ピリオド)がある点に注意。
    同上。一致する条件を一番広範囲に広げる。

プロバイダが固定IPアドレスを提供する場合は最初のすべて指定するパターンが100点でしょう。
固定されてない場合はある程度範囲を広げたほうが無難だと思います。
また海外からの攻撃しか確認されてないなら、とりあえず.jpだけ指定するでも効果はあるはずです。

WEBサーバーの.htaccessに定義を追加

確認した許可範囲を使って次のようにWEBサーバーに設定をします。

設定するファイル

  • <WordPress Dir>/.htaccess
  • <WordPress Dir>/wp-admin/.htaccess

※<WordPress Dir>はWordPressをインストールしたディレクトリ。

設定として次に示すそれぞれの内容で保存。
ここで、★許可する範囲★に先ほど決めた範囲を記載します。

<WordPress Dir>/.htaccess

<WordPress Dir>/wp-admin/.htaccess

admin-ajax.phpは拒否設定によりWEBサーバーのエラーログに以下が出力されるようになったので許可に変更。
正しい設定についてきちんと調べたほうが良い気がする。

この定義がやっていること

  •  この設定の対象ファイル wp-login.php、および、wp-adminディレクトリ以下のすべてのファイル
  • 一旦すべての接続元を拒否する設定にする「Deny from All」
  • ★許可する範囲★に指定の自身の接続元のみ、再度許可する設定に戻す。「Allow from ★許可する範囲★」
  • 特定ファイルのみ指定する場合はFilesディレクティブでくくる。「<Files xxx>~</Files>」

.htaccessの設定マニュアルの該当箇所を抜粋

Filesディレクティブ

filename 引数は、ファイル名かワイルドカード文字列 で、ワイルドカードでは ? は一つの文字、* は任意の文字列にマッチします。
~ という文字を付加することで拡張正規表現を使うこともできます。
例えば、
<Files ~ “\.(gif|jpe?g|png)$”>
とすることにより、一般的なインターネットの画像フォーマットにマッチします。
ただし、 <FilesMatch> を使う方が 推奨されています。

一応正規表現にも対応しているようですが、難しいことをする場合はFilesMatchのほうが良さそうです。
今回は単純にログインページだけを指定したかったのでFilesでよいでしょう。

Orderディレクティブ

Order ディレクティブはデフォルトのアクセスの状態と Allow ディレクティブと Deny ディレクティブが評価される順番を制御します。

    • Deny,Allow
      Deny ディレクティブが Allow ディレクティブの前に評価されます。 アクセスはデフォルトで許可されます。
      Deny ディレクティブに合わないか、Allow ディレクティブに合うクライアントはアクセスを許可されます。
    • Allow,Deny
      Allow ディレクティブが Deny ディレクティブの前に評価されます。 アクセスはデフォルトで拒否されます。
      Allow ディレクティブに合わないか、Deny ディレクティブに合うクライアントはアクセスを拒否されます。
    • Mutual-failure
      Allowのリストに現れて、Denyのリストに現れないホストのみがアクセスを許可されます。
      この順番付けはOrder Allow,Denyと同じ効果を持ち、その設定の方が好ましいために非推奨となっています。

以下の例では、apache.org ドメインのすべてのホストはアクセスを許可されます。 他のすべてのホストはアクセスを拒否されます。

Order Deny,Allow
Deny from all
Allow from apache.org

 

動作確認

残念ながら自分自身のDNSホスト名は簡単に変えられません。
ここで出来るテストは.htaccessで指定する許可範囲を切り替えながら許可・拒否の動作を確認となります。

なおWEBサーバーの設定によっては、そもそも.htaccessへの記載項目に制限がかかっているがために本記事に書かれた設定ができない場合もあります。
そういう場合は、サーバーのサポートにセキュリティ確保のやり方を問い合わせるなどしないといけないのかもしれませんね。

変更暦

  • 2014/11/19:初版
  • 2014/11/24:攻撃対象がwp-adminディレクトリ以下にも及ぶらしいので、こちらも保護対象に追加。
  • 2014/11/27:wp-admin/admin-ajax.phpはアクセス出来ないとWEBサーバーのログにエラーが出始めたので許可。けど、正しい設定かちょっと心配。

レスポンシブ広告

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.

  関連記事

Visual Studio CodeでPHPファイルのフォーマッタを使う

突然ですが、最近Visual Studio Codeを使ってPHPアプリの開発に …

PowerShellスクリプトを動かすための設定

PowerShellは最近のWindowsで追加されたスクリプト言語で、今のWi …

SourceTreeのGit-Flow機能は納得の行かない動作をする

以前、こちらの記事(WindowsへGitとSourceTreeのインストール& …

GitHubへのWEBサイト作成用Markdown原稿をプレビューする環境をセットアップ

ソースリポジトリ管理サービスで一番有名であるGitHubにアカウントを取得後、G …

スマホやタブレットからパソコンを起動する

我が家のパソコンはリビングから離れた部屋にあるので、ちょっとした作業をするために …

EclipseのGradleプロジェクトでJMockitを使う設定をする

Javaの開発で使うツールと言えば、EclipseとJUNITは絶対にはずすこと …

Android Studioをインストール

せっかくタブレットをゲットしたので、勉強も兼ねてAndroidアプリ開発をはじめ …

WindowsへGitとSmartGit/Hgのインストール&セットアップ

SourceTreeは綺麗で使いやすかったのですが、Git-Flow機能がどうし …

WindowsへGitとSourceTreeのインストール&セットアップ

STINGERテンプレートへの独自の修正が多くなってしまったので、変更箇所の目的 …

ログインページの表示を自分だけ許可することでセキュリティ確保