MySQLでは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 | +----------+-----------+-------------+
データベース権限
データベース権限は、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
は違います。たとえば、SUPER
やSHUTDOWN
などは管理者権限ですので、ALL
では付与されません。
どの権限がどの権限レベルに属するかは、
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 | | +-----------------------+---------------+------+-----+---------+-------+
テーブル権限
テーブル権限は、ON dbname.
と記述します。権限情報はmysqlデータベースのtables_
GRANT SELECT ON userdb.usertable TO 'user'@'localhost';
1つのGRANT文に対して、
カラム権限
カラム権限は、privtype (columnname) ON dbname.
というような記述になります。権限情報はmysqlデータベースのcolumns_
GRANT SELECT (col1), INSERT (col1,col2) ON dbname.tablename TO 'user'@'localhost';
また、
権限レベルのアクセス制御の順番
MySQLは対象のユーザに操作する権限があるのかを確認するために、
- グローバル権限
- データベース権限
- ワイルドカードのデータベース権限
- テーブル権限
- カラム権限
MySQLがアクセスを許可する流れを見てみます。
たとえば、SELECT
権限を保持しているとします。SELECT
権限はすべての権限レベルに属しています。SELECTが発行されると、
また、
GRANT SELECT ON `userdb`.* TO 'user'@'localhost'; GRANT INSERT ON `user%`.* TO 'user'@'localhost';
上記の場合は、userdb
データベースが存在しているとどちらも一致します。しかし、userdb
データベースに対する権限はSELECT
権限のみとなります。
権限付与のタイミング
基本的には運用中はユーザ作成時に一緒に権限を付与することが多いと思います。では、
- グローバル権限・
・ 接続中のセッションには反映されません。再接続されたタイミングで反映されます。 - データベース権限・
・ 接続中のセッションが USE
文を使用したタイミングで反映されます。 - テーブル権限、
カラム権限・ ・ 接続中のセッションがリクエストを発行したタイミングで反映されます。
よって、
たとえば、
まとめ
今回はGRANT文の権限レベルについて紹介しました。この権限レベルについて理解して、