私は自分の個人サイトをはじめ、仕事でもWordPressサイトを運用している。WordPressは気軽にサイトを立ち上げられてカスタマイズも簡単な、素晴らしいオープンソースなのだが、世界中で使われまくっているその知名度ゆえに、セキュリティ面ではやや脆弱な部分も多いと云われている。とはいえ、基本的に管理者設定をしっかりして、活性化している公式のテーマやプラグインを使っている分にはそうそう安全性が低下することはない。無論、インストール時の管理者設定をテキトーにしたまま、本番運用を開始してしまったサイトなどは論外だ。
WordPressで作られたサイトはみな一様に同じファイルとディレクトリ構成となり、データベースのテーブル構造もシンプルなため、サイトを攻撃する側からすれば、かなり攻撃がし易いWEBサイトであることは想像に難くないだろう。まぁ、これはWordPressだけに限った話ではなく、オープンソースのCMSやフレームワークで作成されているすべてのWEBサイトに云えることではあるのだが……。
実際、WordPressサイトを運営していて、不正なログインの痕跡をログで出してみると、デフォルトのログイン画面である wp-login.php
には毎日のように管理画面へのログインを試みた形跡が大量に出力されている。ほとんど知名度のない個人サイトでもそれらの不正アクセスが散見されるので、コーポレートサイトやサービスサイト等をWordPressで運営しているとその量は膨大になるだろう。デフォルトのWordPressはログイン制御部分に不正アクセスを抑止するような機能を持っていないので、管理者パスワードをいくら強固に設定していたとしても、高度化する総当たり攻撃を受け続けると、いつかは認証を突破されてしまうのではないかと不安を憶える人もいるのではないだろうか(私がそうだ)。
また、世のWordPress建てのWebサイトには、ログイン画面である /wp-login.php
へのアクセス制限を設けていないものが多い。サイトのドメイン直下にアクセスして、ブラウザURL欄に /wp-login.php
と入力すれば、簡単にログイン画面が表示されてしまうサイトが溢れているのだ。これでは「どうぞ攻撃してください」と、悪意ある訪問者に門戸を開いているのと大して変わらない無用心さだ。もし /wp-login.php
へのアクセス制限を設けていたとしても、その後リダイレクトされて401エラーとか表示されれば、そのサイトはWordPress建てであることがモロバレだし、ページのHTMLソースを読まれてCSSやJSの読み込みパスに /wp-content/
なんて含まれていたら、ここもWordPressサイトなんだな、と悟られてしまう。
別に、WordPress建てのサイトだと見破られて、仮に攻撃を喰らったとしても、そうそう簡単に認証突破・管理画面陥落・サイト乗っ取りなんて状態にはならないのだが、私個人的には何か「負けた」感じがして心穏やかでないw
そこで今回、WordPressサイトから「WordPress臭さ」を極限まで除去して、WordPressで作られたサイトであることを簡単には気づかせない、かつセキュリティ的にも堅牢で、それでいてコアやプラグインなどのアップデートにも通常通り追従していけるWebサイト、ってモノをどこまで構築できるかチャレンジしてみようと思い立った次第だ。
実際のチャレンジは段階的に記事にしていく予定である。
インベントリ
- 第1章 WordPressのインストールで差をつけろ!
- wp-config.php の初期設定
- wp-content ディレクトリの変更
- プラグインディレクトリの変更
- テーマディレクトリの変更
- uploadsディレクトリの変更
- WordPress関連ファイルへのアクセス制限
- 第2章 脱WordPress式テーマのカスタマイズ
- テーマの独自拡張のコツ
- テーマ名とテーマディレクトリパスを秘匿化する
<head>
要素のクリーンアップと秘匿化- wp-includesとwp-adminディレクトリの秘匿化
- ページ内読み込みリソースを最適化する
- Twentyシリーズテーマ固有のフッターやメタ情報の最適化
- 第3章 WordPressのプラグインを隠蔽せよ
- プラグインの選別が重要
- Jetpackプラグインを隠蔽する
- プラグインのハッシュ化ツール
- プラグイン秘匿化の手順・まとめ
- 第4章 WordPressの登録・認証系の秘匿化
- wp-login.phpの存在を消す
- 新たなログイン用URLを作る
- WordPressの固定ページとして新しいログイン画面を作る
- Cookieの秘匿化
- 第5章 さらなるWordPress秘匿化への道(仮)
- REST APIの制御(仮)
- 投稿者リストの非表示化(仮)