Фильтрация выходных данных интерфейса командной строки AWS по группам безопасности, имеющим определенный порт и списки ACL IP
У меня проблемы с фильтрацией выходных данных AWS CLI описать-группы безопасности
Цель: Найти все SG с правилами входа на порт 22 с cidr 0.0.0.0/0
Собственные документы Amazons предоставляют пример, но утверждают, что в их запросе есть ограничение: сначала он фильтрует весь набор данных для порта 22, а затем фильтрует весь этот набор данных для 0.0.0.0/0. Это означает, что генераторы SG со следующими правилами все равно будут срабатывать:
ingress 22 sg-12345678
ingress 443 0.0.0.0/0
Это полностью противоречит цели фильтрации, и я даже не уверен, почему Amazon предоставляет этот пример с заголовком "Для описания групп безопасности, имеющих определенные правила".
Маршрут 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`]]]'
Который предоставляет список всех групп безопасности, но показывает вложенные данные для любых SG с 22 0.0.0.0/0 (и успешно игнорирует любые 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",
[]
]
]
Это отличный первый шаг, так как я исключил 0.0.0.0/0 ACL, которые не связаны с портом 22. Но когда я пытаюсь запустить jq, чтобы просто удалить записи с пустыми наборами данных, у меня возникают трудности, так как все ключи были раздеты.
- Когда я пытаюсь глубже выбрать вложенные разделы, я получаю ошибки, вроде не могу перебрать нуль
- Если я пытаюсь использовать содержимое, я просто ничего не получаю, поэтому я даже не уверен, где я ошибаюсь
Маршрут 2: незапрашиваемый вывод CLI
Я не смог уйти от ловушки исходного примера AWS с помощью jq с самого начала, где я могу сначала запросить все SG, которые содержат порт 22, а затем запросить любые ACL 0.0.0.0/0, какой из Конечно, дает мне ложные срабатывания. Из-за потоковой природы jq я не выяснил, как проверить условие A (порт 22), а затем проверить условие B (0.0.0.0/0) только для элементов, связанных с условием A.
Вот некоторые очищенные необработанные данные CLI для 2 SG, опять же, мне нужно получить первый, не вызывая ложного срабатывания на 2
{
"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"
}
]
}
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
Вот фильтр jq, который будет возвращать только SecurityGroups с IpPermission с FromPort=22 и IpRange CidrIp "0.0.0.0/0":
.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"
}
Решение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"
}
]
]
]
]
]