0x01 MySQL的安全加固

补丁

  • 安全基线项说明:满足业务正常运行的前提下,安装新版本,修补漏洞
  • 检查方法
    查看 MySQL 的版本信息: select version();
  • 加固方法:安装最新版 http://www.mysql.com

检查口令

  • 安全基线项说明:确保数据库不存在弱口令,提高数据库安全性
  • 检查方法

    mysql> use mysql;
    mysql> select user,password from mysql.user;

将密码 hash 导入 cain 软件破解

  • 加固方法:将密码修改为复杂密码

    mysql> use mysql;
    mysql> update user set password=password('复杂的新密码') where user='需要修改的用户';
    mysql> flush privileges;

检查匿名账号

  • 安全基线项说明:确保数据库不存在匿名账户,提高数据库安全性
  • 检查方法

    mysql> use mysql;
    mysql> select user,password from mysql.user;

存在 user 和 password 字段均为空的行

  • 加固方法:删除匿名账户

    mysql> use mysql;
    mysql> delete from user where user='';
    mysql> flush privileges;

删除无关账号

  • 安全基线项说明:如果与业务和数据库无关的账号,应该删除
  • 检查方法

    mysql> use mysql;
    mysql> select user,password from mysql.user;

  • 加固方法:删除相关账户

    mysql> use mysql;
    mysql> delete from user where user='无关账号';
    mysql> flush privileges;

数据库授权

  • 安全基线项说明:合理设置用户权限,防止权限滥用
  • 检查方法

    mysql> show grants for test@localhost;

  • 加固方法:一般引用用户建议授予最小权限

    mysql> grant 权限1,权限2,权限n on 数据库名称.表名称 to 用户名@用户地址
    mysql> grant select,insert on db.table to test@localhost;

文件安全

  • 安全基线项说明:合理设置数据库文件权限,防止未授权访问或篡改
  • 检查方法

    # ls -al .mysql_history .bash_history 应为 600 权限
    # ls -al /etc/my.cnf 应为 644 权限
    # find / -name .MYD | xarge ls -al 应为 600 权限
    # find / -name .MYI | xarge ls -al 应为 600 权限
    # find / -name .frm | xarge ls -al 应为 600 权限

  • 加固方法:保护数据库文件,授予恰当的权限

    # chmod 600 .mysql_history .bash_history
    # chmod 600 .MYD .MYI .frm
    # chmod o-rw /etc/my.cnf

日志审核

  • 安全基线项说明:合理设置日志审核,保证安全事件发生可查询日志记录
  • 检查方法

    [mysql]
    log = filename

查看 my.cnf 或 my.ini 文件,查看是否包含如上设置

  • 加固方法:编辑my.cnf 或 my.ini 文件,保存后并重启
    [mysql]
    log-bin = /var/log/mysql/log-bin
    log = /var/log/mysql/mysql.log
    log-error = /var/log/mysql/mysql-err.log
    log-update = /var/log/mysql/mysql-upd.log

运行账户

  • 安全基线项说明:MySQL 服务以普通用户运行,防止数据库最高权限被利用
  • 检查方法

    # ps -ef | grep mysql
    # grep -i user /etc/my.cnf

  • 加固方法:编辑 my.cnf 文件

    [mysql.server]
    user=mysql

可信 IP 地址控制

  • 安全基线项说明:只允许可信任 IP 访问数据库,降低数据库风险
  • 检查方法

    mysql> select user,host from mysql.user;

查看可访问数据库的 IP 和 IP对应的账号

  • 加固方法:编辑 my.cnf 文件

    mysql> grant all privileges on . to '可信任用户'@'可信任IP地址' identified by '可信任用户密码' with grant option;

连接数限制

  • 安全基线项说明:根据业务需求设置数据库最大连接数
  • 检查方法

    [mysql]
    max_connections = 1000

    mysql> show variables like 'max_connections';

  • 加固方法:编辑my.cnf 或 my.ini 文件,保存后并重启

    [mysql]
    max_connections = 1000

0x02 MSSQL的安全加固

删除不必要的账号

  • 安全基线项目名称:数据库管理系统 SQLServer 用户安全基线要求项
  • 安全基线项目说明:应删除与数据库运行、维护等工作无关的账号
  • 检测操作步骤:
    1.SQLServer 企业管理器 -> 安全性 -> 登陆中删除无关账号
    2.SQLServer 企业管理器 -> 数据库 -> 对应数据库 -> 用户中删除无关账号

查看登陆中无关账号

查看用户中无关账号

  • 基线符合性判断依据:
    首先删除不需要的用户,已删除数据库不能登录使用,在 MSSQL Server 中查询分析器的登录界面中使用已删除账号登录

用户口令安全

  • 安全基线项目名称:数据库管理系统 SQLServer 用户口令安全基线要求项
  • 安全基线项目说明:
    对用户的属性进行安全检查,包括空密码、密码更新时间等.修改目前所有账号的口令,确认为强口令,特别是 sa 账号,口令长度至少 8 位,并包括数字、小写字母、大写字母和特殊符号四种类型中的其中两种,且五次以内不得设置相同的口令,密码应至少每90天进行更换
  • 检测操作步骤:
    1.检查 password 字段是否为 null
    2.参考配置操作

    查看用户状态,运行分析器执行一下两条命令:
    select from sysusers
    select name,password from syslogins where password is null order by name

  • 基线符合性判断依据:
    password 字段不为 null.

查询密码为空的账户

根据用户分配账号避免账号共享

  • 安全基线项目名称:数据库管理系统 SQLServer 共享账号安全基线要求项
  • 安全基线项目说明:应按照用户分配账号,避免不同用户之间共享账号使用
  • 检测操作步骤:
    1.参考配置操作
    sp_addlogin 'username_1','password1'
    sp_addlogin 'username_2','password2'
    或在企业管理器中直接添加远程登录用户,建立角色,并给角色授权,把角色赋予给不同的用户或修改用户属性中的角色和权限
    2.检测方法
    在查询分析其中用 username_1/password1 连接数据库成功
    3.补充操作说明
    username_1 和 username_2 是两个不同的账号名称,可根据不同用户取名
  • 基线符合性判断依据:不同用户可以连接数据库

分配数据库用户所需要的最小权限

  • 安全基线项目名称:数据库管理系统 SQLServer 共享账号安全基线要求项
  • 安全基线项目说明:在数据库权限配置能力内,根据用户的业务需求,配置其所需要的最小权限
  • 检测操作步骤:
    1.更改数据库属性,取消业务数据库不需要的服务器角色
    2.更改数据库属性,取消业务数据库账号不需要的 "数据库访问许可" 和 "数据库角色允许" 中不需要的角色
    在查询分析其中用 username_1/password1 连接数据库成功

查询账户角色

查询账户映射

网络访问限制

  • 安全基线项目名称:数据库管理系统 SQLServer 共享账号安全基线要求项
  • 安全基线项目说明:通过数据库所在操作系统或防火墙限制,只有信任的 IP 地址才能通过监听器访问数据库
  • 检测操作步骤:
    在防火墙中做限制,只允许与指定的 IP 地址建立 1433 通信,当然更为安全的考虑因该把 1443 监听端口修改为其他的端口

    1. 在 "windows 防火墙" 对话框中,单击 "例外" 选项卡
    2. 单击 "添加端口"
    3. 键入您要允许的端口名称,键入端口号,然后单击 "TCP" 或 "UDP" 以提示这是 TCP 端口还是 UDP 端口
    4. 单击 "更改范围"
    5. 指定要为其阻止此端口的一系列计算机,然后单击 "确定"
  • 基线符合性判断依据:无关 IP 不允许连接 1433 端口

防火墙设置

SQLServer 登陆审计

  • 安全基线项目名称:数据库管理系统 SQLServer 共享账号安全基线要求项
  • 安全基线项目说明:数据库应配置日志功能,对用户登陆进行记录,记录内容包括用户登录使用的账号、登陆是否成功、登陆时间
  • 检测操作步骤:
    打开数据库属性,选择安全性,将安全性中的审计级别调整为 "全部"
  • 基线符合性判断依据:登陆成功和失败测试,检查相关信息是否被记录

设置登陆审计

SQLServer 安全事件审计

  • 安全基线项目名称:数据库管理系统 SQLServer 共享账号安全基线要求项
  • 安全基线项目说明:数据库应配置日志功能,记录对与数据库相关的安全事件
  • 检测操作步骤:
    打开企业管理器,查看数据库 "管理" 中的 "SQLServer日志",查看当前的日志记录和存档的日志记录是否包含相关数据库安全事件

    1. 参考配置操作
      数据库默认开启日志记录
    2. 补充操作说明
      增加账号登录审计: 打开数据库属性,选择安全性,将安全性中的审计级别调整为 "全部"
  • 基线符合性判断依据: SQLServer 日志中是否存在数据库相关事件日志信息

补丁要求

  • 安全基线项目名称:数据库管理系统 SQLServer 共享账号安全基线要求项
  • 安全基线项目说明:为系统打最新的补丁包
  • 检测操作步骤:
    检查当前所已经安装的数据库产品的版本信息,运行 SQL 查询分析器,执行:
    select @@version

查看数据库版本信息

停用不必要的存储过程
首先确认一下的扩展存储过程不会被使用到,然后删除这些存储过程
例如:去掉 xp_cmdshell 扩展存储过程

use master
sp_dropextendedproc 'xp_cmdshell'
不必要的存储过程
Sp_OACreateSp_OADestroySp_OAGetErroeInfoSp_OAGetProperty
Sp_OAMethodSp_OASetPropertySp_OAStopXp_regaddmultistring
Xp_regdeletekeyXp_regdeeeleetevalueXp_regenumvaluesXp_regremovemultistrng
xp_sdidebugxp_availablemediaxp_cmdshellxp_deletemail
xp_dirtreexp_dropwebtaskxp_dsinfoxp_enumdsn
xp_enumerrorlogsxp_enumgroupsxp_enumqueuedtasksxp_eventlog
xp_findnextmsgxp_fixeddrivesxp_getfiledetailsxp_getnetname
xp_grantloginxp_logeventxp_loginconfiigxp_logininfo
xp_makewebtaskxp_msverxp_perfendxp_permonitor
xp_perfsamplexp_perfstartxp_readerrorlogxp_readmail
xp_revokeloginxp_runwebstaskxp_schedulersignalxp_sendmail
xp_servicecontrolxp_snmp_getstatexp_snmp_raisetrapxp_sprintf
xp_sqlinventoryxp_sqlregisterxp_sqltravcexp_sscanf
xp_startmailxp_stopmailxp_subdirsxp_unc_to_drive
Last modification:March 3rd, 2020 at 08:13 pm