アプリケーションのセキュリティについて言及するときはいつでも、インジェクション、認証の失敗、機密データの漏洩など、最も頻繁に発生する攻撃からアプリケーションを保護することを考えています。ただし、これらの攻撃は一般的ですが、アプリケーションを攻撃から保護する方法を知っているだけでは十分ではありません。特に、MySQLを実行している場合はそうです。今日は、セキュリティの別の側面を見ていきます。MySQLを適切に保護する方法を調べます。
MySQLのセキュリティは非常に重要であるため、この投稿をMySQLのセキュリティ対策に関する一連の投稿の始まりとして扱ってください。すべてを網羅するわけではありませんが、この投稿はMySQLのセキュリティ対策の基礎を提供するはずです。
MySQLを保護する必要があるのはなぜですか?
まず、MySQLを保護する理由についての質問に答える必要があります。結局のところ、最も一般的な脅威からアプリケーションを保護するのであれば、安全であるはずですよね?はい、いいえ。
特定の攻撃からアプリケーションを保護する場合、攻撃者がアプリケーションの防御に侵入するのに苦労することを確認します。ただし、データベースを保護するために、このような攻撃から保護すると、十分ではありません。データベースを保護することは、アプリケーション(およびデータベース!)を破壊から救うことができる最後の手段かもしれません。
さて、燃える質問に移りましょう。実際にMySQLをどのように保護しますか?
MySQLインスタンスのセキュリティについて考えるときは、考えられるさまざまなオプションを検討する必要があります。幸い、これらのオプションの一部はMySQLに限定されていないため、他のシナリオにも適用できます。一般的なことから始めましょう。
MySQLセキュリティ-一般
MySQLを保護するときは、ユーザーが実行する操作にセキュリティベースのアクセス制御リスト(ACL)を使用することに注意してください(アクセス制御リストは、オブジェクトに関連付けられたアクセス許可のリストです)。最も基本的なセキュリティの問題をいくつか処理する方法は次のとおりです。
- 最初のMySQLアカウントを保護します-これは非常に明白ですが、rootアカウントにパスワードがあることを確認する必要があります。ルートアカウントには、MySQLが最初にインストールされたときにパスワードがある場合とない場合があります。エラーログを確認してパスワードを確認し、必要に応じてより強力なパスワードに変更できます。他のすべてのアカウントにもパスワードが必要です。
- MySQLデータベース内にプレーンテキストでパスワードを保存しないでください。BCryptのような一方向のハッシュ関数を使用してください。
- mysqlデータベースのユーザーテーブルへのアクセスをユーザーに許可しないでください(rootユーザーは例外です)。
また、MySQLのアクセス制御とアカウント管理についてもよく理解してください。この主題はそれ自体で本全体に値しますが、知っておくべき基本的なことは次のとおりです。
- MySQLでのアクセスの制御;
- ユーザーの作成、変更、削除;
- MySQLが提供するセキュリティプラグインを一瞥します;
- MySQLバックアップを保護する方法を知っています。
MySQLのセキュリティに関する限り、バックアップもカバーする必要があります。
次に、これらの各オプションについてさらに詳しく見ていきます。
- 上記のように、rootアカウント以外のアカウントには、mysqlデータベースのユーザーテーブルへのアクセスを許可しないでください。
MySQLでのユーザーの作成、変更、および削除
MySQLでは、CREATEUSERクエリを実行してユーザーを作成できます。
CREATE USER ‘demouser’@’localhost’ IDENTIFIED BY ‘password’;
ALTERUSERクエリを実行することでユーザーを変更できます-このクエリを使用すると、アカウントのロックとロック解除、アカウントにSSLを使用した接続の要求、1時間あたりの最大接続数の確立、古いパスワードの破棄など、さまざまな操作を実行できます。自分のパスワードを変更できるクエリの例を次に示します。
ALTER USER USER() IDENTIFIED BY ‘password’;
DROPUSERクエリを実行してユーザーを削除できます:
DROP USER ‘demouser’@’localhost’;
MySQLのユーザーとの間での権限の付与と取り消し
GRANTステートメントは、特権または役割のいずれかを付与する必要があります。 ONステートメントは、特権または役割が付与されるかどうかを通知できます。次のクエリは特権を付与します:
GRANT ALL ON demo_db.* TO ‘demouser’@’localhost’;
次のクエリは役割を付与します:
GRANT ‘demo_role’ TO ‘demouser’@’localhost’;
GRANTはクエリOKで応答する必要があり、0行が影響を受けます。
ユーザーから特定の特権を取り消すには、REVOKEステートメントを使用します(アカウント名のホスト名部分はデフォルトで「%」になります):
REVOKE SELECT ON *.* FROM ‘demouser’@’localhost’;
すべての特権を取り消すには、REVOKE ALLを使用できます:
REVOKE ALL PRIVILEGES ON *.* FROM ‘demouser’@’localhost’;
FLUSHPRIVILEGESを発行することをお勧めします。上記の手順を実行した後のステートメント。
- 割り当てられている特権を確認するには、SHOWGRANTSを発行します。ステートメント。
- サーバーは、発行されるすべての要求について、実行する操作を決定し、ユーザーの特権が問題の操作を実行するのに十分かどうかを確認します。
- サーバーは、mysqlデータベースのuserテーブルとdbテーブルを使用して、アクセス制御を確保します。
残りのオプションについては、今後の投稿で取り上げます。
MySQLのセキュリティに関する限り、非常に幅広いオプションから選択できます。オプションには、ほとんどすべてのアプリケーションに適用できる基本的なセキュリティ対策が含まれていますが、一部のオプションはMySQLに固有のものです。利用可能なオプションのすべてがまだカバーされていないことに注意してください-それらはMySQLセキュリティシリーズの次のエディションでも議論されるでしょう。