9月にコンテンツをすべて消されるという被害に遭ってから閉鎖していたA-tak.comを復旧しました。
目次
何が起きていたのか
WordPressがクラッキングにあってコンテンツ全消しされた | A-tak-dot-com
消されたときの状況は上記のページの通り。
一旦は復旧させたのですが、その後もしつこくコンテンツを消されてしまったので、一旦閉鎖していました。
とりあえず再構築
私もだいぶ詳しいつもりですが、ログとか見ても原因がさっぱりわからん。消されたときの状態は保存してあるので調べる事はできるのですが、いかんせん時間がね…。
そんなこともあって、再構築することにしました。前まではKubernetesで稼働させていたのですが、なぜかNFSをマウント出来なくなってしまって、もう面倒なのでKubernetesは一旦封印する事にしました。面倒だけどDockerfileに頼らずはじめから環境構築です。
セキュリティの強化
原因がわからない中で対策もなにもない気はしますが、考えられるセキュリティ対策は全て実施しました。
パーミッションの適正化
Linuxサーバーの基本中の基本。ファイル単位に所有者、グループ、その他のユーザーが読み・書き・実行を許可するかを設定するものですね。
今までNFS経由でファイルにアクセスすると、なぜか書き込みが出来なくてフルアクセスの権限与えてたのよね😅
chmod 777 みたいなね。
これはさすがにイマイチだったし、構成変更でNFSもやめたので、きっちり最低限の権限にすることにした。
WordPress の安全性を高める – WordPress Codex 日本語版
ここを参考に設定した。
NFSを止めた
今までフロントのWebサーバーから後ろにあるファイルサーバーにWordPressのコンテンツを取りに行くような構成になっていたので、ファイル共有の仕組みとしてNFSを使っていました。
外からのアクセスは許可していないつもりなんだけど、コンテンツのフォルダ丸ごと削除されているので、もしかしてNFSが外見えしてたというとんでもないミスがあった可能性もあるので止めた。ファイルが消えていくのをリアルタイムで見た事もあるんだけど、直接コマンド実行されているような気がするんだよな。
SELinux導入
SELinux導入した。
これはパーミッションよりもより細かくセキュリティ設定が出来る仕組みで、プロセス(プログラム)やリソース(ファイルとか通信とか)毎に細かく許可を与える事が出来るので、使う機能だけ最低限許可してセキュリティを高める事が出来る。
今までまともに使った事ないので相当苦労するかと思いきや、案外すんなりできた。
「SELinuxのせいで動かない」撲滅ガイド – Qiita
ここを参考にさせてもらった。今までわけのわからんログしか出さないから全く理解できなかったSELinuxだけど、ちゃんと設定できた。
SELinuxが働くということは、もう半分侵入されかけてるんだけど、セキュリティは何重にもして置いた方が安心だからね。
WAF導入
Webアプリケーションに脆弱性はつきもの。WordPressも良く見つかってます。もし脆弱性突かれたとしても、怪しげな通信を止めてくれるのがWAF(Web Application Firewall)。
Apacheを使っていたときはMod Securityを導入していたけど、Nginxにしてからは簡単に導入できない事もあってWAFは使ってなかった。
今回、NginxのWAFモジュールであるNaxsiを導入した。こいつがなかなか敷居が高くてソースからビルドしないといけないわ、ElasticSearch入れてホワイトリスト作らないといけないわで、なかなか面倒。
最初はDockerで構築するつもりだったからAlpine Linux入れてソースからビルドするDockerfileまで作ってたからそれで余計に時間が掛かったのだけど。
NginxのWAFモジュールのNaxsi(naxsi-0.54)をインストールしてみた – Qiita
こちらに書いてある通りでなんとか出来た。いろいろ引っかかったところはあるので、そのうちブログにポストしようと思う。
改ざん検知導入
Aideという改ざん検知ツールを入れた。インストールなどは冒頭のリンク参照。
これは定期的にサーバーのファイルが変更されていないかをチェックして、変更されていたらメールでお知らせしてくれるというもの。
まぁ、変更されている時点で、もう侵入されちゃってるので後の祭りだし、前回もファイル前消しされた後にメール来て気づいたという感じで、今後バックドアとか仕掛けられたら気づけるかな?という程度です。
とりあえず様子見
正直、原因がわかってないので対策できてる感はないが、しばらく様子見ようかと思う。しかし、なんだろなーDockerなのかNFSなのか、それとも別の問題なのか。