freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Mysql数据库的最佳安全配置
2020-12-18 09:32:21

今天来跟大家分享说明一下Mysql数据库的最佳安全配置,安装mysql数据库可参考 https://www.cnblogs.com/yss818824/p/12349719.html,下面就来说说MySQL的最佳安全配置吧 !

一、安全配置项

1、确保数据文件在非系统分区:

操作系统上有明确的系统分区和非系统分区。如果数据文件在系统分区,会

提高整个系统因为磁盘空间用尽发生拒绝服务的几率。

1)进入数据库执行下列语句

show variables where variable_name = 'datadir'

如果发现结果中存在/ /var /usr 说明数据文件在系统分区建议换区

1608192699_5fdb12bb7cc7165286548.png!small

2、确保 mysql 操作系统账号权限最小化:

mysql 在操作系统上的账号权限最小化有助于减小 mysql 数据库漏洞造成

的影响;

假设 mysql 账号为 mysql 执行 ps -ef | egrep "^mysql.*$"命令

如果没有返回行,则权限存在问题。

1608193558_5fdb161643e3cc1a0e4de.png!small

3、禁止 mysql 链接历史记录:

mysql 会把客户端登陆的交互执行记录保存在.mysql_history 文件中,该记录有可能会暴露登陆过程中的敏感信息,建议删除,检查.mysql_history 文件是否存在(默认在home 下)执行命令 find /home -name ".mysql_history"如果有返回行说明存在建议删除

1608194287_5fdb18ef0ec9d37ad8224.png!small

4、禁止 MYSQL_PWD 的使用:

MYSQL_PWD 是一种用于明文形式存储 mysql 密码的环境变量,检查 MYSQL_PWD 环境变量是否存在于某个进程中执行命令 grep MYSQL_PWD /proc/*/environ如果有返回行说明那个进程使用了 MYSQL_PWD 环境变量

1608195174_5fdb1c66efe8ec24c381b.png!small

5、禁止 MYSQL 操作系统账号登陆:

Mysql 的操作做系统账号在安装完数据库后,不应该有其他用途,建议禁止该账号登陆操作系统,假设 mysql 数据库操作系统账号就是 Mysql 执行下列命令 getent passwd mysql | egrep "^.*[ \ /bin\ / false| \ / sbin \ / nologin]$",如果没有返回行则说明存在安全隐患。

1608195574_5fdb1df6a31c9d5787107.png!small

6、禁止 MYSQL 使用默认端口:

如果返回是 3306,则说明需要修改端口;执行 sql 确认端口show global variables like 'port';

1608195628_5fdb1e2c9c1e2dcce0060.png!small

二、文件系统权限安全配置

1、确保数据文件最小权限:

执行 sql 定位数据文件地址

show variables where variable_name = 'datadir';

检查路径权限是否符合最小权限原则

ls -l /.. | egrep "^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql"

1608195835_5fdb1efbd62cfa17d80ac.png!small

2、确保 log_bin_basename 文件最小权限:

执行 sql 定位日志文件地址 show variables like 'log_bin_basename';日志文件的权限是 660 属于 mysql

1608195914_5fdb1f4ab8376eee9d597.png!small

3、确保 log_error 文件最小权限:

执行 sql 定位日志文件地址 show global variables like 'log_error';

1608196347_5fdb20fb6cef5dcc8056b.png!small

4、 确保 slow_query_log 文件最小权限:

执行 sql 定位日志文件地址 show variables like 'slow_query_log_file';

1608196409_5fdb213922e2cd9d8de06.png!small

5 、确保 relay_log_basename 文件最小权限:

执行 sql 定位日志文件地址  show variables like 'relay_log_basename';

1608196493_5fdb218de4aa0a81025a3.png!small

6、 确保 general_log_file 文件最小权限:

执行 sql 定位日志文件地址  show variables like 'general_log_file';

1608196555_5fdb21cbcee037de52663.png!small

7 、确保密钥文件最小权限:

1.执行 sql 定位密钥文件地址

show variables where variable_name = 'ssl_key';

2.检查路径权限是否符合最小权限原则

ls -l | egrep "^-r--------[ \t]*.[ \t]*mysql[ \t]*mysql.*$"

如果没有返回行,则说明存在安全问题

1608196628_5fdb22145b09891702c64.png!small

1608196660_5fdb2234ad0efdae834e1.png!small

8 、确保插件目录最小权限:

1.执行 sql 定位插件目录地址

show variables where variable_name = 'plugin_dir';

2.检查路径权限是否符合最小权限原则

ls -l /.. | egrep "^drwxr[-w]xr[-w]x[ \t]*[0-9][ \t]*mysql[ \t]*mysql.*plugin.*$"

1608196766_5fdb229e726ec5bec1622.png!small

三、Mysql 基本安全配置

1、 确保使用最新版 mysql 数据库:

执行 sql 检查数据库版本  SHOW VARIABLES WHERE Variable_name LIKE "version";

1608196870_5fdb230643f4a13032ebd.png!small

2、修改 root 用户名:

检查数据库是否有默认用户 root,执行命令:SELECT user from mysql.user where user='root;  如果有返回行则需要修改;

1608196931_5fdb23438a915d01be2cf.png!small

3、确保样例数据库删除:

样例数据库可以被所有数据库用户访问,并且可以用来消耗系统资源删除样例库可以减少攻击面;

检查数据库是否存在样例库执行 sql命令 SHOW DATABASES LIKE 'test';

1608197131_5fdb240b726f566f86085.png!small

4、禁用 local_infile:

以阻止黑客利用 sql 注入来读取数据库文件,检查参数状态执行命令:

SHOW VARIABLES WHERE Variable_name = 'local_infile';如果返回值不是 off,则存在安全问题

1608197254_5fdb24868fe5238bd671f.png!small

5、确保 skip-symbolic-links 开启:

开启 skip-symbolic-links 可以禁止数据库用户删除或重名数据文件目录之外的文件,检查参数状态执行命令:

SHOW variables LIKE 'have_symlink';

1608197346_5fdb24e2b20f0be51c333.png!small

6、确保插件 daemon_memcached 被禁用:

任何人可以利用 daemon_memcached 来访问或修改一部分数据,给数据库造成信息泄漏的隐患。

检查参数状态执行命令:SELECT * FROM information_schema.plugins WHERE

PLUGIN_NAME='daemon_memcached';如果有返回行数说明有插件,需要删除

1608197443_5fdb2543398f376ac1b36.png!small

7、确保 secure_file_priv 不是空:

secure_file_priv 限制客户端可以读取数据文件的路径,secure_file_priv

设置合理的值可以有效降低 sql 注入后黑客读取数据库数据的可能性。

检查参数状态执行如下命令:SHOW GLOBAL VARIABLES WHERE Variable_name =

'secure_file_priv' AND Value<>'';如果有返回内容说明安全,否则需要修复;

1608197545_5fdb25a937654145d2725.png!small

8、确保 sql_mode STRICT_ALL_TABLES 模式:

sql_mode 模式有三种,STRICT_TRANS_TABLES 是其中一种模式。

STRICT_TRANS_TABLES 模式会检查所有更新的数据

检查参数状态执行命令:SHOW VARIABLES LIKE 'sql_mode';

如果有返回的是 STRICT_TRANS_TABLES 说明安全,否则需要修复;

1608197643_5fdb260b3df0230ca3f45.png!small

9、确保 disconnect_on_expired_password 参数是 ON:

disconnect_on_expired_password 是用来控制客户端用失效密码来访问

数据库的,关闭这个参数会给数据库带来安全风险。

检查参数状态执行命令:SHOW GLOBAL VARIABLES like 'disconnect_on_expired_password';

如果有返回的是 ON 说明安全,否则需要修复

1608197712_5fdb26506ff51d23b8910.png!small

四、Mysql 权限安全配置

1 、确保只有管理员账号有所有数据库的访问权限:

执行命令:

SELECT user, host FROM mysql.user WHERE (Select_priv = 'Y') OR

(Insert_priv = 'Y') OR (Update_priv = 'Y') OR (Delete_priv = 'Y') OR (Create_priv = 'Y')

OR (Drop_priv = 'Y');

如果返回的都是管理员账号说明安全,否则需要对用户清除权限;

1608197929_5fdb272965c6c0cb5bc1b.png!small

2、非管理员账号 file_priv 不应该设置成 Y

File_priv 权限允许 mysql 用户对磁盘进行读写操作,执行命令:

select user, host from mysql.user where File_priv = 'Y'; 如果返回的都是管理员账号,否则需要对用户清除权限;1608198091_5fdb27cb4ebdbc0495c60.png!small

3、非管理员账号 process_priv 不应该设置成 Y

process_priv 权限允许委托账号查看当前正在执行的 sql 语句,使用超越

当前用户权限的权利,可以被攻击者所利用。执行命令:

select user, host from mysql.user where Process_priv = 'Y'; 如果返回的都是管理员账号则是安全的,否则需要对用户清除权限;

1608198157_5fdb280d263b537cce1ec.png!small

(同上)非管理员账号 super_priv 不应该设置成 Y,非管理员账号 shutdown_priv 不应该设置成 Y,

非管理员账号 create_user_priv 不应该设置成 Y,非管理员账号 grant_priv 不应该设置成 Y,

非管理员账号 reload_priv 不应该设置成 Y,非管理员账号 repl_slave_priv 不应该设置成 Y;

4、确保 DML/DDL 权限只在特定用户手上:

执行sql命令:

SELECT User,Host,Db FROM mysql.db WHERE Select_priv='Y' OR

Insert_priv='Y' OR Update_priv='Y' OR Delete_priv='Y' OR Create_priv='Y' OR

Drop_priv='Y' OR Alter_priv='Y';

如果返回的都是管理员账号,否则需要对用户清除权限

1608198366_5fdb28deeaaaeffd67b99.png!small

五、审计和日志安全配置

1、 确保 log_error 日志启动:

启用错误日志有可能会增加检测到针对 mysql 的恶意攻击行为机会,执行命令:

SHOW variables LIKE 'log_error';   如果返回是空否,则存在安全问题需要修复

1608253724_5fdc011c40c9fbe9e3591.png!small

2、 确保日志文件在非系统分区:

操作系统上有明确的系统分区和非系统分区,如果日志文件在系统分区,会提高整个系统因为磁盘空间用尽发生拒绝服务的几率;进入数据库执行命令:SELECT @@global.log_bin_basename;

1608253831_5fdc018733caa12cc339a.png!small

3、确保 log_warnings 被设置成 2:

log_warnings 适用于决定日志中记录的内容的,默认是 1 随着级别的调整会记录更多信息,调整到 2 有助于通过日志追查安全问题;执行命令:SHOW GLOBAL VARIABLES LIKE 'log_warnings';

1608253898_5fdc01cadca39c3e19a59.png!small

六、身份认证安全配置

1、确保 sql_mode 中含有 NO_AUTO_CREATE_USER:

NO_AUTO_CREATE_USER 是 sql_mode 的一个选项,可以阻止 grant 语

句在特定情况下自动创建用户;执行命令:SELECT @@session.sql_mode;

1608254125_5fdc02adaaa8bb5cd93c3.png!small

2、确保没有用户使用空密码

如果密码被设置成空密码,入侵者只要知道密码和主机允许列表,就可以绕

过身份验证随意登录数据库;执行命令:

SELECT User,host FROM mysql.user WHERE authentication_string=''; 没有行数返回说明安全,否则需要配置;

1608254190_5fdc02ee240beb4973908.png!small

3、确保 default_password_lifetimes 少于或等于 90

密码需要定期更换,才有意义,也才能更有效的防止黑客破解;执行命令:

SHOW VARIABLES LIKE 'default_password_lifetime';

看返回值和 90 的关系如果大于 90 就需要修复

1608254243_5fdc03231db01a97ab8df.png!small

4、 确保用户不允许所有 ip 访问

某一数据库用户支持所有 ip 访问,一旦账号密码泄露,数据库就变得很不安全,执行命令:

SELECT user, host FROM mysql.user WHERE host = '%'; 结果集为空说明不存在问题,否则需要修复

1608254374_5fdc03a6c1744c6d44e90.png!small

5、确保无匿名帐户存在

匿名用户是空的,也没有密码,安全性很差,任意人员都可以利用匿名用户

访问数据库,执行命令: SELECT user,host FROM mysql.user WHERE user = '';

结果集为空说明不存在问题,否则需要修复;

1608254450_5fdc03f2523e6b74b265b.png!small

七、网络安全配置

1、确保 have_ssl 设置成 yes:

所有网络请求必须走 SSL/TLS 访问数据库,执行命令:SHOW variables WHERE variable_name = 'have_ssl';

返回 yes 不存在问题,否则需要修复;

1608254565_5fdc04656d33af7c08600.png!small

2 、确保 ssl_type 'ANY', 'X509', or 'SPECIFIED':

所有网络请求必须走 SSL/TLS 访问数据库。SSL 提供多种算法,其中一些算法安全性并不高不能帮助用户杜绝网络劫持和网络拦截。建议设置 ssl_type 为高安全类型的加密算法。但这其中有一个隐患,如果客户端使用较低加密算法,会由于算法无法匹配导致链接失败,执行命令:

SELECT user, host, ssl_type FROM mysql.user WHERE NOT HOST IN ('::1', '127.0.0.1', 'localhost');

确保每个用户返回的 ssl_type 等于 ANY, X509, or SPECIFIED;

1608254769_5fdc053108acffb10d280.png!small

八、复制数据传输中的安全配置

1 、确保 MASTER_SSL_VERIFY_SERVER_CERT 设置成 yes 1:

1608254905_5fdc05b96b01090646a32.png!small

2、确保 master_info_repository 设置成 table:

master_info_repository 设置成 table.客户端使用的密码存储在表中,相较于文件系

统表中更为安全执行命令:SHOW GLOBAL VARIABLES LIKE 'master_info_repository';

master_info_repository 返回是 table,否则需要修复,修复建议:打开配置文件

set the master_info_repository value to TABLE;

1608254978_5fdc06025a7e2dd685699.png!small

此处便是结尾,欢迎小伙伴留言探讨。

本文作者:, 转载请注明来自FreeBuf.COM

# mysql安全 # mysql # 数据安全
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
评论 按时间排序

登录/注册后在FreeBuf发布内容哦

相关推荐
  • 0 文章数
  • 0 评论数
  • 0 关注者
登录 / 注册后在FreeBuf发布内容哦
收入专辑