mysql安全加固配置文档(完结)

4. MySQL 权限安全配置

4.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');
    • SELECT user, host FROM MySQL.db WHERE db = 'MySQL' AND ((Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y') OR (Delete_priv = 'Y') 45 | Page OR (Create_priv = 'Y') OR (Drop_priv = 'Y'));
    • 如果返回的都是管理员账号说明安全,否则需要对用户清除权限 
  • 修复建议
    • 清除非管理员账号的过高部分权限 

4.2. 非管理员账号file_priv不应该设置成

  • 建议理由
    • file_priv权限允许MySQL用户对磁盘进行读写操作。黑客很可能利用这一点盗取数据库中敏感数据。
  • 检查方法
    • select user, host from MySQL.user where File_priv = 'Y';
    • 如果返回的都是管理员账号,否则需要对用户清除权限
  • 修复建议
    • REVOKE FILE ON *.* FROM '’;

4.3. 非管理员账号process_priv不应该设置成

  • 建议理由
    • process_priv权限允许委托账号查看当前正在执行的sql语句。使用超越当前用户权限的权利。可以被攻击者所利用。
  • 检查方法
    • select user, host from MySQL.user where Process_priv = 'Y';
    • 如果返回的都是管理员账号则是安全的,否则需要对用户清除权限
  • 修复建议
    • REVOKE PROCESS ON *.* FROM '’;

4.4. 非管理员账号super_priv不应该设置成Y

  • 建议理由
    • super_priv权限允许委托账号执行任意语句,非管理员不应该具备该权限。
  • 检查方法
    • select user, host from MySQL.user where Super_priv = 'Y';
    • 如果返回的都是管理员账号则是安全的,否则需要对用户清除权限
  • 修复建议
    • REVOKE SUPER ON *.* FROM '’; 

4.5. 非管理员账号shutdown_priv不应该设置成Y 

  • 建议理由
    • shutdown_priv权限允许委托账号关闭数据库,会造成一定安全隐患。
  • 检查方法
    • SELECT user, host FROM MySQL.user WHERE Shutdown_priv = 'Y';
    • 如果返回的都是管理员账号则是安全的,否则需要对用户清除权限
  • 修复建议
    • REVOKE SHUTDOWN ON *.* FROM '’; 

4.6. 非管理员账号create_user_priv不应该设置成

  • 建议理由
    • create_user_priv权限允许委托账号创建任意用户,会造成一定安全隐患。
  • 检查方法
    • SELECT user, host FROM MySQL.user WHERE Create_user_priv = 'Y';
    • 如果返回的都是管理员账号则是安全的,否则需要对用户清除权限
  • 修复建议
    • REVOKE CREATE USER ON *.* FROM '’;

4.7. 非管理员账号grant_priv不应该设置成Y

  • 建议理由
    • Grant_priv权限允许委托账号对其他用户赋权,可能会被黑客利用造成一定安全隐患。
  • 检查方法
    • SELECT user, host FROM MySQL.user WHERE Grant_priv = 'Y';
    • 如果返回的都是管理员账号则是安全的,否则需要对用户清除权限
  • 修复建议
    • REVOKE Grant ON *.* FROM '’;

4.8. 非管理员账号reload_priv不应该设置成

  • 建议理由
    • reload_priv权限可以对本地文件进行操作,可能会被黑客利用造成一定安全隐患。
  • 检查方法
    • SELECT user, host FROM MySQL.user WHERE reload_priv = 'Y';
    • 如果返回的都是管理员账号则是安全的,否则需要对用户清除权限
  • 修复建议
    • REVOKE reload ON *.* FROM '’;

4.9. 非管理员账号repl_slave_priv不应该设置成Y

  • 建议理由
    • repl_slave_priv用于从主服务器上获得更新的数据。黑客很可能利用这一点盗取数据库中敏感数据。
  • 检查方法
    • select user, host from MySQL.user where repl_slave_priv = 'Y';
    • 如果返回的都是管理员账号,否则需要对用户清除权限
  • 修复建议
    • REVOKE repl_slave ON *.* FROM '’;

4.10. 确保DML/DDL权限只在特定用户手上 

  • 建议理由
    • 限制用户有INSERTSELECTUPDATEDELETEDROPCREATEALTER权限。这些权限都会导致数据泄密等。
  • 检查方法
    • 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';
    • 如果返回的都是管理员账号,否则需要对用户清除权限
  • 修复建议
    • REVOKE SELECT ON . FROM ; REVOKE INSERT ON . FROM ; REVOKE UPDATE ON . FROM ; REVOKE DELETE ON . FROM ; REVOKE CREATE ON . FROM ; REVOKE DROP ON . FROM ; REVOKE ALTER ON . FROM ;

5. 审计和日志安全配置

5.1. 确保log_error日志启动

  • 建议理由
    • 启用错误日志有可能会增加检测到针对MySQL的恶意攻击行为机会。为日后安全检查提供更多线索和证据。 
  • 检查方法
    • SHOW variables LIKE 'log_error';
    • 如果返回是空否,则存在安全问题需要修复
  • 修复建议
    • 打开MySQL配置文件把log_error配置到一个有效路径 

5.2. 确保日志文件在非系统分区

  • 建议理由
    • 操作系统上有明确的系统分区和非系统分区。如果日志文件在系统分区,会提高整个系统因为磁盘空间用尽发生拒绝服务的几率。
  • 检查方法
    • 进入数据库执行下列语句
      • SELECT @@global.log_bin_basename;
    • df –h <上面的地址返回值> 如果发现结果中存在/ /var /usr 说明数据文件在系统分区建议换区 
  • 修复建议:打开MySQL配置文件
    • log_bin设置成非系统分区路径 

5.3. 确保log_raw被设置成off

  • 建议理由
    • 语句中的密码在写入一般查询日志时会被服务器重写,不会以明文方式记录。但如果log-raw被设置成ture,则会记成明文。
  • 检查方法
    • 打开数据库配置文件
    • 确定log_raw被设置成off
    • 如果是off是安全的,但如果是on则需要修复
  • 修复建议:打开MySQL配置文件
    • log_raw = OFF 

5.4. 确保log_warnings被设置成2

  • 建议理由
    • log_warnings适用于决定日志中记录的内容的。默认是1随着级别的调整会记录更多信息。调整到2有助于通过日志追查安全问题。
  • 检查方法
    • 通过sql读取信息
      • SHOW GLOBAL VARIABLES LIKE 'log_warnings';
    • 如果返回值是1需要调整到2
  • 修复建议:打开MySQL配置文件
    • log_warnings = 2 

6. 身份认证安全配置

6.1. 确保密码不在全局变量中 

  • 建议理由
    • MySQL配置文件(客户端部分)允许设置用户名和密码。使用密码参数可能会对用户的机密性造成负面影响。 
  • 检查方法
    • 打开数据库配置文件
    • 检查用户名和密码参数
    • 如果是空的是安全的,但如果不是空的则需要修复
  • 修复建议:打开MySQL配置文件
    • 清理参数内容

6.2. 确保sql_mode中含有NO_AUTO_CREATE_USER

  • 建议理由
    • NO_AUTO_CREATE_USERsql_mode的一个选项,可以阻止grant语句在特定情况下自动创建用户。给数据库带来安全隐患。
  • 检查方法
    • SELECT @@session.sql_mode;
    • 如果返回值包含NO_AUTO_CREATE_USER是安全的,但如果不包含则需要修复
  • 修复建议:打开MySQL配置文件
    • sql_mode 中添加参数NO_AUTO_CREATE_USER

6.3. 确保没有用户使用空密码 

  • 建议理由
    • 如果密码被设置成空密码,入侵者只要知道密码和主机允许列表,就可以绕过身份验证随意登录数据库。进行违规操作。
  • 检查方法
    • SELECT User,host FROM MySQL.user WHERE authentication_string='';
    • 没有行数返回说明安全,否则需要配置
  • 修复建议:给空白密码的账号配上密码
    • SET PASSWORD FOR @'' = ''@;’ = ‘

6.4. 确保default_password_lifetimes少于或等于90 

  • 建议理由
    • 密码需要定期更换,才有意义,也才能更有效的防止黑客破解。
  • 检查方法
    • SHOW VARIABLES LIKE 'default_password_lifetime';
    • 看返回值和90的关系如果大于90就需要修复
  • 修复建议:设置全局变量
    • SET GLOBAL default_password_lifetime=90 

6.5. 确保用户不允许所有ip访问 

  • 建议理由
    • 某一数据库用户支持所有ip访问,一旦账号密码泄露,数据库就变得很不安全。
  • 检查方法
    • SELECT user, host FROM MySQL.user WHERE host = '%';
    • 结果集为空说明不存在问题,否则需要修复
  • 修复建议
    • 删除该用户会或通过alter删除 %,指定特定ip 

6.6. 确保无匿名帐户存在 

  • 建议理由
    • 匿名用户是空的,也没有密码。安全性很差,任意人员都可以利用匿名用户访问数据库。
  • 检查方法
    • SELECT user,host FROM MySQL.user WHERE user = '';
    • 结果集为空说明不存在问题,否则需要修复
  • 修复建议:删除匿名用户。 

7. 网络安全配置

7.1. 确保have_ssl设置成yes 

  • 建议理由
    • 所有网络请求必须走SSL/TLS访问数据库。杜绝网络劫持和网络拦截
  • 检查方法
    • SHOW variables WHERE variable_name = 'have_ssl';
    • 返回yes不存在问题,否则需要修复
  • 修复建议:开启ssh

7.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
  • 修复建议:使用GRANT语句来使用要求的SSL
    • GRANT USAGE ON *.* TO 'my_user'@'app1.example.com' REQUIRE SSL;

8. 复制数据传输中的安全配置

8.1. 确保MASTER_SSL_VERIFY_SERVER_CERT设置成yes

  • 建议理由
    • 在使用SSL时,证书验证对于验证正在进行连接的一方很重要。 在这种情况下,从属(客户端)应该在继续连接之前验证主服务器的证书以验证主服务器。MASTER_SSL_VERIFY_SERVER_CERT主要是用于检查证书,确保证书的合法性。
  • 检查方法
    • select ssl_verify_server_cert from MySQL.slave_master_info;
    • ssl_verify_server_cert返回是1,否则需要修复
  • 修复建议:修改MASTER_SSL_VERIFY_SERVER_CERT配置。
    • STOP SLAVE;
    • CHANGE MASTER TO MASTER_SSL_VERIFY_SERVER_CERT=1;
    • START SLAVE;

8.2. 确保master_info_repository设置成table

  • 建议理由
    • master_info_repository设置成table.客户端使用的密码存储在表中。相较于文件系统表中更为安全。
  • 检查方法
    • SHOW GLOBAL VARIABLES LIKE 'master_info_repository';
    • master_info_repository返回是table,否则需要修复
  • 修复建议:打开配置文件
    • master_info_repository=TABLE

你可能感兴趣的:(mysql,数据库,安全)