单位有台Windows服务器专门进行SqlServer数据库每日还原和业务数据盘点分析使用,线上的生产数据库并不参与这一过程,而是每天18:00从线上服务器进行数据库全库备份、然后再在这台专用的分析服务器上进行还原,之后从还原出来的镜像数据库上进行数据的统计、分析。
从线上服务器到这台统计服务器,是通过中间服务器做文件中转的,也就是线上先将数据库备份到中间的文件服务器上,然后这台统计服务器再从中间文件服务器上拉取文件还原出镜像数据库使用。
这台统计服务器从2天前开始出现问题,起初的表现是无法顺利完成每日还原操作。
我起初以为只是偶发现象,没当回事儿。但是一连2天、多个数据账套的还原都失败,于是今天上服务器看了下日志。这一看才发现,大约2天前开始,这台服务器上遭受了穷举猜测登录的黑客攻击。有数百万次对sa的尝试猜测登录,幸好始终没有猜测到密码。(因为服务器本身禁用了远程连接,猜到也应该没什么问题)。
如此大量的尝试登录,导致服务器内存耗尽,从而引发了SqlServer拒绝服务。也就无法完成数据库还原、或基本的常规连接等操作了。
我看到日志时有些恍惚:SqlServer并没有启用远程登录,只允许本机登录,为什么还有来自外网的登录请求呢?起初我以为是SqlServer的鉴权方式:使用Windows身份验证模式,导致的问题:想当然的以为使用Windows身份验证模式,会允许通过远程桌面进行SqlServer的连接。
想着:只要禁用Windows身份验证模式,仅仅开启Sql Server身份验证模式,应该就可以解决问题了吧?
但是看过SqlServer的安全性配置发现,并不能单独关闭Windows身份验证模式,换言之,Windows身份验证模式登录SqlServer是必须开启的。
后来才发现自己的认知是错误的:SqlServer并不能通过3389端口的远程桌面进行连接,只能通过它的1433端口访问。虽然我已经禁用了SqlServer的远程连接,但这并不意味着它会关闭1433端口。1433端口仍然开着、如果外网能够访问到,就能够通过这一端口尝试登陆,虽然无法登录成功,但仍然会对SqlServer造成影响。
于是我就去检查防火墙配置,这才发现1433端口果然暴露在外。之所以一直没有发现,是因为防火墙设置里面有一条默认规则、默认打开了所有的端口!
我之前还一直以为自己对这台服务器的防火墙设置规则做的很详尽呢,其实所有的设置都没有用,因为在这所有规则之上,有一条“1/65535::(0.0.0.0/0)”的规则,允许了来自于所有IP对所有端口的访问,这台服务器一直就这样赤裸裸的暴露在外网下!
以前一直没有看到这条规则,是因为它在这个配置表的最上面,被一堆注释段落掩藏着,直到今天才突然发现。当看到这条规则时我的心率估计已经飙升到160。于是赶快将它删除,再回到服务器上观察,已经没有了外网的暴力穷举,内存也恢复了正常。
看来以后不能信任自己,对防火墙的规则配置,最好还是在生效之后,自己从外部进行一遍端口扫描,尽可能严谨的检查一遍,才更为稳妥。