SQL Server加固
账号管理
查询目前所有用户列表
1 | select name,password from syslogins order by name |
为不同的管理员分配不同的账号
按照使用目的进行分配账号,避免不同用户间共享账号,提高安全性。或在企业管理器中直接添加远程登陆用户建立角色,并给角色授权,把角色赋给不同的用户或修改用户属性中的角色和权限。
添加不同用户,参考配置操作:
1 | sp_addlogin 'user1','password1' |
删除或锁定无效账号
删除冗余的系统默认账号,减少系统安全隐患,参考配置操作。
1 | Microsoft SQL Server Management Studio -> SQL Server -> 安全性 -> 登录名 -> 选择要删除的用户名(右键) |
限制启动账号权限
启动mssql的用户权限过高,会导致其子进程具有相同权限,参考配置操作:
1 | Microsoft SQL Server Management Studio -> SQL Server ->属性(右键) -> 安全性 |
新建SQL server服务账号后,建议将其从User组中删除,且不要把该账号提升为Administrators组的成员,授予以账户最少启动权限。
认证授权
权限最小化
在数据库权限配置能力内,根据用户的业务需要,配置其所需的最小权限,参考配置操作:
1 | Microsoft SQL Server Management Studio -> SQL Server -> 属性(右键) -> 安全性 |
数据库角色
使用数据库角色(ROLE)来管理对象的权限,参考配置操作:
1 | Microsoft SQL Server Management Studio -> SQL Server -> 安全性 -> 服务器角色(右键)-> 新服务器角色 |
调整角色属性中的权限,赋予角色中拥有对象对应的SELECT、INSERT、UPDATE、DELETE、EXEC、DRI权限
是否存在空密码用户
对所有账户的属性进行审计,包括空密码、密码更新时间等。修改目前所有账号的口令,确认为强口令。特别是sa 账号。
1 | select * from sysusers |
使用sp_password更新用户密码,特别是sa 账号,需要设置至少10位的强口令。
1 | exec sp_password 'old_passwd', 'new_passwd', sa |
锁定特权
默认情况下,SQL Server安装会在模型数据库之外的所有数据库中授予guest帐户公共角色成员身份。 建议在Windows中禁用guest帐户,并撤消其对除master和tempdb之外的所有数据库的访问权限。参考配置操作,使用以下命令删除数据库访问权限
1 | use msdb; |
Public不应访问Web任务表,因为它们可以使表数据可供Web客户端使用。 特权应被撤销:
1 | revoke update on mswebtasks to public |
Microsoft数据转换服务(DTS)程序包是一组COM接口,可用于在SQL Server上使用以下命令执行许多管理任务:T-SQL,Windows脚本和可执行工具。 默认情况下,企业管理器用户可以访问可用DTS软件包列表。 过程sp_enum_ dtspackages将显示可以输入到sp_get_dtspackage中的软件包名称和ID号,这将返回软件包数据。 然后,攻击者可能会将程序包放入他的SQL Server本地安装中,并查看程序包详细信息,其中通常包含其他服务器的凭据。 这些程序的特权应被删除:
1 | revoke execute on sp_enum_dtspackages to public |
sp_get_SQLAgent_properties存储过程,用于显示SQL Server代理服务连接到数据库服务器的混淆密码。 使用此工具(http://jimmers.narod.ru/agent_pwd.c)可以解混淆。 应删除此程序的权限:
1 | revoke execute on sp_get_SQLAgent_properties to public |
Microsoft数据转换服务(DTS)用于处理来自多个源(例如OLE DB,ODBC或文本文件)的数据。 连接密码以明文形式保存在Col11120列的表RTblDBMProps中,因此任何具有选择特权的人都可以检索到。 使用以下命令锁定此表的权限:
1 | revoke select on RTblDBMProps to public |
配置日志审计
开启日志审计功能
数据库应配置日志功能,对用户登录进行审计,日志内容包括用户登录使用的账号、登录是否成功、登录时间等。
打开数据库属性,查看安全性,将服务器身份验证调整为“SQL Server 和Windows身份验证模式” ,安全性中的登录审核调整为“失败和成功的登录”。
1 | Microsoft SQL Server Management Studio -> SQL Server(右键) -> 属性 -> 安全性 |
或者通过将以下注册表值设置为2(将其设置为3还将记录成功的登录):
1 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\AuditLevel |
配置网络通信协议
禁用不必要的网络服务
SQL Server使用的网络通信协议应限制为最小基础架构所需。 禁用SQL Server运行冗余服务。 启用陌生的网络通信协议,可能增加数据库网络风险。TCP/IP是最常用的用于SQL Server的网络协议栈,它与SSL一起为访问SQL Server提供安全的基础。
Microsoft SQL Server程序组, 运行服务网络实用工具。建议只使用TCP/IP协议,禁用其他协议。
1 | SQL Server Configuration Manager -> SQL Server网络配置 -> MSSQLSERVER的协议 |
加固TCP/IP协议栈
查看注册表键值
1 | HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\DisableIPSourceRouting |
参考配置操作
对于TCP/IP协议栈的加固主要是某些注册表键值的修改。主要是以下几个:
1 | HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\DisableIPSourceRouting #说明:该键值应设为2,以防御源路由欺骗攻击。HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnableICMPRedirect #说明:该键值应设为0,以ICMP重定向。HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\SynAttackProtect #说明:该键值应设为2,防御SYN FLOOD攻击。 |
使用加密通讯协议
启动SQL Server配置工具,启用“强制协议加密”。
1 | SQL Server Configuration Manager -> SQL Server网络配置 -> MSSQLSERVER的协议(右键) -> 属性 |
删除不必要的存储过程
查询已有的所有的存储过程
1 | select * from sysobjects where xtype='P' |
或者
1 | Microsoft SQL Server Management Studio -> SQL Server -> 数据库 -> 系统数据库 -> master(举例)-> 可编程性 -> 存储过程/扩展存储过程 -> 系统存储过程/系统扩展存储过程 |
删除SQL Server中存在的危险存储过程:
1 | exec sp_dropextendedproc 'xp_cmdshell' |
删除不必要的存储过程,一般情况下建议删除的存储过程有:
1 | sp_OACreate |
不是应用程序必须使用时,建议删除以下存储过程:
1 | xp_perfend |
删除不必要的功能和服务
SQL Server的远程访问功能,允许网络上的其他SQL Server远程连接并执行存储过程。 如果不需要此功能,则应使用以下命令禁用该功能。
1 | execute sp_configure 'remote access', '0' |
或者使用Microsoft SQL Server Management Studio
1 | Microsoft SQL Server Management Studio -> SQL Server(右键) -> 属性 -> 连接 |
配置选项“允许更新”定义数据库用户是否可以直接更新系统表。 这对于高级管理员来说可能是有用的临时功能,但对于正常操作,应该将其禁用:
1 | execute sp_configure 'allow updates', '0' |
SQL Server Monitor,它侦听UDP端口1434并提供客户端不应访问有关服务器上存在的实例的信息,并且SQL Server将在其被阻止的情况下运行。 防火墙或应阻止来自TCP端口1433和UDP端口1434的外部通信。异构查询或临时查询允许数据库用户使用本地数据在远程服务器上执行查询。 该功能可能被滥用以强制使用远程或本地访问凭据,应在不需要此功能时,将其禁用:
1 | exec xp_regwrite N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\Providers\SQLOLEDB', N'DisallowAdhocAccess', N'REG_DWORD', 1 |
如果不需要,则应禁用SQL Server代理,Microsoft分布式事务处理协调器(MSDTC)和MSSearch服务。 可以使用企业管理器或通过在Windows Services管理工具中将其启动类型设置为“停止”来关闭服务。
1 | Microsoft SQL Server Management Studio -> SQL Server -> 管理 |
或者设置注册表值禁用服务:
1 | exec sp_set_sqlagent_properties @auto_start=0 |
进行这些更改后,应手动停止服务或重新启动服务器。
安装补丁
最后的步骤是确保应用最新的服务包和补丁程序。将显示SQL Server的当前版本。
1 | select @@version |
参考资料
- https://www.quackit.com/sql_server/tutorial/sql_server_dts.cfm
- http://www.freetds.org/
- http://freetds.cvs.sourceforge.net/checkout/freetds/freetds/doc/tds.html
- https://research.nccgroup.com/2021/01/21/mssql-lateral-movement/
- https://xz.aliyun.com/t/7534
- https://github.com/EPICROUTERSS/MSSQL-Fileless-Rootkit-WarSQLKit
- https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration