Mysql8.0 安全配置

        目前业界的MySQL主流分支版本有Oracle官方版本的MySQL、Percona Server for mysql、MariaDB。每个分支都有自己的特色,功能也存在不同的差异。我们平常使用的官方版本是指的ORACLE官方版本的Mysql,官方版本主要分为社区版和企业版,两者的差异主要在一些定制插件方面。今天要说的相关安全配置主要是以mysql 8.0版本介绍。

  1. 口令策略

默认MySQL登录一般通过内部的mysql.user表进行用户名、密码的匹配验证,登录mysql数据库时,连接层接入数据库需要经过mysql.user表中,用户名密码的验证才能登录数据库,如果mysql.user中不存在此用户或者密码不正确,则会返回错误提示。

password_history = 3  新密码不能和前面三次的密码相同;

password_reuse_interval = 90  新密码不能和前面九十天内使用的密码相同;

password_require_current = on 默认为off;为on 时 修改密码需要用户提供当前密码 (开启后修改密码需要验证旧密码,root 用户不需要);

mysql 密码策略是插件形式,默认安装时是没有加载的,可以通过查看插件 show plugins 查看validate_password

安装方法:

mysql> install plugin validate_password soname 'validate_password.dll';

Query OK, 0 rows affected, 1 warning (0.18 sec)

修改my配置文件重启数据库服务

[mysqld]

plugin-load=validate_password=validate_password.dll

查看插件状态

  1. select plugin_name, plugin_status from information_schema.plugins where plugin_name='validate_password'  

plugin_status: ACTIVE 激活

查看参数

  1. mysql>  show variables like 'validate_password%';  
  2. +--------------------------------------+--------+  
  3. | Variable_name                        | Value  |  
  4. +--------------------------------------+--------+  
  5. | validate_password_check_user_name    | ON     |  
  6. | validate_password_dictionary_file    |        |  
  7. | validate_password_length             | 8      |  
  8. | validate_password_mixed_case_count   | 1      |  
  9. | validate_password_number_count       | 1      |  
  10. | validate_password_policy             | MEDIUM |  
  11. | validate_password_special_char_count | 1      |  
  12. +--------------------------------------+--------+  
  13. rows in set, 1 warning (0.00 sec)  

validate_password.length固定密码的总长度;

validate_password.dictionary_file 指定密码验证的文件路径;

validate_password.mixed.case_count整个密码中至少要包含大/小写字母的总个数;

validate_password.number_count整个密码中至少要包含阿拉伯数字的个数;

validate_password_special_char_count整个密码中至少要包含特殊字符的个数;

validate_password.policy 指定密码的强度验证等级,默认为 MEDIUM;

关于 validate_password.policy 的取值:

0/LOW:只验证长度;

1/MEDIUM:验证长度、数字、大小写、特殊字符;

2/STRONG:验证长度、数字、大小写、特殊字符、字典文件;

修改代码

mysql> set global validate_password_policy=LOW;  

Query OK, 0 rows affected (0.00 sec)  

2.角色与权限

MySQL 8.0 版本引入了角色( Role ),角色是权限的集合,可以通过对角色赋权,实现更加快捷统一的管理模式。先创建不同角色,然后授予角色不同权限,最后给用户授予不同的角色。

 

角色创建代码

 --创建3个角色:  

mysql> CREATE ROLE 'app_developer''app_read''app_write';  

--给每个角色授权:  

mysql> GRANT ALL ON app_db.* TO 'app_developer';    --:app_db给这个角色所有权限  

mysql> GRANT SELECT ON app_db.* TO 'app_read';      --:app_db给这个角色只读权限  

mysql> GRANT INSERTUPDATEDELETE ON app_db.* TO 'app_write';   --:app_db给这个角色写权限  

--给每个用户授予不同的角色:  

GRANT 'app_developer' TO 'dev1'@'localhost';  

GRANT 'app_read' TO 'read_user1'@'localhost''read_user2'@'localhost';  

GRANT 'app_read''app_write' TO 'rw_user1'@'localhost';  

权限分布

可能设置的权限

表权限

select Insert Update Delete Create Drop Grant References Index Alter

列权限

select Insert Update References

过程权限

execute , Alter Routine , Grant

查看权限 show privileges

系统角色功能默认为 OFF 即不自动激活,建议将该变量activate_all_roles_on_login改为 ON ,这样以后赋予角色给新用户后就不需要再手动激活了。

查看 activate_all_roles_on_login 变量  

mysql> show variables like 'activate_all_roles_on_login';  

+-----------------------------+-------+  

| Variable_name               | Value |  

+-----------------------------+-------+  

| activate_all_roles_on_login | OFF   |  

+-----------------------------+-------+  

1 row in set (1.53 sec)    

启用该变量 先动态启用 之后可以将此参数加入my.cnf配置文件中  

mysql> set global activate_all_roles_on_login = on;  

Query OK, 0 rows affected (0.50 sec)  

3.数据库访问控制

        验证来源主机能通过具体主机名或者IP地址指定的尽量通过使用具体的主机名和 IP 地址来限定来访主机,不能用具体的主机名或者 IP 地址限定的也需要用尽可能小的通配范围来限制,减少使用“%”通配符访问主机带来的潜在风险,最好使用防火墙控制访问权限。

客户端连接通过用户管理模块的验证,建立连接后,就会发送各种Query和Command 给MySQL,以实现客户端应用的各种功能。当 MySQL 接收到客户端的请求之后,访问控制模块是需要校验该用户是否满足提交的请求所需要的权限。权限校验过程是从最大范围的权限往最小范围的权限开始依次校验所涉及到的每个对象的每个权限。

对于密码敏感,但是又需要给外部维护者提供访问权限的情况下无密码访问是有必要的。

创建无密码登录示例

mysql_config_editor set --login-path=fastlogin --user=root --host=localhost --password --prot=3306  --socket=/tmp/mysqld.sock  

Enter password: #第一次需要输入密码    

ll -la .my* #当前路径下生成一个隐藏文件.mylogin.cnf  

mysql_config_editor print --login-path=fastlogin #要查看里面的明细信息  

mysql --login-path=fastlogin  #大功告成,这个时候直接登录  

mysql_config_editor remove -login-path=fastlogin #禁用删除.login文件不会删除  

密码登录的别名: fastlogin 

​​​​​​​4.数据库审计

Mysql社区版默认没有提供审计功能,只能通过开启通用日志功能,通用查询日志以文本文件的形式存储,如果数据库的使用非常频繁,通用查询日志将会占用非常大的磁盘空间,对系统性能影响较大。一般情况尽量减少使用。这里可推荐使用Percona for msyql 审计

安装插件

INSTALL PLUGIN audit_log SONAME 'audit_log.so';  

审计参数:

show session  variables like '%audit%';  

+-----------------------------+---------------+  

| Variable_name               | Value         |  

+-----------------------------+---------------+  

| audit_log_buffer_size       | 1048576       |#审计缓冲区的大小,仅对 ASYNCHRONOUS  PERFORMANCE 策略有意义。  

| audit_log_exclude_accounts  |               |#排除用户  

| audit_log_exclude_commands  |               |  

| audit_log_exclude_databases |               |#排除数据库  

| audit_log_file              | audit.log     |#日志路径  

| audit_log_flush             | OFF           |#句柄  

| audit_log_format            | OLD           |  

| audit_log_handler           | FILE          |#类型  

| audit_log_include_accounts  |               |#包含用户  

| audit_log_include_commands  |               |  

| audit_log_include_databases |               |#包含数据训  

| audit_log_policy            | ALL           |#策略  none 关闭 ALL 开启)  

| audit_log_rotate_on_size    | 0             |#限制日志文件的大小  

| audit_log_rotations         | 0             |#指定日志文件的数量  

| audit_log_strategy          | ASYNCHRONOUS  |#异步记录,等待输出缓冲区中的空间  

| audit_log_syslog_facility   | LOG_USER      |  

| audit_log_syslog_ident      | percona-audit |  

| audit_log_syslog_priority   | LOG_INFO      |#rsyslog  

+-----------------------------+---------------+  

18 rows in set (0.00 sec)  

关闭审计

使用下面这条命令,就可以关闭审计日志功能  

set global audit_log_policy=none;   

如果这是永久性更改,请将该值添加到my.cnf文件中。

5.漏洞补丁升级

        补丁建议使用官文包,下载的最好去验证MD5值,防止病毒软件包被篡改植入勒索病毒,安装包不完整或者损坏造成服务不能使用。最简单有效的方法,下载新版本安装。

6.通信信息安全

        MySQL 提供的网络访问模式,主要有socket 和TCP /IP 两类, 并且对于每个实例,只能对应一个端口,如果使用本地访问,启动MySQL的时候通过使用“--skip-networking” 参数选项,让 MySQL 不通过 TCP/IP 监听网络请求,使用socket和客户端连接交互,目前项目大部分应用场景都在网络环境下,通过网络连接提供服务,所以要解决网络方面存在的潜在安全威胁,局域网络通过网络防火墙设备控制出口的安全,修改默认3306端口,使用SSL加密通道,将传输数据进行加密。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值