情勢的にやらざるを得ない
昨今、セキュリティインシデントが多発する世の中で、昔から不正アクセスの標的とされてきたWordPress君、こやつのセキュリティ対策をバッツリやってみようと思いあれこれ実施してみました。という名の備忘録です。
環境
サーバー | さくらのVPS メモリ1Gプラン@石狩 |
仮想マシン | kusanagi 9 |
Webサーバー | nginx |
PHP | 8.3.x最新版 |
実施した対策
SiteGuard WP Pluginの導入
WP界隈でわりとメジャーなSiteGuardプラグインを導入しました。
SiteGuardプラグインはインストールするだけで大体の主要な対策が実装できます。が、プラグイン自体はApache(htaccess)を使う前提だったりするので、nginxだと全ての機能を有効化することはできません。とはいえ、nginxでもある程度の機能は動きますのですごく有用なプラグインです。
私は本プラグインの機能のうち以下の機能を有効化しています。
・画像認証
・ログイン詳細エラーメッセージの無効化
・ログインロック
・ログインアラート
・ユーザー名漏えい防御(REST API無効化も併せてON)
・更新通知
・(ログイン履歴)
XMLRPCの遮断
SiteGuardプラグインのログイン履歴を見ると、ほぼ毎日のようにXMLRPCによる不正アタックが大量に記録されていました。
こんだけ毎日毎日アタックされまくりのログが残るのは流石に気持ち悪く、私はXMLRPCの機能を使わないので一律ブロックしてしまいたいのですが、、、、
SiteGuardプラグイン標準機能のXMLRPC防御は、nginx環境においてはそのままではONにできません。
nginxの場合、手動でコンフィグファイルを編集し、サーバー側でXMLRPCのアクセス自体を一律拒否する形で対応します。
kusanagi 9でnginxを導入した場合
サーバーにSSH接続し、root権限のあるユーザーで以下作業を行います。
#configファイルの場所まで移動
cd /etc/opt/kusanagi/nginx/conf.d#viを使ってますが編集保存できればなんでも
#xxxxにはプロファイル名が入ります
vi xxxx.wp.inc#同じようなlocationディレクティブが並んでいるので以下を新規追加
location ~* xmlrpc\.php$ {
deny all;
return 404;
}
returnとしてひとまず404を返していますが、ネット上では444だったり403だったり返している人もいます。何が良いのかちょっとまだよくわかっていないので、とりあえず404のままで様子を見ています。また、そのうちログにも出力させずに闇に葬る系の設定も追加しようと思います。
nginxでステータス444は即座にコネクションを切断して何も返さない仕様との事。もしかすると444の方がいいのかも・・・
対策の結果、対策後からSiteGuardプラグインのログイン履歴にXMLRPCの不正アタックログは、当然のことながらゼロになりました。
Google Authenticatorプラグインの導入
スマホアプリを使ってワンタイムパスワードによる2段階認証を有効化するプラグインです。
元々このアプリは仕事の案件でも使っていましたので導入してみることにしました。
ログインがちょっと面倒になるのですが、セキュリティを高めるには単純に要素を増やして手数を増やすのが一番手っ取り早いので導入してみました。
導入自体は簡単で、プラグインの画面の指示に従うだけで完了でしたので手順は省略。
現在、WordPressにログインするには、
・ユーザー
・パスワード
・画像認証のひらがな
・Google Authenticatorで生成したワンタイムパスワード
の4つを入れる必要があります。ちょっと面倒ですけど仕方がない。
WordPress管理画面へのIPアドレス制限
地味な対策ですが、管理画面へのアクセスは所定のIPアドレス以外弾く設定にしました。
kusanagi 9では、標準で管理画面へのIPアドレス制限の雛形が用意されていますので、configファイルをちょこっと書き換えるだけでお手軽に実装可能です。
詳細は以下のURLの2-1 Nginxのアクセス許可IPアドレス設定」を参照。
なお、我が家のインターネッツプロバイダはソフトバンク光なのですが、契約時から今までIPアドレスが一生変わっていません。どうやらONUやBBユニットのコンセントをぶち抜いて再起動するとIPアドレスが変わるようですが、もう4年ぐらいコンセント差しっぱなので実質的な固定IPとなっています。
kusanagi標準のセキュリティ施策
先にも記載したkusanagi公式のセキュリティ施策をできる限り一通り実施しています。URLがkusanagi 8になっていますが、多分9でも有用だと思います。
サーバー側でのSSHポートのIP制限
さくらのVPSのコントロールパネルから、サーバーにSSHする際のIPアドレスも制限しました。基本的に自宅からしか接続しないので。
さくらのVPSでのIPアドレス制限(パケットフィルター)設定の注意点としては、「フィルターの要素」のプルダウンにデフォルトで用意されているSSHを選択した場合、IPアドレス制限の設定不可となります。
追加方法としては、新たなフィルター行を追加した上で、「フィルターの要素」プルダウンをカスタムで登録します。その後、22番ポート(標準の場合)を指定し、所定のIPアドレスを条件に加えて登録する必要があります。
普段よく触っているAWSの場合は、既存で用意されているSSH等の設定にIPアドレス制限を追加できるので、ここが微妙に詰まったところでした。
パスワードを最強に
パスワードは、システムが許す限りの最大桁数&全文字を織り交ぜた最強強度のパスワードを設定しています。これはWordPressに限らず、パスワードが必要な全てのサイトで心がけるようにしています。
そのうちやりたい
管理画面へのログインURLを異なるURLに変更するのもセキュリティ対策で有用です。
これもSiteGuardプラグインの機能としてついているのですが、nginxだとそのままでは使用できません。
ログインURLの変更自体、普段のお仕事の案件でもよく対応していますし、functions.phpをちょろっとカスタマイズすればいいだけなのはわかっているのですが、めんどくさいので放置しています・・・
コメント