MySQL服务安全加固及防护
1、MySQL 安全防护
一、配置添加新用户密码复杂度检查
二、配置密码过期策略
三、MySQL数据库限制多次登录失败重试时间
一、配置密码复杂度检查
1.mysql 5.7.15版本好像默认启用了密码复杂度设置,插件名字叫做 validate_password
mysql>>INSTALL PLUGIN validate_password SONAME 'validate_password.so';
2、加上/etc/my.cnf配置
[mysqld]
plugin-load=validate_password.so
validate_password_policy=2
# 0 or LOW 仅需需符合密码长度
# 1 or MEDIUM 满足LOW策略,同时还需满足至少有1个数字,小写字母,大写字母和特殊字符
# 2 or STRONG 满足MEDIUM策略,同时密码不能存在字典文件(dictionary file)中
validate-password=FORCE_PLUS_PERMANENT
3.重启MySQL
systemctl restart mysqld.service
二、配置密码定期更换
定期更换口令策略:由于定期修改密码,会涉及到应用一块更改,涉及到应用重启,不建议定期修改密码。
1、在/etc/my.cnf配置文件中增加
[mysqld]
default_password_lifetime=90 # 90天过期
2、重启MySQL
systemctl restart mysqld.service
三、MySQL数据库限制多次登录失败重试时间
需求:
如果连续5次输入密码错误,限制登录数据库30分钟 --次数和限制时间可以根据实际变更
解决方法(通过MySQL插件控制)
1、登录数据库,安装插件(CONNECTION_CONTROL和CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS)
mysql -uroot -p
install plugin CONNECTION_CONTROL soname 'connection_control.so';
install plugin CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS soname 'connection_control.so';
2、查看所有已安装的插件
show plugins;
重新启动MySQL(根据版本选择重启命令)
service mysqld restart 或 service mysql restart
4、重新登录数据库,查看配置是否生效
mysql -uroot -p
show variables like '%connection_control%';
5、验证
输错5次密码后,会发现第6次登录会卡住,限制登录,时间为设定的限制时间30分钟
2、MySQL服务安全加固
转载来源 : https://help.aliyun.com/knowledge_detail/49568.html
介绍
数据库管理人员可以参考本文档进行 MySQL 数据库系统的安全配置加固,提高数据库的安全性,确保数据库服务稳定、安全、可靠地运行。
漏洞发现
您可以使用安骑士企业版自动检测您的服务器上是否存在 MySQL 漏洞问题,或者您也可以自己排查您服务器上的 MySQL 服务是否存在安全问题。
判断Mysql数据库版本
nmap的指纹识别可以精确的判断数据库的版本号,通过telnet来判断是否支持远程连接(telnet 192.168.0.88 3306)。当连接成功后会显示Mysql版本号。
然后可以利用hydra来探测是否存在弱口令。
hydra -L user.txt -P pass.txt -o savessh.log -f -vV -e ns 192.168.0.88 mysql
InnoDB并发调优
解决InnoDB高并发条件性能下降快,就是限制并发。SHOW INNODB STATUS输出中的SEMAPHORES部分来确认是否发生了并发问题,
并发 = CPU的数量 x 磁盘的数量 x 2
安全加固
1、帐号安全
正确设置目录权限:
设置目录权限的原则是软件和数据分开,具体如下:
- 将 mysql 安装在单独的用户下
- 安装时,以 root 用户进行安装,mysql 的软件默认都为 root 权限
- 安装完毕后,将数据目录权限设置为实际运行 mysql 的用户权限,比如:
Chown –R mysql:mysql /home/mysql/data
- 禁止 Mysql 以管理员帐号权限运行
以普通帐户安全运行 mysqld,禁止以管理员帐号权限运行 MySQL 服务。在 /etc/my.cnf 配置文件中进行以下设置。
[mysql.server]
user=mysql
- 避免不同用户间共享帐号
参考以下步骤。
a、创建用户。
mysql> mysql> insert into
mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_sub
ject) values("localhost","pppadmin",password("passwd"),'','','');
执行以上命令可以创建一个 phplamp 用户。
b、使用该用户登录 MySQL 服务。
mysql>exit;
@>mysql -u phplamp -p
@>输入密码
mysql>登录成功
- 删除无关帐号
DROP USER 语句可用于删除一个或多个 MySQL 账户。使用 DROP USER 命令时,必须确保当前账号拥有 MySQL 数据库的全局 CREATE USER 权限或 DELETE 权限。账户名称的用户和主机部分分别与用户表记录的 User 和 Host 列值相对应。
执行DROP USER user;语句,您可以取消一个账户和其权限,并删除来自所有授权表的帐户权限记录。
2、口令
检查账户默认密码和弱密码。口令长度需要至少八位,并包括数字、小写字母、大写字母和特殊符号四类中的至少两种类型,且五次以内不得设置相同的口令。密码应至少每 90 天进行一次更换。
修改root用户口令,删除空口令
您可以通过执行以下命令修改密码。
mysql> update user set password=password('test!p3') where user='root';
mysql> flush privileges;
3、授权
在数据库权限配置能力范围内,根据用户的业务需要,配置其所需的最小权限。
查看数据库授权情况。
mysql> use mysql;
mysql> select * from user;
mysql>select * from db;
mysql>select * from host;
mysql>select * from tables_priv;
mysql>select * from columns_priv;
通过 revoke 命令回收不必要的或危险的授权。
mysql> help revoke
Name: 'REVOKE'
Description:
Syntax:
REVOKE
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type]
{
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
}
FROM user [, user] ...
4、开启日志审计功能
数据库应配置日志功能,便于记录运行状况和操作行为。
MySQL服务有以下几种日志类型:
- 错误日志: -log-err
- 查询日志: -log (可选)
- 慢查询日志: -log-slow-queries (可选)
- 更新日志: -log-update
- 二进制日志: -log-bin
找到 MySQL 的安装目录,在 my.ini 配置文件中增加上述所需的日志类型参数,保存配置文件后,重启 MySQL 服务即可启用日志功能。例如,
#Enter a name for the binary log. Otherwise a default name will be used.
#log-bin=
#Enter a name for the query log file. Otherwise a default name will be used.
#log=
#Enter a name for the error log file. Otherwise a default name will be used.
log-error=
#Enter a name for the update log file. Otherwise a default name will be used.
#log-update=
该参数中启用错误日志。如果您需要启用其他的日志,只需把对应参数前面的 “#” 删除即可。
日志查询操作说明
执行show variables like 'log_%';命令可查看所有的 log。
执行show variables like 'log_bin';命令可查看具体的 log。
5、安装最新补丁
确保系统安装了最新的安全补丁。
注意: 在保证业务及网络安全的前提下,并经过兼容性测试后,安装更新补丁。
6、如果不需要,应禁止远程访问
禁止网络连接,防止猜解密码攻击、溢出攻击、和嗅探攻击。
注意: 仅限于应用和数据库在同一台主机的情况。
如果数据库不需要远程访问,可以禁止远程 TCP/IP 连接,通过在 MySQL 服务器的启动参数中添加–skip-networking参数使 MySQL 服务不监听任何 TCP/IP 连接,增加安全性。
您可以使用 安全组 进行内外网访问控制,建议不要将数据库高危服务对互联网开放。
7、设置可信 IP 访问控制
通过数据库所在操作系统的防火墙限制,实现只有信任的 IP 才能通过监听器访问数据库。
mysql> GRANT ALL PRIVILEGES ON db.*
·-> -> TO 用户名@'IP子网/掩码';
8、连接数设置
根据您的机器性能和业务需求,设置最大、最小连接数。
在 MySQL 配置文件(my.conf 或 my.ini)的 [mysqld] 配置段中添加max_connections = 1000,保存配置文件,重启 MySQL 服务后即可生效。
9、 删除匿名帐号:
安装完毕 mysql 后,会自动安装一个空帐号,普通用户只需要执行 mysql 命令即可
登陆 mysql,给系统造成隐患,建议删除此空帐号:
drop user ''@'localhost';
drop user ''@' localhost.localdomain’;
10、 给 mysql root 帐号设置口令:
Mysql 安装完毕后,root 默认口令为空,需要马上修改 root 口令:
[zzx@localhost data]$ mysql –uroot
mysql> set password=password('123');
Query OK, 0 rows affected (0.00 sec)
11、设置安全密码并定期修改:
尽量使用安全密码,建议使用 6 位以上字母、数字、下画线和一些特殊字符组合而
成的字符串
12、 只授予帐号必须的权限:
只需要赋予普通用户必须的权限,比如:
Grant select,insert,update,delete on tablename to
‘username’@’hostname’;
13、 除 root 外 , 任何用户不应有l mysql 库 user 表的存取权限:
如果拥有 mysql 库中 user 表的存取权限(select 、 update 、 insert 、 delete ), 就
可以轻易的增加、修改、删除其他的用户权限,造成系统的安全隐患。
14、 不要把 FILE 、S PROCESS 或 或 SUPER 权限授予管理员以外的帐号 : :
FILE 权限可以被滥用于将服务器主机上 MySQL能读取的任何文件读入到数据库表中 。
包括任何人可读的文件和服务器数据目录中的文件。可以使用 SELECT 访问数据库表 ,
然后将其内容传输到客户端上。不要向非管理用户授予 FILE 权限。有这权限的任何用户能在拥有 d mysqld 守护进程权
限的文件系统那里写一个文件!为了更加安全,由SELECT … INTO OUTFILE 生成的所有文件对每个人是可写的,并且你不能覆盖已经存在的文件。 file 权限也可以被用来读取任何作为运行服务器的 Unix 用户可读取或访问的文件。使用该权限,你可以将任何文件读入数据库表。这可能被滥用,例如,通过使用 LOAD DATA 装载“/etc/passwd”进一个数据库表,然后能用 SELECT 显示它。PROCESS 权限能被用来察看当前执行的查询的明文文本,包括设定或改变密码的查
询。
SUPER 权限能用来终止其它用户或更改服务器的操作方式。比如 kill 进程不要将 PROCESS 或 SUPER 权限授给非管理用户。n mysqladmin t processlist 的输出显示出当前执行的查询正文,如果另外的用户发出一个 UPDATE user SET password=PASSWORD(‘not_secure’)查询,被允许执行那个命令的任何用户可能看得到
15、 尽量避免通过 symlinks 访问表:
不要允许使用表的符号链接。(可以用–skip-symbolic-links 选项禁用)。如果 你
用 root 运行 mysqld则特别重要,因为任何对服务器的数据目录有写访问权限的人
则能够删除系统中的任何文件!
16、 使用 merge 存储引擎潜藏的安全漏洞:
Merge 表在某些版本中可能存在以下安全漏洞:
用户 A 赋予表 T 的权限给用户 B
用户 B 创建一个包含 T 的 merge 表,做各种操作
用户 A 收回对 T 的权限
安全隐患:用户 B 通过 merge 表仍然可以访问表 A 中的数据
17、 drop table 命令并不收回以前的相关访问授权:
drop 表的时候,其他用户对此表的权限并没有被收回,这样导致重新创建同名的
表时,以前其他用户对此表的权限会自动赋予,导致权限外流。
因此,要在删除表时,同时取消其他用户在此表上的相应权限。
18、 如果可能,给所有用户加上访问 IP 限制:
给所有用户加上 ip 限制将拒绝所有未知的主机进行的连接,保证只有受信任的主
机才可以进行连接。例如:
Grant select on dbname.* to ‘username’@’ip’ identified by
‘passwd’;
Mysql安全防护
1.禁用local-infile选项
禁用local_infile选项会降低攻击者通过SQL注入漏洞器读取敏感文件的能力
编辑Mysql配置文件/etc/my.cnf,在[mysqld](https://yundun.console.aliyun.com/?p=sasnext) 段落中配置local-infile参数为0,并重启mysql服务:
local-infile=0
2.确保配置了log-error选项
启用错误日志可以提高检测针对mysql和其他关键消息的恶意尝试的能力,例如,如果错误日志未启用,则连接错误可能会被忽略
编辑Mysql配置文件/etc/my.cnf,在[mysqld_safe](https://yundun.console.aliyun.com/?p=sasnext) 段落中配置log-error参数,<log_path>代表存放日志文件路径,如:/var/log/mysqld.log,并重启mysql服务:
log-error=<log_path>
3.禁用symbolic-links选项
编辑Mysql配置文件/etc/my.cnf,在[mysqld](https://yundun.console.aliyun.com/?p=sasnext) 段落中配置`symbolic-links=0`,5.6及以上版本应该配置为`skip_symbolic_links=yes`,并重启mysql服务。
4.为Mysql服务使用专用的最低特权帐户
使用最低权限帐户运行服务可减小MySQL天生漏洞的影响。受限帐户将无法访问与MySQL无关的资源,例如操作系统配置。
使用非root和非sudo权限用户启动Mysql服务
5.禁止使用–skip-grant-tables选项启动Mysql服务
使用此选项,会导致所有客户端都对所有数据库具有不受限制的访问权限。
6.删除’test’数据库
测试数据库可供所有用户访问,并可用于消耗系统资源。删除测试数据库将减少mysql服务器的攻击面
登陆数据库执行以下SQL语句删除test数据库:
DROP DATABASE test;
flush privileges;
7.确保log-raw选项没有配置为ON
当log-raw记录启用时,有权访问日志文件的人可能会看到纯文本密码。
编辑Mysql配置文件/etc/my.cnf,删除log-raw参数,并重启mysql服务
8.确保没有用户配置了通配符主机名
避免在主机名中只使用通配符,有助于限定可以连接数据库的客户端,否则服务就开放到了公网
执行SQL更新语句,为每个用户指定允许连接的host范围。
1. 登录数据库,执行use mysql; ;
2. 执行语句select user,Host from user where Host='%';查看HOST为通配符的用户;
3. 删除用户或者修改用户host字段,删除语句:DROP USER 'user_name'@'%'; 。更新语句:update user set host = <new_host> where host = '%';。
4. 执行SQL语句:
OPTIMIZE TABLE user;
flush privileges;
9.匿名登陆检查
检查Mysql服务是否允许匿名登陆
登陆Mysql数据库,执行以下命令删除匿名帐户:
delete from user where user='';
flush privileges;
10.数据库登陆弱密码
若系统使用弱口令,存在极大的被恶意猜解入侵风险,需立即修复
可使用 SET PASSWORD 命令把弱密码修改为强密码
1、登陆数据库
2、查看数据库用户密码信息
mysql> SELECT user, host, authentication_string FROM user;
部分版本查询命令为:
mysql> SELECT user, host, password FROM user;
3、根据查询结果及弱密码告警信息修改具体用户的密码
mysql> SET PASSWORD FOR '用户名'@'主机' = PASSWORD('新密码');
11 个必须注意的 MySQL 安全规范
1 mysql_secure_installation
这是数据库基础的安全设置脚本
a 设置root密码
b 移除匿名用户
c 禁止远程root登录
d 移除test数据库
看看你的环境是否存在上述问题,这个算是是最基本的安全吧。
2 连接访问安全
常见创建用户的时候你需要指定你的ip访问地址范围或者固定ip,一般化而言,只有特定唯一的几个ip的才会访问,或者说你可以采用代理访问的方式,减少应用直接访问你的数据库,而且现在很多中间件也都有白名单机制,原则上是把非法请求防止在数据库以外的地方。
规范数据库管理软件,实现管理软件的标准、统一化,还有严禁杜绝开启外网访问,如果客户端在远程,就根本不应该直接访问数据库,而应该使用中间件堡垒机或其他替代方案。
为了防止连入数据库的应用程序存在后门,造成数据库安全隐患,检查所有连接数据库程序的安全性。通过使用堡垒机或者其他监控登录数据库,禁止对数据库的直接操作。
对已经连接的IP网段进行规范化、统一化的管理,定期进行权限复核操作,对系统所属IP、用户进行权限梳理工作。
对员工进行安全培训,增强员工的系统安全观念,做到细心操作,安全操作。
确保访问数据库的主机为已知用户或者主机,使用专门主机与数据库进行连接。
对重要业务表的所有行为,全部审计,审计同时所有包括即使是DBA的DDL操作行为
最后是报表系统,利用审计的相关日志,出具系统化的审计报告。
3 权限安全
权限这块无可厚非,在简历之初遵循最小权限原则,坚持最小权限原则,是数据库安全的重要步骤。
很多时候我们不知道具体的最小权限是什么,你说一个账号到底需要什么样权限才合适,才不会影响业务?这个不是很好界定。我们需要知道在设置权限时的信息,要授予的权限级别,库级别,表级别,列级别,或者其他超级权限,要授予的权限类型,增删改查等
从mysql.user表来看
Select_priv/Insert_priv/Update_priv/Delete_priv/Create_priv/Drop_priv
Reload_priv/Shutdown_priv/Process_priv/File_priv/Grant_priv/References_priv
Index_priv/Alter_priv/Show_db_priv/Super_priv/Create_tmp_table_priv/Lock_tables_priv
Execute_priv/Repl_slave_priv/Repl_client_priv/Create_view_priv/Show_view_priv/Create_routine_priv/
Alter_routine_priv/Create_user_priv/Event_priv/Trigger_priv/Create_tablespace_priv
用户名,IP地址,是否需要连接数控制,SSL,过期时间等,不要怕麻烦,可能前期设置的时候比较繁琐,但是,一个好的基础设置,才是安全的保障,做到需要什么给什么,而不是。
4 账户安全
用户账户划分原则
超级管理员账号
系统应用账号(比如备份,监控,审计等)
应用业务账号
业务人员账号
开发人员账号
测试人员账号
其他专用账号
主要是防止泄漏,非必要人员不需要知道账号的名称,同时需要制定相应的命名规则,还有就是合理使用自己的账号密码,保护好你的账号密码,对于绝无必要的用户,先禁用,后期删除,要做到无匿名账户和无废弃账户。
5 目录文件安全
提高本地安全性,主要是防止mysql对本地文件的存取,会对系统构成威胁,还有Load DATA LOCAL INFILE,禁用该功能。
这个主要是防止误删除,非权限用户禁止访问目录,还有就是数据文件禁止访问,或者采用更改常用的目录路径,或者通过chroot,要保证该目录不能让未经授权的用户访问后把数据库打包拷贝走了,所以要限制对该目录的访问。
6 密码安全
密码强度复杂性
尽量并且不要使用固定密码,实行每个用户单独密码,长度在16位以上 0-9a-zA-Z~!@#$%^&*()-+ 随机组合。
密码过期机制
根据公司的情况设定密码过期时间,定期更改,同时不可使用重复密码。
密码保存机制
为了方便管理,可能会采用一个密码表,要加强对于密码表的维护更新,最重要的是保证不泄漏。
7 漏洞安全
常规的方式是安装补丁,不过这个往往比较麻烦,主要是版本升级,还有就是防护策略。
8 被忽视的SSL
由于性能或者其他方面原因,很多生产环境并没有使用,不过从5.7+开始,已经好很多了,有需要的加强安全防范其实可以尝试下了。
https://dev.mysql.com/doc/refman/5.7/en/mysql-ssl-rsa-setup.html
9 防火墙安全
一般化数据库前面都会有主备的墙,不过从成本上考虑,很多企业都是单个或者裸奔的,有自己的硬件防火墙最好,没有的话也可以使用系统自带的防火墙,然后在加上其他白名单和中间件白名单过滤辅助措施,也能防止一部分问题。
10 端口安全
默认端口是3306,这个最好修改下,为了方便记忆,你可以根据的ip地址来加密动态调整,不过如果生产网络允许,也可以定期修改,最好不要影响研发进度。
11 记录安全
删除操作系统记录的敏感数据,比如.mysql_history、.bash_history 等,及时清理,移除和禁用.mysql_history文件。
人是安全的主导,管理的对象要从两个角度来看,从信息角度来说就是MySQL本身的安全,要防止数据的丢失和免遭破坏;从技术的角度来说就是整个系统的安全,要防止系统的瘫痪和免遭破坏。
作者:xiaofu
文章标题:MySQL服务安全加固及防护
文章地址:https://blog.xf0.cc/200.html
作者地址:https://blog.xf0.cc/author/xiaofu
来源:Fu Zai's Notes
文章版权归作者所有,未经允许请勿转载。

共有 0 条评论