MySQLではGRANTステートメントを使用して、ユーザに対して権限を付与することができます。MySQLの場合は管理者用の権限や特定のカラムに対してのみのSELECT権限などGRANT文で細かい粒度に分けて設定できます。今回はこのような権限レベルついて紹介いたします。GRANT文でいうON *.*
の部分が主な話となります。
権限レベル
権限レベルには主にグローバル権限、データベース権限、テーブル権限やカラム権限が存在します。これらをそれぞれ説明します。
グローバル権限
グローバル権限は管理者用のための権限です。GRANT構文のON *.*
と記述します。
権限情報はmysqlデータベースのuserテーブルに格納されます。
データベース権限
データベース権限は、指定したデータベース内のすべてのオブジェクトに適用されます。GRANT構文のON dbname.*
と記述します。
権限情報はmysqlデータベースのdbテーブルに格納されます。
また、データベース権限ではワイルドカードを指定することができます。その場合はバッククォートで囲み、ワイルドカード文字「%」を使用します。
1つ目の例はすべてのデータベースに対してSELECT
を許可します。2つ目の例はshardという文字列に前方一致したデータベースに対してSELECT
を許可します。
また、例文にてALL
と指定していますが、これは対象の権限レベルに属するすべての権限を付与します。よって、グローバル権限でのALL
とデータベース権限でのALL
は違います。たとえば、SUPER
やSHUTDOWN
などは管理者権限ですので、データベース権限のALL
では付与されません。
どの権限がどの権限レベルに属するかは、マニュアル:[13.7.1.4 GRANT 構文]の“MySQLによってサポートされる権限”をご参照ください。MySQL上からは権限情報を管理するテーブルをDESCしてフィールドを確認することで、設定可能な権限を推測することができます。
mysqlデータベースのdbテーブルの例
テーブル権限
テーブル権限は、指定したテーブル内のすべてのカラムに適用されます。GRANT構文のON dbname.tablename
と記述します。権限情報はmysqlデータベースのtables_privテーブルに格納されます。
1つのGRANT文に対して、複数のテーブルを指定することやワイルドカードを使用することはできません。複数のテーブルを指定したい場合はテーブル数分のGRANT文を発行する必要があります。
カラム権限
カラム権限は、指定したテーブル内のカラムに対して適用されます。これまでの構文と少し変わりprivtype (columnname) ON dbname.tablename
というような記述になります。権限情報はmysqlデータベースのcolumns_privテーブルに格納されます。
また、ここでは説明していませんが、前述の権限レベルの他にストアドルーチン権限やプロキシユーザー権限があります。詳しくはマニュアル[13.7.1.4 GRANT 構文]をご参照ください。
権限レベルのアクセス制御の順番
MySQLは対象のユーザに操作する権限があるのかを確認するために、以下の順番でアクセス制御を管理します。
- グローバル権限
- データベース権限
- ワイルドカードのデータベース権限
- テーブル権限
- カラム権限
MySQLがアクセスを許可する流れを見てみます。
たとえば、あるユーザがデータベース権限のSELECT
権限を保持しているとします。SELECT
権限はすべての権限レベルに属しています。SELECTが発行されると、MySQLは最初にグローバル権限を確認します。ここに設定させていないので次にデータベース権限を確認します。ここで設定されているのを確認すると、そのユーザはテーブルへのSELECTを許可されます。
また、データベース権限はワイルドカードを使用していないほうを優先的に適用します。
上記の場合は、userdb
データベースが存在しているとどちらも一致します。しかし、そのユーザのuserdb
データベースに対する権限はSELECT
権限のみとなります。
権限付与のタイミング
基本的には運用中はユーザ作成時に一緒に権限を付与することが多いと思います。では、接続中のセッションに対して権限の付与や取消(GRANT文やREVOKE文)を行うとどうなるでしょうか。
- グローバル権限・・接続中のセッションには反映されません。再接続されたタイミングで反映されます。
- データベース権限・・接続中のセッションが
USE
文を使用したタイミングで反映されます。
- テーブル権限、カラム権限・・接続中のセッションがリクエストを発行したタイミングで反映されます。
よって、グローバル権限は再接続が必要です。それ以外は即時で反映されます。
たとえば、グローバル権限が付与された接続中のセッションに対して、グローバル権限の取消とデータベース権限の付与をするとします。その場合はデータベース権限は付与されますが、グローバル権限の取消は再接続されるまで行われません。よって、そのセッションが切断されるまでは一時的にグローバル権限とデータベース権限が付与されている状態になります。
まとめ
今回はGRANT文の権限レベルについて紹介しました。この権限レベルについて理解して、ユーザには適切な権限を付与するようにしましょう。今回は触れていませんがユーザに関する情報は第17回 MySQLのユーザー管理について[その1]をご参照ください。