そもそもの話
ノンプログラミングでWebサイトが構築できるWordPress。
そんな便利なWordPressですが、セキュリティ対策を怠ると思わぬセキュリティホールができてしまい、Webサイトが乗っ取られる可能性があります。せっかく構築したWebサイトが誰かに乗っ取られ、コンテンツを書き換えられたり、ウィルスをばらまかれたりしたら大変です。
このような事故を未然に防ぐためにも、セキュリティ対策はきちんと行う必要があります。
とは言っても何をやればいいかわからない方も少なくないかと思います。そのような方向けに、今回は私の頭の整理も兼ねてWordPressのセキュリティ対策をまとめてみます。(もしこの記事だけではよくわからないという方は専門家に相談することを推奨します)
まず何からやればいいの?
まずは簡単にできるけど効果の高そうな以下の対策をオススメします!
難易度は私の独断で設定したものである点、ご了承くださいませ。あとこの後ログインという言葉がたびたび出ますが、WordPressの管理画面へのログインを指しています。
項目 | 難易度 |
---|---|
ログインID、パスワードの複雑化 | ★☆☆☆☆ |
管理者と投稿者のアカウント分離 | ★☆☆☆☆ |
不要なプラグインの削除 | ★☆☆☆☆ |
WordPress本体やプラグインのアップデート | ★★☆☆☆ |
ログインID、パスワードの複雑化
攻撃者はWordPressの管理画面を見つけたら、世の中に出回っているログインID&パスワードのリストを使ってログインを試してきます。「私の設定したパスワードがまさか・・・」と思うかもしれませんが、単純なものや色々なサイトで使い回しているものは意外と出回っています。ですので、極力複雑なものを設定しましょう。
特に管理者権限を持つアカウントについては乗っ取られたらやりたい放題ですので要注意です。adminとかadministratorとかいかにも管理者っぽいログインIDは即対策しましょう。
ここで一点注意です。既存のアカウントのログインIDは変更できないので、新たにアカウントを作り直す必要がありますが、その場合記事の投稿者は忘れずに変更しましょう(アカウントを削除する場合にオプションとして既存の記事の投稿者の一括変更ができるようです)。
管理者と投稿者のアカウント分離
もし管理者が記事を投稿しているのであれば、管理者と投稿者でアカウントを分離することをお奨めします。なぜかというと投稿者のログインIDは簡単に調べることができるため、サイトを乗っ取られるリスクがより高くなります。投稿者権限のアカウントが万が一乗っ取られたとしても、できることは限定的であるためリスクはやや下がります。(不正な記事が投稿されてしまうので、当然ダメなんですけど)
ですので、もし現状アカウントが分離されていなければ、新たに管理者権限を持つアカウントを作成し、記事投稿に使用していたアカウントの権限を投稿者権限にしてしまうことをオススメします。
不要なプラグインの削除
使っていないプラグインがあれば忘れずに削除しましょう。プラグインに脆弱性がある場合、そこを突かれることがあります。
WordPress本体やプラグラインのアップデート
WordPressやプラグインの脆弱性が完全に無くなることはなく、日々開発者が脆弱性を修正するためのアップデートを行っています。ですので、アップデートは極力行いましょう。特にWordPressのような世界的に有名なOSSは脆弱性が発見されると瞬く間に周知のものとなるため、アップデートしないことは極めてリスクです。
ただし、アップデートすることで不具合が出る可能性はゼロでは無いため、事前にバックアップを取得したり、アクセスの少ないタイミングに実施した方がいいです。
他に何をやればいいの?
先ほど紹介した三点は即座に実行した方がいいですが、それだけで完璧なわけではありません。
そこで私が必要だと考えるセキュリティ対策を以下に列挙し、順に説明します。全て実行しないといけないわけではないですが、一つでも多く実行することでセキュリティリスクを軽減することができます。
項目 | 難易度 |
---|---|
ログインアラートの設定 | ★☆☆☆☆ |
ログインロックの設定 | ★☆☆☆☆ |
captcha認証の導入 | ★☆☆☆☆ |
二段階認証の導入 | ★☆☆☆☆ |
接続元IPアドレスを限定 | ★★★☆☆ |
ログインURLの変更 | ★☆☆☆☆ |
ユーザー名一覧のAPIを無効化 | ★★☆☆☆ |
Basic認証の設定 | ★★★☆☆ |
Webサーバ(Apache等)、PHPのバージョンを非表示に | ★★★☆☆ |
ファイアウォールの設定 | ★★★★☆ |
https化 | ★★★★☆ |
Webサーバ(Apache等)、PHP、OSのアップデート | ★★★★★ |
WAF(Web Application Firewall)の導入 | ★★★★☆ |
ログインアラートの設定
ログインした際に事前に設定したメールアドレスにログインしたことを通知することができます。ログイン日時、どのIPアドレスからのアクセスかが記載されたメールが届くので、心当たりの無いタイミングやIPアドレスからのログインの通知であれば要注意です。その場合は速やかにパスワード変更等の対応が必要になります。
こちらは「SiteGuard WP Plugin」というプラグインで簡単に設定できます。
ログインロックの設定
短時間で一定回数ログインに失敗した場合に接続元IPアドレスからのアクセスを一定時間ブロックできます。ログインを試そうとする攻撃者は一回ログインに失敗しただけで諦めることはありません。手元にあるリストを順番に試してきます。その際にこちらの設定が効いてきます。
こちらも「SiteGuard WP Plugin」というプラグインで簡単に設定できます。
captcha認証の導入
最近では多くのサイトで導入されている「ログインの時に画像の文字を入力してね」というアレです。人間の目で文字を読み取って入力しないといけないので、こちらを導入すればプログラムやツールを使っての機械的なログインをブロックすることができます。
こちらも「SiteGuard WP Plugin」というプラグインで簡単に設定できます。
二段階認証の導入
こちらも最近では多くのサイトで導入されています。captcha認証では機械的なログイン試行は防げますが、人間がログインを試した場合には突破される可能性があります。しかし、二段階認証を導入すればデバイスが手元に無い限りログインできなくなります。セキュリティレベルが大きく引き上がります。
こちらは「Two Factor Authentication」というプラグインで簡単に設定できます。
一点注意なのは、一般的にはデバイスを紛失時に備えてバックアップコードが発行されますが、先のプラグインではプレミアムプランにしないとバックアップコードが発行されないことです。
接続元IPアドレスを限定
管理画面にアクセスする場所のIPアドレス(ネットワーク上の住所のようなもの)が決まっている場合には接続可能なIPアドレスを限定してしまうのもありです。Webサーバで設定できますし、プラグインでも設定できます。
一点注意なのは、あくまでもIPアドレスが固定の場合のみに設定できる対策で、固定でない場合に設定しまうと、どこからも管理画面にログインできなくなってしまう恐れがあります。
ログインURLの変更
WordPressのログイン画面はデフォルトで決まっていますので、世界中誰でも簡単にログイン画面にアクセスできる状態になっています。そうすると、誰でもログインを試すことができてしまうので、ログインURLの変更は少なからず有効な策だと思います(厳密には一手間加えるとログインURLの特定はできるため完璧に隠蔽することは難しいですが)。
こちらも「SiteGuard WP Plugin」というプラグインで簡単に設定できます。
ユーザー名一覧のAPIを無効化
WordPressにはREST APIが実は搭載されており、API経由でWordPressのデータを取得することができます。これは便利な機能ですが、一歩間違えると第三者に自由にデータを取得されてしまうリスクがあります。特にWordPressのユーザー名の一覧をAPIを使って取得できてしまいます。
これの何が問題かと言いますと、ログインするにはユーザー名とパスワードの組み合わせが必要ですが、ユーザー名がわかってしまうだけで、不正アクセスされる確率が劇的に上がってしまいます。
もし気になる方は自身のWordPressに対して、そのAPIを実行してみてください。
https://[ドメイン]/wp-json/wp/v2/users
APIが無効化してあれば、このようになります。
{"code":"rest_disabled","message":"The REST API on this site has been disabled.","data":{"status":401}}
こちらの対策としてはいくつかやり方があるようですが、「SiteGuard WP Plugin」というプラグインで設定するのが個人的にはおすすめです。(直接、PHPプログラムを修正する方法もあるようですが、慣れない方が行うと意図せぬ障害を引き起こす可能性もあります)
またAPIを無効化することで一部のプラグインが使えなくなるケースもあるようですので、対策後はきちんとサイトの動作を確認することをおすすめします。
Basic認証の設定
Basic認証とはWebサイトに対して必要最低限の認証設定をかけることです。Basic認証を設定することで、管理画面に接続する手前で管理画面のログイン画面とは別にIDとパスワードの入力が必要になるので、セキュリティレベルは上がります。
しかし、Basic認証については脆弱性があり、http環境だと容易にIDとパスワードが盗まれてしまいます。ですので、Basic認証を設定するには後段のhttps化が前提となります。
Basic認証はプラグインでも設定できるという情報もありますが、Webサーバで設定するのが定石のようです。
Webサーバ(Apache等)、PHPのバージョンを非表示に
WebサーバやPHPのバージョンがHTTPヘッダーに出力されているWebサイト、意外と多いです。HTTPヘッダーは通常ブラウザでサイトを閲覧している際には存在に気付きませんが、ブラウザの機能で簡単に中身を見ることが可能です。バージョンを表示したままにしておくと、ソフトウェアのバージョンが古いままであること(本来、常に最新バージョンにしておくことが望ましいですが)、延いてはセキュリティへの関心が薄いことを世界中に発信してしまいます。こちらはWebサーバやPHPの設定ファイルで簡単に設定できます。
Apacheであれば、confファイルに以下の記述を追加あるいは変更します。
ServerTokens Prod
PHPであれば、設定ファイル(php.ini)に以下の記述を追加あるいは変更します。
expose_php = Off
上記を設定した上でWebサーバを再起動することでHTTPヘッダーにバージョンが表示されなくなります。
ファイアウォールの設定
ファイアウォールとはシステムの防御壁であり、不要な通信を拒否することでセキュリティレベルを向上できます。AWSやGCP等のクラウドサービスにファイアウォールのサービスがあったり、OSそのものにファイルウォールの機能があったりします。
ファイアウォールの設定についてはインフラに関する知識が必要ですので、設定を検討する場合はインフラエンジニア等の専門家に相談するのが良いかと思います。
https化
httpとhttpsの違いについて気にしない方もいるかもしれませんが、httpだと通信を盗聴することでログイン情報等の機密情報が盗まれる可能性があります。特にWordPressの場合、せっかくここまで色々とセキュリティ対策をしたとしても、https化していないと管理画面へのログイン情報が盗まれてしまい、管理画面に不正ログインされる恐れがあります。
ですので、ちょっと手間はかかりますが個人的にはhttps化を推奨します。https化するにはSSL証明書というものが必要で色々な種類のものがあります。WordPressを無料でhttps化する方法についてはこのブログの別記事で紹介しているので、参考にしていただければ。(ただし、このブログで紹介している方法については個人用サイトで使うことを想定)
Webサーバ(Apache等)、PHP、OSアップデート
Webサーバ、PHP、OS(WindowsやLinux)が古いバージョンのまま使い続けることはセキュリティリスクとなります。日々これらのソフトウェアについては脆弱性が無いか探索されており、脆弱性の情報がアンダーグラウンドの世界では売買されているようです。
対策の実施にあたってはインフラに関する知識が必要ですので、ファイアウォール同様、アップデートを検討する場合はインフラエンジニア等の専門家に相談するのが良いかと思います。
WAF(Web Application Firewall)の導入
前段で紹介したファイアウォールと名前が似ていますが、こちらはWebアプリケーションに対するファイアウォールです。Webアプリケーションの有名な脆弱性としてSQLインジェクションやクロスサイトスクリプティングがありますが、これらを使った攻撃をWebサイトの手前でブロックしてくれる仕組みです。導入さえしてしまえば、大抵の怪しい通信はブロックしてくれるので効果絶大です。
とは言っても、WAFも完璧では無いため、WAFの裏側にいるWebサイトのセキュリティレベルはきっちり上げておきましょう。
そしてWAFについては正常なアクセスもブロックしてしまうリスクもあるので、こちらも設定を検討する場合はインフラエンジニア等の専門家に相談するのが良いかと思います。
まとめ
ざっと私の方で思いつくWordPressのセキュリティ対策をまとめてみましたが、他にもセキュリティ対策があるかと思いますので、継続的にこちらのページは更新していきます。
そしてセキュリティについては、日々攻撃手法が進歩しており、攻撃者は24時間365日休むことなく攻撃を仕掛けてくるため、自分でできることは自分でやりつつ専門家に相談するのが良策ではないかと個人的には考えます。