使用 *** 混淆网络流量时,AWS CLI 脚本更改 EC2 的安全组以匹配当前分配的 IP 地址?

Posted

技术标签:

【中文标题】使用 *** 混淆网络流量时,AWS CLI 脚本更改 EC2 的安全组以匹配当前分配的 IP 地址?【英文标题】:AWS CLI script to change security group of EC2 to match currently assigned IP address when using *** to obfuscate network traffic? 【发布时间】:2021-09-14 16:15:28 【问题描述】:

如果我正在使用动态更改我的 IP 地址的 *** 服务,有没有办法编写一个脚本,我可以使用 AWS CLI 运行该脚本来更新 IP 地址(*** 在那个特定时刻提供的地址)及时)在我的 AWS VPC 安全组上,该安全组允许通过 TCP/端口 22 对 EC2 实例进行 SSH 访问?

另外,当 *** 提供商更改我的 IP 地址时,如何自动禁用它?

【问题讨论】:

【参考方案1】:

如果您有许多环境和许多安全组,这里有一个 python 脚本可以在您的家庭 ip 更改后全部更新:

import boto3
import urllib3
import sys
from datetime import datetime

CURRENT_IP = "4x.1xx.2xx.2xx/32"  # Fixed old ip

GROUP_MAP = 
    "profile1": [
        
            "GroupId": ["sg-xxx"],
            "Description": "Description",
            "FromPort": 443
            # "ToPort": optional to port
        
    ],
    "profile2": [
        
            "GroupId": ["sg-xxx"],
            "Description": "proxy",
            "FromPort": 22
        
    ]



def get_new_ip():
    http = urllib3.PoolManager()
    r = http.request('GET', 'http://checkip.amazonaws.com/')
    ip = r.data.decode("utf-8").strip('\n')
    return ip + '/32'


def update_for_profile(data, old_ip, new_ip, profile_name):
    print(f"profile_name: Updating for data.get('Description', '') data['GroupId']")
    ec2 = boto3.resource('ec2')
    groups = ec2.security_groups.filter(Filters=['Name': 'group-id', 'Values': data['GroupId']])
    from_port = data["FromPort"]
    to_port = data.get('ToPort', from_port)
    ip_protocol = data.get('ip_protocol', 'tcp')
    cidr_ip = old_ip
    description = f"Added datetime.today().strftime('%Y-%m-%d')"
    try:
        for group in groups:
            group.revoke_ingress(
                FromPort=from_port,
                IpProtocol=ip_protocol,
                CidrIp=cidr_ip,
                ToPort=to_port
            )
            group.authorize_ingress(
                IpPermissions=[dict(
                    FromPort=from_port,
                    IpProtocol=ip_protocol,
                    ToPort=to_port,
                    IpRanges=[
                        'CidrIp': new_ip,
                        'Description': description
                    ])
                ]
            )
    except Exception as exc:
        print(exc)


def update_my_ip(old_ip, new_ip):
    for profile_name, mapping in GROUP_MAP.items():
        boto3.setup_default_session(profile_name=profile_name)
        for item in mapping:
            update_for_profile(item, old_ip, new_ip, profile_name)


if __name__ == "__main__":
    new_ip = get_new_ip()
    old_ip = sys.argv[1] if len(sys.argv) > 1 else CURRENT_IP
    if not old_ip:
        print("There's no old ip")
    print(f"Updating my ip from old_ip to new_ip")
    update_my_ip(old_ip, new_ip)

感谢您在上面的回答

【讨论】:

【参考方案2】:

根据上面 John Rotenstein 的回答,我对其进行了修改并将其写入 Lambda 函数。现在效果很好!希望这对其他人有帮助。

import boto3
import urllib3

# %% Description
'''Update the IP address to connect with a *** that
dynamically changes user IPs.'''
    
def lambda_handler(event, context):
    
    # %% Get current IP in CIDR notation
    http = urllib3.PoolManager()
    r = http.request('GET', 'http://checkip.amazonaws.com/')
    ip = r.data.decode("utf-8").strip('\n')
    CidrIp_new = ip + '/32'
    
    # %% Revoke old permissions
    sg = boto3.resource('ec2').SecurityGroup('sg-ce95e5d5')
    permissions = sg.ip_permissions
    FromPort = permissions[0].get('FromPort')
    IpProtocol = permissions[0].get('IpProtocol')
    CidrIp = permissions[0].get('IpRanges')[0].get('CidrIp')
    ToPort = permissions[0].get('ToPort')
    revoke_resp = sg.revoke_ingress(
        FromPort=FromPort, IpProtocol=IpProtocol,
        CidrIp=CidrIp, ToPort=ToPort
        )
    
    # %% Authorize new sg parameters
    auth_resp = sg.authorize_ingress(
        FromPort=FromPort, IpProtocol=IpProtocol,
        CidrIp=CidrIp_new, ToPort=ToPort
        )
    
    return 'Revoke Status', revoke_resp, 'Authorize Status', auth_resp

【讨论】:

【参考方案3】:

这是我用来将当前 IP 地址添加到安全组的 shell 脚本:

IP=`curl -s http://whatismyip.akamai.com/`
aws ec2 authorize-security-group-ingress --group-name "***-SSH-SG" --protocol tcp --port 22   --cidr $IP/32 --output text

您需要将其更新为您的安全组的名称。

这是一个自动从安全组中删除所有规则的 Python 脚本:

#!/usr/bin/env python

import boto3

GROUP_NAME = "***-SSH-SG"

# Connect to the Amazon EC2 service
ec2 = boto3.resource('ec2')

# Retrieve the security group
security_groups = ec2.security_groups.filter(Filters=['Name':'group-name', 'Values':[GROUP_NAME]])

# Delete all rules in the group
for group in security_groups:
    group.revoke_ingress(IpPermissions = group.ip_permissions)

您可以将它们组合在一起以清除现有条目,然后添加您当前的 IP 地址。

【讨论】:

【参考方案4】:

Tl;DR您可以将规则的源配置为与您的 *** 地址空间匹配的 CIDR 块。

安全组充当您的实例的虚拟防火墙,以控制入站和出站流量。对于每个安全组,您可以添加控制入站流量到实例的规则,以及一组单独的控制出站流量的规则。

这里我们对入站规则感兴趣。每个规则都包含流量的来源和目标端口或端口范围。源可以是另一个安全组、IPv4 或 IPv6 CIDR 块、单个 IPv4 或 IPv6 地址或前缀列表 ID。

当您将 CIDR 块指定为规则的来源时,将允许来自指定地址的流量用于指定协议和端口。如果您指定单个 IPv4 地址,请使用 /32 前缀长度指定地址。例如127.0.0.1/32 将只允许来自这个特定 IP 的访问。但是,如果我们将 CIDR 块定义为 127.0.0.1/8,则所有以 127. 开头的 IP 地址都将被允许。例如,127.123.123.123 将被允许。

因此,您可以将规则的源配置为与您的 *** 地址空间匹配的 CIDR 块。

最好的,斯特凡

【讨论】:

拥有一个 CIDR 块在这里并没有什么帮助,因为我想根据我当前 *** 提供的 IP 地址锁定它。我一直在寻找通过 AWS CLI 更新安全组的方法。我已经适当地更新了问题。

以上是关于使用 *** 混淆网络流量时,AWS CLI 脚本更改 EC2 的安全组以匹配当前分配的 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章

AWS学习笔记--CLI创建EC2时执行脚本

AWS Device Farm - 使用 CLI 时上传失败

sh AWS cli实用程序脚本

AWS CLI 与控制台和 CloudFormation 堆栈

aws CLI使用

在哪里可以找到具有更新值的 AWS CLI 文档?