四. MySQL 账号和密码管理
四. MySQL 账号和密码管理
密码策略
MySQL 数据库中设置密码策略可以通过修改系统变量来实现,主要是通过调整密码验证插件和相关参数来强制或控制用户密码的复杂性和安全性要求。
密码策略查看
- 查看当前密码策略设置
SHOW VARIABLES LIKE 'validate_password%';
- 密码的长度
是由validate_password_length决定的,而validate_password_length的计算公式
validate_password_length = validate_password_number_count + validate_password_special_char_count + (2 * validate_password_mixed_case_count)
密码策略设置
在 MySQL 中,通常使用 validate_password 插件来实施密码策略。可以通过修改以下几个关键变量来配置密码策略
密码策略
validate_password_policy: 指定密码复杂性要求的级别
0:禁用密码策略(不推荐)。 1:最低要求,至少包含数字、小写字母和大写字母。 2:中等要求,包含级别 1 的要求,并可包括特殊字符。 3:最严格要求,包含级别 2 的要求,并增加对密码字典的检查。
validate_password_mixed_case_count: 密码中必须包含的大写字母数量。
validate_password_number_count: 密码中必须包含的数字数量。
validate_password_special_char_count: 密码中必须包含的特殊字符数量。
mysql> set global validate_password_policy=2;
mysql> SET GLOBAL validate_password_mixed_case_count = 1;
mysql> SET GLOBAL validate_password_number_count = 1;
mysql> SET GLOBAL validate_password_special_char_count = 1;
修改 MySQL 配置文件 (my.cnf 或 my.ini),并在 [mysqld] 部分添加或修改这些参数
[root@localhost ~]# cat /etc/my.cnf
[mysqld]
validate_password_policy=2;
validate_password_mixed_case_count = 1;
validate_password_number_count = 1;
validate_password_special_char_count = 1;
密码长度
- validate_password_length: 控制密码的最小长度。默认为 8。
mysql> set global validate_password_length=1;
初始化密码
mysql> use mysql;
mysql> UPDATE USER SET Password = PASSWORD('new-password') WHERE USER = 'root';
mysql> FLUSH PRIVILEGES;
mysql> ALTER USER USER() IDENTIFIED BY '1234566';
mysql> FLUSH PRIVILEGES;
获取默认初始化密码
默认已经被自动初始化了随机密码
grep "password" /var/log/mysqld.log
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
mysql> ALTER USER 'username'@'IP' IDENTIFIED WITH mysql_native_password BY 'newPassword';
mysql> flush privileges;
创建密码
MySQL 的密码认证格式是三段式的,即 用户名
、被授权主机
和 密码
。
用户名
: 可以是任意字符串被授权主机
: 指可以从哪些主机访问数据库,符合通配(如%表示任意主机)格式的 IP、IP段、域名 即可密码
: 任意字符串,且符合密码策略即可
其中 用户名
@被授权主机
的组合形式称为 白名单。
符合规范的 白名单 | 说明 |
---|---|
userName@'10.0.0.11' | 只能 "10.0.0.11" 主机访问数据库 |
userName@'10.0.0.%' | 可以从任意 "10.0.0.1" 到 "10.0.0.255" 主机访问数据库 |
userName@'10.0.0.3%' | 可以从任意 "10.0.0.31" 到 "10.0.0.39" 主机访问数据库 |
userName@'10.0.0.0/255.255.255.0' | 可以从任意 "10.0.0.0" 网段主机访问数据库 |
userName@'domain.com' | 可以从 "domain.com" 这个域名访问数据库 |
userName@'localhost' | 只能从 "localhost" 访问数据库 |
案例
mysql> CREATE USER 'newUserName'@'172.31.%.%' IDENTIFIED BY 'newPassword';
mysql> FLUSH PRIVILEGES;
修改密码
- 方法一
ALTER USER 'userName'@'ip' IDENTIFIED BY 'newPassword';
- 方法二
SET PASSWORD FOR 'userName'@'ip' = PASSWORD('newPassword');
- 方法三
只是修改了当前用户的当前链接方式
SET PASSWORD = password('newPassword');
- 方法四
修改当前用户所有连接方式的密码;方式太粗暴,不建议用
UPDATE USER SET PASSWORD = password('newPassword'); #
- 方法五
用户不存在则会创建
GRANT ALL ON *.* TO 'userName'@'localhost' IDENTIFIED BY '123456';
- 方法六
终端方式修改的管理员密码
mysqladmin -uroot -p password newpassowrd
删除
mysql> DROP USER userName@'ip';
mysql> DELETE FROM USER WHERE USRE='userName' AND HOST='localhost';
注意
drop
不仅会将user
表中的数据删除,还会删除其他权限表的内容。delete
只删除user
表中的内容,所以使用delete删除用户后需要执行FLUSH PRIVILEGES;刷新权限,否则下次使用create语句创建用户时会报错