admin 管理员组文章数量: 887007
一、背景
某次某平台进行安全性符合型评估时,列出了数据库相关安全选项,本文特对此记录,以供备忘参考。
二、安全配置
2.1、数据库系统登录时的用户进行身份标识和鉴别;
1)对登录Mysql系统用户的密码复杂度是否有要求?
即需要满足密码复杂度要求,至少8位长度,大小写各1个,数字2个,特殊字符至少1个,密码有效期3个月。现场版本5.7.34;Mysql 5.6后自带validate_password.so插件(windows为validate_password.dll)
//检查是否启用命令,如果啥也没返回,就是没启用
mysql> SHOW VARIABLES LIKE 'validate_password%';
mysql> SELECT * from mysql.plugin ;
mysql> show plugins;
#安装插件
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so'; #Linux
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.dll'; #windows
#验证
mysql> SELECT * from mysql.plugin ;
#创建一个名为password_policy的新表,用于存储密码策略的相关信息
CREATE TABLE password_policy (
id INT PRIMARY KEY AUTO_INCREMENT,
uppercase_required BOOLEAN NOT NULL, #至少一个大写字母
lowercase_required BOOLEAN NOT NULL, #至少一个小写字母
number_required BOOLEAN NOT NULL, #至少一个数字
special_character_required BOOLEAN NOT NULL, #至少一个特殊字符
min_length INT NOT NULL #密码的最小长度
);
完成后修改配置文件写入:
plugin-load-add=validate_password.so
validate-password=ON
validate_password_policy = 1 ##0(LOW), 1 (MEDIUM), 2 (STRONG)
validate_password_length = 8
validate_password_mixed_case_count = 1 #大小写字符长度,至少1个
validate_password_number_count = 2
validate_password_special_char_count = 1 #特殊字符至少1个
default_password_lifetime=180
password_history=6 #能选择最近使用过的6个密码
password_reuse_interval=365 #设置不能选择最近一年内的密码
#验证测试密码符合度
SELECT VALIDATE_PASSWORD_STRENGTH('Ad32weak$_@123');
规则说明:详情参看官网说明:
策略 | 检查规则 |
---|---|
0 or LOW | Length(满足长度要求) |
1 or MEDIUM | Length; numeric, lowercase/uppercase, and special characters |
2 or STRONG | Length; numeric, lowercase/uppercase, and special characters; dictionary file |
创建触发器:每次插入或更新用户密码时检查密码复杂度
CREATE TRIGGER check_password_complexity
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
DECLARE password_complexity_error VARCHAR(255) DEFAULT NULL;
IF NEW.password REGEXP '^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*]).{8,}$' = 0
THEN
SET password_complexity_error = 'Password must contain at least one uppercase letter, one lowercase letter, one number, one special character, and have a minimum length of 8 characters.';
END IF;
IF password_complexity_error IS NOT NULL
THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = password_complexity_error;
END IF;
END;
说明:上述触发器使用正则表达式(regular expression)检查被插入的新密码(NEW.password)是否满足复杂度要求。正则表达式^(?=.[a-z])(?=.[A-Z])(?=.[0-9])(?=.[!@#
%^&*]).{8,}
要求密码至少包含一个小写字母、一个大写字母、一个数字、一个特殊字符(!@#$%^&*)
,并且密码长度至少为8个字符。另,mysql 5.7 及之后版本的密码保存到 authentication_string 字段中不再使用password 字段。MySQL 8.0 在用户管理方面还增加了角色管理,默认的密码加密方式也做了调整,由之前的 SHA1 改为了 SHA2 ,不可逆 ,同时加上 MySQL 5.7 的禁用用户和用户过期的功能。
2.2 、是否启用ssl:
show variables like '%ssl%';
MySQL 8.4支持TLSv1.2和TLSv1.3协议进行连接,不再支持TLSv1 and TLSv1.1。要使用TLSv1.3,MySQL服务器和客户端应用程序都必须使用OpenSSL 1.1.1或更高版本进行编译。更多参考:8.4 安全连接配置
#mysql ssl_key
mysql> Sshow variables like 'ssl_key';
mysql> Sshow variables like 'ssl_ca';
mysql> Sshow variables like 'ssl_cert';
mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher';
+---------------+---------------------------+
| Variable_name | Value |
+---------------+---------------------------+
| Ssl_cipher | DHE-RSA-AES128-GCM-SHA256 |
+---------------+---------------------------+
mysql> \s
...
SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256
mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';
mysql> SELECT * FROM performance_schema.session_status WHERE VARIABLE_NAME IN ('Ssl_version','Ssl_cipher');
#配置ssl秘钥,采用pem格式,放在数据目录下;其中,证书和密钥文件会呗mysql自动发现,其启动时默认激活连接采用加密方式
[mysqld]
ssl-ca=/path/to/ca.pem
ssl-cert=/path/to/server-cert.pem
ssl-key=/path/to/server-key.pem
require_secure_transport=ON #开启客户端连接使用加密连接
mysql> SET PERSIST require_secure_transport=ON;
mysql> CREATE USER 'jeffrey'@'localhost' REQUIRE X509; #使用x509证书加密连接
#生成SSL证书与密钥
openssl genrsa -out server-key.pem 2048 #生成私钥
# 生成CSR (Certificate Signing Request)
openssl req -new -key server-key.pem -out server-csr.pem
#生成证书
openssl x509 -req -in server-csr.pem -signkey server-key.pem -out server-cert.pem
# 合并证书与私钥到一个文件,最后生成一个带有证书和私钥的"server.pem"文件
cat server-cert.pem server-key .pem > server.pem
#客户端配置
[client]
ssl-ca=/path/to/ca.pem
#验证
mysql -u username -p --ssl-ca=/path/to/ca.pem--ssl-cert=/path/to/client-cert.pem --ssl-key=/path/to/client-key.pem
2.3、最小化权限配置
主要分为:用户管理权限、对象管理权限和SQL执行权限。最小化权限原则是指,只授权用户所必需的权限,并且要尽可能地限制其权限范围。
#创建只读用户
mysql> GRANT SELECT ON database_name.* TO 'OR_user'@'localhost' IDENTIFIED BY 'password';
#去除删除权限,须用户重新登录后才能生效
mysql> REVOKE DROP ON database_name.* FROM 'dbadmin'@'localhost';
mysql> REVOKE SELECT,INSERT,UPDATE,DELETE ON mysql.* FROM 'dbadmin'@'localhost';
#限制用户操作的表和字段
mysql> GRANT SELECT (name, age) ON rsms.user TO 'test'@'localhost' IDENTIFIED BY 'password';
#创建一个名为“user_acl”的视图,只能查询名为“user”的表中“name”和“age”字段,可以使用以下命令:
mysql> CREATE VIEW user_acl AS SELECT name,age FROM user;
#验证
mysql> SHOW GRANTS FOR CURRENT_USER();
mysql> SHOW GRANTS FOR 'user'@'主机地址' ;
mysql> SELECT host,user,authentication_string,select_priv,insert_priv,drop_priv
FROM mysql.user;
2.4、权限分级配置
权限分级原则是指,根据用户角色或职责的不同,对其进行权限分级管理,避免数据被未经授权的用户访问和操作。
#8.0中创建角色
mysql> CREATE ROLE 'role_name'[@'host_name'] [,'role_name'[@'host_name']]……
mysql> GRANT role [,role2,...] TO user [,user2,...];
mysql> REVOKE role FROM user; #撤销用户的角色
#验证
mysql> SELECT CURRENT_ROLE();
#激活角色,激活4个
mysql> SET DEFAULT ROLE ALL TO
'admin'@'localhost',
'read_user1'@'localhost',
'read_user2'@'localhost',
'rw_user1'@'localhost';
#临时配置角色
mysql> SET PERSIST mandatory_roles = 'role1,role2@localhost,rw_user1@%'; #系统重启后仍然有效
mysql> SET GLOBAL mandatory_roles = 'role1,role2@localhost,rw_user1@%'; #系统重启后失效
#写到配置文件里,固定
[mysqld]
mandatory_roles='role1,role2@localhost,rw_user1@%'
#验证
mysql> show variables like 'activate_all_roles_on_login';
#对所有角色永久激活
mysql> SET GLOBAL activate_all_roles_on_login=ON;
版权声明:本文标题:Mysql安全之基础合规配置 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1733954199h1646991.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论