https://dev.mysql.com/doc/refman/8.0/ja/create-user.html を調べたのでメモ
文の全体
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] ...
[COMMENT 'comment_string' | ATTRIBUTE 'json_object']
これを1行ずつ見ていく
[IF NOT EXISTS]
CREATE USER文は存在するユーザー名のユーザーを作成しようとするとエラーになるが、IF NOT EXISTS がついているとエラーにならず、存在しない場合のみ作成されるようになる
user [auth_option] [, user [auth_option]] …
user にはユーザー名を設定する
auth_option は、パスワード周りの設定ができる。
設定内容は
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'
}
となっており、
IDENTIFIED BY ‘auth_string’
で、任意のパスワードを設定しつつユーザー作成するか、
IDENTIFIED BY RANDOM PASSWORD
で、MySQLにランダムなパスワードを生成してもらいつつユーザー作成する、ということもできる
ランダムで生成されるパスワードの長さは generated_random_password_length で制御されており、デフォルトは20文字
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’
では、認証プラグインを指定しつつパスワードを設定することができる
認証プラグインの詳細は https://dev.mysql.com/doc/refman/8.0/ja/authentication-plugins.html にある
デフォルトの認証プラグインは default_authentication_plugin に設定されているもので、最初は caching_sha2_password が設定されている
また最後の「AS ‘auth_string’」の構文は、認証プラグインに沿った形でそのままパスワードを設定できる (ハッシュが必要ならハッシュ化されたパスワードを指定できる)
DEFAULT ROLE role [, role ] …
MySQLにログイン時に有効になるデフォルトロールを設定できる
ロールの付与自体は GRANT文でできるが、それだけだとログイン時に有効になるようにはなっておらず、DEFAULT ROLE に設定されて初めてログイン時に有効になる
[REQUIRE {NONE | tls_option [[AND] tls_option] …}]
MySQLログイン時のセキュリティ要件を設定できる
NONE は要件なしのときに設定する (デフォルトはこれ)
tls_option には以下の内容を設定できる
tls_option: {
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
}
証明書に詳しくないので割愛するが、SSL接続を必須としたり、
特定の認証局の証明書でないとだめ、といった設定ができる
[WITH resource_option [resource_option] …]
下記の resource_option を指定することにより、ログイン時のDBリソース使用に制限をもたせることができる
resource_option: {
MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
}
MAX_QUERIES_PER_HOUR count
1時間に同じユーザーが実施できるクエリ数を制限できる
MAX_UPDATES_PER_HOUR count
1時間に同じユーザーが実施できるDMLの数を制限できる
MAX_CONNECTIONS_PER_HOUR count
1時間で同じユーザーが接続できる数を制限できる
MAX_USER_CONNECTIONS count
同じユーザーでの同時接続数を制限できる
[password_option | lock_option] …
password_option
パスワードの管理用オプション
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}
}
PASSWORD EXPIRE [DEFAULT | NEVER | INTERVAL N DAY]
パスワードの期限に関するオプション
PASSWORD EXPIRE のみだと、ユーザーのパスワードは期限切れ状態で登録される
DEFAULT だと default_password_lifetime で設定された日数で期限切れにする
0の場合は期限切れにならない (デフォルトはこれ)
NEVER は、期限切れなし
INTERVAL N DAY で、任意の日数を指定することもできる
PASSWORD HISTORY {DEFAULT | N}
以前設定した何回分のパスワードは設定不可とするか
DEFAULT の場合 password_history の値を見る (デフォルトは 0 で、制限なし)
N で任意の回数を指定することもできる
PASSWORD REUSE INTERVAL {DEFAULT | N DAY}
今後何日間は同じパスワードの設定を不可とするか
DEFAULT の場合 password_reuse_interval の値を見る (デフォルトは 0 で、制限なし)
N で任意の日数を指定することもできる
PASSWORD REQUIRE CURRENT [DEFAULT | OPTIONAL]
パスワード変更時に今のパスワード入力を必要とするか
PASSWORD REQUIRE CURRENT のみの指定だと必須になる
DEFAULT をつけると、password_require_current の値を見る (デフォルトは OFF)
OPTIONAL だと任意になり、今のパスワードを入力しなくてもOKになる
FAILED_LOGIN_ATTEMPTS N
パスワードを何連続で失敗したらアカウントロックするか
0の場合この制限を行わない
PASSWORD_LOCK_TIME {N | UNBOUNDED}
パスワード連続失敗でのロック時に何日間ロックするか
0の場合ロックされなくなる
UNBOUNDED だと無期限のロックになる
lock_option
アカウントロック状態のユーザーとするか
lock_option: {
ACCOUNT LOCK
| ACCOUNT UNLOCK
}
[COMMENT ‘comment_string’ | ATTRIBUTE ‘json_object’]
COMMENT で生成するユーザーに対するコメントを設定できる
ATTRIBUTE はJSON形式で、そのユーザーに対する任意の属性を設定できる


コメント