GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user_specification [, user_specification] ...
[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
[WITH with_option ...]
GRANT PROXY ON user_specification
TO user_specification [, user_specification] ...
[WITH GRANT OPTION]
object_type:
TABLE
| FUNCTION
| PROCEDURE
priv_level:
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
user_specification:
user
[
| IDENTIFIED WITH auth_plugin [AS 'auth_string']
IDENTIFIED BY [PASSWORD] 'password'
]
ssl_option:
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
with_option:
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
GRANT
ステートメントは、MySQL ユーザーアカウントに権限を付与します。GRANT
にはまた、セキュア接続の使用やサーバーリソースへのアクセスに関する制限などの、その他のアカウント特性を指定する機能もあります。GRANT
を使用するには、GRANT OPTION
権限が必要であり、かつ付与しようとしている権限を持っている必要があります。
通常、データベース管理者は最初に CREATE USER
を使用してアカウントを作成し、次に GRANT
を使用してその権限や特性を定義します。例:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';
GRANT USAGE ON *.* TO 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;
ただし、GRANT
ステートメントで指定されたアカウントがまだ存在しない場合、GRANT
は、あとで NO_AUTO_CREATE_USER
SQL モードの説明に示されている条件の下でそのアカウントを作成する可能性があります。
REVOKE
ステートメントは GRANT
に関連しており、管理者がアカウントの権限を削除できるようにします。セクション13.7.1.6「REVOKE 構文」を参照してください。
mysql プログラムから正常に実行された場合、GRANT
は Query OK, 0 rows affected
で応答します。この操作によってどのような権限が付与されたかを判定するには、SHOW GRANTS
を使用します。セクション13.7.5.22「SHOW GRANTS 構文」を参照してください。
GRANT
ステートメントには、このセクションの次のトピックで説明されているいくつかの側面があります。
MySQL の一部のリリースでは、新たな権限や機能を追加するために付与テーブルの構造に変更を加えているものもあります。すべての新しい機能を確実に活用できるようにするには、新しいバージョンの MySQL に更新するときに常に付与テーブルを更新して、最新の構造を持つようにします。セクション4.4.7「mysql_upgrade — MySQL テーブルのチェックとアップグレード」を参照してください。
MySQL によってサポートされる権限
次の表は、GRANT
および REVOKE
ステートメントに対して指定できる許可される priv_type
権限タイプと、各権限を付与できるレベルについて要約したものです。これらの権限の詳細は、セクション6.2.1「MySQL で提供される権限」を参照してください。
表 13.1 GRANT および REVOKE に対して許容可能な権限
権限 | 意味と付与可能なレベル |
---|---|
ALL [PRIVILEGES] |
GRANT OPTION を除き、指定されたアクセスレベルにあるすべての権限を付与します |
ALTER |
ALTER TABLE の使用を有効にします。レベル: グローバル、データベース、テーブル。 |
ALTER ROUTINE |
ストアドルーチンの変更または削除を有効にします。レベル: グローバル、データベース、プロシージャー。 |
CREATE |
データベースおよびテーブルの作成を有効にします。レベル: グローバル、データベース、テーブル。 |
CREATE ROUTINE |
ストアドルーチンの作成を有効にします。レベル: グローバル、データベース。 |
CREATE TABLESPACE |
テーブルスペースおよびログファイルグループの作成、変更、または削除を有効にします。レベル: グローバル。 |
CREATE TEMPORARY TABLES |
CREATE TEMPORARY TABLE の使用を有効にします。レベル: グローバル、データベース。 |
CREATE USER |
CREATE USER 、DROP USER 、RENAME USER 、および REVOKE ALL PRIVILEGES の使用を有効にします。レベル: グローバル。 |
CREATE VIEW |
ビューの作成または変更を有効にします。レベル: グローバル、データベース、テーブル。 |
DELETE |
DELETE の使用を有効にします。レベル: グローバル、データベース、テーブル。 |
DROP |
データベース、テーブル、およびビューの削除を有効にします。レベル: グローバル、データベース、テーブル。 |
EVENT |
イベントスケジューラでのイベントの使用を有効にします。レベル: グローバル、データベース。 |
EXECUTE |
ユーザーがストアドルーチンを実行できるようにします。レベル: グローバル、データベース、テーブル。 |
FILE |
ユーザーがサーバーにファイルを読み取らせたり書き込ませたりできるようにします。レベル: グローバル。 |
GRANT OPTION |
権限のほかのアカウントへの付与、またはほかのアカウントからの削除を有効にします。レベル: グローバル、データベース、テーブル、プロシージャー、プロキシ。 |
INDEX |
インデックスの作成または削除を有効にします。レベル: グローバル、データベース、テーブル。 |
INSERT |
INSERT の使用を有効にします。レベル: グローバル、データベース、テーブル、カラム。 |
LOCK TABLES |
ユーザーが SELECT 権限を持っているテーブルに対する LOCK TABLES の使用を有効にします。レベル: グローバル、データベース。 |
PROCESS |
ユーザーが SHOW PROCESSLIST を使用してすべてのプロセスを表示できるようにします。レベル: グローバル。 |
PROXY |
ユーザーのプロキシ設定を有効にします。レベル: ユーザーからユーザーへ。 |
REFERENCES |
実装されていません |
RELOAD |
FLUSH 操作の使用を有効にします。レベル: グローバル。 |
REPLICATION CLIENT |
ユーザーがマスターまたはスレーブサーバーの場所を問い合わせできるようにします。レベル: グローバル。 |
REPLICATION SLAVE |
レプリケーションスレーブがマスターからバイナリログイベントを読み取れるようにします。レベル: グローバル。 |
SELECT |
SELECT の使用を有効にします。レベル: グローバル、データベース、テーブル、カラム。 |
SHOW DATABASES |
SHOW DATABASES がすべてのデータベースを表示できるようにします。レベル: グローバル。 |
SHOW VIEW |
SHOW CREATE VIEW の使用を有効にします。レベル: グローバル、データベース、テーブル。 |
SHUTDOWN |
mysqladmin shutdown の使用を有効にします。レベル: グローバル。 |
SUPER |
CHANGE MASTER TO 、KILL 、PURGE BINARY LOGS 、SET GLOBAL 、mysqladmin debug コマンドなどのその他の管理操作の使用を有効にします。レベル: グローバル。 |
TRIGGER |
トリガー操作を有効にします。レベル: グローバル、データベース、テーブル。 |
UPDATE |
UPDATE の使用を有効にします。レベル: グローバル、データベース、テーブル、カラム。 |
USAGE |
「権限なし」のシノニムです |
トリガーはテーブルに関連付けられているため、トリガーを作成または削除するには、そのトリガーではなく、このテーブルに対する TRIGGER
権限が必要です。
GRANT
ステートメントでは、ALL [PRIVILEGES]
または PROXY
権限は単独で指定する必要があり、ほかの権限とともに指定することはできません。ALL [PRIVILEGES]
は、GRANT OPTION
および PROXY
権限を除き、権限が付与されるレベルで使用可能なすべての権限を表します。
USAGE
を指定すると、権限を持っていないユーザーを作成したり、あるアカウントの REQUIRE
または WITH
句を、その既存の権限を変更することなく指定したりできます。
MySQL アカウント情報は、mysql
データベースのテーブルに格納されています。このデータベースとアクセス制御システムについては、セクション6.2「MySQL アクセス権限システム」で広範囲にわたって説明されています。詳細は、このセクションを参照するようにしてください。
付与テーブルに、大文字と小文字が混在したデータベースまたはテーブル名を含む権限行が保持されており、かつ lower_case_table_names
システム変数が 0 以外の値に設定されている場合は、REVOKE
を使用してこれらの権限を取り消すことはできません。付与テーブルを直接操作することが必要になります。(lower_case_table_names
が設定されているとき、GRANT
はこのような行を作成しませんが、その変数が設定される前にこのような行が作成されていた可能性があります。)
権限は、ON
句に使用される構文に応じて、いくつかのレベルで付与できます。REVOKE
の場合は、その同じ ON
構文で、どの権限を取り消すかを指定します。次に示す例には、簡略化のために IDENTIFIED BY '
句が含まれていませんが、そのアカウントがまだ存在しない場合は、パスワードのないセキュアでないアカウントが作成されないようにこの句を含めるようにしてください。
password
'
グローバル権限
グローバル権限は管理権限です。つまり、特定のサーバー上のすべてのデータベースに適用されます。グローバル権限を割り当てるには、ON *.*
構文を使用します。
GRANT ALL ON *.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON *.* TO 'someuser'@'somehost';
CREATE TABLESPACE
、CREATE USER
、FILE
、PROCESS
、RELOAD
、REPLICATION CLIENT
、REPLICATION SLAVE
、SHOW DATABASES
、SHUTDOWN
、および SUPER
権限は管理権限であり、グローバルにのみ付与できます。
その他の権限はグローバルに、またはより具体的なレベルで付与できます。
MySQL は、グローバル権限を mysql.user
テーブル内に格納します。
データベース権限
データベース権限は、特定のデータベース内のすべてのオブジェクトに適用されます。データベースレベルの権限を割り当てるには、ON
構文を使用します。
db_name
.*
GRANT ALL ON mydb.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';
ON *.*
ではなく ON *
構文を使用し、かつデフォルトデータベースを選択した場合、権限はデフォルトデータベースのデータベースレベルで割り当てられます。デフォルトデータベースが存在しない場合は、エラーが発生します。
CREATE
、DROP
、EVENT
、GRANT OPTION
、および LOCK TABLES
権限は、データベースレベルで指定できます。また、テーブルまたはルーチン権限もデータベースレベルで指定できます。この場合、これらの権限はデータベース内のすべてのテーブルまたはルーチンに適用されます。
MySQL は、データベース権限を mysql.db
テーブル内に格納します。
テーブル権限
テーブル権限は、特定のテーブル内のすべてのカラムに適用されます。テーブルレベルの権限を割り当てるには、ON
構文を使用します。
db_name.tbl_name
GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';
db_name.tbl_name
ではなく tbl_name
を指定した場合、このステートメントは、デフォルトデータベース内の tbl_name
に適用されます。デフォルトデータベースが存在しない場合は、エラーが発生します。
テーブルレベルで許可される priv_type
値は、ALTER
、CREATE VIEW
、CREATE
、DELETE
、DROP
、GRANT OPTION
、INDEX
、INSERT
、SELECT
、SHOW VIEW
、TRIGGER
、および UPDATE
です。
MySQL は、テーブル権限を mysql.tables_priv
テーブル内に格納します。
カラム権限
カラム権限は、特定のテーブル内の単一カラムに適用されます。カラムレベルで付与される各権限のあとに、括弧で囲まれた 1 つまたは複数のカラムを指定する必要があります。
GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost';
カラムに対して (つまり、column_list
句を使用するときに) 許可される priv_type
値は、INSERT
、SELECT
、および UPDATE
です。
MySQL は、カラム権限を mysql.columns_priv
テーブル内に格納します。
ストアドルーチン権限
ALTER ROUTINE
、CREATE ROUTINE
、EXECUTE
、および GRANT OPTION
権限は、ストアドルーチン (プロシージャーおよびファンクション) に適用されます。これらの権限は、グローバルおよびデータベースレベルで付与できます。CREATE ROUTINE
を除き、これらの権限は、個々のルーチンに対してルーチンレベルで付与できます。
GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';
GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';
ルーチンレベルで許可される priv_type
値は、ALTER ROUTINE
、EXECUTE
、および GRANT OPTION
です。CREATE ROUTINE
は、最初にルーチンを作成するためにこの権限が必要であるため、ルーチンレベルの権限ではありません。
MySQL は、ルーチンレベルの権限を mysql.procs_priv
テーブル内に格納します。
プロキシユーザー権限
PROXY
権限は、あるユーザーを別のユーザーのプロキシにできるようにします。プロキシユーザーは、プロキシ設定されたユーザーになりすますか、またはそのユーザーの識別情報を取得します。
GRANT PROXY ON 'localuser'@'localhost' TO 'externaluser'@'somehost';
PROXY
が付与される場合、その権限は GRANT
ステートメントで指定されている唯一の権限である必要があり、REQUIRE
句は指定できず、また許可される唯一の WITH
オプションは WITH GRANT OPTION
です。
プロキシ設定では、プロキシユーザーが、接続時にプロキシ設定されたユーザーの名前をサーバーに返すプラグイン経由で認証すること、およびプロキシユーザーがプロキシ設定されたユーザーに対する PROXY
権限を持っていることが必要です。詳細および例については、セクション6.3.9「プロキシユーザー」を参照してください。
MySQL は、プロキシ権限を mysql.proxies_priv
テーブル内に格納します。
グローバル、データベース、テーブル、およびルーチンレベルの場合、GRANT ALL
は、付与しようとしているレベルに存在する権限のみを割り当てます。たとえば、GRANT ALL ON
はデータベースレベルのステートメントであるため、db_name
.*FILE
などのグローバルのみの権限を付与しません。ALL
を付与しても、PROXY
権限が割り当てられるわけではありません。
object_type
句 (存在する場合) は、それに続くオブジェクトがテーブル、ストアドファンクション、またはストアドプロシージャーであるときは TABLE
、FUNCTION
、または PROCEDURE
として指定するようにしてください。
データベース、テーブル、カラム、またはルーチンに対する権限は、各権限レベルにある権限の論理 OR
として付加的に形成されます。たとえば、ユーザーがグローバルな SELECT
権限を持っている場合は、データベース、テーブル、またはカラムレベルの権限がないことによってその権限を拒否することはできません。権限確認手順の詳細については、セクション6.2.5「アクセス制御、ステージ 2: リクエストの確認」で説明されています。
MySQL では、存在しないデータベースまたはテーブルに対する権限を付与できます。テーブルの場合は、付与される権限に CREATE
権限が含まれている必要があります。この動作は設計によるものであり、データベース管理者がユーザーアカウントと、あとで作成されるデータベースまたはテーブルに対する権限を準備できるようにすることを目的にしています。
MySQL では、データベースまたはテーブルを削除しても、どの権限も自動的には取り消されません。ただし、ルーチンを削除した場合は、そのルーチンに付与されたルーチンレベルの権限がすべて取り消されます。
アカウント名とパスワード
user
値は、GRANT
ステートメントが適用される MySQL アカウントを示します。任意のホストのユーザーへの権利の付与に対応するために、MySQL は、
という形式での user_name
@host_name
user
値の指定をサポートしています。user_name
または host_name
値が引用符で囲まれていない識別子として正当である場合、それを引用符で囲む必要はありません。ただし、特殊文字 (「-
」など) を含む user_name
文字列、または特殊文字やワイルドカード文字 (「%
」など) を含む host_name
文字列 (たとえば、'test-user'@'%.com'
) を指定するには引用符が必要です。ユーザー名とホスト名は個別に引用符で囲みます。
ホスト名には、ワイルドカードを指定できます。たとえば、
は user_name
@'%.example.com'example.com
ドメイン内の任意のホストの user_name
に適用され、
は user_name
@'192.168.1.%'192.168.1
クラス C サブネット内の任意のホストの user_name
に適用されます。
単純な形式 user_name
は、
のシノニムです。
user_name
@'%'
MySQL は、ユーザー名でのワイルドカードをサポートしていません。匿名ユーザーを参照するには、GRANT
ステートメントで空のユーザー名を含むアカウントを指定します。
GRANT ALL ON test.* TO ''@'localhost' ...
この場合は、匿名ユーザーの正しいパスワードを使用してローカルホストから接続するすべてのユーザーに、匿名ユーザーアカウントに関連付けられた権限でのアクセスが許可されます。
アカウント名内のユーザー名とホスト名の値の詳細は、セクション6.2.3「アカウント名の指定」を参照してください。
引用符で囲まれた値を指定するには、データベース、テーブル、カラム、およびルーチン名は識別子として引用符で囲みます。ユーザー名とホスト名は識別子または文字列として引用符で囲みます。パスワードは文字列として引用符で囲みます。文字列および識別子として引用符で囲む方法のガイドラインについては、セクション9.1.1「文字列リテラル」およびセクション9.2「スキーマオブジェクト名」を参照してください。
グローバルまたはデータベースレベルの権限を付与する GRANT
ステートメントでデータベース名を指定する場合は、「_
」や「%
」のワイルドカードが許可されます。つまり、たとえば、データベース名の一部として「_
」文字を使用する場合は、そのユーザーがワイルドカードパターンに一致する追加のデータベースにアクセスできないようにするために、その文字を GRANT
ステートメントで「\_
」として指定するようにしてください (たとえば、GRANT ... ON `foo\_bar`.* TO ...
)。
匿名ユーザーから MySQL サーバーへの接続を許可する場合は、
として、すべてのローカルユーザーにも権限を付与するようにしてください。それ以外の場合は、指定されたユーザーがローカルマシンから MySQL サーバーにログインしようとすると、(MySQL のインストール中に作成された) user_name
@localhostmysql.user
テーブル内の localhost
の匿名ユーザーアカウントが使用されます。詳細は、セクション6.2.4「アクセス制御、ステージ 1: 接続の検証」を参照してください。
前の警告が適用されるかどうかを判定するには、すべての匿名ユーザーを一覧表示する次のクエリーを実行します。
SELECT Host, User FROM mysql.user WHERE User='';
今説明した問題を回避するには、次のステートメントを使用して、ローカルの匿名ユーザーアカウントを削除します。
DROP USER ''@'localhost';
GRANT
は、最大 60 文字の長さのホスト名をサポートしています。データベース、テーブル、カラム、およびルーチン名には、最大 64 文字を指定できます。ユーザー名には、最大 16 文字を指定できます。
mysql.user
テーブルを変更しても、ユーザー名に許可される長さは変更できません。それを行おうとすると、予測できない動作が発生し、ユーザーが MySQL サーバーにログインできなくなる可能性さえあります。mysql
データベース内のどのテーブルも、セクション4.4.7「mysql_upgrade — MySQL テーブルのチェックとアップグレード」で説明されている手順による場合を除き、どのような方法でも決して変更しないようにしてください。
ユーザーのサーバー接続時の認証方法を示すために、user_specification
句には、認証プラグインを指定するための IDENTIFIED WITH
またはパスワードを指定するための IDENTIFIED BY
を含めることができます。ユーザー指定の構文は、CREATE USER
ステートメントの場合と同じです。詳細は、セクション13.7.1.2「CREATE USER 構文」を参照してください。
IDENTIFIED BY
が存在し、かつグローバルな付与権限 (GRANT OPTION
) を指定しているときは、アカウントが存在し、すでにパスワードが設定されている場合でも、そのパスワードがアカウントの新しいパスワードになります。IDENTIFIED BY
を指定しない場合、アカウントのパスワードは変更されないままになります。
GRANT
ステートメントで指定されたアカウントが存在しない場合、実行されるアクションは NO_AUTO_CREATE_USER
SQL モードによって異なります。
NO_AUTO_CREATE_USER
が有効になっていない場合、GRANT
はこのアカウントを作成します。IDENTIFIED BY
を使用して空以外のパスワードを指定していないかぎり、これはまったくセキュアではありません。NO_AUTO_CREATE_USER
が有効になっている場合は、IDENTIFIED BY
を使用して空以外のパスワードを指定するか、またはIDENTIFIED WITH
を使用して認証プラグインを指定していないかぎり、GRANT
は失敗し、このアカウントを作成しません。
MySQL 5.6.12 の時点では、アカウントがすでに存在する場合、IDENTIFIED WITH
は、新しいアカウントの作成時に使用されることのみを目的にしているため禁止されます。
状況によっては、GRANT
がサーバーログ、またはクライアント側にある ~/.mysql_history
などの履歴ファイル内に記録されることがあります。つまり、平文のパスワードが、その情報に対する読み取りアクセス権を持つ任意のユーザーによって読み取られる可能性があります。これがサーバーログで発生する条件およびこれを制御する方法については、セクション6.1.2.3「パスワードおよびロギング」を参照してください。クライアント側のロギングに関する同様の情報については、セクション4.5.1.3「mysql のロギング」を参照してください。
その他のアカウント特性
WITH
句は、次のいくつかの目的に使用されます。
ユーザーがほかのユーザーに権限を付与できるようにするため
ユーザーに対するリソース制限を指定するため
ユーザーがサーバーへのセキュア接続を使用する必要があるかどうか、およびその方法を指定するため
WITH GRANT OPTION
句は、ユーザーが、そのユーザーの持つ指定された権限レベルにある任意の権限をほかのユーザーに与えることができるようにします。異なる権限を持つ 2 人のユーザーが権限を組み合わせることができる可能性があるため、GRANT OPTION
権限を与える相手には十分に注意してください。
自分が保持していない権限を別のユーザーに付与することはできません。GRANT OPTION
権限を使用して割り当てることができるのは、自分が保持している権限だけです。
あるユーザーに特定の権限レベルにある GRANT OPTION
権限を付与すると、そのユーザーがそのレベルに保持している (または、将来与えられる可能性のある) すべての権限も、そのユーザーからほかのユーザーに付与される場合があることに注意してください。あるユーザーに、データベースに対する INSERT
権限を付与するとします。次に、そのデータベースに対する SELECT
権限を付与し、WITH GRANT OPTION
を指定した場合、そのユーザーはほかのユーザーに SELECT
権限だけでなく、INSERT
権限も与えることができます。そのあと、そのユーザーにデータベースに対する UPDATE
権限を付与すると、そのユーザーは INSERT
、SELECT
、および UPDATE
を付与できます。
管理者以外のユーザーには、グローバルな、または mysql
データベースに対する ALTER
権限を付与してはいけません。それを行うと、そのユーザーはテーブルの名前を変更することによって権限システムの破壊を試みることができます。
特定の権限に関連付けられたセキュリティーリスクの詳細は、セクション6.2.1「MySQL で提供される権限」を参照してください。
いくつかの WITH
句オプションは、アカウントによるサーバーリソースの使用に関する制限を指定します。
MAX_QUERIES_PER_HOUR
、count
MAX_UPDATES_PER_HOUR
、およびcount
MAX_CONNECTIONS_PER_HOUR
制限は、いずれかの特定の 1 時間の間にこのアカウントに対して許可されるサーバーへのクエリー、更新、および接続の数を制限します。(結果がクエリーキャッシュから得られたクエリーは、count
MAX_QUERIES_PER_HOUR
制限に対してカウントされません。)count
が0
(デフォルト) である場合、これは、このアカウントに対する制限が存在しないことを示します。MAX_USER_CONNECTIONS
制限は、このアカウントによるサーバーへの同時接続の最大数を制限します。0 以外のcount
count
は、このアカウントに対する制限を明示的に指定します。count
が0
(デフォルト) である場合、サーバーは、max_user_connections
システム変数のグローバル値からこのアカウントの同時接続の数を決定します。max_user_connections
もゼロである場合は、アカウントに制限がありません。
既存の権限に影響を与えることなく既存のユーザーに対するリソース制限を指定するには、GRANT USAGE
をグローバルレベルで使用し (ON *.*
)、変更される制限を指定します。例:
GRANT USAGE ON *.* TO ...
WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
指定されない制限は、その現在の値を保持します。
サーバーリソースへのアクセス制限の詳細は、セクション6.3.4「アカウントリソース制限の設定」を参照してください。
MySQL は、ユーザー名とパスワードに基づいた通常の認証に加えて、X509 証明書の属性を確認できます。MySQL アカウントの SSL 関連オプションを指定するには、GRANT
ステートメントの REQUIRE
句を使用します。(MySQL での SSL の使用に関する背景情報については、セクション6.3.10「セキュアな接続のための SSL の使用」を参照してください。)
特定のアカウントの接続タイプを制限するには、次のいくつかの可能性があります。
REQUIRE NONE
は、このアカウントに SSL または X509 の要件がないことを示します。これは、SSL 関連のREQUIRE
オプションが指定されていない場合のデフォルトです。ユーザー名とパスワードが有効であれば、暗号化されていない接続が許可されます。ただし、クライアントに適切な証明書と鍵ファイルが存在する場合は、そのクライアントのオプションで暗号化された接続も使用できます。つまり、クライアントはどの SSL コマンドオプションも指定する必要がなく、その場合は接続が暗号化されません。暗号化された接続を使用するには、クライアントは--ssl-ca
オプションか、または--ssl-ca
、--ssl-key
、--ssl-cert
の 3 つのすべてのオプションを指定する必要があります。-
REQUIRE SSL
オプションは、このアカウントの SSL 暗号化接続のみを許可するようサーバーに指示します。GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' IDENTIFIED BY 'goodsecret' REQUIRE SSL;
接続するには、クライアントはサーバー証明書を認証するための
--ssl-ca
オプションを指定する必要があり、さらに--ssl-key
および--ssl-cert
オプションを指定する可能性があります。--ssl-ca
オプションと--ssl-capath
オプションのどちらも指定されていない場合、クライアントはサーバー証明書を認証しません。 -
REQUIRE X509
は、クライアントに有効な証明書が存在する必要があるが、正確な証明書、発行者、およびサブジェクトは問題にならないことを示します。唯一の要件は、いずれかの CA 証明書でその署名を検証できるべきであるということです。GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' IDENTIFIED BY 'goodsecret' REQUIRE X509;
接続するには、クライアントは
--ssl-ca
、--ssl-key
、および--ssl-cert
オプションを指定する必要があります。REQUIRE
のオプションISSUER
やSUBJECT
は暗黙的にX509
を示しているため、これはまた、これらのオプションにも当てはまります。 -
REQUIRE ISSUER '
は、接続試行に対して、クライアントが CAissuer
''
によって発行された有効な X509 証明書を提供する必要があるという制限を設定します。クライアントが、有効ではあるが、別の発行者を含む証明書を提供した場合、サーバーはその接続を拒否します。X509 証明書の使用には常に暗号化が含まれるため、この場合、issuer
'SSL
オプションは必要ありません。GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' IDENTIFIED BY 'goodsecret' REQUIRE ISSUER '/C=FI/ST=Some-State/L=Helsinki/ O=MySQL Finland AB/CN=Tonu Samuel/emailAddress=tonu@example.com';
'
値は、1 つの文字列として入力するようにしてください。issuer
'注記MySQL が 0.9.6h より古いバージョンの OpenSSL に対してリンクされている場合、
'
値にはissuer
'emailAddress
ではなくEmail
を使用します。 -
REQUIRE SUBJECT '
は、接続試行に対して、クライアントがサブジェクトsubject
'subject
を含む有効な X509 証明書を提供する必要があるという制限を設定します。クライアントが、有効ではあるが、別のサブジェクトを含む証明書を提供した場合、サーバーはその接続を拒否します。GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' IDENTIFIED BY 'goodsecret' REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/ O=MySQL demo client certificate/ CN=Tonu Samuel/emailAddress=tonu@example.com';
'
値は、1 つの文字列として入力するようにしてください。MySQL は、この値と証明書内の値の単純な文字列比較を実行するため、大文字と小文字の区別やコンポーネントの順序は、証明書内に存在するものと正確に同じように指定する必要があります。subject
'注記emailAddress
については、REQUIRE ISSUER
の説明にある注を参照してください。 -
十分な強度の暗号化と鍵の長さが確実に使用されるようにするには、
REQUIRE CIPHER '
が必要です。短い暗号化鍵を使用する古いアルゴリズムが使用されると、SSL 自体が弱くなる場合があります。このオプションを使用すると、接続に特定の暗号化方式を使用するように要求できます。cipher
'GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' IDENTIFIED BY 'goodsecret' REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
SUBJECT
、ISSUER
、および CIPHER
オプションを REQUIRE
句内で次のように組み合わせることができます。
GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
IDENTIFIED BY 'goodsecret'
REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
O=MySQL demo client certificate/
CN=Tonu Samuel/emailAddress=tonu@example.com'
AND ISSUER '/C=FI/ST=Some-State/L=Helsinki/
O=MySQL Finland AB/CN=Tonu Samuel/emailAddress=tonu@example.com'
AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
これらのオプションの順序は問題になりませんが、どのオプションも 2 回指定することはできません。AND
キーワードは、REQUIRE
オプション間のオプションです。
1 人のユーザーのテーブル、カラム、またはルーチン権限を使用している場合でも、サーバーはすべてのユーザーのテーブル、カラム、およびルーチン権限を検査するため、これにより MySQL が少し遅くなります。同様に、いずれかのユーザーのクエリー、更新、または接続の数を制限した場合、サーバーはこれらの値をモニターする必要があります。
MySQL バージョンと標準 SQL バージョンの GRANT
MySQL バージョンと標準 SQL バージョンの GRANT
の最大の違いは次のとおりです。
MySQL は、権限をユーザー名だけではなく、ホスト名とユーザー名の組み合わせに関連付けます。
標準 SQL はグローバルまたはデータベースレベルの権限を持たず、また MySQL がサポートするすべての権限タイプをサポートしているわけでもありません。
MySQL は、標準 SQL の
UNDER
権限をサポートしていません。標準 SQL の権限は、階層的な方法で構造化されています。ユーザーを削除した場合は、そのユーザーに付与されていたすべての権限が取り消されます。これはまた、
DROP USER
を使用した場合の MySQL にも当てはまります。セクション13.7.1.3「DROP USER 構文」を参照してください。標準 SQL では、テーブルを削除すると、そのテーブルに対するすべての権限が取り消されます。標準 SQL では、権限を取り消すと、その権限に基づいて付与されていたすべての権限も取り消されます。MySQL では、権限は明示的な
DROP USER
またはREVOKE
ステートメントを使用するか、あるいは MySQL 付与テーブルを直接操作することによってのみ削除できます。MySQL では、テーブル内の一部のカラムに対してのみ
INSERT
権限を持つことができます。この場合、INSERT
権限を持っているカラムの値のみを挿入するのであれば、そのテーブルに対して引き続きINSERT
ステートメントを実行できます。厳密な SQL モードが有効になっていない場合、省略されたカラムはその暗黙のデフォルト値に設定されます。厳密モードでは、省略されたカラムのいずれかにデフォルト値がない場合、このステートメントは拒否されます。(標準 SQL では、すべてのカラムに対してINSERT
権限を持つ必要があります。) セクション5.1.7「サーバー SQL モード」では、厳密モードについて説明しています。セクション11.6「データ型デフォルト値」では、暗黙のデフォルト値について説明しています。