4

我在过滤 AWS CLI describe-security-groups 输出时遇到了困难

目标:在端口 22 上找到所有具有入口规则且 cidr 为 0.0.0.0/0 的 SG

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

ingress 22 sg-12345678
ingress 443 0.0.0.0/0

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

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

这条路线基于我在这里找到的:https ://github.com/aws/aws-cli/issues/971

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 的任何 SG 的嵌套数据(并成功忽略了其他端口的任何 0.0.0.0/0 ACL) 在下面的输出中,我感兴趣的是 SG1 , SG2/SG3 需要被过滤掉。

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

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

  • 当我尝试更深入地选择嵌套部分时,我最终会遇到无法迭代 null 之类的错误
  • 如果我尝试使用包含,我什么也得不到,所以我什至不确定我哪里出错了

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

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

这是 2 个 SG 的一些经过净化的原始 CLI 输出,我需要再次获取第一个,而不会在第二个触发误报

{
    "SecurityGroups": [
        {
            "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"
        }, 
        {
            "Description": "SG 2", 
            "IpPermissions": [
                {
                    "PrefixListIds": [], 
                    "FromPort": 22, 
                    "IpRanges": [], 
                    "ToPort": 22, 
                    "IpProtocol": "tcp", 
                    "UserIdGroupPairs": [
                        {
                            "UserId": "1234567890", 
                            "GroupId": "sg-abcdefab"
                        }
                    ], 
                    "Ipv6Ranges": []
                },
                {
                    "PrefixListIds": [], 
                    "FromPort": 443, 
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ], 
                    "ToPort": 443, 
                    "IpProtocol": "tcp", 
                    "UserIdGroupPairs": [], 
                    "Ipv6Ranges": []
                }
            ], 
            "GroupName": "SG 2", 
            "VpcId": "vpc-12345678", 
            "OwnerId": "1234567890", 
            "GroupId": "sg-22222222"
        } 
    ]
}
4

3 回答 3

6

您需要使用高级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
于 2017-10-25T18:24:37.500 回答
1

这是一个 jq 过滤器,它将仅返回具有 FromPort=22 的 IpPermission 和“0.0.0.0/0”的 IpRange CidrIp 的 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"
}

在 jqplay.org 在线尝试

于 2017-10-25T19:09:56.763 回答
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"
          }
        ]
      ]
    ]
  ]
]
于 2017-10-25T19:05:42.033 回答