
プラグインやテーマテンプレート自体にセキュリティ上の問題がある場合を除いて、
wordpressのセキュリティは、一般的に使われる安価な共有ホスティングサービスで使う場合、ユーザーができることは意外と少ない。
- インストール時にやること。
- テーブル名のプレフィックスを[ wp_ ] から [ 適当な文字列_ ]に変更する。テーブル名を分かりにくくするため。(標準のインストラーなら可能だけど、インストラーが別途用意されている親切なホスティングサービスでは変更できない時もある。)
- デフォルトのユーザー名を[ admin ]から別のものに変更しておく。
- Wordpressの最新状態の維持
- 本体、テーマ、プラグインの自動最新化
- 比較的新しいバージョンは標準で自動最新化が設定されているので、特に気にする必要なし。
- コメントのデフォルトでの無効化
- 管理画面のディスカッション設定で、「新しい投稿へのコメントを許可する」のチェックを外す。最近は、よっぽどメジャーなブログにならないと、コメントを残してくれる人はいないので、ほとんど支障は出ない。
- もしくは、Akismetプラグインを有効化する。
- 経験上、スパムの方が圧倒的に多いので、コメント無効化をしておいたほうが良いと思う。
- 本体、テーマ、プラグインの自動最新化
- セキュリティプラグインの利用(以下のような機能を持つものを導入する。以下の機能を全部でなくとも、2、3個は搭載しているものは探すと結構ある。)
- ログインの試行回数制限
- wp-admin関連フォルダへのアクセス制限
- 管理者ログイン画面のURI変更
- 二段階認証
- 画像認証
- 未使用のプラグインは、停止ではなく削除
- wp-config.phpへのアクセス制限(可能ならやったほうが良いけど、安価な共有ホスティングサービスではできないことも多い。)
- ファイルのパーミッションを400にする。
- .htaccessに以下を追加する。
-
1234<files wp-config.php>order allow,denydeny from all</files>
-
この他にも、CDNを使ったり、ホスティングサービスでWAFを使ったりと、やれることはあるけど、費用もそれなりにかかるので、上記4項目のうち、1と3は気をつけて能動的に対応したほうが良い。
そして本題。
意外と気づかれないけど、やるとそれなりに効果がありそうなものに、「ユーザー名を表示させない」というものがある。
一般的なログイン機能は、ユーザーIDとパスワードを照合して行う。
だから、パスワードは、秘匿性の高い複雑な文字列で、誰にも教えないってことが常識になっている。
でも、ユーザーIDまで気をつけている人は少ないし、それをなるべく秘密にしろという人もいない。
しかし、よく考えると、
- ユーザー名がわかり、パスワードのみが攻撃対象になるのと
- ユーザー名もパスワードも分からない状態で攻撃されるのでは、
2の方が、セキュリティが破られるリスクが格段に小さくなることがわかる。パスワードクラッキングに関してのみだけど、それなり効果が大きいと思う。
まあ、プロのクラッカーにかかれば、焼け石に水かもしれないが、少なくとも、スクリプトキディなどには十分有効かもしれない。
なので、以下をする。
- 管理画面のプロフィール設定で、作成者の表示を「ユーザ名」ではなく「ニックネーム」へ変更する。
- 小テーマを作って、single.phpなどをいじって、ユーザーIDが表示される部分を削除する。もしくは、このような機能を搭載するセキュリティプラグインを導入する。大概、以下のような関数を使っているので、これらを「 // 」でコメントアウトする。他の関数で表示されている時もあるが、記事ページを表示させて、そのHTMLソースにユーザーIDが含まれないかチェックしてみると良い。
- get_the_author
- the_author
- get_the_author_posts
- author.phpを、例えば以下のように編集する。これは、/?author=1とかで、ユーザーIDがバレるの防ぐためにやる。
-
123<?phpwp_redirect(home_url());exit();
-
- Disable Embedsプラグインを導入して、WordPress 4.4から導入されたoEmbedという機能を無効化しておく。oEmbedは、本来、他のブログ記事を埋め込み表示できるようにする目的の機能だけど、この機能で出力されるauthor_urlには、ユーザーIDが含まれている。それに、この機能は試験的に実装されたもので使っている人も現状はかなり少ないので無効化しても全く支障は出ない。
まあ、wordpress本体側が、基本的に、ログイン用のユーザーIDを全く出力しないで、ニックネームのみ表示してくれれば、こんな面倒はないんだが、・・・