一、参数详解
1.禁用local_infile选项会降低攻击者通过SQL注入漏洞器读取敏感文件的能力
local-infile=0
2.5.6以上版本应禁用符号链接以防止各种安全风险
skip_symbolic_links=yes
3.使用此选项,会导致所有客户端都对所有数据库具有不受限制的访问权限。
skip-grant-tables 【禁用】
4.当log-raw记录启用时,有权访问日志文件的人可能会看到纯文本密码。
log-raw=off
5.MYSQL_PWD环境变量的使用意味着MYSQL凭证的明文存储,极大增加MySQL凭据泄露风险。
MYSQL_PWD
6.启动错误日志
log-error=<log_path>
二、安全优化
1.使用非默认端口,降低被初级扫描危险
port = 3307
2.使用非root用户启动mysql
user = mysql
3.匿名登录检查
delete from user where user='';
flush privileges;
4.避免在主机名中只使用通配符,有助于限定可以连接数据库的客户端,否则服务就开放到了公网
执行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;
5.启动错误日志,快速定位问题
log-error=<log_path>
6.mysql5.7执行sql报错,1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'csc_risk.a.DefaultDate' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by, Time: 0.035000s
查看sql_mode:
SELECT @@sql_mode;
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
解决:
配置文件:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
临时修改:
全局修改,适用于新建数据库
SET @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
适用于已有数据库
SET sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';