为使用了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。
这里我配置了两个安全组:
- 管理使用:只有办公室和特定公网IP才能访问该EC2的22(SSH)和8888(宝塔)端口;
- 用户访问使用:Cloudflare的IP才能访问该EC2的443端口;
但是这并不是最优雅的方式,因为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
然后再点击test
返回结果为“成功”,但是安全组并没有被成功修改。
类似于下图。
我们去检查下配置
按照教程,环境变量还没有设置呢~能好用才怪~~
尝试再次测试发现报错如下
去IAM console里看一下~
这里是需要单独配置的,其实前面教程里也提到了这部分,我去看下~
https://github.com/johnmccuk/cloudflare-ip-security-group-update
这里有写
我们把教程里那段policy贴到”Statement”: []这里
然后下一步
然后我们再回到刚刚lambda的role,再次点击Attach policies
Filter policies 中选择 Customer managed,就能快速看到你创建的policy
然后回到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
修改lambda相关配置
进入常规配置,进行编辑。
修改timeout时间
修改role权限
Add tags (Optional) 跳过
Policy名称写为Policy-AutomaticUpdateSecurityGroupforCloudflareIPs
完成policy创建。
回到Add permissions to AutomaticUpdateSecurityGroupforCloudflareIPs-role-j598wadn页面
配置环境变量
回到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中查看
发表回复