过滤具有特定端口和 IP ACL 的安全组的 AWS CLI 输出
Filtering AWS CLI output for security groups that have specific port and IP ACLs
我在过滤 AWS CLI describe-security-groups 输出时遇到困难
目标:找到所有在端口 22 上具有入口规则且 cidr 为 0.0.0.0/0 的 SG
Amazon 自己的文档提供了一个示例,但声明他们的查询存在局限性,因为它将首先过滤端口 22 的整个数据集,然后过滤 0.0.0.0/0 的整个数据集。这意味着具有以下规则的 SG 仍将触发:
ingress 22 sg-12345678
ingress 443 0.0.0.0/0
这完全违背了过滤的目的,我什至不确定为什么亚马逊会提供标题为 "To describe security groups that have specific rules"
的示例
方式一:先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 以简单地删除具有空数据的条目时设置,我遇到了困难,因为所有的钥匙都被剥夺了。
- 当我尝试 select 深入到嵌套部分时,我最终遇到了诸如无法迭代 null
之类的错误
- 如果我尝试使用 contains,我什么也得不到,所以我什至不确定哪里出错了
路径 2:jq un-queried CLI 输出
我从一开始就使用 jq 无法摆脱原始 AWS 示例的陷阱,在这里我可以首先查询包含端口 22 的所有 SG,然后查询任何 0.0.0.0 的 ACL /0,这当然给了我误报。
由于 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"
}
]
}
您需要使用高级 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
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"
}
]
]
]
]
]
这是一个 jq 过滤器,它将 return 只有具有 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"
}
我在过滤 AWS CLI describe-security-groups 输出时遇到困难
目标:找到所有在端口 22 上具有入口规则且 cidr 为 0.0.0.0/0 的 SG
Amazon 自己的文档提供了一个示例,但声明他们的查询存在局限性,因为它将首先过滤端口 22 的整个数据集,然后过滤 0.0.0.0/0 的整个数据集。这意味着具有以下规则的 SG 仍将触发:
ingress 22 sg-12345678
ingress 443 0.0.0.0/0
这完全违背了过滤的目的,我什至不确定为什么亚马逊会提供标题为 "To describe security groups that have specific rules"
的示例方式一:先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 以简单地删除具有空数据的条目时设置,我遇到了困难,因为所有的钥匙都被剥夺了。
- 当我尝试 select 深入到嵌套部分时,我最终遇到了诸如无法迭代 null 之类的错误
- 如果我尝试使用 contains,我什么也得不到,所以我什至不确定哪里出错了
路径 2:jq un-queried CLI 输出
我从一开始就使用 jq 无法摆脱原始 AWS 示例的陷阱,在这里我可以首先查询包含端口 22 的所有 SG,然后查询任何 0.0.0.0 的 ACL /0,这当然给了我误报。 由于 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"
}
]
}
您需要使用高级 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
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"
}
]
]
]
]
]
这是一个 jq 过滤器,它将 return 只有具有 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"
}