为使用了Cloudflare CDN的AWS WordPress服务器设置安全组(用Lambda+CloudWatch Events实现自动化)

为使用了Cloudflare CDN的AWS WordPress服务器设置安全组(用Lambda+CloudWatch Events实现自动化)

背景

针对自己搭建的网站,把服务器的80 443 22等常用端口开放给全部互联网,可能是一件非常危险的事情。

如果被黑客盯上或者被DDOS/应用层攻击,可能造成高昂的带宽费用,甚至可能造成信息泄露。

尤其是当我们已经给网站搭建了CDN,那么只允许CDN服务器访问源站服务器,是比较安全的一种做法。

为了保证自己在AWS的EC2中搭建的WordPress服务器的安全,设置严格而又合理的安全组是非常非常重要滴!~

第一阶段:手动设置安全组

因为我为网页服务器配置了Cloudflare的CDN,因此,可以限制只让Cloudflare的IP才能访问源站的443端口(我源站设置了https证书,因此80端口就不开放给任何人了,包括Cloudflare。这样所有请求都走https 443)。

这样,即使有人知道了我源站的IP,也无法绕过Cloudflare直接访问我的源站。

在Cloudflare官方链接https://www.cloudflare.com/ips/中可以查到最新的Cloudflare的IP。

这里我配置了两个安全组:

  1. 管理使用:只有办公室和特定公网IP才能访问该EC2的22(SSH)和8888(宝塔)端口;
  2. 用户访问使用:Cloudflare的IP才能访问该EC2的443端口;
然后把这两个安全组同时绑定到我的服务器的EC2上就可以了。

但是这并不是最优雅的方式,因为Cloudflare的IP组是会更新的。

因此,如果要改进的话,下一步就要让Cloudflare的IP的更新,可以通过脚本,自动的更新到我的安全组上。

这里我们可以使用AWS的serverless的运行代码的Lambda服务,这样就不用维护代码的服务器了。

前面再加一个CloudWatch Events来定时触发lambda,就可以实现全部自动化的更新安全组了。

第二阶段:用lambda+CloudWatch Events实现–根据Cloudflare的官方IP库,定期地自动更新安全组

我是参考如下教程来做的:

https://dev.to/johnmccuk/automate-aws-security-group-with-cloudflare-ips-la6

:由于是一边研究,一边写的笔记,下面的lambda的配置实际上我做了两次:

  • 第一次:边尝试边记录,过程中遇到的问题、解决思路和过程,也都依次记录了下来;
  • 第二次:经历第一次从头到尾填完了所有的坑之后,又记录了一次顺利配置的过程。

如果有人想参考这篇笔记的话,建议在本文中搜索“重新开始”,从那儿开始看就可以,看前面的部分可能会让不熟悉AWS的人confuse。

这里第一步是新建一个安全组,作为lambda自动更新安全组的目标,并记下Security group ID

Security group ID = sg-0787b9700f08523dd

第一次尝试

开始创建lambda

粘贴教程中的代码:

https://github.com/johnmccuk/cloudflare-ip-security-group-update/blob/master/cf-security-group-update.py

点击Test

这里用默认值就好,Event name随便填个名字就行

然后再点击test

返回结果为“成功”,但是安全组并没有被成功修改。

类似于下图。

我们去检查下配置

timeout改成9s

按照教程,环境变量还没有设置呢~能好用才怪~~

尝试再次测试发现报错如下

看报错,这里是权限问题,应该是lambda没有被赋予足够的权限修改安全组。
这里的给lambda配置的IAM role,默认的应该没有这部分权限,需要额外配置下。

去IAM console里看一下~

这里可以看到目前这个lambda脚本只有写入CloudWatch logs的权限,没有修改安全组的权限!~

这里是需要单独配置的,其实前面教程里也提到了这部分,我去看下~

https://github.com/johnmccuk/cloudflare-ip-security-group-update

这里有写

打开这个文件看下
这里policy都写好了,我们需要加到现在这个lambda的role里。下面搞一下~~

我们把教程里那段policy贴到”Statement”: []这里

然后下一步

弄个tag,不弄也行,optional的
创建完的policy可以看到了。

然后我们再回到刚刚lambda的role,再次点击Attach policies

Filter policies 中选择 Customer managed,就能快速看到你创建的policy

找到刚创建的policy attach上就OK了。

然后回到lambda,再运行下Test试试~~

看起来已经执行成功啦!!!~

去安全组里看一眼,是不是改过来了~

改过来啦!!~ 成功~~~~

复盘

  • 上面的操作只证明的lambda修改安全组代码的部分可以了,但是定时trigger的部分,还没验证。
  • 上面的安全组有IPv6的地址,目前其实用不上,之后可以按照教程,加个环境变量:UPDATE_IPV6 – if set to 0, will not update IPv6 ranges in security groups nor S3 bucket policies.

上面因为中间有出问题troubleshooting的过程,整个配置流程不是那么丝滑。

下面我重新再从头开始,再配置一次。

重新开始

创建Lambda

name AutomaticUpdateSecurityGroupforCloudflareIPs

修改lambda相关配置

进入常规配置,进行编辑。

修改timeout时间
修改role权限

填入https://github.com/johnmccuk/cloudflare-ip-security-group-update/blob/master/allow-lambda-ingress-role中policy内容

Add tags (Optional) 跳过

Policy名称写为Policy-AutomaticUpdateSecurityGroupforCloudflareIPs

完成policy创建。

回到Add permissions to AutomaticUpdateSecurityGroupforCloudflareIPs-role-j598wadn页面

刷新并选择新添加的policy,然后点击“Attach policy”让配置生效。
配置环境变量

回到lambda配置页面,找到环境变量配置处

在下一步之前,我们先创建一个新的安全组 SG-Cloudflare-AutoUpdate,描述:https://dev.to/johnmccuk/automate-aws-security-group-with-cloudflare-ips-la6,过程略。

到lambda设置,创建环境变量

SECURITY_GROUP_ID
PORTS_LIST
UPDATE_IPV6

注:PORTS_LIST 如果80 443都需要,其格式为“80,443”

添加代码

到code处

贴入 https://github.com/johnmccuk/cloudflare-ip-security-group-update/blob/master/cf-security-group-update.py 中的全部代码,代替现有代码

点击Test

弹窗中Event name填写一个名字,其他不动用默认配置即可,然后create。

然后点击下Deploy。之后,再次点击Test

成功执行
检查安全组,已成功更新。

如果再次执行,没有更新内容的话,会printout如下

如果提前删除某一条安全组IP条目,然后再次执行,会printout如下

lambda代码部分的功能已经验证没问题了,下面我们配置trigger,让lambda定时的检查Cloudflare的IP更新。

添加trigger,来每天执行lambda

Rule-CloudwatchEventTriggerLambda

Description: for cloudflare IP Update triggered by CloudwatchEvent

Schedule expression的语法可见官方说明如下

https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchevents-expressions.html

我先用rate(1 minute)测试下能否触发。

配置完毕,然后我去目标安全组里删除所有条目。

过1分钟后,刷新安全组策略,可见已触发自动更新。

通过Lambda的Monitor也可以看到之前每分钟执行的success rate都是100%。

前面1分钟更新一次是为了测试,正常的话,每天更新一次就够了。

下面把CloudWatch Event的触发频率改成我想要的一天一触发。

这样就全部OK啦~~撒花~ ✿✿ヽ(°▽°)ノ✿

扩展

如果想看每次执行lambda程序的printout的log,可以到CloudWatch中查看

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注