NginxでWPの管理画面だけクライアント認証をしてみる

セキュリティ。

WordPressをVPSで動かしてるとスパムコメントも気になるけど勿論ダッシュボードのセキュリティも心配だよね。

念には念を入れていてもいつアタックされるか分からない。

幸いにも今のところ不正ログインを試みた形跡は無いようだけれども以前他のところのWPで謎のアタックが行われたこともあるので…

SSLでクライアント認証するよ!

今回はConoHaのWordpressテンプレ、すなわちAmimotoを利用した環境を前提とする。

とりあえずオレオレ証明書を使用するので

が前提です。(そのまま設定するとリダイレクトループが起こったりすることがあります。そこは何とか先に頑張って。)

まずはクライアント認証ってどんな感じなの

多分SSL通信中にこんな手順を踏むらしい。

00260728-142433-51873934.jpg

.confを編集

クライアント認証を利用するためそれらの設定を追加します。

まず、ssl.default.confのssl_関連の設定のラストあたりに次を追加

ssl_verify_clientをoptionalにすることで証明書要求はしますが無くても400を返さずに通常ページは表示させます。(対応鍵を持ってる場合のみ選択ダイアログが表示される。)
これをonにするとhttpsでアクセスされた通常コンテンツも鍵がないと400返されてしまい見ることが出来なくなります。

次にlocationディレクティブを追加。

の直前に

とした。

が肝心。

ssl_verify_client optionalによってチェックされた結果は$ssl_client_verifyに入っているのでSUCCESSだったら認証成功って訳だね。

認証失敗してたら403エラーページを返してやり、成功してたらダッシュボードが返ってくる。

とりあえず設定が変更出来たら保存してservice restart nginx

設定できたかアクセスしてみる

ダッシュボードにアクセスしてみる。

クライアント証明書をインストールしていないと403エラーが表示される。

403 Forbidden

インストールしてあると証明書確認画面が出る。(ブラウザにより一度だけ(次回以降自動)や毎回等ある。)

IEの場合はこんなの。client_cert_c

承認してやれば管理画面が表示されるはず。(またはログイン画面)

今回は証明書とユーザーを紐づけてまではいないのでWPのログインは必要になるけどパスワード入力の二度手間は省けました。

なおWindowsの場合IEやChromeはシステムにインストールされた証明書を使用するけどFirefoxはブラウザ独自で証明書を管理しているので注意。
他のOSでも多分そんな感じ。

躓いた点とか

  • locationディレクティブを作ったはいいけどPHPに飛ばし忘れる事案。
  • ssl_verify_clientはlocationディレクティブ内には置けない(よく考えたら当たり前)

とりあえずなんと言っても特定のディレクトリだけクライアント認証必須にする日本語資料が全然見つかりません…(そのこともあってこの記事を書いた)

なお今回特定のlocationに対してクライアント認証をチェックすることに関してAuthenticating Users in Nginx Using Both User Password and Client Certificates | DoubleCloud => Private Cloud + Public Cloudという記事が一番参考になりました。Thanks!

コメントを残す