13.7.1.4 GRANT 構文

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 プログラムから正常に実行された場合、GRANTQuery 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 USERDROP USERRENAME 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 TOKILLPURGE BINARY LOGSSET GLOBALmysqladmin 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 TABLESPACECREATE USERFILEPROCESSRELOADREPLICATION CLIENTREPLICATION SLAVESHOW DATABASESSHUTDOWN、および SUPER 権限は管理権限であり、グローバルにのみ付与できます。

その他の権限はグローバルに、またはより具体的なレベルで付与できます。

MySQL は、グローバル権限を mysql.user テーブル内に格納します。

データベース権限

データベース権限は、特定のデータベース内のすべてのオブジェクトに適用されます。データベースレベルの権限を割り当てるには、ON db_name.* 構文を使用します。

GRANT ALL ON mydb.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';

ON *.* ではなく ON * 構文を使用し、かつデフォルトデータベースを選択した場合、権限はデフォルトデータベースのデータベースレベルで割り当てられます。デフォルトデータベースが存在しない場合は、エラーが発生します。

CREATEDROPEVENTGRANT 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 値は、ALTERCREATE VIEWCREATEDELETEDROPGRANT OPTIONINDEXINSERTSELECTSHOW VIEWTRIGGER、および UPDATE です。

MySQL は、テーブル権限を mysql.tables_priv テーブル内に格納します。

カラム権限

カラム権限は、特定のテーブル内の単一カラムに適用されます。カラムレベルで付与される各権限のあとに、括弧で囲まれた 1 つまたは複数のカラムを指定する必要があります。

GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost';

カラムに対して (つまり、column_list 句を使用するときに) 許可される priv_type 値は、INSERTSELECT、および UPDATE です。

MySQL は、カラム権限を mysql.columns_priv テーブル内に格納します。

ストアドルーチン権限

ALTER ROUTINECREATE ROUTINEEXECUTE、および GRANT OPTION 権限は、ストアドルーチン (プロシージャーおよびファンクション) に適用されます。これらの権限は、グローバルおよびデータベースレベルで付与できます。CREATE ROUTINE を除き、これらの権限は、個々のルーチンに対してルーチンレベルで付与できます。

GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';
GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';

ルーチンレベルで許可される priv_type 値は、ALTER ROUTINEEXECUTE、および 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 句 (存在する場合) は、それに続くオブジェクトがテーブル、ストアドファンクション、またはストアドプロシージャーであるときは TABLEFUNCTION、または 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 サーバーへの接続を許可する場合は、user_name@localhost として、すべてのローカルユーザーにも権限を付与するようにしてください。それ以外の場合は、指定されたユーザーがローカルマシンから MySQL サーバーにログインしようとすると、(MySQL のインストール中に作成された) mysql.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 権限を付与すると、そのユーザーは INSERTSELECT、および UPDATE を付与できます。

管理者以外のユーザーには、グローバルな、または mysql データベースに対する ALTER 権限を付与してはいけません。それを行うと、そのユーザーはテーブルの名前を変更することによって権限システムの破壊を試みることができます。

特定の権限に関連付けられたセキュリティーリスクの詳細は、セクション6.2.1「MySQL で提供される権限」を参照してください。

いくつかの WITH 句オプションは、アカウントによるサーバーリソースの使用に関する制限を指定します。

  • MAX_QUERIES_PER_HOUR countMAX_UPDATES_PER_HOUR count、および MAX_CONNECTIONS_PER_HOUR count 制限は、いずれかの特定の 1 時間の間にこのアカウントに対して許可されるサーバーへのクエリー、更新、および接続の数を制限します。(結果がクエリーキャッシュから得られたクエリーは、MAX_QUERIES_PER_HOUR 制限に対してカウントされません。) count0 (デフォルト) である場合、これは、このアカウントに対する制限が存在しないことを示します。

  • MAX_USER_CONNECTIONS count 制限は、このアカウントによるサーバーへの同時接続の最大数を制限します。0 以外の count は、このアカウントに対する制限を明示的に指定します。count0 (デフォルト) である場合、サーバーは、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 のオプション ISSUERSUBJECT は暗黙的に X509 を示しているため、これはまた、これらのオプションにも当てはまります。

  • REQUIRE ISSUER 'issuer' は、接続試行に対して、クライアントが CA 'issuer' によって発行された有効な X509 証明書を提供する必要があるという制限を設定します。クライアントが、有効ではあるが、別の発行者を含む証明書を提供した場合、サーバーはその接続を拒否します。X509 証明書の使用には常に暗号化が含まれるため、この場合、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';
    

    'issuer' 値は、1 つの文字列として入力するようにしてください。

    注記

    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';
    

    'subject' 値は、1 つの文字列として入力するようにしてください。MySQL は、この値と証明書内の値の単純な文字列比較を実行するため、大文字と小文字の区別やコンポーネントの順序は、証明書内に存在するものと正確に同じように指定する必要があります。

    注記

    emailAddress については、REQUIRE ISSUER の説明にある注を参照してください。

  • 十分な強度の暗号化と鍵の長さが確実に使用されるようにするには、REQUIRE CIPHER 'cipher' が必要です。短い暗号化鍵を使用する古いアルゴリズムが使用されると、SSL 自体が弱くなる場合があります。このオプションを使用すると、接続に特定の暗号化方式を使用するように要求できます。

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      IDENTIFIED BY 'goodsecret'
      REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
    

SUBJECTISSUER、および 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「データ型デフォルト値」では、暗黙のデフォルト値について説明しています。


User Comments
  Posted by Andreas Ley on December 10, 2004
It would be helpful to link the paragraph on the 'WITH GRANT OPTION' to the '--safe-user-create' start option for mysqld.

It may be obvious to experienced users that the GRANT option not only allows to give privileges to existing users, but also to create new users this way. However, it is not intuitive how to restrict this.
  Posted by Vincent SALARD on February 4, 2009
To display all users Grants (for backup purpose as example) :

mysql -Bse "SELECT CONCAT('SHOW GRANTS FOR \'', user ,'\'@\'', host, '\';') FROM mysql.user" | mysql -Bs | sed 's/$/;/g'
  Posted by randy melder on February 2, 2010
I thought I'd add that if you script out your backups, you'll want to create a user with the 'LOCK TABLES' privilege for occasions when you're doing complete backups.

E.g.

mysql>GRANT SELECT,LOCK TABLES ON *.* TO backuprobot@'localhost' IDENTIFIED BY 'password'; exit;

# mysqldump -c --routines --triggers --all-databases -u backuprobot -ppassword | gzip > all.sql.gz
  Posted by Russell Harper on April 12, 2010
To save anyone else a lot of time:

For grant options MAX_QUERIES_PER_HOUR, MAX_UPDATES_PER_HOUR, MAX_CONNECTIONS_PER_HOUR there isn't a way to get the current status (as opposed to the current setting!) e.g. how close is current queries/hour to MAX_QUERIES_PER_HOUR, say for use in a dashboard, or just as a means of determining how close to capacity the current settings are.

To implement a dashboard or equivalent you basically have to redo all the logic on your own. This limits the usefulness of the current grant options.
  Posted by Poldi Rijke on May 12, 2010
My solution of the backup user was:

mysql> GRANT FILE, SELECT, SHOW VIEW, LOCK TABLES, RELOAD, REPLICATION CLIENT ON
*.* TO 'backup_user'@'localhost' IDENTIFIED BY 'yourPassWord';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
Sign Up Login You must be logged in to post a comment.