MySQL道普請便り

第69回 MySQLの権限レベルについて

この記事を読むのに必要な時間:およそ 3 分

MySQLではGRANTステートメントを使用して,ユーザに対して権限を付与することができます。MySQLの場合は管理者用の権限や特定のカラムに対してのみのSELECT権限などGRANT文で細かい粒度に分けて設定できます。今回はこのような権限レベルついて紹介いたします。GRANT文でいうON *.*の部分が主な話となります。

権限レベル

権限レベルには主にグローバル権限,データベース権限,テーブル権限やカラム権限が存在します。これらをそれぞれ説明します。

グローバル権限

グローバル権限は管理者用のための権限です。GRANT構文のON *.*と記述します。

GRANT ALL ON *.* TO 'user'@'localhost';

権限情報はmysqlデータベースのuserテーブルに格納されます。

mysql> SELECT user, host, Select_priv FROM mysql.user WHERE user='user';
+----------+-----------+-------------+
| user     | host      | Select_priv |
+----------+-----------+-------------+
| user     | localhost | Y           |
+----------+-----------+-------------+

データベース権限

データベース権限は,指定したデータベース内のすべてのオブジェクトに適用されます。GRANT構文のON dbname.*と記述します。

GRANT ALL ON userdb.* TO 'user'@'localhost';
GRANT SELECT ON userdb.* TO 'user'@'localhost';

権限情報はmysqlデータベースのdbテーブルに格納されます。

mysql> SELECT user, host, Select_priv FROM mysql.db WHERE user='user';
+------+-----------+--------+-------------+
| user | host      | db     | Select_priv |
+------+-----------+--------+-------------+
| user | localhost | userdb | Y           |
+------+-----------+--------+-------------+

また,データベース権限ではワイルドカードを指定することができます。その場合はバッククォートで囲み,ワイルドカード文字「%」を使用します。

GRANT SELECT ON `%`.* TO 'user'@'localhost';
GRANT SELECT ON `shard%`.* TO 'user'@'localhost';

1つ目の例はすべてのデータベースに対してSELECTを許可します。2つ目の例はshardという文字列に前方一致したデータベースに対してSELECTを許可します。

また,例文にてALLと指定していますが,これは対象の権限レベルに属するすべての権限を付与します。よって,グローバル権限でのALLとデータベース権限でのALLは違います。たとえば,SUPERSHUTDOWNなどは管理者権限ですので,データベース権限のALLでは付与されません。

どの権限がどの権限レベルに属するかは,マニュアル:[13.7.1.4 GRANT 構文]⁠MySQLによってサポートされる権限⁠をご参照ください。MySQL上からは権限情報を管理するテーブルをDESCしてフィールドを確認することで,設定可能な権限を推測することができます。

mysqlデータベースのdbテーブルの例
mysql> DESC mysql.db;
+-----------------------+---------------+------+-----+---------+-------+
| Field                 | Type          | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host                  | char(60)      | NO   | PRI |         |       |
| Db                    | char(64)      | NO   | PRI |         |       |
| User                  | char(16)      | NO   | PRI |         |       |
| Select_priv           | enum('N','Y') | NO   |     | N       |       |
| Insert_priv           | enum('N','Y') | NO   |     | N       |       |
| Update_priv           | enum('N','Y') | NO   |     | N       |       |
| Delete_priv           | enum('N','Y') | NO   |     | N       |       |
| Create_priv           | enum('N','Y') | NO   |     | N       |       |
| Drop_priv             | enum('N','Y') | NO   |     | N       |       |
| Grant_priv            | enum('N','Y') | NO   |     | N       |       |
| References_priv       | enum('N','Y') | NO   |     | N       |       |
| Index_priv            | enum('N','Y') | NO   |     | N       |       |
| Alter_priv            | enum('N','Y') | NO   |     | N       |       |
| Create_tmp_table_priv | enum('N','Y') | NO   |     | N       |       |
| Lock_tables_priv      | enum('N','Y') | NO   |     | N       |       |
| Create_view_priv      | enum('N','Y') | NO   |     | N       |       |
| Show_view_priv        | enum('N','Y') | NO   |     | N       |       |
| Create_routine_priv   | enum('N','Y') | NO   |     | N       |       |
| Alter_routine_priv    | enum('N','Y') | NO   |     | N       |       |
| Execute_priv          | enum('N','Y') | NO   |     | N       |       |
| Event_priv            | enum('N','Y') | NO   |     | N       |       |
| Trigger_priv          | enum('N','Y') | NO   |     | N       |       |
+-----------------------+---------------+------+-----+---------+-------+

テーブル権限

テーブル権限は,指定したテーブル内のすべてのカラムに適用されます。GRANT構文のON dbname.tablenameと記述します。権限情報はmysqlデータベースのtables_privテーブルに格納されます。

GRANT SELECT ON userdb.usertable TO 'user'@'localhost';

1つのGRANT文に対して,複数のテーブルを指定することやワイルドカードを使用することはできません。複数のテーブルを指定したい場合はテーブル数分のGRANT文を発行する必要があります。

カラム権限

カラム権限は,指定したテーブル内のカラムに対して適用されます。これまでの構文と少し変わりprivtype (columnname) ON dbname.tablenameというような記述になります。権限情報はmysqlデータベースのcolumns_privテーブルに格納されます。

GRANT SELECT (col1), INSERT (col1,col2) ON dbname.tablename TO 'user'@'localhost';

また,ここでは説明していませんが,前述の権限レベルの他にストアドルーチン権限やプロキシユーザー権限があります。詳しくはマニュアル[13.7.1.4 GRANT 構文]をご参照ください。

著者プロフィール

北川健太郎(きたがわけんたろう)

LINE株式会社所属のデータベースエンジニア。担当はMySQLとOracle Database。好きなMySQLの機能はレプリケーションで,好きなOracleDatabaseの機能はログオントリガー。

Twitter:@keny_lala

コメント

コメントの記入