共通ユーザーを作成する
MySQL は、CREATE USER ステートメントを使用してユーザーを作成すること、GRANT ステートメントを使用してユーザーを作成することをサポートしています。ユーザーは、mysql データベースの下のユーザー データ テーブルを操作して作成することもできます。
CREATE USER ステートメントを使用してユーザーを作成する
CREATE USER ステートメントを実行すると、MySQL は新しく作成されたユーザー データ レコードをユーザー データ テーブルに挿入します。構文形式は次のとおりです。
CREATE USER [IF NOT EXISTS]
user [auth_option] [, user [auth_option]] ...
DEFAULT ROLE role [, role ] ...
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH resource_option [resource_option] ...]
[password_option | lock_option] ...
user:
(see Section 6.2.4, “Specifying Account Names”)
auth_option: {
IDENTIFIED BY 'auth_string'
| IDENTIFIED BY RANDOM PASSWORD
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin BY 'auth_string'
| IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD
| IDENTIFIED WITH auth_plugin AS 'auth_string'
}
tls_option: {
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
}
resource_option: {
MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
}
password_option: {
PASSWORD EXPIRE [DEFAULT | NEVER | INTERVAL N DAY]
| PASSWORD HISTORY {DEFAULT | N}
| PASSWORD REUSE INTERVAL {DEFAULT | N DAY}
| PASSWORD REQUIRE CURRENT [DEFAULT | OPTIONAL]
| FAILED_LOGIN_ATTEMPTS N
| PASSWORD_LOCK_TIME {N | UNBOUNDED}
}
lock_option: {
ACCOUNT LOCK
| ACCOUNT UNLOCK
}
その中で、いくつかのパラメータは次のように説明されています。
·user: 新しく作成されたユーザーの名前。
· IDENTIFIED BY: ユーザーのパスワードを設定します。
· IDENTIFIED WITH: ユーザーの認証プラグインを指定します。
· auth_plugin: 認証プラグインの名前。
注: MySQL コマンド ラインで CREATE USER ステートメントを使用してユーザーを作成する場合、現在 MySQL にログインしているユーザーは、mysql データベースの CREATE USER 権限または INSERT (挿入) 権限を持っている必要があります。
(1) ユーザー名が zhaoyanfei、ホスト名が localhost の MySQL ユーザーを作成します。
mysql> CREATE USER 'zhaoyanfei'@'localhost';
Query OK, 0 rows affected
SQL ステートメントが正常に実行され、ユーザー名が binghe のユーザー レコードがチェックされます。
mysql> SELECT host,user,authentication_string FROM mysql.user WHERE user = 'zhaoyanfei';
+-----------+------------+-----------------------+
| host | user | authentication_string |
+-----------+------------+-----------------------+
| localhost | zhaoyanfei | |
+-----------+------------+-----------------------+
1 row in set
結果は、zhaoyanfei という名前のユーザーとホスト localhost が正常に作成されたことを示しています.このユーザーは、MySQL サービスが配置されているローカルサーバー上の MySQL サービスにのみ接続できます.
新しく作成した zhaoyanfei ユーザーを使用して MySQL サービスに接続すると、パスワードを入力せずに接続できます。
現在のユーザーが持つデータベース権限を表示します。
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.01 sec)
結果は、現在のユーザーが information_schema データベースにのみアクセスできることを示しています。
(2) MySQL がユーザーを作成すると、特定の IP セグメント内で MySQL サービスに接続するユーザーをサポートします。たとえば、zhaoyanfei という名前のユーザーを作成すると、192.168.31 の IP 範囲内で MySQL サービスに接続できます。
mysql> CREATE USER 'zhaoyanfei'@'192.168.31.%';
Query OK, 0 rows affected (0.00 sec)
SQL ステートメントが正常に実行され、zhaoyanfei という名前のユーザーのデータ レコードが表示されます。
mysql> SELECT
-> host, user, authentication_string
-> FROM mysql.user
-> WHERE user = 'zhaoyanfei';
+---------------+--------+-----------------------+
| host | user | authentication_string |
+---------------+--------+-----------------------+
| 192.168.31.% | zhaoyanfei | |
| localhost | zhoayanfei | |
+---------------+--------+-----------------------+
2 rows in set (0.00 sec)
結果は、この時点で mysql データベースの下のユーザー データ テーブルに zhaoyanfei という名前のユーザーの 2 つのデータ レコードがあり、ホスト名はそれぞれ 192.168.31.% と localhost であることを示しています。ホスト名は 192.168.31 です。% は、MySQL サービスが 192.168.31 の IP 範囲内で接続できることを示します。
注: MySQL に接続する方法とそのデータベース権限は、MySQL サービスが配置されているローカル サーバー上の MySQL に接続する方法とそのデータベース権限と同じであるため、ここでは繰り返しません。
(3) MySQL ユーザーの作成時にユーザー名の部分のみを指定した場合、ホスト名の部分はデフォルトで % になります。これは、すべてのホストが現在のユーザー名を使用して MySQL サービスに接続できることを意味します。
mysql> CREATE USER 'zhaoyanfei';
Query OK, 0 rows affected (0.00 sec)
SQL ステートメントが正常に実行され、作成されたユーザー情報が表示されます。
mysql> SELECT
-> host, user, authentication_string
-> FROM mysql.user
-> WHERE user = 'zhaoyanfei';
+---------------+--------+-----------------------+
| host | user | authentication_string |
+---------------+--------+-----------------------+
| % | zhaoyanfei | |
| 192.168.31.% | zhaoyanfei | |
| localhost | zhaoyanfei | |
+---------------+--------+-----------------------+
3 rows in set (0.00 sec)
結果は、ユーザー名 zhaoyanfei で作成されたデータ レコードに、ホスト名 % の追加のデータ レコードがあることを示しています。
(4) MySQL ユーザーの作成時に、ユーザーの接続パスワードを指定できます。
mysql> CREATE USER 'zhaoyanfei'@'localhost' IDENTIFIED BY '@zhaoyanfei123456';
Query OK, 0 rows affected (0.10 sec)
SQL ステートメントが正常に実行され、作成されたユーザー情報が表示されます。
mysql> SELECT
-> host, user, authentication_string
-> FROM mysql.user
-> WHERE user = 'zhaoyanfei';
+---------------+--------+-------------------------------------------+
| host | user | authentication_string |
+---------------+--------+-------------------------------------------+
| % | zhaoyanfei | |
| 192.168.31.% | zhaoyanfei | |
| localhost | zhaoyanfei | *027B07B8E65F17AD1283D290B33909F1B8D0E5BB |
+---------------+--------+-------------------------------------------+
3 rows in set (0.00 sec)
ホスト名が localhost のユーザーのパスワードがあることがわかりました。MySQL サービスに接続するとき、MySQL は組み込みの認証メカニズムを内部で使用します。正しく接続するには、パスワード @zhaoyanfei123456 を入力する必要があります。
[root@binghe150 ~]# mysql -ubinghe -hlocalhost -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 8.0.18 binghe edition
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
(5) パスワードの暗号文がわかっている場合、MySQL は暗号文を使用してユーザーのパスワードを設定することをサポートします。まず、MySQL コマンド ラインでパスワードの暗号文を取得します。バージョン 8.0 でこのステートメントを実行すると、エラーが報告されます。
1064 - SQL 構文にエラーがあります。1 行目の '('@zhaoyanfei123456')' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。
mysql> SELECT password('@zhaoyanfei123456');
+-------------------------------------------+
| password('@zhaoyanfei123456') |
+-------------------------------------------+
| *027B07B8E65F17AD1283D290B33909F1B8D0E5BB |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)
次に、MySQL ユーザーを作成します。その中で、ホスト名は 192.168.31.223、ユーザー名は zhaoyanfei です。
mysql> CREATE USER 'zhaoyanfei'@'192.168.31.223' IDENTIFIED BY PASSWORD '*027B07B8E65F17AD1283D290B33909F1B8D0E5BB';
Query OK, 0 rows affected (0.10 sec)
SQL ステートメントが正常に実行されました.MySQL サービスに正しく接続するには、パスワード @zhaoyanfei123456 を入力する必要があります.
(6) MySQL は、ユーザー作成時にユーザーのプラグイン認証方式の設定をサポートしていますが、このとき IDENTIFIED WITH ステートメントを使用する必要があります。
mysql> CREATE USER 'zhaoyanfei'@'localhost'
-> IDENTIFIED WITH mysql_native_password BY '@zhaoyanfei123456';
Query OK, 0 rows affected (0.00 sec)
SQL ステートメントが正常に実行されました.MySQL サービスに接続するには、パスワード @zhaoyanfei123456 を入力して正しく接続する必要があります.
GRANT ステートメントを使用してユーザーを作成する
CREATE USER ステートメントを使用してユーザーを作成すると、mysql データベースの下のユーザー データ テーブルにレコードが追加されるだけで、ユーザーは承認されません。GRANT ステートメントを使用してユーザーを作成すると、ユーザーを追加できるだけでなく、対応する権限をユーザーに付与することもできます。構文形式は次のとおりです。
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user [auth_option] [, user [auth_option]] ...
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH {GRANT OPTION | resource_option} ...]
GRANT PROXY ON user
TO user [, user] ...
[WITH GRANT OPTION]
object_type: {
TABLE
| FUNCTION
| PROCEDURE
}
priv_level: {
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
}
user:
(see Section 6.2.4, “Specifying Account Names”)
auth_option: {
IDENTIFIED BY 'auth_string'
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin BY 'auth_string'
| IDENTIFIED WITH auth_plugin AS 'auth_string'
| IDENTIFIED BY PASSWORD 'auth_string'
}
tls_option: {
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
}
resource_option: {
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
}
その中で、いくつかのパラメータは次のように説明されています。
·priv_type: ユーザーに付与された権限の種類を示します。
· db_name: ユーザーに権限が付与されているデータベースを示します。
·tbl_name: ユーザーに権限が付与されるデータ テーブルを示します。
· IDENTIFIED BY: ユーザーにパスワードが設定されていることを示します。
· WITH {GRANT OPTION | resource_option}: ユーザーの GRANT パーミッションまたはリソース オプションを設定します。
MAX_QUERIES_PER_HOUR count: 1 時間あたり count 個のクエリを実行します。
MAX_UPDATES_PER_HOUR count: 1 時間あたり count 個の更新を実行します。
MAX_CONNECTIONS_PER_HOUR count: 1 時間あたり count 接続を実行します。
· MAX_USER_CONNECTIONS カウント: 各ユーザーは同時にカウント接続を確立できます。
(1) ユーザー名が binghe、パスワードが @binghe123456 のユーザーを作成し、そのユーザーにすべてのデータ テーブルに対するクエリ権限を付与します。
mysql> GRANT SELECT ON *.* TO 'zhaoyanfei'@'localhost'
-> IDENTIFIED BY '@zhaoyanfei123456';
Query OK, 0 rows affected, 1 warning (0.12 sec)
SQL ステートメントが正常に実行され、この時点で、zhaoyanfei という名前のユーザーは、すべてのデータ テーブルに対するクエリ権限を持っています。
(2) ユーザー名が zhaoyanfei_database でパスワードが @zhaoyanfei123456 のユーザーを作成し、商品データベースを照会および変更する権限をユーザーに付与します。
mysql> GRANT SELECT, UPDATE ON goods.* TO 'zhaoyanfei_database'@'localhost'
-> IDENTIFIED BY '@zhaoyanfei123456';
Query OK, 0 rows affected, 1 warning (0.10 sec)
結果は、SQL ステートメントが正常に実行されたことを示しており、この時点で、zhaoyanfei_database という名前のユーザーは、商品データベースを照会および変更する権限を持っています。
(3) ユーザー名が zhaoyanfei_table でパスワードが @zhaoyanfei123456 のユーザーを作成し、そのユーザーに商品データベースの下の t_goods データ テーブルを挿入、削除、変更、およびクエリする権限を付与します。
mysql> GRANT INSERT, DELETE, UPDATE, SELECT
-> ON goods.t_goods TO 'zhaoyanfei_table'@'localhost'
-> IDENTIFIED BY '@zhaoyanfei123456';
Query OK, 0 rows affected, 1 warning (0.02 sec)
結果は、SQL ステートメントが正常に実行されたことを示しています。この時点で、zhaoyanfei_table という名前のユーザーは、商品データベースの下にある t_goods データ テーブルを追加、削除、変更、および確認する権限を持っています。
(4) zhaoyanfei という名前のユーザーを作成し、IP 範囲が 192.168.31 のホストを指定して、MySQL サービスに接続できるようにします。
mysql> GRANT SELECT ON *.* TO 'zhaoyanfei'@'192.168.31.%'
-> IDENTIFIED BY '@zhaoyanfei123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
(5) zhaoyanfei という名前のユーザーを作成し、すべてのホストが MySQL サービスに接続できるように指定します。
mysql> GRANT SELECT ON *.* TO 'zhaoyanfei'@'%'
-> IDENTIFIED BY '@zhaoyanfei123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
ユーザーデータテーブルを操作してユーザーを作成する
MySQL はユーザー情報を mysql データベースの下のユーザー データ テーブルに保存するため、ユーザー データ テーブルを直接操作して MySQL の新しいユーザーを作成できます。
たとえば、mysql データベースのユーザー データ テーブルにユーザー情報を挿入するには、ホスト名は localhost、ユーザー名は zhaoyanfei_insert、パスワードは @zhaoyanfei123456 です。
mysql> INSERT INTO mysql.user
-> (Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject)
-> VALUES
-> ('localhost', 'zhaoyanfei_insert', password('@zhaoyanfei123456'), '', '', '');
Query OK, 1 row affected, 1 warning (0.00 sec)
結果は、SQL ステートメントが正常に実行されたことを示しています。次に、zhaoyanfei_insert というユーザー名を持つユーザーを確認します。
mysql> SELECT host, user, authentication_string FROM mysql.user WHERE user = 'zhaoyanfei_insert';
+-----------+---------------+-------------------------------------------+
| host | user | authentication_string |
+-----------+---------------+-------------------------------------------+
| localhost | zhaoyanfei_insert | *0DEB06AA6E096EB2F26EACEE157143ADB9481B5B |
+-----------+---------------+-------------------------------------------+
1 row in set (0.00 sec)
結果は、データがユーザー データ テーブルに正常に挿入されたことを示しています。ユーザー zhaoyanfei_insert として MySQL にログインします。
[root@binghe151 ~]# mysql -uzhaoyanfei_insert -hlocalhost
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 34
Server version: 5.7.24 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
結果は、ユーザー zhaoyanfei_insert が MySQL に正常にログインしたことを示しています。