ユーザー(アカウント)、ロール管理
MySQL ではユーザーとロールは別々に管理されます。MySQL のリファレンスにおける解説ではロールとはユーザー名とデータベース操作権限があるものとあります。ユーザーとロールの概念が混在しているようです。
MySQL では、ユーザーごとにデータベースの操作権限を与えることができます。しかし、データベースの接続認証はロールで行いますので、API といった外部からデータベースに接続するような構成をお考えのときはロールを設定しておかなければなりません。
操作権限を設定したロールを作成し、ユーザーにそのロールを設定することができます。そのことでデータベースへの接続にはロールを介して行います。
以下はユーザーと作成とロールの作成と設定についてです。
MySQL ではユーザーを CREATE USER で追加し、そのユーザーに権限を与えることができます。
/* ユーザーの追加 */ CREATE USER 'user_name'@'localhost' IDENTIFIED BY '5v().B5y4wpT';
ロールは CREATE ROLE で追加作成することができ、そのロールに操作権限を与えることができます。
/* ロールの作成 */ CREATE ROLE 'role_develop'; /* ロールにデータベースの操作権限を設定 */ GRANT ALL ON *.* TO 'role_develop';
さらにユーザーにロールを含むことでユーザーはロールに設定された操作権限を継承することができます。
/* ユーザーにロールを設定 */ GRANT 'role_develop' TO 'user_name'@'localhost';
MySQL ではユーザーはアカウントとも表記されています。
特にロールを意識しなければならないのは、データベースへの接続認証はロール
で管理することです。
データ操作における認証や MySQL との接続を管理する際にはロールがどのような役割をもっているかを知っておく必要があります。
ページ内 Index
データベースへの接続とデータ操作における認証はロールで管理します。ユーザーに似ていますが、OS上のユーザーとは別として扱います。
- ad -
スーパーユーザー root について
多くの場合 MySQL の初期の管理ユーザーはroot
に設定されています。root
はスーパーユーザーとも呼ばれます。
このroot
ユーザーは MySQL のインストール時に OS 上の管理ユーザーでもあります。そのため、OS の端末からsudo myql
コマンドでログインができます。
$ sudo mysql ... mysql>
パスワードはデフォルトインストールでは必要ありません。
初期はroot
で MySQL の設定を行っていくことになりますが、公のサーバーとして運用するなら mysql_secure_installation
によってセキュリティー設定を変更した方がよいでしょう。
mysql_secure_installation
の設定でroot
による接続はローカルからのみで MySQL にログインするにはパスワードを必要とするようにします。
- ad -
ユーザー(アカウント)管理
MySQL ではユーザー管理とロール管理は別になっています。ユーザーにロールを含めることでロールのデータベースの操作権限を継承することができます。
ユーザーごとにも操作権限を与えることができます。
ユーザーの確認
MySQL に登録されているユーザを確認するには以下のようにします。
mysql> SELECT * FROM mysql.user;
上記の例ではユーザーのプロパティがすべて表示されます。
ユーザー名とホスト名のみを抽出するには以下のようにします。
mysql> SELECT user, host FROM mysql.user;
ユーザーの追加
MySQL におけるユーザーとは MySQL サーバーにログインしデータベース操作を行う抽象的な人のことです。 MySQL ではアカウントとも表記されています。
スーパーユーザーとしてデフォルトでroot
ユーザーがありますが、さらにCREATE USER
でユーザーの追加行うことができます。
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
まずはスーパーユーザーroot
で mysql にログインします。
$ sudo mysql ... mysql>
ユーザーの追加は CREATE USER クエリーを実行します。
mysql> CREATE USER 'user_name'@'localhost' IDENTIFIED BY '5v().B5y4wpT';
ユーザー名は 'user_name'、ユーザーの接続元は 'localhost' まで許可しています。パスワードは '5v().B5y4wpT' です。
'localhost' はユーザーの許可される接続元のホストの範囲を示します。'%' でネットワークを通した方法でもローカルからでも接続できます。'localhost' は同一コンピュータ内からの接続のみを許可します。
接続元ホストを省略すると '%' に設定されます。
パスワードは強度に従って決めます。ここでは、パスワードは8文字以上で強度は MEDIUM としています。パスワードの強度の確認は以下のようにします。
パスワード強度の確認
パスワードは強度の設定に合わせます。パスワードの強度が設定に準拠していないと次のようなエラーが出ます。
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
パスワードの強度を確認するには以下のようなクエリーを実行します。
mysql> SHOW VARIABLES LIKE 'validate_password%';
+-------------------------------------------------+--------+
| Variable_name | Value |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0 |
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 8 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | 1 |
+-------------------------------------------------+--------+
8 rows in set (0.01 sec)
当方のインストール環境でのデフォルトの設定では、パスワードは8文字以上で強度は MEDIUM でした。
MEDIUM はアルファベットの大文字、小文字、数字、記号を含んでいる必要があります。
ユーザー名とホスト名の変更
以下のような RENAME USER クエリーによってユーザー名とホスト名を変更することができます。
mysql> RENAME USER 'username'@'localhost' TO 'new_name'@'%';
パスワードの変更
パスワードの変更は以下のような構文で行います。
mysql> SET PASSWORD FOR 'username'@'host' = PASSWORD('new-password');
またはカレントユーザーのパスワードの変更は以下のような構文になります。
mysql> SET PASSWORD = PASSWORD('new-password');
変更内容を反映するにはFLUSH PRIVILEGES
クエリーを実行します。
mysql> FLUSH PRIVILEGES;
ユーザーの削除
ユーザーの削除は DROP USER クエリーを使用します。構文は以下です。
mysql> DROP USER 'username'@'host' [,'username'@'host' ]...;
ユーザーは複数を指定することができます。
ユーザーの削除を行うとその権限についても削除されます。
ユーザー(アカウント)の操作権限
MySQL ではユーザーごとにデータベースの操作権限を設定します。ユーザーはアカウントも呼ばれ、ユーザー名とパスワードで MySQL にログイン後に操作権限に基づいて出来ることが制限されます。
データベースにはロールという設定があります。ロールはロール名に操作権限を設定するもので、ユーザーにロールを設定するとそのロールの操作権限を継承します。
個々のユーザーごとに操作権限を設定しなくてもロールの切り替えで操作権限を変更することもできます。
ユーザーの権限の設定
ユーザーごとのデータベースやテーブルに対する権限の設定には GRANT 文を使用します。
権限設定の構文は以下のようになっています。
GRANT PRIVILEGE ON database.table TO 'username'@'host';
PRIVILEGE は、 ALL PRIVILEGES
、ALL
または CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD
クエリーからの指定です。
ALL PRIVILEGES
は CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD クエリーのすべての指定です。
または、CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD
クエリーから選択による組み合わせが可能です。
CREATE, ALTER, DROP はテーブルの作成、変更、削除です。
INSERT, UPDATE, DELETE, SELECT はデータの新規作成、更新、削除、閲覧です。
REFERENCES は外部キー作成権限。RELOAD はキャッシュをクリアやリロード、テーブルのフラッシュやロックといった FLUSH 操作に関する権限です。
もしも、example ユーザーにすべてのデータベースの全ての操作権限を与えるには以下のようにします。
mysql> GRANT ALL ON *.* TO 'example'@'localhost';
*.*
はすべてのデータベースの全てのテーブルという指定です。
例えば、example ユーザーは閲覧のみを可能にするには以下のようにします。
mysql> GRANT SELECT ON *.* TO 'example'@'localhost';
ユーザーの追加や権限設定が終わったらFLUSH PRIVILEGES
クエリーを実行します。
mysql> FLUSH PRIVILEGES;
このことで即時に追加されたユーザーとその権限が反映されます。
権限設定のクエリーでユーザー登録ができます。
以下のように権限設定と同時にパスワードを指定するとユーザー登録ができます。
mysql> GRANT ALL PRIVILEGE ON *.* TO 'example'@'localhost' IDENTIFIED BY 'password';
MySQL ではユーザーごとに操作権限を設定できます。また、ロールを作成しユーザーにそのロールを含むことで操作権限を設定することもできます。
ユーザー権限の確認
ユーザーに設定した権限を確認するには SHOW GRANTS クエリーを実行します。
mysql> SHOW GRANTS FOR 'username'@'host';
操作権限の変更
ユーザーの操作権限の変更は GRANT クエリーで操作内容を指定します。
構文は以下にようになります。
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user_or_role [, user_or_role] ...
[WITH GRANT OPTION]
[AS user
[WITH ROLE
DEFAULT
| NONE
| ALL
| ALL EXCEPT role [, role ] ...
| role [, role ] ...
]
]
}
例えば上記で設定した操作権限をSELECT
のみに変更するには以下のようにします。
mysql> GRANT SELECT ON *.* TO 'example'@'localhost';
操作権限の削除
ユーザーから操作権限を削除するには REVOKE クエリーを使用します。
構文は以下にようになります。
REVOKE
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user_or_role [, user_or_role] ...
/* または */
REVOKE ALL [PRIVILEGES], GRANT OPTION
FROM user_or_role [, user_or_role] ...
priv_type は操作対象でALL
または CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD
クエリーのことです。
[object_type] priv_level は主にデーベースやテーブルの指定です。database.table のように指定し、すべての場合は *.* とします。
user_or_role はユーザー名'username'@'host'
とロール名のことです。
例えば 'example'@'localhost' ユーザーにおいて、すべてのデータベースとテーブルに対してINSERT、UPDATE、DELETE 権限を削除するには以下のようにします。
mysql> REVOKE INSERT, UPDATE ,DELETE ON *.* TO 'example'@'localhost';
- ad -
ロールについて
MySQL でのロールは、ロール名にデータベースの操作権限が設定するものです。ユーザー(アカウント)にロールを設定することでユーザーは操作権限を継承します。
例えば以下のように閲覧のみを設定したロールが与えられたユーザーはデータの閲覧のみしかできません。
/* ロールの作成 */ mysql> CREATE ROLE 'read_only'; /* ロールに閲覧のみを許可 */ mysql> GRANT SELECT ON *.* TO 'read_only'; /* ユーザーにロールを設定する */ mysql> GRANT 'read_only' TO 'student_a'@'%', 'student_b'@'%', 'student_c'@'%';
このように複数のロールに一括してデータベースの操作権限を設定することができます。ロールの操作権限を変更することで簡易にユーザーの権限を変更することができます。
