This section describes how to create user accounts. It
demonstrates configuring global password policies, using
security-related CREATE USER
options, granting user privileges, and verifying user privileges
and authentication.
Two user accounts are created: user1 and
user2. The user1 account is
defined with an SSL/TLS option that requires an encrypted
connection. The user2 account is defined
without an SSL/TLS option (REQUIRE NONE) so
that it can be used to demonstrate RSA key pair-based password
exchange with the server over an unencrypted connection.
-
Define global password history, reuse, expiration, and verification-required policies:
-
A global password history policy is defined using the
password_historysystem variable. The default setting is 0, which means that there is no restriction. To require a specified number of password changes before the same password can be reused, add an entry similar to this under the[mysqld]option group in the MySQL configuration file (/etc/my.cnf):password_history=12A setting of
12means that a minimum of 12 password changes must occur before a password can be reused. -
A global password reuse policy is defined using the
password_reuse_intervalsystem variable. The default setting is 0, which means that there is no restriction. To require that a specified number of days pass before the same password can be reused, add an entry similar to this under the[mysqld]option group in the MySQL configuration file (/etc/my.cnf):password_reuse_interval=1095A setting of
1095means that a minimum of 1095 days must pass before a password can be reused. -
A global automatic password expiration policy is defined using the
default_password_lifetimesystem variable. The default setting is 0, which disables automatic password expiration. To have passwords automatically expire after a specified number of days, add an entry similar to this under the[mysqld]option group in the MySQL configuration file (/etc/my.cnf):default_password_lifetime=120A setting of
120means that the lifetime of a password is 120 days, after which it automatically expires. -
A global password verification-required policy is defined using the
password_require_currentsystem variable. The default setting is 0, which means that password changes do not require specifying the current password. To require that password changes specify the current password, add the following entry under the[mysqld]option group in the MySQL configuration file (/etc/my.cnf):password_require_current=1
Restart the server to apply the configuration changes:
$> systemctl restart mysqld -
-
Log in as root.
$> cd /usr/local/mysql $> bin/mysql -u root -p Enter password: (enter root password here) -
Create the user accounts. The following statements create user accounts named
'user1'@'and203.0.113.11''user1'@', where203.0.113.12203.0.113.11and203.0.113.12are the IP addresses of the client hosts. The statements include security-related options for enabling authentication, defining SSL/TLS requirements, generating a random password, limiting server resource usage, and managing password expiration.mysql> CREATE USER 'user1'@'203.0.113.11' IDENTIFIED WITH caching_sha2_password BY RANDOM PASSWORD REQUIRE X509 WITH MAX_USER_CONNECTIONS 3 PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD EXPIRE DEFAULT PASSWORD REQUIRE CURRENT DEFAULT FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME UNBOUNDED; +-------+--------------+----------------------+ | user | host | generated password | +-------+--------------+----------------------+ | user1 | 203.0.113.11 | e6<]aR3he*XPg3o6ML<7 | +-------+--------------+----------------------+mysql> CREATE USER 'user2'@'203.0.113.12' IDENTIFIED WITH caching_sha2_password BY RANDOM PASSWORD REQUIRE NONE WITH MAX_USER_CONNECTIONS 3 PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD EXPIRE DEFAULT PASSWORD REQUIRE CURRENT DEFAULT FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME UNBOUNDED; +-------+--------------+----------------------+ | user | host | generated password | +-------+--------------+----------------------+ | user2 | 203.0.113.12 | VT@jNXB3@CvVB>/vMbke | +-------+--------------+----------------------+CREATE USERstatement options:-
IDENTIFIED WITH caching_sha2_password BY RANDOM PASSWORDSets the account authentication plugin to
sha256_password, generates a random password that is passed as a cleartext value to the plugin for hashing, and stores the result in themysql.useraccount row. The cleartext random password is also returned in a row of a result set (as shown above) to make it available to the user executing the statement.NoteThe
RANDOM PASSWORDoption is used as an alternative to an administrator-specified literal password. By default, generated random passwords have a length of 20 characters. This length is controlled by thegenerated_random_password_lengthsystem variable, which has a range from 5 to 255. The default length is used in this deployment.If an administrator-specified literal password is specified instead of the
RANDOM PASSWORDoption, the literalpasswordvalue must conform to the password policy enabled by thevalidate_passwordcomponent. (See Chapter 6, Installing the MySQL Password Validation Component.) The policy that thevalidate_passwordcomponent implements has no effect on generated passwords. The purpose of avalidate_passwordpolicy is to help humans create better passwords.For more information, see CREATE USER Authentication Options.
-
REQUIRE X509This SSL/TLS option is only used for the
user1account.MySQL can check X509 certificate attributes in addition to the usual authentication that is based on the user name and credentials. Available SSL/TLS options include
SSL,X509,ISSUER,SUBJECT, andCIPHER. TheCREATE USERstatement foruser1uses theX509option, which requires that clients present a valid certificate, but the exact certificate, issuer, and subject do not matter. The only requirement is that it should be possible to verify its signature with one of the CA certificates. Use ofX509certificates always implies encryption, so it is unnecessary to also specify theSSLoption.For more information, see CREATE USER SSL/TLS Options.
-
REQUIRE NONEIndicates that the account has no
TLSorX509requirements. Unencrypted connections are permitted if the user name and password are valid. Encrypted connections can be used, at the client's option, if the client has the proper certificate and key files.NONEis the default if no SSL-relatedREQUIREoptions are specified.For more information, see CREATE USER SSL/TLS Options.
-
MAX_USER_CONNECTIONS 3Restricts the maximum number of simultaneous connections to the server by the account. If the number is 0 (the default), the server determines the number of simultaneous connections for the account from the global value of the
max_user_connectionssystem variable.MAX_USER_CONNECTIONS 3means that the account can have a maximum of 3 simultaneous connections to the server.Other resource-limiting options not used here include
MAX_QUERIES_PER_HOUR,MAX_UPDATES_PER_HOUR, andMAX_CONNECTIONS_PER_HOUR. For more information, see CREATE USER Resource-Limit Options. -
PASSWORD HISTORY DEFAULTApplies the global password history policy defined by the
password_historysystem variable. In an earlier step,password_historywas set to12to require that 12 password changes occur before the same password can be reused. -
PASSWORD REUSE INTERVAL DEFAULTApplies the global password reuse policy defined by the
password_reuse_intervalsystem variable. In an earlier step,password_reuse_intervalwas set to1095to require that 1095 days pass before the same password can be reused. -
PASSWORD EXPIRE DEFAULTApplies the global automatic password expiration policy defined by the
default_password_lifetimesystem variable. In an earlier step,default_password_lifetimewas set to 120 so that passwords automatically expire every 120 days.Other password expiration options include
PASSWORD EXPIRE,PASSWORD EXPIRE INTERVAL, andPASSWORD EXPIRE NEVER. For more information, see CREATE USER Password-Management Options. -
PASSWORD REQUIRE CURRENT DEFAULTCauses the account to defer to the global password verification-required policy defined by the
password_require_currentsystem variable. In an earlier step,password_require_currentwas enabled to require that password changes must specify the current password.Verification of the current password occurs when a user changes a password using the
ALTER USERorSET PASSWORDstatement. For more information, see Password Verification-Required Policy. -
FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME UNBOUNDEDThe
FAILED_LOGIN_ATTEMPTSoption defines how many consecutive incorrect passwords cause the account to become locked. ThePASSWORD_LOCK_TIMEoption defines how long the account is locked after too many consecutive login attempts provide an incorrect password.PASSWORD_LOCK_TIMEcan be set to a number of days or toUNBOUNDED, which specifies that the duration of locked state is unbounded and does not end until the account is unlocked.For more information, including the conditions under which unlocking occurs, see Failed-Login Tracking and Temporary Account Locking.
-
-
Grant user privileges. The following statements grant the
SHOW DATABASESprivilege to theuser1anduser2accounts:mysql> GRANT SHOW DATABASES ON *.* TO 'user1'@'203.0.113.11';mysql> GRANT SHOW DATABASES ON *.* TO 'user2'@'203.0.113.12';NoteThe privileges granted to a MySQL account determine which operations the account can perform. Following the principle of least privilege, a MySQL account should only be granted privileges required for its legitimate purposes. To facilitate effective privilege management, MySQL 8.0 provides two new privilege-related features: MySQL Roles and Dynamic Privileges. For information about these features, see Appendix D, SQL Roles and Dynamic Privileges.
-
To verify the privileges granted to the user accounts, issue a
SHOW GRANTSstatement. For example:mysql> SHOW GRANTS FOR 'user1'@'203.0.113.11'; +-----------------------------------------------------------------------------------+ | Grants for user1@203.0.113.11 | +-----------------------------------------------------------------------------------+ | GRANT SHOW DATABASES ON *.* TO 'user1'@'203.0.113.11' | +-----------------------------------------------------------------------------------+ -
To verify that the accounts are using the expected authentication plugin, issue this query:
mysql> SELECT user, plugin FROM mysql.user WHERE user LIKE ('user%')\G *************************** 1. row *************************** user: user1 plugin: caching_sha2_password *************************** 2. row *************************** user: user2 plugin: caching_sha2_password