SQL Server固定不可改登录账号的安全防护及本地访问伪造风险咨询
我有一款服务器类软件需连接本地SQL Server,其内置硬编码的SQL登录名/密码(需具备sqladmin角色)且无法修改。因必须使用该软件,我在SQL Server中创建了此登录账号。但该硬编码登录信息在互联网上公开可查,同时因客户需访问SQL Server获取数据和功能,无法关闭1433等SQL Server端口。
为防范知晓该信息的人员攻击SQL Server,我已采取以下安全措施:
- 关闭SQL Server的远程连接功能
- 创建登录触发器,仅允许该登录账号进行本地连接
现咨询:是否有人可伪造localhost发送包含DROP TRIGGER等SQL命令的数据包进行入侵?若存在该风险,还有哪些防护措施可用?
附上触发器代码:
CREATE TRIGGER prevent_ip ON ALL SERVER FOR LOGON AS BEGIN DECLARE @LoginName sysname DECLARE @LoginType sysname SET @LoginName = ORIGINAL_LOGIN() IF(@LoginName = 'HardcodedLogin' AND (EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]','nvarchar(128)') IN ('<local machine>'))) BEGIN RETURN; -- Login Authorized END ELSE IF(@LoginName IN ('SecuredLoginForClients')) BEGIN RETURN; -- Login Authorized END ELSE BEGIN ROLLBACK; -- Disconnect the session END END

伪造localhost连接的风险
确实存在伪造localhost连接的可能性:
- 同一局域网内,攻击者可通过ARP欺骗、IP欺骗等手段,将数据包源IP伪装成127.0.0.1或服务器本地IP,绕过基于ClientHost的登录触发器校验。
- 若服务器存在本地提权漏洞,攻击者可先获取服务器低权限本地访问,再以本地身份发起SQL连接,直接绕过远程连接限制和IP校验。
另外你的触发器存在一处隐患:EVENTDATA()返回的<local machine>仅对应使用共享内存协议的本地连接,若硬编码账号通过TCP/IP协议本地连接,ClientHost会显示为服务器的本地IP(如127.0.0.1或网卡IP),此时触发器会拒绝合法连接,导致软件无法正常工作。
补充防护措施
1. 修复登录触发器逻辑
修改触发器,同时校验<local machine>和服务器本地IP段,确保合法本地连接都能通过:
CREATE TRIGGER prevent_ip ON ALL SERVER FOR LOGON AS BEGIN DECLARE @LoginName sysname DECLARE @ClientHost nvarchar(128) SET @LoginName = ORIGINAL_LOGIN() SET @ClientHost = EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]','nvarchar(128)') -- 允许硬编码账号通过本地共享内存或本地IP连接 IF(@LoginName = 'HardcodedLogin' AND (@ClientHost = '<local machine>' OR @ClientHost IN ('127.0.0.1', '你的服务器本地IP'))) BEGIN RETURN; -- Login Authorized END -- 允许客户专用账号连接 ELSE IF(@LoginName = 'SecuredLoginForClients') BEGIN RETURN; -- Login Authorized END ELSE BEGIN ROLLBACK; -- Disconnect the session END END
2. 限制硬编码账号的权限范围
即便无法修改软件的硬编码账号,也可通过权限最小化原则降低风险:
- 取消该账号的
sysadmin角色,仅授予软件运行必需的权限(如特定数据库的db_owner、特定存储过程的执行权限等)。若软件确实需要高权限,可通过存储过程封装操作,仅允许账号执行指定存储过程,禁止直接执行DROP TRIGGER、DROP DATABASE等危险命令。
3. 网络层防护
- 在服务器防火墙(如Windows防火墙)中,仅允许客户IP段访问1433端口,拒绝其他来源的连接请求。
- 启用SQL Server的IPsec策略,仅允许指定IP与服务器建立加密的SQL连接,进一步防范IP欺骗。
4. 启用SQL Server审计功能
开启SQL Server的登录审计和对象修改审计,实时监控硬编码账号的登录行为和敏感操作(如触发器删除、权限变更),一旦发现异常立即告警。
5. 隔离硬编码账号的连接路径
将软件的SQL连接配置为仅使用共享内存协议(而非TCP/IP),此时ClientHost始终为<local machine>,彻底杜绝远程伪造本地IP的可能。可在SQL Server配置管理器中禁用硬编码账号的TCP/IP连接权限。
内容的提问来源于stack exchange,提问作者Chloe

