为具有特定端口和IP ACL的安全组过滤AWS CLI输出

时间:2017-10-25 17:14:17

标签: amazon-web-services amazon-ec2 aws-cli jq jmespath

我无法过滤AWS CLI describe-security-groups输出

目标:使用cidr 0.0.0.0/0

查找端口22上具有入口规则的所有SG

亚马逊'自己的文档提供了一个示例,但声明其查询存在限制,因为它将首先过滤端口22的整个数据集,然后过滤整个数据集为0.0.0.0/0。这意味着具有以下规则的SGs仍会触发:

gsutil rm gs://my-bucket/my-directory/

这完全违背了过滤的目的,我甚至不确定为什么亚马逊为该示例提供标题为"描述具有特定规则的安全组"

路线1:首先是aws cli查询然后是jq

此路线基于我在此处找到的内容:https://github.com/aws/aws-cli/issues/971

ingress 22 sg-12345678
ingress 443 0.0.0.0/0

其中提供了所有安全组的列表,但显示了任何具有22 0.0.0.0/0的SG的嵌套数据(并且成功忽略了其他端口的任何0.0.0.0/0 ACL)输出如下,SG1是我感兴趣的,需要过滤掉SG2 / SG3。

aws ec2 describe-security-groups --output json --query 'SecurityGroups[*].[GroupName,GroupId,IpPermissions[?ToPort==`22`].[IpRanges[?CidrIp==`0.0.0.0/0`]]]'

这是一个很好的第一步,因为我已经消除了与端口22无关的0.0.0.0/0 ACL。但是当我尝试运行jq来简单地删除具有空数据集的条目时,我遇到困难导致所有钥匙都被剥离了。

  • 当我尝试更深入地选择嵌套部分时,我最终会遇到错误,例如无法迭代null
  • 如果我尝试使用contains,我就什么都不回来,所以我甚至不确定我在哪里出错了

路由2:jq未查询的CLI输出

我从一开始就使用jq无法摆脱原始AWS示例的陷阱,我可以先查询包含端口22的所有SG,然后查询0.0.0.0的任何ACL / 0,这当然给了我误报。 由于jq的流特性,我还没有弄清楚如何检查条件A(端口22),然后仅检查条件A的项目B(0.0.0.0/0)。

这里有2个SG的一些已清理的原始CLI输出,再次,我需要获得第一个没有在第二个引发误报的

[
    [
        "SG 1", 
        "sg-11111111", 
        [
            [
                [
                    {
                        "CidrIp": "0.0.0.0/0"
                    }
                ]
            ]
        ]
    ],
    [
        "SG 2",
        "sg-22222222",
        [
            [
                []
            ]
        ]
    ],
    [
        "SG 3", 
        "sg-33333333", 
        []
    ]
]

3 个答案:

答案 0 :(得分:3)

您需要使用高级 JMESPath 条件。看看下面的cli命令是否满足你的要求。

aws ec2 describe-security-groups \
    --filters "Name=ip-permission.to-port,Values=22" \
    --query 'SecurityGroups[?IpPermissions[?ToPort==`22` && contains(IpRanges[].CidrIp, `0.0.0.0/0`)]].{GroupId: GroupId, GroupName: GroupName}' \
    --output json \
    --region us-east-1

答案 1 :(得分:1)

这是一个jq过滤器,它只返回带有FromPort = 22的IpPermission和IpRange CidrIp为“0.0.0.0/0”的SecurityGroups:

  .SecurityGroups[]
| select(.IpPermissions[] | .FromPort == 22 and .IpRanges[].CidrIp == "0.0.0.0/0")

示例运行(假设filter.jq中的过滤器和data.json中的数据)

$ jq -M -f filter.jq data.json
{
  "Description": "SG 1",
  "IpPermissions": [
    {
      "PrefixListIds": [],
      "FromPort": 22,
      "IpRanges": [
        {
          "CidrIp": "0.0.0.0/0"
        }
      ],
      "ToPort": 22,
      "IpProtocol": "tcp",
      "UserIdGroupPairs": [],
      "Ipv6Ranges": []
    }
  ],
  "GroupName": "SG 1",
  "VpcId": "vpc-12345678",
  "OwnerId": "1234567890",
  "GroupId": "sg-11111111"
}

Try it online at jqplay.org

答案 2 :(得分:0)

jq 使用空嵌套数据过滤安全组的解决方案:

aws ec2 describe-security-groups --output json --query 'SecurityGroups[*].[GroupName,GroupId,IpPermissions[?ToPort==`22`]
.[IpRanges[?CidrIp==`0.0.0.0/0`]]]' | jq 'map(select(.[2] | flatten | length > 0))'

输出:

[
  [
    "SG 1",
    "sg-11111111",
    [
      [
        [
          {
            "CidrIp": "0.0.0.0/0"
          }
        ]
      ]
    ]
  ]
]