CREATE USER
構文
DROP USER
構文
GRANT
構文
RENAME USER
構文
REVOKE
構文
SET PASSWORD
構文
MySQL アカウント情報は mysql
データベースのテーブルに格納されています。このデータベースとアクセス コントロール システムについては 章 4. データベース管理 で詳しく説明されていますので、更なる詳細についてはこれを参照して下さい。
重要:MySQL のいくつかのリリース版は、新しい権限や特徴を追加する為に供与テーブルの構造の変更を紹介しています。MySQL の新しいバージョンを更新する時はいつでも、新しい機能を有効に利用できるようにする為に、供与テーブルを最新の構造に更新しなければいけません。詳しくは 項 「mysql_upgrade — MySQL アップグレードのテーブル チェック」 を参照してください。
MySQL Enterprise 製造環境では、ユーザ アカウントへの変更を慎重に分析する事が大切です。MySQL ネットワーク モニタリングとアドバイス サービス はユーザの権限が変更される度にそれを通知します。追加情報については http://www-jp.mysql.com/products/enterprise/advisors.html を参照してください。
CREATE USER
構文CREATE USERuser
[IDENTIFIED BY [PASSWORD] 'password
'] [,user
[IDENTIFIED BY [PASSWORD] 'password
']] ...
CREATE USER
ステートメントは新しい MySQL アカウントを作成します。それを利用する為には、mysql
データベースにグローバル CREATE USER
権限か INSERT
権限を持つ必要があります。それぞれのアカウントに対して、CREATE USER
は権限を持たない mysql.user
テーブル内に新しい行を作成します。もしアカウントが既に存在すると、エラーが発生します。各アカウントは、例えば、'jeffrey'@'localhost'
のように GRANT
ステートメントと同じフォーマットを利用して名づけられます。もしアカウント名のユーザ名部分だけを指定すると、ホスト名の '%'
部分が利用されます。アカウント名の指定についての追加情報に関しては、項3. 「GRANT
構文」 を参照してください。
アカウントには、任意の IDENTIFIED BY
条項を利用してパスワードを与える事ができます。user
値とパスワードは、GRANT
ステートメントと同じ方法で与える事ができます。特に、プレーン テキスト内でパスワードを指定するには、PASSWORD
キーワードを省略してください。パスワードを、PASSWORD()
関数によって返されたようにハッシュ化された値として指定するには、PASSWORD
キーワードを含んでください。詳しくは 項3. 「GRANT
構文」 を参照してください。
DROP USER
構文DROP USERuser
[,user
] ...
DROP USER
ステートメントは1つ、または複数の MySQL アカウントを削除します。それは、全ての供与テーブルからアカウントの権限行を削除します。このステートメントを利用する為には、mysql
データベースにグローバル CREATE USER
権限か DELETE
権限を持つ必要があります。各アカウントは、例えば、'jeffrey'@'localhost'
のように GRANT
ステートメントと同じフォーマットを利用して名づけられます。もしアカウント名のユーザ名部分だけを指定すると、ホスト名の '%'
部分が利用されます。アカウント名の指定についての追加情報に関しては、項3. 「GRANT
構文」 を参照してください。
DROP USER
を利用すると、アカウントとその権限を次のように削除する事ができます。
DROP USER user
;
重要:DROP USER
は自動的にユーザ セッションを閉じません。それよりも、オープン セッションを持つユーザがドロップした時には、そのユーザのセッションが閉じられるまでそのステートメントは効果を発揮しません。一度セッションが閉じられると、そのユーザはドロップされ、そのユーザが次にログインしようとすると失敗します。これには意図があります。
DROP USER
は、ユーザが作成したデータベース オブジェクトを自動的に削除したり、無効にしたりしません。これは、テーブル、ビュー、ストアド ルーチン、トリガ、そしてイベントに適応します。
GRANT
構文GRANTpriv_type
[(column_list
)] [,priv_type
[(column_list
)]] ... ON [object_type
] {tbl_name
| * | *.* |db_name
.*} TOuser
[IDENTIFIED BY [PASSWORD] 'password
'] [,user
[IDENTIFIED BY [PASSWORD] 'password
']] ... [REQUIRE NONE | [{SSL| X509}] [CIPHER 'cipher
' [AND]] [ISSUER 'issuer
' [AND]] [SUBJECT 'subject
']] [WITHwith_option
[with_option
] ...]object_type
= TABLE | FUNCTION | PROCEDUREwith_option
= GRANT OPTION | MAX_QUERIES_PER_HOURcount
| MAX_UPDATES_PER_HOURcount
| MAX_CONNECTIONS_PER_HOURcount
| MAX_USER_CONNECTIONScount
GRANT
ステートメントは、システム管理者が MySQL ユーザ アカウントを作成し、アカウントに権利を与える事を可能にします。GRANT
を利用する為には、GRANT OPTION
権限を持ち、また自分が供与している権限を持つ必要があります。REVOKE
ステートメントは、アカウント管理者が権限を削除する事に関連し、それを可能にします。詳しくは 項5. 「REVOKE
構文」 を参照してください。
MySQL アカウント情報は mysql
データベースのテーブルに格納されています。このデータベースとアクセス コントロール システムについては 章 4. データベース管理 で詳しく説明されていますので、更なる詳細についてはこれを参照して下さい。
重要:MySQL のいくつかのリリース版は、新しい権限や特徴を追加する為に供与テーブルの構造の変更を紹介しています。MySQL の新しいバージョンを更新する時はいつでも、新しい機能を有効に利用できるようにする為に、供与テーブルを最新の構造に更新しなければいけません。詳しくは 項 「mysql_upgrade — MySQL アップグレードのテーブル チェック」 を参照してください。
もし供与テーブルが、大文字と小文字が混在するデータベースかテーブル名を含む権限行を保持し、lower_case_table_names
システム変数がゼロではない値に設定されたら、REVOKE
をこれらの権限を廃止する為に利用する事はできません。供与テーブルを直接コントロールする必要があるかも知れません。(GRANT
は lower_case_table_names
が設定された時にそのような行を作成しませんが、そのような行は変数を設定する前に作成されていた可能性があります。)
権限はいくつかのレベルで供与する事ができます:
グローバル レベル
既存サーバ上では、グローバル権限は全てのデータベースに適応します。これらの権限は mysql.user
テーブル内に格納されています。GRANT ALL ON *.*
と REVOKE ALL ON *.*
はグローバル権限だけを供与、廃止します。
データベース レベル
データベース権限は既存データベース内の全てのオブジェクトに適応します。これらの権限は mysql.db
と mysql.host
テーブル内に格納されています。GRANT ALL ON db_name.*
と REVOKE ALL ON db_name.*
はグローバル権限だけを供与、廃止します。
テーブル レベル
テーブル権限は既存テーブル内の全てのカラムに適応します。これらの権限は mysql.tables_priv
テーブル内に格納されています。GRANT ALL ON db_name.tbl_name
と REVOKE ALL ON db_name.tbl_name
はグローバル権限だけを供与、廃止します。
カラム レベル
カラム権限は既存テーブル内の単一カラムに適応します。これらの権限は mysql.columns_priv
テーブル内に格納されています。REVOKE
を利用している時は、供与されたカラムと同じカラムを指定する必要があります。
ルーチン レベル
CREATE ROUTINE
、ALTER ROUTINE
、EXECUTE
、そして GRANT
権限はストアド ルーチンに適応します。(ファンクションとプロシージャ)それらは、グローバルとデータベース レベルで供与されます。また、CREATE ROUTINE
以外は、これらの権限は各ルーチンに対してルーチン レベルで供与する事ができ、mysql.procs_priv
テーブル内で格納されます。
object_type
条項は、次のオブジェクトがテーブル、ストアド ファンクション、またはストアド ルーチンの時には TABLE
、FUNCTION
、または PROCEDURE
条項として指定されなければいけません。
GRANT
と REVOKE
ステートメントに対しては、priv_type
は次の表にある物として指定する事ができます。
権限 | 意味 |
ALL [PRIVILEGES] |
GRANT OPTION 以外の全てのシンプルな権限を設定します。 |
ALTER |
ALTER TABLE の使用を可能にします。 |
ALTER ROUTINE |
ストアド ルーチンの変更、ドロップを可能にします。 |
CREATE |
CREATE TABLE の使用を可能にします。 |
CREATE ROUTINE |
ストアド ルーチンの作成を可能にします。 |
CREATE TEMPORARY TABLES |
CREATE TEMPORARY TABLE の使用を可能にします。 |
CREATE USER |
CREATE USER 、DROP USER 、RENAME USER 、そして REVOKE ALL PRIVILEGES の使用を可能にします。 |
CREATE VIEW |
CREATE VIEW の使用を可能にします。 |
DELETE |
DELETE の使用を可能にします。 |
DROP |
DROP TABLE の使用を可能にします。 |
EVENT |
イベントスケジューラがイベントを作成するのを可能にします。 |
EXECUTE |
ユーザがストアドルーチンを起動させるのを可能にします。 |
FILE |
SELECT ... INTO OUTFILE と LOAD DATA INFILE の使用を可能にします。 |
INDEX |
CREATE INDEX と DROP INDEX の使用を可能にします。 |
INSERT |
INSERT の使用を可能にします。 |
LOCK TABLES |
SELECT 権限を持つテーブル上の LOCK TABLES の使用を可能にします。 |
PROCESS |
SHOW FULL PROCESSLIST の使用を可能にします。 |
REFERENCES |
インプリメントされていません。 |
RELOAD |
FLUSH の使用を可能にします。 |
REPLICATION CLIENT |
ユーザがスレーブとマスタの場所を問い合わせる事を可能にします。 |
REPLICATION SLAVE |
複製スレーブが必要とします。 (マスタからバイナリ ログ イベントを読み込む為) |
SELECT |
SELECT の使用を可能にします。 |
SHOW DATABASES |
SHOW DATABASES は全てのデータベースを表示します。 |
SHOW VIEW |
SHOW CREATE VIEW の使用を可能にします。 |
SHUTDOWN |
mysqladmin shutdown の使用を可能にします。 |
SUPER |
CHANGE MASTER 、KILL 、PURGE MASTER LOGS 、そして SET GLOBAL ステートメントの使用を可能にし、 the mysqladmin debug コマンドはmax_connections が達成していても接続を (一回) 許可します。 |
TRIGGER |
ユーザがトリガを作成、ドロップするのを可能にします。 |
UPDATE |
UPDATE の使用を可能にします。 |
USAGE |
「権限が無い」 の同義語です。 |
GRANT OPTION |
権限を与えるのを可能にします。 |
EVENT
と TRIGGER
権限は MySQL 5.1.6 で追加されました。 トリガはテーブルと関連しているので、トリガを作成したり、ドロップしたりするには、トリガではなくテーブルに
TRIGGER
権限を持つ必要あります。(MySQL 5.1.6 以前では SUPER
権限はトリガを作成したりドロップしたりする為に必要でした。)
REFERENCES
権限は現在は利用されていません。
USAGE
は、権限を持たないユーザを作成した時に指定する事ができます。
アカウントがどんな権限を持つのかを決定する為には SHOW GRANTS
を利用してください。詳しくは 項16. 「SHOW GRANTS
構文」 を参照してください。
ON *.*
構文を利用してグローバル権限を、または、ON db_name.*
構文を利用してデータベース権限を割り当てる事ができます。もし ON *
を指定し、デフォルト データベースを選択したら、権限はそのデータベース内に供与されます。(警告: もし ON *
を指定し、デフォルト データベースを選択 しなければ 、供与される権限はグローバルになります。
FILE
、PROCESS
、RELOAD
、REPLICATION CLIENT
、REPLICATION SLAVE
、SHOW DATABASES
、SHUTDOWN
、そして SUPER
権限は、グローバルとしてのみ供与される(ON *.*
構文を利用して)管理権限です。
その他の権限は、グローバルに、またはより特定なレベルで供与する事ができます。
テーブルに指定できる priv_type
値は、SELECT
、INSERT
、UPDATE
、DELETE
、CREATE
、DROP
、GRANT OPTION
、INDEX
、ALTER
、CREATE VIEW
、SHOW VIEW
そして TRIGGER
です。
カラムに指定できる priv_type
値は (column_list
条項を利用する時)、SELECT
、INSERT
、そして UPDATE
です。
ルーチン レベルで指定できる priv_type
値は ALTER ROUTINE
、 EXECUTE
、そして GRANT OPTION
です。CREATE ROUTINE
は、最初にルーチンを作成する時にこの権限を持たなければいけないので、ルーチン レベル権限ではありません。
GRANT ALL
は、与えようとしているレベルに存在する権限のみをグローバル、データベース、テーブル、そしてルーチン レベルに対して割り当てます。例えば、GRANT ALL ON db_name.*
はデータベース レベル ステートメントなので、 FILE
のようなグローバルのみの権限は供与しません。
MySQL は、存在しないデータベース オブジェクト上にも権限を与える事を許容します。そのような場合、供与される権限は CREATE
権限を含む必要があります。この動作は意図的であり、また後で作成されるデータベース オブジェクトに対するユーザ アカウントと権限を、データベース管理者が準備する事を可能にします。
重要:MySQL は、テーブルやデータベースをドロップする時に、自動的に権限を廃止しません。しかし、もしルーチンをドロップすると、そのルーチンに供与された全てのルーチン レベル権限は廃止されます。
注意:‘_
’ と ‘%
’ ワイルドカードは、権限をグローバル、またはデータベース レベルで供与する GRANT
ステートメント内でデータベース名を指定する時に許容されます。 これは例えば、データベース名の一部として ‘_
’ 文字を利用したければ、ワイルドカードのパターンに一致する追加データベースにアクセスする事を不可能にする為に、GRANT
ステートメント内でこれを ‘\_
’ として指定必要がるという事を意味します。例えば、GRANT ... ON `foo\_bar`.* TO ...
のようになります。
任意ホストからユーザに供与権を適応させる為に、MySQL は user_name@host_name
の形で user
値を指定する事をサポートします。もし user_name
か host_name
値が引用されていない識別子として正当であれば、それを引用する必要はありません。しかし、引用句は特別な文字(‘-
’ 等のような)を含む user_name
文字列、または特別な文字やワイルドカード文字(‘%
’ 等のような)を含む host_name
文字列を指定するのに必要です。例えば、'test-user'@'test-hostname'
のようになります。ユーザ名とホスト名を別々に引用してください。
ホスト名の中でワイルドカードを指定する事ができます。例えば、user_name@'%.loc.gov'
は、loc.gov
ドメイン内のどのホストに対しても user_name
に適応し、user_name@'%'
は 144.155.166
クラス C サブネット内のどのホストに対しても、user_name
に適応します。
シンプルな形 user_name
は、user_name@'%'
の同義語です。
MySQL はユーザ名内でワイルドカードをサポートしません。.匿名のユーザは、User=''
を持つエントリを mysql.user
テーブル内に挿入する事、または GRANT
を利用してユーザを空の名前で作成する事で定義されます。
GRANT ALL ON test.* TO ''@'localhost' ...
引用された値、引用データベース、テーブル、カラム、そしてルーチン名を識別子として指定する時は、バッククォートを利用しています。(‘`
’)ホスト名、ユーザ名、そしてパスワードを文字列として、単一引用句(‘'
’)を利用して引用してください。
警告:匿名ユーザが MySQL サーバに接続する事を許可するなら、全てのローカル ユーザにも user_name@localhost
として権限を供与する必要があります。そうでなければ、名づけられたユーザがローカル マシンから MySQL サーバにログインしようとした時に、mysql.user
テーブル内(MySQL インストールの最中に作成された物)の localhost
の匿名ユーザ アカウントが利用されます。 詳細に関しては 項 「アクセス制御の段階 1: 接続確認」 を参照して下さい。
匿名ユーザをリスト アップしてある次のクエリを実行する事によって、これが当てはまるかどうかを決定する事ができます。
SELECT Host, User FROM mysql.user WHERE User='';
もし先ほど説明した問題を防ぐ為に、ローカル匿名ユーザ アカウントを削除したければ、次のステートメントを利用してください。
DELETE FROM mysql.user WHERE Host='localhost' AND User=''; FLUSH PRIVILEGES;
GRANT
は最大60文字のホスト名をサポートします。データベース、テーブル、カラム、そしてルーチン名は最大64文字です。ユーザ名は最大16文字です。注意:ユーザ名の許容長さは、mysql.user
テーブルを変更しても変える事はできません。もしそれをすると、ユーザが MySQL サーバにログインできなくなってしまうような、予想不可能な動作に陥る可能性があります。項 「mysql_upgrade — MySQL アップグレードのテーブル チェック」 に説明のある、MySQL AB で規定されている方法を利用する以外は、mysql
データベース内のテーブルは、どんな方法でも絶対に変更してはいけません。
テーブル、カラム、ルーチンの権限は、各権限レベルの権限の論理的な OR
として相加的に形成されています。例えば、もし mysql.user
テーブルが、ユーザはグローバル SELECT
権限を持つ、と指定すると、その権限はデータベース、テーブル、またはカラムレベルのエントリによって否定する事はできません。
カラムの権限は次のように計算する事ができます。
global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges OR routine privileges
ほとんどの場合、たった1つの権限レベルでユーザに対して権利を供与する為、実際にはこれほど複雑では有りません。権限チェックの方法の詳細については、項4.7. 「MySQL アクセス権限システム」 で紹介されています。
もし mysql.user
テーブルに存在しないユーザ名/ホスト名の組み合わせに権限を供与するのであれば、エントリが追加されそれは DELETE
ステートメントで削除されるまでそこに残ります。言い換えると、GRANT
は user
テーブル エントリを作成するかもしれませんが、REVOKE
はそれらを削除しません。 従ってそれは DROP USER
か DELETE
を明示的に利用して行わなければいけません。
警告:もし新しいユーザを作成して IDENTIFIED BY
条項を指定しないと、そのユーザはパスワードを持ちません。これはとても不安定です。しかし、新規ユーザに空ではないパスワードを提供する為に IDENTIFIED BY
が与えられない限り、GRANT
が新規ユーザを作成するのを防ぐ為に NO_AUTO_CREATE_USER
SQL モードを有効にする事ができます。
MySQL Enterprise MySQL ネットワーク モニタリングとアドバイス サービスは、パスワードが無いユーザ アカウントを明確に防いでいます。更なる情報については、http://www-jp.mysql.com/products/enterprise/advisors.html を参照してください。
もし新規ユーザが作成されたり、グローバル供与権限を持っていたら、ユーザのパスワードは、IDENTIFIED BY
条項があればそれによって指定された物に設定されます。もしユーザが既にパスワードを持っていたら、それは新しい物と置き換えられます。
パスワードは SET PASSWORD
ステートメントで設定する事もできます。詳しくは 項6. 「SET PASSWORD
構文」 を参照してください。
IDENTIFIED BY
条項内では、パスワードは直定数パスワード値でなければいけません。PASSWORD()
関数を SET PASSWORD
ステートメントに対する時と同じように使用する必要はありません。例:
GRANT ... IDENTIFIED BY 'mypass';
もしパスワードを明確なテキストで送信したく無い場合、PASSWORD()
がそのパスワードに返すハッシュ化された値が分かっていれば、キーワード PASSWORD
の前にハッシュ化された値を指定する事ができます。
GRANT ... IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';
C プログラムの中では、make_scrambled_password()
C API 関数を利用する事で、ハッシュ化された値を得る事ができます。
もしデータベースに権限を供与すると、mysql.db
テーブル内のエントリが必要に応じて作成されます。もしデータベースの全ての権限が REVOKE
で削除されると、このエントリも削除されます。
SHOW DATABASES
権限は SHOW DATABASE
ステートメントを発行する事によって、アカウントがデータベース名を見る事を可能にします。この権限を持たないアカウントは、それらが権限を持つデータベースだけを見て、また、もしサーバが
--skip-show-database
オプションでスタートされていれば、ステートメントを利用する事は全くできません。
MySQL Enterprise SHOW DATABASES
権限は、MySQL サーバ上で全てのデータベースを見る必要があるユーザにだけ与えられます。MySQL ネットワーク モニタリングとアドバイス
サービスの読者は、サーバが --skip-show-database
オプション無しでスタートされた時に変更されます。追加情報については http://www-jp.mysql.com/products/enterprise/advisors.html を参照してください。
もしユーザがテーブルに何の権限も持たなければ、ユーザがテーブルのリストを要求した時(例えば、SHOW TABLES
ステートメントを利用して)テーブル名は表示されません。
WITH GRANT OPTION
条項は、ユーザが指定された権限レベルで持つ権限を、別のユーザに与える事ができる機能を与えます。異なる権限を持つ2つのユーザは権限を接合できる事があるので、どのユーザに
GRANT OPTION
権限を与えるのか注意する必要があります。
自分が持たない権限を別のユーザに与える事はできません。GRANT OPTION
権限によって、自分が持つ権限を割り当てる機能のみ与えられます。
特定の権限レベルでユーザに GRANT OPTION
権限を与える時は、そのユーザがそのレベルで持つどんな権限も、(または将来与えられる物も)そのユーザから別のユーザに与える事ができるので、注意が必要です。ユーザにデータベース上で
INSERT
権限を与えると仮定してください。その時もし SELECT
権限をデータベース上で与え、WITH GRANT OPTION
を指定すると、そのユーザは別のユーザに SELECT
権限だけではなく INSERT
も与える事ができます。その時もしデータベース上でユーザに UPDATE
権限を与えると、そのユーザは INSERT
、SELECT
、そして UPDATE
を与える事ができるようになります。
非管理者ユーザに対しては、ALTER
権限をグローバルに与えたり、またはそれを mysql
データベースに与えたりするべきでは有りません。もしそれをしてしまうと、残りのテーブルによってそのユーザが権限システムを破壊する事が可能になってしまいます!
MAX_QUERIES_PER_HOUR count
、MAX_UPDATES_PER_HOUR count
、そして MAX_CONNECTIONS_PER_HOUR count
オプションは、1時間の間にユーザが行う事ができるクエリ、更新、そしてログインの数を制限します。(クエリ キャッシュから結果が与えられるクエリは
MAX_QUERIES_PER_HOUR
制限に対してカウントしません。)もし count
が 0
なら(デフォルト)、そのユーザには制限がないという意味になります。
MAX_USER_CONNECTIONS count
オプションは、そのアカウントが作成する事ができる同時接続の最大数を制限します。もし count
が 0
なら(デフォルト)、max_user_connections
システム変数はそのアカウントの同時接続数を決定します。
注意:既存権限に影響を与えずに、既に存在するユーザにこれらのリソース制限オプションを指定するには、GRANT USAGE ON *.* ... WITH MAX_...
を利用して下さい。
詳しくは 項 「ユーザ リソースの制限」 を参照してください。
MySQL は、ユーザ名とパスワードに基づいた通常認証に加え、X509 証明拡張子を確認する事ができます。 SSL 関連オプションを MySQL
アカウントに指定するには GRANT
ステートメントの REQUIRE
条項を利用してください。(MySQL を利用した 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
オプションを指定する必要があります。
REQUIRE X509
は、クライアントが有効な証明書を持つ必要があるが、その証明書、発行者、そして題目は何でもかまわないという事を意味します。要求されるのは、CA
証明の1つによってそのサインを検証できなければいけない、という事だけです。
GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' IDENTIFIED BY 'goodsecret' REQUIRE X509;
接続するには、クライアントは --ssl-ca
、--ssl-key
、--ssl-cert
オプションを指定する必要があります。
これは REQUIRE
オプションが X509
の意味を含む為、ISSUER
と SUBJECT
にとっても同じ事が言えます。
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/Email=tonu@example.com';
'issuer'
値は単一文字列として入力されなければいけない事を覚えておいて下さい。
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/Email=tonu@example.com';
'subject'
値は単一文字列として入力されなければいけない事を覚えておいて下さい。
REQUIRE CIPHER 'cipher'
は十分な強さの暗号とキー長さが利用される事が保証されていなければいけません。SSL 自体は、短い暗号キーを利用している古いアルゴリズムが利用されると、弱くなる事があります。このオプションを利用すると、接続を許可する為に特定の暗号方法が利用されるように依頼する事ができます。
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/Email=tonu@example.com' AND ISSUER '/C=FI/ST=Some-State/L=Helsinki/ O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com' AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
AND
キーワードは REQUIRE
オプションとの間では任意です。
オプションの順番は重要では有りませんが、2回指定できるオプションはありません。
mysqld がスタートする時、全ての権限はメモリの中に読み込まれます。詳細に関しては 項 「権限の変更が反映するタイミング」 を参照して下さい。
1つのユーザに対してテーブル、カラム、またはルーチン権限を利用していると、サーバはテーブル、カラム、そしてルーチン権限を全てのユーザに対して分析し、その為に MySQL のスピードが少し遅くなります。同じように、もしユーザに対してクエリ、更新または接続の数を制限すると、サーバはそれらの値を監視しなければいけません。
SQL と MySQL GRANT
バージョンとの最大の違いは次のような物です。
MySQL では、権限はユーザ名だけではなく、ホスト名とユーザ名の組み合わせと関連しています。
スタンダード SQL はグローバル、またはデータベース レベル権限を持たず、MySQL がサポートする全ての権限タイプのサポートもしません。
MySQL はスタンダード SQL UNDER
権限をサポートしません。
スタンダード SQL 権限は、階層的な様式で構造されています。もしユーザを削除すると、そのユーザが持つ全ての権限が与えられ、削除されます。もし
DROP USER
を利用するなら、MySQL でも同じです。詳しくは 項2. 「DROP USER
構文」 を参照してください。
スタンダード SQL では、テーブルをドロップすると、そのテーブルの全ての権限は削除されます。スタンダード SQL では、権限を削除すると、その権限に基づいて与えられた全ての権限もまた削除されます。MySQL
では、明示的な REVOKE
ステートメントだけの利用、または MySQL 供与テーブル内に格納された値の複製でドロップできます。
MySQL では、テーブル内のいくつかのカラムに対してだけ INSERT
権限を持つ事が可能です。この場合、INSERT
権限を持っていないそれらのカラムを削除するのであれば、テーブル上で INSERT
ステートメントを実行する事ができます。削除されたカラムは、もしストリクト SQL モードが有効でなければ、暗黙的なデフォルト値に設定されます。ストリクト
モードでは、もし削除されたカラムがデフォルト値を持たなければ、ステートメントは却下されます。(スタンダード SQL は、全てのカラムに INSERT
権限を持つように要求します。)項 「SQL モード」 で、ストリクト モードについて説明されています。項 「データタイプデフォルト値」 で暗黙のデフォルト値について説明されています。
RENAME USER
構文RENAME USERold_user
TOnew_user
[,old_user
TOnew_user
] ...
RENAME USER
ステートメントは既存 MySQL アカウントをリネームします。それを利用する為には、mysql
データベースにグローバル CREATE USER
権限か UPDATE
権限を持つ必要があります。もし古いアカウントが存在しない時、または新しいアカウントが存在する時はエラーが発生します。各アカウントは、例えば、'jeffrey'@'localhost'
のように GRANT
ステートメントと同じフォーマットを利用して名づけられます。もしアカウント名のユーザ名部分だけを指定すると、ホスト名の '%'
部分が利用されます。アカウント名の指定についての追加情報に関しては、項3. 「GRANT
構文」 を参照してください。
RENAME USER
は、ユーザが作成したデータベース オブジェクトを自動的に移動させたり、リネーム前にユーザが持っていた権限を移動させたりしません。これは、テーブル、ビュー、ストアド
ルーチン、トリガ、そしてイベントに適応します。
REVOKE
構文REVOKEpriv_type
[(column_list
)] [,priv_type
[(column_list
)]] ... ON [object_type
] {tbl_name
| * | *.* |db_name
.*} FROMuser
[,user
] ... REVOKE ALL PRIVILEGES, GRANT OPTION FROMuser
[,user
] ...
REVOKE
ステートメントは、システム管理者が MySQL アカウントから権限を削除する事を可能にします。REVOKE
を利用する為には、GRANT OPTION
権限を持ち、また自分が削除しようとしている権限を持っている必要があります。 各アカウントは、例えば、'jeffrey'@'localhost'
のように GRANT
ステートメントと同じフォーマットを利用して名づけられます。もしアカウント名のユーザ名部分だけを指定すると、ホスト名の '%'
部分が利用されます。アカウント名の指定についての追加情報に関しては、項3. 「GRANT
構文」 を参照してください。
どのレベルにどの権限が存在するのか、許容 priv_type
値、そしてユーザとパスワードを指定する為の構文については、項3. 「GRANT
構文」 を参照してください。
もし供与テーブルが、大文字と小文字が混在するデータベースかテーブル名を含む権限行を保持し、lower_case_table_names
システム変数がゼロではない値に設定されたら、REVOKE
をこれらの権限を廃止する為に利用する事はできません。供与テーブルを直接コントロールする必要があるかも知れません。(GRANT
は lower_case_table_names
が設定された時にそのような行を作成しませんが、そのような行は変数を設定する前に作成されていた可能性があります。)
全ての権限を削除するには、名づけられた全てのユーザに対して、全てのグローバル、データベース、テーブル、そしてカラム レベルの権限をドロップする次の構文を利用してください。
REVOKE ALL PRIVILEGES, GRANT OPTION FROMuser
[,user
] ...
この REVOKE
構文を利用する為には、mysql
データベースにグローバル CREATE USER
権限か UPDATE
権限を持つ必要があります。
REVOKE
は権限を削除しますが、user
テーブル エントリのドロップはしません。それは DELETE
か DROP USER
を利用して明示的に行う必要があります。(項2. 「DROP USER
構文」 を参照してください。)
SET PASSWORD
構文SET PASSWORD [FORuser
] = PASSWORD('some password
')
SET PASSWORD
ステートメントは既存 MySQL ユーザ アカウントにパスワードを割り当てます。
FOR
条項無しで、このステートメントは現在のユーザにパスワードを設定します。非匿名アカウントを利用しているサーバに接続したクライアントは、そのアカウントのパスワードを変更する事ができます。
このステートメントは、FOR
条項を利用して、現在のサーバ ホスト上の特定のアカウントにパスワードを設定します。mysql
データベースの UPDATE
権限を持つクライアントだけがこれを実行できます。user
値は、user_name
と host_name
が、mysql.user
テーブル エントリの User
と Host
カラム内でリストされているのと全く同じである user_name@host_name
フォーマット内で与えられる必要があります。 例えば、もし 'bob'
と '%.loc.gov'
の User
と Host
カラム値と共にエントリを持っていたら、 ステートメントを次のように書くでしょう。
SET PASSWORD FOR 'bob'@'%.loc.gov' = PASSWORD('newpass
');
これは、次のステートメントと同等です。
UPDATE mysql.user SET Password=PASSWORD('newpass
')
WHERE User='bob' AND Host='%.loc.gov';
FLUSH PRIVILEGES;
注意:もし MySQL 4.1 または pre-4.1 クライアント プログラムを利用するそれ以降のサーバに接続していたら、項 「MySQL 4.1 のパスワードハッシュ」 を読むまでは、前出の SET PASSWORD
や UPDATE
ステートメントを利用しないでください。MySQL 4.1 で変更されたパスワード フォーマット、そして特定の状況下では、もしパスワードを変更するとその後サーバに接続する事ができなくなる、という事が起こり得ます。
SELECT CURRENT_USER()
を実行する事によって、どのアカウントとしてサーバが認証したのかを見る事ができます。