メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
デフォルトの MySQL インストールは、セキュリティよりもセットアップの容易さを優先しています。本番サーバーの強化とは、開発者のラップトップでは理にかなっていたものの、サーバーがアプリケーションやネットワークから到達可能になると不適切になるデフォルトを取り除くことです。

デプロイ環境ごとの強化

すべての強化ステップが同じリスクと手間のトレードオフを持つわけではありません。優先順位付けにはこの表を使ってください。 インターネットに面したとは、ロードバランサーの背後であっても、ポート 3306 がプライベートネットワークの外から到達可能であることを意味します。「必須」の行はすべて例外なく適用してください。 内部/プライベートネットワークは、VPC、プライベートサブネット、またはオフィスネットワーク内からのみアクセスできるサーバーを指します。一部の緩和策(CA 署名の証明書、すべてのアカウントでの SSL 強制)は、わずかな利益のために運用上のオーバーヘッドを加えます。しかし、強力なパスワード、最小権限、および bind-address の制限は依然として譲れません。 開発/ステージングのマシンは、資格情報漏えいの最も一般的な発生源です。パスワードの複雑さを省略したり、ホスト '%' への権限付与を残したりしてよいのは、そのインスタンスにラップトップや CI 環境の外から到達できない場合だけです。ステージングが本番データとネットワークを共有しているなら、最低でも内部/プライベートとして扱ってください。

mysql_secure_installation

ローカルの開発マシンでないサーバーに MySQL をインストールしたら、直ちにこれを実行します。
最も重要な強化ステップを順に案内します。
  • root パスワードの設定(まだ設定されていない場合)
  • 匿名ユーザーの削除
  • リモートからの root ログインの禁止
  • test データベースの削除
  • 権限テーブルの再読み込み
これらの 4 つのステップは、新規インストールで最も一般的な攻撃対象領域を取り除きます。

root アカウントの制限

root は localhost からのみ接続できるべきです。これを確認し、強制します。
root に '%' ホストのエントリがある場合は削除します。
リモート管理には、root をリモートで使う代わりに、ホストアクセスを限定した名前付きの DBA アカウントを作成します。

匿名ユーザーと test データベースの削除

パスワードポリシー

MySQL 8.0 以降には、パスワードの複雑さのルールを強制する validate_password コンポーネントが含まれています。使用前にインストールが必要で、mysql_secure_installation は自動でのインストールを提案します。手動でインストールするには次のようにします。
有効になっていることを確認します。
最低要件を設定します。
ポリシーのレベル: LOW(長さのみ)、MEDIUM(長さ + 文字種)、STRONG(+ 辞書チェック)。 忘れられる可能性のあるアカウントには、パスワードの有効期限を設定します。

最小権限のユーザーアカウント

アプリケーションのアカウントには、必要最小限の権限を与えるべきです。GRANT の完全な構文は MySQL のユーザー管理を参照してください。 一般的なパターンは次のとおりです。
ホストはできる限り厳しく制限します。'%' ではなく、サブネット表記または特定の IP を使ってください。

既存の権限の監査

すべてのアカウントとその権限を確認します。
使われていないアカウントは削除するかロックします。

SSL/TLS 接続

MySQL 8.0 はデフォルトで SSL/TLS を有効にし、起動時に証明書を自動生成します。有効になっていることを確認します。
特定のアカウントに SSL を必須にします。
クライアント接続が SSL を使っていることを確認するには次のようにします。
本番環境では、自動生成された自己署名証明書を、信頼できる CA の証明書に置き換えてください。

ネットワークアクセス

MySQL が必要なインターフェイスだけで待ち受けるように制限します。my.cnf で次のように設定します。
MySQL にネットワークから一切到達できないようにすべき場合(アプリケーションが同じホストにある場合)は、127.0.0.1 にバインドし、ポート 3306 を外部に公開しないでください。ファイアウォールのルールは第二の防御層であり、バインドアドレスの制限の代わりにはなりません。

危険な機能の無効化

アプリケーションが使わない機能はオフにします。
my.cnf では次のとおりです。

よくある質問

デフォルトの MySQL 8.4 のインストールは安全ですか?

古い MySQL のデフォルトよりは良いですが、本番環境向けに強化されてはいません。MySQL 8.4 はランダムな root パスワードを生成し、デフォルトで SSL を有効にします。それでも、root パスワードが強力であることの確認、匿名ユーザーの削除、ホストアクセスの制限、および validate_password コンポーネントの設定は必要です。

MySQL を root で実行すべきですか?

決してしないでください。MySQL は専用の低権限システムユーザー(通常は mysql)として実行すべきです。サーバープロセスを root で実行すると、MySQL の脆弱性がシステム全体の侵害につながる可能性があります。

トラブルシューティング

関連項目