MySQL 入門

MySQL ユーザー権限管理

MySQLにおけるアクセス制御は、GRANT および REVOKE ステートメントによって管理されます。これらのコマンドは、特定のユーザーアカウントがデータベースオブジェクトに対して実行可能な操作を厳密に規定し、ユーザーが業務を遂行するために必要な最低限のアクセス権のみを保持することを保証します。この原則は「最小権限の原則(Least Privilege)」として知られています。

1. GRANT による権限の付与

GRANT ステートメントは、ユーザーアカウントに特定の権限を割り当てるために使用されます。権限を付与する際は、スコープ(グローバル、データベースレベル、またはテーブルレベル)と、ユーザーが接続するホストを明示する必要があります。

基本的な構文は以下の通りです:

GRANT [権限] ON [データベース].[テーブル] TO '[ユーザー]'@'[ホスト]';

1.1 詳細なアクセス制御(細粒度コントロール)

広範な権限を付与することも、高度に制限された権限を付与することも可能です。例えば、アプリケーションユーザーに対して world データベースへの読み取り操作のみを許可する場合、次のように記述します。

-- 'world' データベース内のすべてのテーブルに対して SELECT アクセスを許可
GRANT SELECT ON world.* TO 'app_user'@'localhost';

デベロッパーに対してデータの変更は許可するが、テーブルの削除は禁止したい場合は、カンマ区切りで複数の権限を指定できます。

-- データの操作(DML)およびテーブル構造の変更(ALTER)を許可
GRANT SELECT, INSERT, UPDATE, DELETE, ALTER ON world.* TO 'dev_user'@'localhost';

1.2 管理者権限

特定のデータベースに対して、テーブルの作成やインデックスの管理を含む完全なコントロール権限が必要な場合があります。その際は ALL PRIVILEGES キーワードを使用して、すべての標準権限を付与できます。

-- 特定のデータベースに対する完全なコントロール権限を付与
GRANT ALL PRIVILEGES ON world.* TO 'admin_user'@'localhost';

注意: GRANT コマンドを実行した後、変更内容が既存のセッションに即座に反映されない場合があります。その場合は FLUSH PRIVILEGES; を実行して権限テーブルを再ロードしてください。ただし、DCL(データ制御言語)ステートメントについては、通常 MySQL が自動的に処理します。

2. REVOKE によるアクセス権限の剥奪

REVOKE ステートメントは、以前に付与された権限を取り消すために使用されます。構文は GRANT と対応していますが、アクセス権を追加するのではなく、剥奪する役割を持ちます。

デベロッパーに ALTER テーブルの権限が不要になった場合は、その特定の権限のみを削除します。

REVOKE ALTER ON world.* FROM 'dev_user'@'localhost';

ユーザーアカウントは維持したまま、そのユーザーのすべての権限を削除したい場合は、ALL PRIVILEGES を使用します

REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'app_user'@'localhost';

3. 権限の階層

MySQLは権限を階層的に評価します。権限を付与する際、ユーザーがアクセスできるデータの「広さ(スコープ)」を定義することになります。

  • グローバルレベル (Global Level): *.*
  • データベースレベル (Database Level): db.*
  • テーブルレベル (Table Level): db.table
  • カラムレベル (Column Level): db.table.column

詳細な説明は以下の通りです:

  • グローバル権限: サーバー全体に適用されます。このレベルで GRANT OPTION を付与すると、ユーザーは自分の権限を他者に譲渡できるようになります。
  • データベース権限: 特定のデータベース内のすべてのテーブルに適用されます。
  • テーブル権限: 特定のテーブル内のすべてのカラムに適用されます。
  • カラム権限: 特定のカラムに適用されます(例:name カラムへの SELECT アクセスは許可し、salary カラムは非表示にする、といった制御が可能です)。

4. スコープとセキュリティ上のリスク

アクセス権限を付与する際は、常にホストを明確に指定してください。ホストにワイルドカード % を使用する(例:'user'@'%')と、そのユーザーはあらゆるマシンから接続可能になります。これは一般的なセキュリティ脆弱性の原因となります。可能な限り、ホストは特定の IP アドレスまたは localhost に制限してください。

ユーザーが現在保持している権限を確認するには、SHOW GRANTS コマンドを使用します。

SHOW GRANTS FOR 'dev_user'@'localhost';

このコマンドは、ユーザーの現在のセキュリティステータスを定義する正確な SQL ステートメントを返します。これはアクセス権限をオーディット(監査)するための最も信頼できる方法です。