ユーザーに権限を設定する(GRANT文)

広告

作成したユーザーには GRANT 文を使用することで色々な権限を設定することができます。ここでは MariaDB で作成したユーザーに権限を設定する方法について解説します。

(2021 年 07 月 24 日公開 / 2021 年 07 月 24 日更新)

ユーザーに権限を設定する

作成済みのユーザーに権限を設定するには GRANT 文を使います。書式は次の通りです。

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user_specification [ user_options ...]

user_specification:
  username [authentication_option]

authentication_option:
  IDENTIFIED BY 'password' 
  | IDENTIFIED BY PASSWORD 'password_hash'
  | IDENTIFIED {VIA|WITH} authentication_rule [OR authentication_rule  ...]

authentication_rule:
    authentication_plugin
  | authentication_plugin {USING|AS} 'authentication_string'
  | authentication_plugin {USING|AS} PASSWORD('password')

GRANT PROXY ON username
    TO username [, username] ...
    [WITH GRANT OPTION]

user_options:
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH with_option [with_option] ...]

object_type:
    TABLE
  | FUNCTION
  | PROCEDURE

priv_level:
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name

with_option:
    GRANT OPTION
  | resource_option

resource_option:
  MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
  | MAX_STATEMENT_TIME time

tls_option:
  SSL 
  | X509
  | CIPHER 'cipher'
  | ISSUER 'issuer'
  | SUBJECT 'subject'

複雑な書式ですがユーザーに権限を設定するための基本的な書式は次のようになります。

GRANT priv_type[, priv_type] ON priv_level TO username

ユーザー( username )に対して指定の種類の権限( priv_type )を指定のレベル( priv_level )で設定します。複数の権限をまとめて設定する場合はカンマ(,)で区切って続けて記述します。

各レベルに応じて権限を設定するには、それぞれ次のように記述します。

グローバルレベル
GRANT ALL ON *.* TO username;
GRANT SELECT, INSERT ON *.* TO username;

データベースレベル
GRANT ALL ON db_name.* TO username;
GRANT SELECT, INSERT ON mydb.* TO username;

テーブルレベル
GRANT ALL ON db_name.table_name TO username;
GRANT SELECT, INSERT ON db_name.mytbl TO username;

カラムレベル
GRANT SELECT (col1), INSERT (col1, col2) ON db_name.table_name TO username;

では実際に試しながら確認してみます。

作成したばかりのユーザーに設定されている権限

権限の設定の仕方を確認する前に、ユーザーを新しく作成したときにどんな権限が設定されているのかを確認してみます。次のように新しいユーザーを作成しました。

create user saru@localhost identified by 'monkey';

作成したばかりのユーザーに設定されている権限(1)

それでは作成したユーザーに割り当てられている権限を確認します。次のように実行してください。

show grants for saru@localhost;

作成済みのユーザーのロックと解除(2)

次のように表示されました。

GRANT USAGE ON *.* TO `saru`@`localhost` IDENTIFIED BY PASSWORD '***'

種類は USAGE 、レベルは グローバルになっています。 USAGE という権限は「何も権限がない」という権限です。つまり新しく作成したユーザーは、すべてのデータベースを対象に何も権限がない状態となっています。

グローバルレベルの権限を設定する

グローバルレベルはすべてのデータベースが対象となります。例えばグローバルレベルで CREATE 権限を設定すると、データベースを作成する CREATE DATABASE 文が制限なしで実行できます。またテーブルを作成する CREATE TABLE がすべてのデータベースで実行できます。

それではユーザーを新しく作成したあと、グローバレルレベルで CREATE 権限を設定してみます。次のように実行してください。

create user saru@localhost identified by 'monkey';
grant create on *.* to saru@localhost;

グローバルレベルの権限を設定する(1)

グローバルレベルで CREATE 権限を設定しました。このユーザーはデータベースの作成および作成済みのすべてのデータベースでテーブルの作成ができます。

それでは設定した権限を確認してみます。

show grants for saru@localhost;

グローバルレベルの権限を設定する(2)

対象のユーザーにグローバルレベルで CREATE 権限が設定されていることが確認できました。

では実際にデータベースを作成してみます。先ほどのユーザーで MariaDB に接続したあと次のように実行してください。

create database mydb;

グローバルレベルの権限を設定する(3)

データベースを作成することができました。

データベースレベルの権限を設定する

データベースレベルは指定したデータベースが対象となります。例えばデータベースレベルで CREATE 権限を設定すると、指定したデータベースでテーブルを作成する CREATE TABLE を実行できるようになります。

それではユーザーを新しく作成したあと、作成済みの mydb データベースを対象にデータベースレベルで CREATE 権限を設定してみます。次のように実行してください。

create user neko@localhost identified by 'cat';
grant create on mydb.* to neko@localhost;

データベースレベルの権限を設定する(1)

データベースレベルで mydb データベースを対象とした CREATE 権限を設定しました。このユーザーは mydb データベースであれば任意のテーブルを作成することができますが、他のデータベースではテーブルを作成することができません。

それでは設定した権限を確認してみます。

show grants for neko@localhost;

データベースレベルの権限を設定する(2)

対象のユーザーにデータベースレベルで CREATE 権限が設定されていることが確認できました。

では実際にテーブルを作成してみます。先ほどのユーザーで MariaDB に接続したあと、 mydb データベースの中に food テーブルを作成します。次のように実行してください。

create table mydb.food (id int, name varchar(10));

グローバルレベルの権限を設定する(3)

mydb データベースの中にテーブルを作成することができました。

なお権限を持っていない otherdb データベースの中にテーブルを作成しようとするとエラーが発生します。次のように実行してください。

create table otherdb.food (id int, name varchar(10));

グローバルレベルの権限を設定する(4)

「CREATE command denied to user 'neko'@'localhost' for table 'food'」と表示されました。 neko@localhost には otherdb データベースに対する CREATE 権限がないためです。

テーブルレベルの権限を設定する

テーブルレベルは指定したテーブルが対象となります。例えばテーブルレベルで SELECT 権限を設定すると、指定したテーブルで SELECT 文を実行できるようになります。

それではユーザーを新しく作成したあと、作成済みの mydb.food テーブルを対象にテーブルレベルで SELECT 権限を設定してみます。次のように実行してください。

create user kuma@localhost identified by 'bear';
grant select on mydb.food to kuma@localhost;

テーブルレベルの権限を設定する(1)

テーブルレベルで mydb.food テーブルを対象とした SELECT 権限を設定しました。このユーザーは mydb.food テーブルであれば SELECT 文を実行することができますが、他のテーブルでは SELECT 文を実行することができません。

それでは設定した権限を確認してみます。

show grants for kuma@localhost;

テーブルレベルの権限を設定する(2)

対象のユーザーにテーブルレベルで SELECT 権限が設定されていることが確認できました。

では実際に SELECT 文を実行してテーブルからをデータを取得してみます。先ほどのユーザーで MariaDB に接続したあと、 mydb データベースの中に food テーブルからデータを取得します。次のように実行してください。

select * from mydb.food;

テーブルレベルの権限を設定する(3)

mydb.food テーブルからデータを取得することができました。

なお権限を持っていない mydb.drink テーブルからデータを取得しようとするとエラーが発生します。次のように実行してください。

select * from mydb.drink;

テーブルレベルの権限を設定する(4)

「SELECT command denied to user 'kuma'@'localhost' for table 'drink'」と表示されました。 kuma@localhost には mydb.other テーブルに対して SELECT 権限がないためです。

カラムレベルの権限を設定する

カラムレベルは指定したカラムが対象となります。例えばカラムレベルで SELECT 権限を設定すると、指定したテーブルの中の指定したカラムに対して SELECT を実行できるようになります。

それではユーザーを新しく作成したあと、作成済みの mydb.food テーブルの name カラムを対象にカラムレベルで SELECT 権限を設定してみます。次のように実行してください。

create user hato@localhost identified by 'pigeon';
grant select(name) on mydb.food to hato@localhost;

カラムレベルの権限を設定する(1)

カラムレベルで mydb.food テーブルの中の name カラムを対象とした SELECT 権限を設定しました。このユーザーは mydb.food テーブルの name カラムであれば SELECT 文を使ってデータの取得ができますが、同じテーブルであっても別のカラムに対しては SELECT 文を実行することはできません。

それでは設定した権限を確認してみます。

show grants for hato@localhost;

カラムレベルの権限を設定する(2)

対象のユーザーにカラムレベルで SELECT 権限が設定されていることが確認できました。

では実際に SELECT 文を実行してテーブルの中の権限を与えられたカラムからをデータを取得してみます。先ほどのユーザーで MariaDB に接続したあと、 mydb データベースの中に food テーブルの中の name カラムからデータを取得します。次のように実行してください。

select name from mydb.food;

カラムレベルの権限を設定する(3)

mydb.food テーブルの name カラムのデータを取得することができました。

なお mydb.food テーブルであっても権限を持っていない id カラムのデータを取得しようとするとエラーが発生します。次のように実行してください。

select id,name from mydb.food;

カラムレベルの権限を設定する(4)

「SELECT command denied to user 'hato'@'localhost' for column 'id' in table 'food'」と表示されました。 hato@localhost には mydb.food テーブルの id カラムに対して SELECT 権限がないためです。

すべての権限を設定する(ALL)

ALL 権限(または ALL PRIVILEGES 権限)は GRANT OPTION 権限以外の全ての種類の権限を与える場合に使用します。ALL 権限はグローバル、データベース、テーブルレベルで設定することができ、グローバルレベルで ALL 権限を設定した場合はすべてのデータベースでほぼすべての権限を持つことになります。

それではユーザーを新しく作成したあと、グローバルレベルで ALL 権限を設定してみます。次のように実行してください。

create user kirin@localhost identified by 'giraffe';
grant all on *.* to kirin@localhost;

すべての権限を設定する(ALL)(1)

それでは設定した権限を確認してみます。

show grants for kirin@localhost;

すべての権限を設定する(ALL)(1)

対象のユーザーにグローバルレベルで ALL 権限が設定されていることが確認できました。

他のユーザーに権限を設定することができる権限(GRANT OPTION)

グローバルレベルで CREATE 権限を他のユーザーに設定する時、 GRANT OPTION を設定すると、権限を設定されたユーザーは自分が設定された権限を別のユーザーに設定することができるようになります。

GRANT OPTION を使用する場合の書式は次のようになります。

GRANT priv_type[, priv_type] ON priv_level TO username WITH GRANT OPTION

それではユーザーを新しく作成したあと、グローバルレベルで CREATE 権限を GRANT OPTION 付きで設定してみます。次のように実行してください。

create user uma@localhost identified by 'horse';
grant create on *.* to uma@localhost with grant option;

他のユーザーに権限を設定することができる権限(1)

uma@localhost ユーザーはグローバルレベルで CREATE 権限を持つと同時に、他のユーザーに同じ権限を設定することができるようになります。

それでは設定した権限を確認してみます。

show grants for uma@localhost;

他のユーザーに権限を設定することができる権限(2)

対象のユーザーに GRANT OPTION 付きでグローバルレベルで CREATE 権限が設定されていることが確認できました。

では実際に他のユーザーに権限を設定できるのか試してみます。先ほどのユーザーで MariaDB に接続したあと、既に作成済みのユーザーでカラムレベルの権限だけを与えられている hato@localhost へグローバルレベルで CREATE 権限を設定してみます。次のように実行して下さい。

grant create on *.* to hato@localhost;

他のユーザーに権限を設定することができる権限(3)

hato@localhost ユーザーへグローバルレベルで CREATE 権限を設定することができました。確認のために root ユーザーで MariaDB に接続しなおしたあとで hato@localhost ユーザーに設定されている権限を確認してみます。

show grants for hato@localhost;

他のユーザーに権限を設定することができる権限(4)

対象のユーザーにはカラムレベルで元々設定されていた権限に加えてグローバルレベルで CREATE 権限が設定されていることが確認できました。

-- --

MariaDB で作成したユーザーに権限を設定する方法について解説しました。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)
Profile
profile_img

著者 / TATSUO IKURA

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。