通过AWSCLI修改安全规则组允许EC2公网登陆

一、背景

在AWS安全最佳实践中,为EC2分配公有IP地址并开放安全规则住允许从互联网上任意地址(也就是来源为0.0.0.0/0)访问操作系统的SSH/RDP是非常不安全的,有非常大的安全隐患。以近期的SSH漏洞

 https://explore.alas.aws.amazon.com/CVE-2024-6387.html 

为例,这样开放端口可能导致几分钟内系统被侵入。为了规避这个安全风险,一般采用如下方式:

  • 1、设置专线或者VPN,所有运维流量都通过内网
  • 2、设置堡垒机/跳板机,允许从互联网来访问堡垒机,然后所有操作通过堡垒机
  • 3、将被管理的EC2的安全规则组设置为只允许当前的IP地址,然后每次在不同地点办公,不停的更新安全规则组里边的IP地址,确保自己可登陆

方法3是成本敏感且安全要求较低的用户一种常见方式。

那么,为了更方便的快速更新当前IP地址,通常需要使用第三方网站查询自己上网的公网IP,然后登陆AWS控制台,找到EC2所使用的安全组,更新特定条目规则的IP地址,保存生效。这样的过程会花掉几分钟多次点击,步骤繁琐。这个过程可通过脚本一键操作。

二、AWSCLI和Profile准备

编写如下一段bash脚本,通过访问https://api.ipify.org获取当前IP,然后修改安全组。这个命令使用AWSCLI程序,要求本机已经配置好AWSCLI使用的AKSK。

前提:

  • 如果您是AWS新手,请先下载AWSCLI并配置上AKSK。
  • 您可以在本机上配置多个AWS账号和多个区域的不同账号和用户的密钥,那么可以通过这篇文章介绍的Profile来切换。如果您使用了Profile,那么在如下的shell脚本里边,修改安全组的那条命令后边,需要增加 --profile xxxxx这样的参数,即可让AWSCLI使用特定Profile对应的AKSK来执行。

三、更新安全组的来源IP的脚本

#! /bin/bash

# get ip
response=$(curl -s https://api.ipify.org)

if [ $? -eq 0 ]; then
    
    # get ip address
    real_ip=$response
    echo "您的公网IP地址是: $real_ip ,更新安全组中,更新完毕会显示返回结果True"
    sleep 5
    
    # update security group
    aws ec2 modify-security-group-rules \
    --group-id sg-08fb252aczb0f64c1 \
    --security-group-rules SecurityGroupRuleId=sgr-02fb32a8442611dc1,SecurityGroupRule='{Description=single_ip,IpProtocol=tcp,FromPort=3389,ToPort=3389,CidrIpv4='$real_ip'/32}'
else
    echo "无法获取IP地址,请检查网络连接"
fi

在当前目录下,给这个脚本赋予可执行权限:

chmod 777 update-sg.sh

在当前目录下,运行这个脚本:

./update-sg.sh

即可运行成功。