mysql数据库安全加固
Posted 萌新_大鹏鸟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql数据库安全加固相关的知识,希望对你有一定的参考价值。
mysql数据库安全加固
一、安装Mysql服务
1、创建mysql文件安装目录
mkdir /opt/mysql
2、进入该目录下载解压安装文件
cd /opt/mysql/
wget http://dev.mysql.com/get/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
yum install pcre pcre-devel gcc openssl openssl-devel zlib zlib-devel
3、删除自带的数据库 mariadb(如果虚拟机上有的话,没有则不管),会跟 mysql 发生冲突。
首先执行下面命令查看是否存在,如果有删除即可
rpm -qa | grep mari
rpm -e --nodeps mariadb-libs
rpm -e --nodeps marisa
4、开始安装 mysql,依次执行下述命令
rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
5、启动mysql服务
systemctl start mysqld.service
systemctl restart mysqld.service
systemctl stop mysqld.service
systemctl status mysqld.service
find / -name my.cnf # 查找mysql配置文件
6、mysql 自动给 root 用户设置随机密码,运行命令可查看当前密码,登录成功后需要修改密码
grep "password" /var/log/mysqld.log
7、利用上面查到的密码,进入 mysql
mysql -u root -p
8、修改数据库密码
set password for 'root'@'localhost'=password('Lyp@123.com');
flush privileges;
9、连接Navicate,记得要开启3306端口,虚拟机直接关闭防火墙即可
# 查看防火墙是否已开放3306端口
firewall-cmd --query-port=3306/tcp
# 设置3306端口为永久开放
firewall-cmd --add-port=3306/tcp --permanent
# 查看firewalld状态,发现当前是dead状态,即防火墙未开启
systemctl status firewalld
# 关闭防火墙
systemctl stop firewalld
# 重启防火墙(设置了新的端口记得先关闭,再重启)
systemctl status firewalld
10、如果还是登录失败可以进入数据库中执行如下命令,修改当前用户的登录权限(本地登录,指定IP登录和无限制登录)
use mysql;
SELECT Host, User FROM user;
UPDATE user SET Host = '%' WHERE User = 'root';
flush privileges;
二、Mysql安全加固
create user 'test'@'localhost' identified by 'Test@123.com'; # 只能本地登录
create user 'test'@'192.168.7.22' identified by 'Test@123.com'; # 指定IP登录
create user 'test'@'%' identified by 'Test@123.com'; # 无限制
drop user 'test'@'localhost'; # 删除用户
set password = password('Test@123.com'); # 修改当前用户密码
set password for 'test'@'%'='Lyp@123.com'; # 修改test用户的密码
alter user 'test'@'%' account lock; # 锁定test用户
alter user 'test'@'%' account unlock; # 解锁test用户
一、空密码与有效期
1、执行如下执行SQL语句检查密码是否为空:
select user,host from mysql.user where length(authentication_string) = 0;
或
select user,host,authentication_string,password_lifetime,account_locked from mysql.user;
2、新建mysql用户
create user 'test'@'localhost' identified by 'Test@123.com'; # 只能本地登录
create user 'test'@'192.168.7.22' identified by 'Test@123.com'; # 指定IP登录
create user 'test'@'%' identified by 'Test@123.com'; # 无限制
3、删除用户
drop user 'test'@'%';
4、修改当前用户密码
set password = password('Test@123.com');
5、修改其他用户密码
set password for 'test'@'%'='Lyp@123.com'; # 修改test用户的密码
6、锁定用户
alter user 'test'@'%' account lock; # 锁定test用户
7、解锁用户
alter user 'test'@'%' account unlock; # 解锁test用户
8、设置密码有效期
show global variables like 'default_password_lifetime';
在mysql的配置文件中修改密码的有效期
vim /etc/my.cnf # find / -name my.cnf 查找配置文件
二、密码复杂度
1、根据业务需要设置密码复杂度,配置文件中修改即可
plugin-load = "validate_password.so"
validate-password = FORCE_PLUS_PERMANENT # 强制启用该插件,不能被卸载
validate_password_length = 8 # 密码位数
validate_password_policy = 1 # 密码强度为medium或者1
validate_password_mixed_case_count = 1 # 至少有大小写字母
validate_password_number_count = 1 # 最少一个数字
validate_password_special_char_count = 1 # 最少一个符号
2、配置完成后查看密码复杂度设置
show variables like 'validate%';
三、 登录失败和连接超时
1、登录数据库安装两个插件即可
install plugin CONNECTION_CONTROL soname 'connection_control.so';
install plugin CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS soname 'connection_control.so';
2、查看安装的两个插件
show plugins;
3、修改配置文件增加如下两行配置
vim /etc/my.cnf
connection-control-failed-connections-threshold=5 #登陆失败次数限制
connection-control-min-connection-delay=1800000 #限制重试时间,此处为毫秒,注意按需求换算
4、重启mysql服务器,查看策略是否生效
service mysqld restart
show variables like '%connection_control%';
5、验证配置连续输入5次密码后的情况
mysql -u root -p
6、设置超时时间
set global interactive_timeout=1800;
set global wait_timeout=1800;
查看配置是否生效
show global variables like 'interactive_timeout';
show global variables like 'wait_timeout';
四、远程登录限制
1、如非业务需要应该禁止远程登录或者禁止以root用户登录mysql
select user,host from mysql.user where user='root';
2、启用ssl连接进行加密,如果本地管理不适用,如果是远程连接查看是否开启SSL加密组件,执行如下命令查看
show variables like "%have_ssl%";
show variables like "%have_openssl%";
五、会话连接数
1、设置myql会话连接数
max_connections = 150 # 是对整个服务器的用户做出限制,
max_user_connections = 0 # 是对每个用户的限制,0表示不限制
六、启用日志审计
1、mysql默认启用日志审计,记录的内容也符合相关安全要求,此项默认符合
log-error=/var/log/mysqld.log
七、禁用local-infile选项
1、禁用local_infile选项会降低攻击者通过SQL注入漏洞读取敏感文件的能力
执行如下SQL语句:
show variables like 'local_infile';
若返回结果不为OFF,则在/etc/my.cnf配置文件中修改
local_infile = 0
八、禁用符号链接
1、禁用符号链接以防止各种安全风险,在配置文件中添加如下配置
skip_symbolic_links=yes
九、修改默认端口
port = 3306
十、用户权限合理分配
1、查看各账户和权限分配情况,应遵循三权分立原则(分为系统管理员、安全管理员、安全审计员等,并检查系统各用户所属的权限组。如:系统管理员不能进行业务操作、审计操作审计员不能进行业务操作、系统管理操作安全员不能进行添加账号操作等)
查看mysql用户
select user,host,account_locked from mysql.user;
查看root用户权限信息
show grants for 'root'@'%';
2、创建MySQL用户和权限
# 1.使用create创建用户,后再授权
# 1.1 创建 bb 用户,设置密码为Bb@123.com,并没有权限
create user 'bb'@'%' identified by 'Bb@123.com';
# 1.2 授予bb查询和添加test库的权限
grant select,insert,update,delete,create,alter on test.* to 'bb';
# 2.使用GRANT创建用户并授权test库的所有操作
grant all privileges on test.* to 'bb'@'%' identified by "Bb@123.com" with grant option;
命令解释
1. all privileges 是表示所有权限,你也可以使用select、update等权限。
2. ON 用来指定权限针对哪些库和表
3. test.* 表示test库的所有表
4. TO 表示将权限赋予某个用户。
5. 'bb'@'%' 表示bb用户,主机为%。主机可以是IP、IP段、域名以及%
6. identified by 指定用户的登录密码
with grant option 这个选项表示该用户可以将自己拥有的权限授权给别人
3、回收权限
# 回收alter权限
revoke alter on test.* from 'bb'@'%';
# 回收所有权限
revoke all privilegeson test.* from 'bb'@'%';
以上是关于mysql数据库安全加固的主要内容,如果未能解决你的问题,请参考以下文章