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数据库安全加固的主要内容,如果未能解决你的问题,请参考以下文章

阿里云MySQL服务安全加固

mysql数据库安全加固

lamp下mysql安全加固

加固mysql服务器

Mysql加固--Centos(基础中的基础吧)

2 数据库安全加固