
Генерирует политики AWS IAM с минимальными привилегиями на основе ARN ресурсов и уровней доступа, автоматизируя создание безопасных политик для облачной инфраструктуры.
Пошаговые руководства и полную документацию можно найти на проекте ReadTheDocs.
Смотрите статью в блоге Salesforce Engineering о Policy Sentry.
Написание безопасных IAM-политик вручную может быть очень утомительным и неэффективным. Многие разработчики Infrastructure as Code сталкивались с чем-то подобным:
Такой процесс не идеален ни для безопасности, ни для разработчиков Infrastructure as Code. Нам нужно упростить написание IAM-политик безопасным образом и скрыть сложность написания политик с минимальными привилегиями. Именно поэтому я создал этот инструмент.
Policy Sentry позволяет пользователям создавать IAM-политики с минимальными привилегиями за считанные секунды, вместо того чтобы часами выписывать их вручную. Эти политики ограничены по уровням доступа и ресурсам. В случае взлома это помогает ограничить радиус поражения скомпрометированных учётных данных, предоставляя IAM-принципалам только необходимый доступ.
До этого инструмента создание IAM-политики с ограничениями по ARN ресурсов могло занять часы — теперь это занимает секунды. Таким образом, разработчикам нужно только определить ресурсы, к которым им требуется доступ, а Policy Sentry абстрагирует сложность IAM-политик от процессов разработки.
Ключевая особенность Policy Sentry — это возможность создавать IAM-политики на основе ARN ресурсов и уровней доступа. Наша функциональность CRUD придерживается мнения, что разработчики IAC не должны понимать все тонкости AWS IAM — мы должны абстрагировать эту сложность за них. По сути, разработчики должны просто сказать...
arn:aws:s3:::example-org-sbx-vmimport"arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret"arn:aws:ssm:us-east-1:123456789012:parameter/test"...и наша автоматизация должна создавать политики, соответствующие этим уровням доступа.
Как мы этого добиваемся? Policy Sentry использует документацию AWS по действиям, ресурсам и ключам условий для поиска действий, уровней доступа и типов ресурсов, и генерирует политики в соответствии с ARN и уровнями доступа. Рассмотрим фрагмент таблицы ниже:
| Действия | Уровень доступа | Типы ресурсов |
|---|---|---|
| ssm:GetParameter | Read | parameter |
| ssm:DescribeParameters | List | parameter |
| ssm:PutParameter | Write | parameter |
| secretsmanager:PutResourcePolicy | Permissions management | secret |
| secretsmanager:TagResource | Tagging | secret |
Policy Sentry агрегирует всю эту документацию в единую базу данных и использует её для генерации политик в соответствии с действиями, ресурсами и уровнями доступа.
brew tap salesforce/policy_sentry https://github.com/salesforce/policy_sentry
brew install policy_sentry
pip3 install --user policy_sentry
Чтобы включить автодополнение Bash, добавьте это в ваш .bashrc:
eval "$(_POLICY_SENTRY_COMPLETE=bash_source policy_sentry)"
Чтобы включить автодополнение ZSH, добавьте это в ваш .zshrc:
eval "$(_POLICY_SENTRY_COMPLETE=zsh_source policy_sentry)"
policy_sentry create-template --output-file crud.yml --template-type crud
mode: crud
name: ''
# Укажите ARN ресурсов
read:
- ''
write:
- ''
list:
- ''
tagging:
- ''
permissions-management:
- ''
# Действия, которые не поддерживают ограничения по ресурсам
wildcard-only:
single-actions: # отдельные действия
- ''
# По сервисам — например, 's3' или 'ec2'
service-read:
- ''
service-write:
- ''
service-list:
- ''
service-tagging:
- ''
service-permissions-management:
- ''
# Пропустите требования к ограничению ресурсов, перечислив действия здесь.
skip-resource-constraints:
- ''
# Исключите действия из вывода, указав их здесь. Принимаются подстановочные знаки, например kms:Delete*
exclude-actions:
- ''
# Если этой политике нужно включить действие AssumeRole
sts:
assume-role:
- ''
assume-role-with-saml:
- ''
assume-role-with-web-identity:
- ''
mode: crud
read:
- 'arn:aws:ssm:us-east-1:123456789012:parameter/myparameter'
write:
- 'arn:aws:ssm:us-east-1:123456789012:parameter/myparameter'
list:
- 'arn:aws:ssm:us-east-1:123456789012:parameter/myparameter'
tagging:
- 'arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret'
permissions-management:
- 'arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret'
policy_sentry write-policy --input-file crud.yml
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SsmReadParameter",
"Effect": "Allow",
"Action": [
"ssm:GetParameter",
"ssm:GetParameterHistory",
"ssm:GetParameters",
"ssm:GetParametersByPath",
"ssm:ListTagsForResource"
],
"Resource": [
"arn:aws:ssm:us-east-1:123456789012:parameter/myparameter"
]
},
{
"Sid": "SsmWriteParameter",
"Effect": "Allow",
"Action": [
"ssm:DeleteParameter",
"ssm:DeleteParameters",
"ssm:LabelParameterVersion",
"ssm:PutParameter"
],
"Resource": [
"arn:aws:ssm:us-east-1:123456789012:parameter/myparameter"
]
},
{
"Sid": "SecretsmanagerPermissionsmanagementSecret",
"Effect": "Allow",
"Action": [
"secretsmanager:DeleteResourcePolicy",
"secretsmanager:PutResourcePolicy"
],
"Resource": [
"arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret"
]
},
{
"Sid": "SecretsmanagerTaggingSecret",
"Effect": "Allow",
"Action": [
"secretsmanager:TagResource",
"secretsmanager:UntagResource"
],
"Resource": [
"arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret"
]
}
]
}
Обратите внимание, как приведённая выше политика распознаёт ARN, предоставленные пользователем, вместе с запрошенным уровнем доступа. Например, SecretsmanagerTaggingSecret содержит только действия по тегированию, назначенные типу ресурса secret.
Это значительно ускоряет время разработки IAM-политик и гарантирует, что все созданные политики ограничивают доступ только к тому, что необходимо вашей роли. Таким образом, разработчикам нужно только определить ресурсы, к которым им требуется доступ, а мы абстрагируем сложность IAM-политик от процессов разработки.
# Сначала создавайте шаблоны!!! Так вы сможете просто вставить нужные значения, не запоминая формат YAML
# Режим CRUD
policy_sentry create-template --output-file tmp.yml --template-type crud
# Режим Actions
policy_sentry create-template --output-file tmp.yml --template-type actions
# Написать политику на основе уровней доступа к конкретным ресурсам
policy_sentry write-policy --input-file examples/yml/crud.yml
# Написать политику на основе списка действий
policy_sentry write-policy --input-file examples/yml/actions.yml
###############
# Таблица действий
###############
# ПРИМЕЧАНИЕ: Используйте --fmt yaml или --fmt json для изменения формата вывода. По умолчанию json для запросов
# Получить список действий, которые не поддерживают ограничения по ресурсам
policy_sentry query action-table --service s3 --resource-type "*" --fmt yaml
# Получить список действий уровня "Write" в сервисе S3, которые не поддерживают ограничения по ресурсам
policy_sentry query action-table --service s3 --access-level write --resource-type "*" --fmt yaml
# Получить список всех IAM-действий во всех сервисах, имеющих уровень доступа "Permissions management"
policy_sentry query action-table --service all --access-level permissions-management
# Получить список всех IAM-действий, доступных для сервиса RAM
policy_sentry query action-table --service ram
# Получить подробности об IAM-действии `ram:TagResource`
policy_sentry query action-table --service ram --name tagresource
# Получить список всех IAM-действий в сервисе RAM с уровнем доступа Permissions management
policy_sentry query action-table --service ram --access-level permissions-management
# Получить список всех IAM-действий в сервисе SES, поддерживающих ключ условия `ses:FeedbackAddress`.
policy_sentry query action-table --service ses --condition ses:FeedbackAddress
###########
# Таблица ARN
###########
# Получить список всех сырых форматов ARN, доступных через сервис SSM.
policy_sentry query arn-table --service ssm
# Получить сырой формат ARN для ARN `cloud9` с коротким именем `environment`
policy_sentry query arn-table --service cloud9 --name environment
# Получить пары ключ/значение всех сырых форматов ARN и их коротких имён
policy_sentry query arn-table --service cloud9 --list-arn-types
######################
# Таблица ключей условий
######################
# Получить список всех ключей условий, доступных для сервиса Cloud9
policy_sentry query condition-table --service cloud9
# Получить подробности о ключе условия с именем `cloud9:Permissions`
policy_sentry query condition-table --service cloud9 --name cloud9:Permissions
# Инициализация папки конфигурации policy_sentry и создание таблиц базы данных IAM.
policy_sentry initialize
# Загрузить последнюю версию документации AWS, чтобы можно было экспериментировать с новыми сервисами.
policy_sentry initialize --fetch
# Переопределить уровни доступа, указав собственные уровни доступа (например, исправить уровни Permissions management)
policy_sentry initialize --access-level-overrides-file ~/.policy_sentry/overrides-resource-policies.yml
policy_sentry initialize --access-level-overrides-file ~/.policy_sentry/access-level-overrides.yml
create-template: Создаёт шаблоны YML-файлов для использования в командах типа write-policy.
write-policy: Использует YAML-файл для автоматического написания политик.
query: Запрос таблиц базы данных IAM. Это может помочь при заполнении шаблонов Policy Sentry или просто для быстрого получения знаний из базы данных.
action-table)arn-table)condition-table)initialize: (Опционально). Создаёт SQLite-базу данных, содержащую все сервисы, доступные через документацию по действиям, ресурсам и ключам условий. См. документацию.
Если вы разрабатываете свой собственный код на Python и хотите импортировать Policy Sentry как сторонний пакет, вы можете пропустить инициализацию и использовать локальный файл базы данных, который поставляется вместе с самим пакетом Python.
Это особенно полезно для разработчиков, которые хотят использовать возможности Policy Sentry, требующие применения базы данных IAM (например, запросы к таблице базы данных IAM). Таким образом, вам не нужно инициализировать базу данных — вы можете сразу делать запросы.
Пример кода находится здесь. Он также приведён ниже.
from policy_sentry.querying.actions import get_actions_for_service
def example():
actions = get_actions_for_service('cloud9') # Затем вы можете использовать любой метод, требующий доступа к базе данных.
for action in actions:
print(action)
if __name__ == '__main__':
example()
Результат будет выглядеть так:
cloud9:CreateEnvironmentEC2
cloud9:CreateEnvironmentMembership
cloud9:DeleteEnvironment
cloud9:DeleteEnvironmentMembership
cloud9:DescribeEnvironmentMemberships
cloud9:DescribeEnvironmentStatus
cloud9:DescribeEnvironments
cloud9:GetUserSettings
cloud9:ListEnvironments
cloud9:ListTagsForResource
cloud9:TagResource
cloud9:UntagResource
cloud9:UpdateEnvironment
cloud9:UpdateEnvironmentMembership
cloud9:UpdateUserSettings
Если вы предпочитаете использовать Docker вместо установки скрипта через Python, мы поддерживаем и это. Из корня репозитория выполните следующее для сборки Docker-образа:
docker build -t kmcquade/policy_sentry .
Используйте это для выполнения некоторых базовых команд:
# Базовые команды без аргументов
docker run -i --rm kmcquade/policy_sentry:latest "--help"
docker run -i --rm kmcquade/policy_sentry:latest "query"
# Запрос к базе данных
docker run -i --rm kmcquade/policy_sentry:latest "query action-table --service all --access-level permissions-management"
Команда write-policy также поддерживает передачу YML-конфигурации через STDIN. Если вы используете метод Docker, попробуйте следующее:
# Написание политик путём передачи конфигурации через STDIN
cat examples/yml/crud.yml | docker run -i --rm kmcquade/policy_sentry:latest "write-policy"
cat examples/yml/actions.yml | docker run -i --rm kmcquade/policy_sentry:latest "write-policy"
Модуль Terraform опубликован и поддерживается здесь.