MySQLのパスワードをrootにしてると危ないよって話
はじめに
以前から色々と検証するためのレンタルサーバーを借りているのですが、その中で動かしていたMySQLコンテナのデータがなぜか全消滅するという事象が起こっていました。
てっきり借りているサーバーの性能が低いため、こういったことが起こっているのだと思っていたのですが、しっかり不正アクセスを受けていたので、懺悔と啓蒙のためにこの記事を書くことにしました。
攻撃を受けた結果
mysql> SHOW DATABASES;
+---------------------+
| Database |
+---------------------+
| Z_README_TO_RECOVER |
| information_schema |
| mysql |
| performance_schema |
| sys |
+---------------------+
5 rows in set (0.00 sec)
追加した覚えのないデータベースが追加されている..🤔
mysql> USE Z_README_TO_RECOVER;
Database changed
mysql> SHOW TABLES;
+-------------------------------+
| Tables_in_Z_README_TO_RECOVER |
+-------------------------------+
| RECOVER_YOUR_DATA |
+-------------------------------+
1 row in set (0.00 sec)
嫌な予感が...😟
mysql> SELECT * FROM RECOVER_YOUR_DATA;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| text |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| All your data is a backed up. You must pay 0.26 BTC to 13RTLWsodBJwxr93F7cfVwKg1a4JktE1XS 48 hours for recover it. After 48 hours expiration we will sell all your data on dark markets and the database dump will be dropped from our server! |
| You can buy bitcoin here, https://localbitcoins.com or https://buy.moonpay.io/ After paying write to us in the mail with your DB IP: rambler+2qqz5@onionmail.org and you will receive a link to download your database dump. |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
うわぁあああ不正アクセスだった😂
意訳すると、「君のデータはバックアップしてあるよ、48時間以内に0.26BTC(執筆時約75万)を指定のウォレットに振り込んでね🙏、48時間がすぎると、ダークマーケットで全部のデータを販売しちゃうよ😘ビットコインは指定のサイトで買えるよ、支払い終わったら、DB IPを書いたメールよろ💌、バックアップをダウンロードできるリンクを送るわ😎」
というわけで、人生初不正アクセスにあってしまいました🥺
原因
当該のMySQLコンテナのDocker設定は以下の様になっていました。
設定
mysql:
image: 'mysql:8.0'
container_name: 'mysql'
environment:
MYSQL_ROOT_PASSWORD: ${ROOT_PASS}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASS}
TZ: ${TZ}
volumes:
- mysql-data:/var/lib/mysql
- ./tmp/mysqld:/var/run/mysqld
- ./mysql/db/my.cnf:/etc/mysql/conf.d/my.cnf
- ./mysql/db/sql:/docker-entrypoint-initdb.d
ports:
- ${DB_PORT}:3306
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# MYSQL 環境変数
# ---------------------------------------------------------------------------------
ROOT_PASS=root
DB_USER=keiba
DB_PASS=pass
DB_PORT=3306
DB_NAME=keiba
TZ=Asia/Tokyo
# ---------------------------------------------------------------------------------
原因
やらかしポイント1 「パスワードがroot」
今回アクセスされた一番の原因はタイトルにも書いた様に、パスワードがrootであったからでしょう。
私もさすがに、パスワードをrootにして本番環境を運用することはないですが、こういう雑に環境を立ち上げた時は気をつけないと今回反省しました。
実際、ネット上のDockerを解説したサイト見てると、rootをパスワードにしているものが結構ありました。
確かに、ローカル上のDockerで運用する場合はそこまで危険性はない(ファイアーウォールをいじってなければ)のですが、主に初めてサーバー運用をする方などが、ローカルPC上の脆弱な設定ファイルをそのままコピペしてサーバー上で実行してしまうと今回の様なことが起こり、惨事となることが十分考えられると思いました。
というわけで、皆さんは普段からある程度安全なパスワードを設定しましょう。
やらかしポイント2 「ポートの番号が3306」
上記のパスワードが脆弱であったことが最大の原因ではありますが、もう一つ原因として考えられるものとして、ポート番号がデフォルトであったことが挙げられます。
通常、攻撃者はよく知られているサービスのポートに対して攻撃を行います。
よく「ポート番号を変えるだけではセキュリティー上意味がない」と言われることが多いですが、これは半分正しく半分間違っているといえます。
確かに、時間をかければポートを特定する事は難しくないです。
しかし攻撃者が「私の様な」脆弱なパスワードが設定されているサーバーを場当たり的に攻撃している場合はよく知られたポートにのみに対して通常攻撃を行います。
そのため、ポート番号を変えておくだけで今回の様な不正なアクセスは防ぐことが可能です。
しかし、例えばあなたが、不正アクセスを行う価値があるサービスを運営している場合、攻撃者は「nmap」などを用いて全てのポートに対してスキャンを行いどこのポートが空いているかを確認するため、ポートを変えるだけでは意味がないというのも正しくもあります。(ただし、時間稼ぎができる)
私としては、やっておいて損はないと思うので是非皆さんはポート番号を変えておくことをお勧めします。
まとめ
他人または自分の作った、Dockerの設定ファイルを脳死でコピペしてくると今回の様なことが起こるということがわかり、今後は気をつけようと思います。
特に、以下の2つ
- パスワードを安全なものにする
- ポート番号は変える
というのは特に意識して、今後に活かしたいと思います。
私と同じ轍を踏まない様に、皆さんもお気をつけください👋
Discussion