网站之前木马防范使用的是安全狗服务器工具但后来使用了CDN内容加速后,安全狗工具就不好使了。因为安全狗木马攻击防范的方式是直接将访问IP进行屏蔽(加入黑名单)但因为使用了CDN内容加速,所以访问IP实际上是CDN节点服务器的IP,而非攻击者的真实IP所以使用安全狗来进行防范就不理想了。但好在安全狗虽然不能防范,但它的网站安全工具还是可以检测到来访者的真实IP(但就是不能使用真实IP进行防范),估计是收费版才能具备此功能。看看网站被攻击的记录,发现每天都有海量的攻击,手工来维护实在是疲于奔命。既然想白嫖,就只有自己来实现了,自己对VB/VBA比较熟悉,虽然它只是个办公利器,但来做个简单点的安全防范工具,看起来也并不是天方夜谭。说干就干。一、目标:想实时获取攻击者的真实IP,并把攻击者IP添加到CDN的黑名单列表中我使用的云服务器是腾讯云,腾讯云的CDN有开发接口,可以通过API来自己动态添加白名单和黑名单二、用VBA读取安全狗的日志数据库经过分析,网站安全狗(SafeDogIis)的数据库是Sqlite数据库,这是存放在这个目录下 D:\Program Files (x86)\SafeDog\SafeDogSiteIIS\Analysis (具体看你安装时选择的程序目录)它的数据内容是这样的:那通过VBA来读取Sqlite数据库,之前分享过有很多方法,可以参考这篇文章小辣椒高效Office:Excel VBA、Access VBA连接Sqlite数据库的各种方法集锦及优缺点对比使用上面这里有的方法VBA连接到网站安全狗的数据库并获取数据没有太大的难度,花了半个多小时就实现了。三、调用腾讯云 CDN API 加密签名前准备公共参数这个过程比较曲折 ,折腾了2天,主要是腾讯云CDN 所有API 都要先进行 公共参数 进行加密签名,这个在其它开发语言相对简单些,但在VBA挺复杂,而且没有参考的代码,全靠自己不断尝试 摸索 折腾以下大部分内容摘自 腾讯云官网开发帮助文档用到签名的公共参数公共参数是用于标识用户和接口签名的参数,如非必要,在每个接口单独的接口文档中不再对这些参数进行说明,但每次请求均需要携带这些参数,才能正常发起请求。公共参数的具体内容会因您使用的签名方法版本不同而有所差异。使用签名方法 v3 的公共参数签名方法 v3 (有时也称作 TC3-HMAC-SHA256)相比签名方法 v1 (有些文档可能会简称签名方法),更安全,支持更大的请求包,支持 POST JSON 格式,性能有一定提升,推荐使用该签名方法计算签名。完整介绍详见 签名方法 v3。注意:接口文档中的示例由于目的是展示接口参数用法,简化起见,使用的是签名方法 v1 GET 请求,如果依旧想使用签名方法 v1 请参考下文章节。使用签名方法 v3 时,公共参数需要统一放到 HTTP Header 请求头部中,如下表所示:四、VBA加密算法实现腾讯云API V3签名的过程腾讯云 API 会对每个请求进行身份验证,用户需要使用安全凭证,经过特定的步骤对请求进行签名(Signature),每个请求都需要在公共参数中指定该签名结果并以指定的方式和格式发送请求。为什么要进行签名签名通过以下方式帮助保护请求:验证请求者的身份 签名确保请求是由持有有效访问密钥的人发送的。请参阅控制台 云 API 密钥 页面获取密钥相关信息。保护传输中的数据 为了防止请求在传输过程中被篡改,腾讯云 API 会使用请求参数来计算请求的哈希值,并将生成的哈希值加密后作为请求的一部分,发送到腾讯云 API 服务器。服务器会使用收到的请求参数以同样的过程计算哈希值,并验证请求中的哈希值。如果请求被篡改,将导致哈希值不一致,腾讯云 API 将拒绝本次请求。签名方法 v3 (TC3-HMAC-SHA256)功能上覆盖了以前的签名方法 v1,而且更安全,支持更大的请求,支持 JSON 格式,POST 请求支持传空数组和空字符串,性能有一定提升,推荐使用该签名方法计算签名。首次接触,建议使用 API Explorer 中的“签名串生成”功能,选择签名版本为“API 3.0 签名 v3”,可以生成签名过程进行验证,也可直接生成 SDK 代码。申请安全凭证本文使用的安全凭证为密钥,密钥包括 SecretId 和 SecretKey。每个用户最多可以拥有两对密钥。SecretId:用于标识 API 调用者身份,可以简单类比为用户名。SecretKey:用于验证 API 调用者的身份,可以简单类比为密码。用户必须严格保管安全凭证,避免泄露,否则将危及财产安全。如已泄漏,请立刻禁用该安全凭证。申请安全凭证的具体步骤如下:登录 腾讯云管理中心控制台 。前往 云API密钥 的控制台页面。在 云API密钥 页面,单击【新建密钥】即可以创建一对密钥。签名版本 v3 签名过程(这个过程大家可以按照官方示例逐个模仿,要非常细心)云 API 支持 GET 和 POST 请求。对于GET方法,只支持 Content-Type: application/x-www-form-urlencoded 协议格式。对于POST方法,目前支持 Content-Type: application/json 以及 Content-Type: multipart/form-data 两种协议格式,json 格式绝大多数接口均支持,multipart 格式只有特定接口支持,此时该接口不能使用 json 格式调用,参考具体业务接口文档说明。推荐使用 POST 请求,因为两者的结果并无差异,但 GET 请求只支持 32 KB 以内的请求包。下面以云服务器查询广州区实例列表作为例子,分步骤介绍签名的计算过程。我们选择该接口是因为:云服务器默认已开通,该接口很常用;该接口是只读的,不会改变现有资源的状态;接口覆盖的参数种类较全,可以演示包含数据结构的数组如何使用。在示例中,不论公共参数或者接口的参数,我们尽量选择容易犯错的情况。在实际调用接口时,请根据实际情况来,每个接口的参数并不相同,不要照抄这个例子的参数和值。此外,这里只展示了部分公共参数和接口输入参数,用户可以根据实际需要添加其他参数,例如 Language 和 Token 公共参数(在 HTTP 头部设置,添加 X-TC- 前缀)。签名过程比较长,具体过程大家请参考腾讯云官方帮助五、完成前面这漫长的准备工作后,就可调用腾讯云API自动更新CDN黑名单了首先说明一下,腾讯云API会经常变动及更新,所以有时直接搜索CDN并不能直接找到对应的帮助。后来是找了客服,咨询了好几次,才能到下面的帮助网址您可以调用更新域名配置这个接口,来通过API添加IP 黑白名单配置,具体接口详解请参考此链接:https://cloud.tencent.com/document/product/228/41116要传入的参数主要是以下这个参数IpFilterIP 黑白名单配置,默认为关闭状态被如下接口引用:AddCdnDomain, DescribeDomainsConfig, UpdateDomainConfig。名称类型必选描述SwitchString是IP 黑白名单配置开关on:开启off:关闭FilterTypeString否IP 黑白名单类型whitelist:白名单blacklist:黑名单注意:此字段可能返回 null,表示取不到有效值。FiltersArray of String否IP 黑白名单列表支持 X.X.X.X 形式 IP,或 /8、 /16、/24 形式网段最多可填充 50 个白名单或 50 个黑名单注意:此字段可能返回 null,表示取不到有效值。FilterRulesArray of IpFilterPathRule否IP 黑白名单分路径配置,白名单功能注意:此字段可能返回 null,表示取不到有效值。ReturnCodeInteger否IP 黑白名单验证失败时返回的 HTTP Code合法值: 400~499注意:此字段可能返回 null,表示取不到有效值。六、最后完成的功能效果 VBA实现后,后来因为要放在网站服务器独立运行,为减少Excel VBA打开占用的资源,又改成VB6 生成Exe独立执行程序。代码几乎完全一样。界面效果如下:程序运行后,发现有可疑行为的Ip都会实时动态添加到CDN黑名单中,非常完美。运行几天后,发现之前网站服务器经常 CPU占用99%以上的情况减少了很多,网站打开也更加快了。基本上达到我的目标要求了,后来又增加了通过企业微信发送给手机微信一些警告信息或通知。但有时偶尔可能会有误报,将来可能还要自己再分析一下IIS日志来自己判断可疑行为特征。还可通过腾讯云的短信发送接口来自动报警。七、总结这个项目主要的难度还是腾讯云V3签名的实现,走了不少弯路,也花了很多精力和时间,前后一共折腾了一个多星期才大致成型。模块与类模块陆陆续续也添加了不少。但最终结果还是完美的。其实利用VBA加上 第三方一些接口,可实现的功能还是比较强大的。之前也做过一些网站维护的辅助工具想了解更多精彩内容,快来关注我的头条号!