如何避免 MS-SQL 暴力登入攻击

我有一台对外服务的 MS-SQL 资料库主机,最近从事件检视器里面发现一直有不明的攻击者利用暴力破解法想要登入 MS-SQL 管理角色。

事件检视器里几乎全是 MSSQL$MSSQLSERVER 登入失败事件,
观察下来每一天有超过上千次的登入失败,有时同一秒钟就有 10 几次的登入失败。

从 SSMS 管理工具可以显示 Log,开启 「SSMS > 管理 > SQL Server 记录档」

显示 Log 讯息

事件检视器里 MS-SQL 登入失败的讯息归纳有这 2 种。

  1. "使用者 'sa' 的登入失败。 原因: 尝试评估密码时发生错误。"
  2. "使用者 'admin' 的登入失败。 原因: 找不到符合所提供名称的登入。"

而讯息 2 中的 ‘admin’ 帐号则会一直改变,例如 root, sys, system 都有可能出现。
表示攻击者一直尝试不同帐号登入,若确认帐号存在後,则会继续用密码暴力破解攻击。

事件检视器会记录来源 IP,我发现 IP 不止一个,表示有不同的主机同时发动攻击。
如果从 IP 反查 的话,会发现来源 IP 在全世界都有,包含欧洲、美洲、亚洲都出现过。

如果未即时处理,可能会有以下风险

  1. 管理者密码被破解,攻击者随意浏览、删除、偷取资料,甚至勒索请求付款。
  2. 服务器效能变慢,主机忙於回应不必要的登入请求。
  3. 服务器 Log 记录不正常膨胀,占用硬碟空间。
  4. Vollgar 攻击事件,入侵主机使用资料库挖矿加密货币。
  5. 植入病毒程序,继续攻击其他主机。

此攻击为严重性风险,如有发现需要立即处理。

如果想要避免攻击者登入 MS-SQL 主机,有几种方式可以执行。

  1. 建立防火墙白名单可连线 IP
  2. 更改连线 port,不要使用预设 1433 port。
  3. 另建管理者帐号并停用 sa 帐号
  4. 赋予需要的使用权限并启用密码原则

接下来我会示范在 Windows Server 2019 如何避免 MS-SQL 受暴力登入攻击

建立防火墙白名单可连线 IP

白名单表示符合指定 IP 才可连线,这是一个很有效的防护方式,只是某些客户环境因无法指定 IP而无法这样做。
在「具有进阶安全性的 Windows Defender 防火墙」,建立新连线规则

规则: 连接埠
本机连接埠: TCP / 特定本机连接埠:1433

动作:允许连线
名称: MS-SQL
完成之後,再点击新建立的规则,在「领域」内设定白名单 IP。

更改连线 port,不要使用预设 1433 port。

开启「开始 > Microsoft SQL Server 2019 > SQL Server 2019 设定管理员」
开启左侧「SQL Server 网路组态 > MSSQLSERVER 的通讯协定 > TCP/IP」

修改「IP 位址 > IPALL > TCP 通讯埠」的值
预设为 1433,修改成其他的通讯埠,并确保并未被使用,可选的范例在 0 ~ 65535。

修改组态设定档需要重启服务才会生效。

注意: 修改连线 port 要注意其他应用程序连线设定也要跟着修改,已允许连线的防火墙 port 也要一起修改。

另建管理者帐号并停用 sa 帐号

另建管理者帐号

以管理者角色登入 SSMS 後,在「安全性 > 登入(按右键) > 新增登入」

选择「SQL Server 验证」,输入「登入名称」,密码需勾选「强制执行密码原则」

服务器角色勾选「sysadmin」要取代原有 sa 角色

在「使用者对应」勾选所有的资料库,并勾选下方的「db_owner」

此设定可以取代原有 sa 帐号权限

停用并改名预设 sa 登入帐号

我们刚刚已经新增了管理者帐号,所以这里就需要用新管理者帐号重新登入。
使用新管理者登入,才可以删除旧有的 sa 帐号。

将预设的 sa 帐号停用并改名後,避免攻击者直接暴力破解 sa 密码

执行「安全性 > 登入 > sa (按右键) > 属性」

在「状态」将「登入」设定「已停用」

执行「安全性 > 登入 > sa (按右键) > 重新命名」

换成别的名字

赋予需要的使用权限并启用密码原则

当我们建立新使用者给应用程序使用时,不要求方便就给予最大权限。
针对使用者帐号能用的权限再赋予就好。

强制执行密码原则设定

在建立新使用者时,一定要勾选「强制执行密码原则」

密码原则说明
密码复杂性原则是为了阻止暴力攻击而设计,方法是尽可能地增加密码数目。当强制执行密码复杂性原则时,新的密码必须符合下列指导方针:

  1. 密码不包含使用者的帐户名称。
  2. 密码长度至少为八个字元。
  3. 密码包含下列四种类别的其中三种:
    a. 拉丁文大写字母 (A 到 Z)。
    b. 拉丁文小写字母 (a 到 z)。
    c. 以 10 为基底的数字 (0 到 9)。
    d. 非英数字元,例如:惊叹号 (!)、钱币符号 ($)、数字符号 (#) 或百分比符号 (%)。

密码长度最多可达 128 个字元。 尽可能使用长且复杂的密码。

服务器角色设定

bulkadmin: 可以执行大量插入作业
dbcreator: 可建立与修改资料库
diskadmin: 管理磁碟中的档案
processadmin: 管理 SQL Server 中执行的程序
public: 观看系统中有哪些资料库
securityadmin: 管理 SQL Server 登入相关事项
serveradmin: 调整与设定 SQL Server
setupadmin: 可新增、移除本机之外所连结的 SQL Server
sysadmin: 可处理 SQL Server 中的任何事情(最大权限)

使用权限设定

db_accessadmin: 可以新增或移除资料库的登入帐户
db_backupoperator: 可备份资料库
db_datareader: 观看资料库中的资料表内容
db_datawriter: 新增、修改、删除资料库中资料表的内容
db_ddladmin: 此角色可以新增、修改、删除资料库中的物件
db_denydatareader: 不允许观看资料库中资料表的内容
db_denydatawriter: 不允许改变资料库中资料表的内容
db_owner: 拥有维护与设定资料库的权限(包含资料库的所有权限) (最大权限)
db_securityadmin: 可管理资料库物件的拥有者.资料库角色.角色的成员.权限
public: 资料库的使用者都属於public角色(拥有预设的资料库权限)

资安心得

以上的防护方法不一定执行完就绝对安全,攻击者的方法会进化,在未来某一天可能会失效。
想要更完善的保护需要定期的观察,或是写程序侦测服务器状态,以避免因忙碌而疏忽。
除了做好防护,定期的备份也要确实执行,自动更新 Windows 系统安全性及病毒码。
对於资安的议题,请各位不要觉得麻烦,方便性与安全性的对立的,不方便就会相对安全。

相关学习文章

Windows Server 2012 R2 安装微软免费防毒软件 Microsoft Security Essentials
SQL Server 每日定期备份与定期删除旧有备份档
Windows Server 如何安装 SQL Server 2019 免费开发版


<<:  如何使用 UML 序列图对 MVC 框架进行建模?

>>:  NIST 通用风险模型-威胁来源

[Day2]疯狂程设基本操作及Hello World

今天要来练习第一道题目及一些基本的操作。 先点CPE历届考古题2013/12/17 的第一题Hell...

铁人赛 Day12 -- 一定要知道的 CSS (九) -- Position 定位 & opacity 透明度

今日目标: 做出一个在网页上常会出现的遮屏广告 先来介绍几个 Position 元素 static(...

那些被忽略但很好用的 Web API / RequestIdleCallback

时间管力大师就是要忙里偷闲 各位应该知道 JavaScript 是单执行绪(单线程)的程序语言,也...

#13 No-code 之旅 — 简单快速开发漂亮的 React 元件 ft. Chakra UI

今天来点不一样的!来讲一个我最近常用的 React UI component library,就是 ...

鬼故事 - CS 高手

鬼故事 - CS 高手 Credit: Vince mcmahon 灵感来源: UCCU Hacke...