MySQLのインストールセキュリティは、すべてのMySQLDBAが念頭に置いておくべきものです。 MySQLセキュリティ全体をどのように処理する必要があるかについては説明しましたが(以前の投稿のいくつか、特にMySQLセキュリティシリーズのパート1とパート2をご覧ください)、特定のセキュリティ関連の問題については説明していません。特権に関連する問題を含みます。ここでそれを行います。
MySQLの権限とは何ですか?
MySQLの権限をアカウントに付与できます。 MySQLでアカウント権限を付与する場合は、アカウントが実行できる操作を決定します。特権は、データベースまたはデータベースオブジェクト(テーブル、インデックス、ビューなど)のいずれかに付与できます。特権は動的または静的にすることもできます。静的特権はサーバーに組み込まれていますが、動的特権は実行時に定義できます。
MySQLセキュリティの権限を利用する方法
MySQLで特権を利用するには、次のことを覚えておく必要があります。
-
特権を割り当てたり取り消したりするには、MySQLユーザーが必要です。ユーザーは、CREATE USERクエリを実行して作成できます:
CREATE USER ‘demouser’@’localhost’ IDENTIFIED BY ‘password’;
-
特権を割り当てまたは取り消すには、それぞれGRANTステートメントとREVOKEステートメントを使用します。
GRANT ALL ON demo_db.* TO ‘demouser’@’localhost’; REVOKE INSERT ON *.* FROM ‘demouser’@’localhost’;
-
FLUSH PRIVILEGESを実行すると、特権を保存できます。 SHOWGRANTSを実行してそれらを表示します。
-
GRANTステートメントを使用して、特権と役割の両方を付与することはできません。ステートメントは、特権または役割のいずれかを付与する必要があります。
MySQLのインストールをより安全にするために、次のことを考慮してください。
-
ユーザーにタスクを実行するために必要な権限のみを付与します(たとえば、それが必要ありません)
-
一般に、MySQLをUnix rootユーザーとして実行することは避けてください。これは、FILE権限を持つすべてのユーザーが原因となる可能性があるためです。 rootとしてファイルを作成するサーバー。
-
管理者ではないユーザーにFILE権限を付与しないでください(上記の説明を参照)
> -
mysqldを通常の非特権ユーザーとして実行することを検討してください。
-
管理者ではないユーザーにPROCESSまたはSUPER特権を付与しないでください。 PROCESS特権により、ユーザーはMySQLで実行されているすべてのプロセスを表示できます。 SUPER特権は、特に、サーバー構成の変更を有効にし、CREATE SERVER、ALTER SERVER、およびDROP SERVERステートメントの使用を有効にし、KILLステートメントの使用を有効にして、ユーザーが他のアカウントに属するステートメントを強制終了できるようにします。 MySQLは、SUPER特権を持つユーザーのために追加の接続を予約していることに注意してください。 SUPER特権により、ユーザーはレプリケーションサーバーを制御することもできます。
上記のアドバイスに従ってください。そうすれば、より安全なMySQLインストールへの道を順調に進むはずです。ただし、新しいバージョンのMySQLを使用している場合は、もう1つ注意する必要があります。MySQLはMySQL8.0.16で役割を導入しています。
MySQLでの役割について聞いたことがない場合でも、心配しないでください。役割は特権と非常に似ているため、このブログ投稿に役割を含めました。実際、役割はまさにそれです。つまり、役割がユーザーに割り当てられると、ユーザーにはその役割に関連するすべての特権が割り当てられます。ロールは、CREATEROLEおよびDROPROLEステートメントを使用して追加および削除できます。 MySQLでロールを使用するには、ロール名を作成し、そのロールに特権を付与してから、次のようにユーザーに割り当てます。
CREATE ROLE [IF NOT EXISTS] ‘role_1’;
GRANT SELECT ON db_name.* TO user_name;
GRANT role_1 TO [email protected];
どのような特権を付与する必要がありますか?
特権を付与するときは、最小特権の原則に従ってください。MySQLアカウントには、その目的に必要な特権のみを付与する必要があります。最も一般的に使用される特権は次のとおりです。
-
アカウントにすべての特権を付与するすべての特権。
-
CREATEは、データベースとテーブルの作成に必要な権限を付与します。
-
DROPは、データベースとテーブルを削除するために必要な権限を付与します。
-
DELETEは、テーブルから行を削除するために必要な権限を付与します。
-
INSERTは、テーブルに行を挿入するために必要な権限を付与します。
-
SELECTは、SELECTクエリの実行に必要な権限を付与します。
-
UPDATEは、テーブルの行を更新するために必要な特権を付与します(UPDATEクエリを実行するため)
一般に、アカウントにすべての権限を付与することは避けることをお勧めします。代わりに、最小特権の原則に従うことを検討してください。また、特定のユーザーに追加の特権を付与しても、以前に設定されていた特権は削除されないことに注意してください。次の構文を使用して、特定のユーザーの特権を表示することもできます(ユーザー名をユーザーのユーザー名に置き換えます):
SHOW GRANTS FOR ‘username’;
MySQLで特権を処理するときは、最小特権の原則に従う必要があることに注意してください(つまり、必要な特権のみを付与する)。このブログで概説されているアドバイスに従うと、MySQLのインストールをより安全にするのに役立ちます。有効にするには、特権を保存する必要があることに注意してください(FLUSH PRIVILEGESステートメントはそれを行うのに役立ちます)。さらに、MySQL 8.0.16から、MySQLのロールを使用して特権のセットを特定のユーザー。
このブログ投稿がMySQLインスタンスの保護に役立つことを願っています。ご質問やご意見がございましたら、お気軽にコメントしてください。また、MySQLセキュリティシリーズ(こちらとこちら)をご覧になることを検討してください。