【问题标题】:Revoke all AWS security group ingress rules撤销所有 AWS 安全组入口规则
【发布时间】:2015-05-21 10:45:14
【问题描述】:

是否可以撤销 AWS 安全组中的所有入口规则?是否可以撤销所有 SSH 入口规则?我正在尝试使用下面的 cli 命令,但它不起作用:

aws ec2 revoke-security-group-ingress --group-id GroupID --protocol tcp --port 22

【问题讨论】:

  • 我试图用它来撤销端口 22 的任何规则,但我想我们需要指定 --cidr 选项......奇怪的是运行你上面发布的命令返回没有错误

标签: amazon-web-services sysadmin


【解决方案1】:

根据@kuboon 的建议,这是该脚本的一个更简单的工作版本,在 zsh 中进行了测试。主要区别在于:

  • 通过显式使用 --output json 选项强制第一个命令返回 json(并不总是默认值)
  • 将该结果传递给revoke-security-group-ingress 的参数--ip-permissions,而不是作为--cli-input-json 需要的json 格式的完全格式命令(它不是)。
groupId="your group-id"
aws ec2 revoke-security-group-ingress --group-id $groupId \
  --ip-permissions \
  "`aws ec2 describe-security-groups --output json --group-ids $groupId --query "SecurityGroups[0].IpPermissions"`"

【讨论】:

    【解决方案2】:

    我最终编写了一个使用 AWS CLI 执行此操作的 Powershell 脚本。

    脚本遍历所有区域,查找默认安全组,并删除其中的所有规则。

    这里是:

    # get all regions
    write-host "Getting all regions.."
    $regions = ([string](aws ec2 describe-regions --region eu-west-2) | ConvertFrom-Json).Regions.RegionName
    write-host "Got them:"
    $regions
    
    write-host "-------------------"
    write-host ""
    
    # for all regions
    foreach ($region in $regions)
    {
        write-host "Getting default security groups for $region.."
        # get all subnets
        $groupIds = ([string](aws ec2 describe-security-groups --filters Name=group-name,Values=default --region $region) | ConvertFrom-Json).SecurityGroups.GroupId
    
        foreach ($groupId in $groupIds)
        {
            write-host "Got it: $groupId" 
            write-host "Getting all rules.."
            $rules = [string](aws ec2 describe-security-groups --group-id $groupId --query "SecurityGroups[0].IpPermissions" --region $region) | ConvertFrom-Json
            foreach ($rule in $rules)
            {
                $protocol = $rule.IpProtocol
                $cidr = $rule.IpRanges.CidrIp
                $fromPort = $rule.FromPort
                $toPort = $rule.ToPort
                $cidrIpv6 = $rule.Ipv6Ranges.CidrIpv6
                $sourceGroup = $rule.UserIdGroupPairs.GroupId
                $sourceGroupUserId = $rule.UserIdGroupPairs.UserId
    
                if ($protocol -eq "icmpv6") {
                    $protocol = "icmp"
                }
    
                if (($protocol -eq "tcp") -Or ($protocol -eq "udp") -Or ($protocol -eq "icmp"))
                {                
                    if ($cidr){
                        if ($fromPort -eq -1){
                            write-host "Removing rule from security group using this command:"
                            write-host "aws ec2 revoke-security-group-ingress --group-id $groupId --protocol $protocol --port "$fromPort" --cidr $cidr --region $region"
                            aws ec2 revoke-security-group-ingress --group-id $groupId --protocol $protocol --port "$fromPort" --cidr $cidr --region $region
                            write-host "Done!"
    
                            query
                        }
                        else {
                            write-host "Removing rule from security group using this command:"
                            write-host "aws ec2 revoke-security-group-ingress --group-id $groupId --protocol $protocol --port "$fromPort-$toPort" --cidr $cidr --region $region"
                            aws ec2 revoke-security-group-ingress --group-id $groupId --protocol $protocol --port "$fromPort-$toPort" --cidr $cidr --region $region
                            write-host "Done!"                         
                        }                    
                    }
                    if ($cidrIpv6){
                        $json = ('{"IpProtocol": "'+$protocol+'", "FromPort": '+$fromPort+', "ToPort": '+$toPort+', "Ipv6Ranges": [{"CidrIpv6": "'+$cidrIpv6+'"}]}') | ConvertTo-Json
                        write-host "Removing Ipv6 version of rule from security group using this command:"
                        write-host "aws ec2 revoke-security-group-ingress --group-id $groupId --ip-permissions $json --region $region"
                        aws ec2 revoke-security-group-ingress --group-id $groupId --ip-permissions $json --region $region
                        write-host "Done!"
                    }
                    if ($sourceGroup -and $sourceGroupUserId) 
                    {
                        write-host "Removing SourceGroup rule from security group using this command:"
                        write-host "aws ec2 revoke-security-group-ingress --group-id $groupId --protocol $protocol --port "$fromPort-$toPort" --cidr $cidr --region $region"
                        aws ec2 revoke-security-group-ingress --group-id $groupId --protocol $protocol --port "$fromPort-$toPort" --source-group $sourceGroup --group-owner $sourceGroupUserId --region $region
                        write-host "Done!"
                    }                
                }
                else 
                {
                    if ($cidr){
                        write-host "Removing rule from security group using this command:"
                        write-host "aws ec2 revoke-security-group-ingress --group-id $groupId --protocol $protocol --cidr $cidr --region $region"
                        aws ec2 revoke-security-group-ingress --group-id $groupId --protocol $protocol --cidr $cidr --region $region
                        write-host "Done!"
                    }
                    if ($cidrIpv6){
                        $json = '{"IpProtocol": "-1", "Ipv6Ranges": [{"CidrIpv6": "'+$cidrIpv6+'"}]}' | ConvertTo-Json
                        write-host "Removing Ipv6 version of rule from security group using this command:"
                        write-host "aws ec2 revoke-security-group-ingress --group-id $groupId --ip-permissions $json --region $region"
                        aws ec2 revoke-security-group-ingress --group-id $groupId --ip-permissions $json --region $region
                        write-host "Done!"
                    }
                    if ($sourceGroup) 
                    {
                        $json = '{ "IpProtocol": "-1", "UserIdGroupPairs":[{"GroupId":"'+$sourceGroup+'","UserId":"'+$sourceGroupUserId+'"}] }' | ConvertTo-Json
                        write-host "Removing SourceGroup rule from security group using this command:"
                        write-host "aws ec2 revoke-security-group-ingress --group-id $groupId --ip-permissions $json --region $region"
                        aws ec2 revoke-security-group-ingress --group-id $groupId --ip-permissions $json --region $region
                        write-host "Done!"
                    }   
                }
            }        
        }    
        write-host "-------------------"
        write-host ""  
    }
    

    注意 此脚本无法删除某些规则(自定义协议、自定义 ICMP 规则 - IPv6),但它适用于大多数规则。

    我根据以下规则集测试了脚本:

    这是运行脚本后剩下的内容:

    希望这对那里的人有所帮助!

    【讨论】:

      【解决方案3】:

      您似乎必须单独指定每个来源,例如 --cidr 0.0.0.0/0 或 --source-group sg-12345678。

      【讨论】:

        【解决方案4】:

        获取规则列表并全部撤销。

        groupId="your group-id"
        json=`aws ec2 describe-security-groups --group-id $groupId --query "SecurityGroups[0].IpPermissions"`
        aws ec2 revoke-security-group-ingress --cli-input-json "{\"GroupId\": \"$groupId\", \"IpPermissions\": $json}"
        

        【讨论】:

          【解决方案5】:

          只是对demonicdaron 脚本的一个小改进,可以将超过1 个cidr 返回到同一规则,在这种情况下,您只需在$cidr 上执行foreach() 即可循环遍历每个人。

          但它就像一个魅力

          【讨论】:

            猜你喜欢
            • 2020-09-29
            • 2020-03-30
            • 2019-02-05
            • 2017-08-10
            • 1970-01-01
            • 2018-08-25
            • 1970-01-01
            • 2015-11-13
            • 2015-04-28
            相关资源
            最近更新 更多