
Gera políticas AWS IAM de privilégio mínimo com base em ARNs de recursos e níveis de acesso, automatizando a criação segura de políticas para infraestrutura em nuvem.
Para tutoriais e documentação completa, visite o projeto no ReadTheDocs.
Veja o post no blog de engenharia da Salesforce sobre o Policy Sentry.
Escrever Políticas IAM com consciência de segurança manualmente pode ser muito tedioso e ineficiente. Muitos desenvolvedores de Infraestrutura como Código já passaram por algo assim:
Tal processo não é ideal para a segurança nem para os desenvolvedores de Infraestrutura como Código. Precisamos facilitar a escrita segura de Políticas IAM e abstrair a complexidade de escrever políticas IAM de menor privilégio. Foi por isso que criei esta ferramenta.
O Policy Sentry permite que os usuários criem políticas IAM de menor privilégio em questão de segundos, em vez de escrever políticas IAM tediosamente manualmente. Essas políticas são reduzidas de acordo com os níveis de acesso e recursos. No caso de uma violação, isso ajuda a limitar o raio de explosão de credenciais comprometidas, dando aos principais IAM apenas o acesso de que precisam.
Antes desta ferramenta, podia levar horas para criar uma Política IAM com restrições de ARN de recurso — mas agora pode levar questão de segundos. Dessa forma, os desenvolvedores só precisam determinar os recursos que precisam acessar, e o Policy Sentry abstrai a complexidade das políticas IAM de seus processos de desenvolvimento.
A principal funcionalidade do Policy Sentry é que ele pode criar políticas IAM com base em ARNs de recursos e níveis de acesso. Nossa funcionalidade CRUD assume a abordagem opinativa de que os desenvolvedores de IAC não precisam entender as complexidades do AWS IAM — devemos abstrair a complexidade para eles. Na verdade, os desenvolvedores deveriam apenas poder dizer...
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"...e nossa automação deve criar políticas que correspondam a esses níveis de acesso.
Como fazemos isso? Bem, o Policy Sentry aproveita a documentação da AWS sobre Ações, Recursos e Chaves de Condição para consultar as ações, níveis de acesso e tipos de recursos, e gera políticas de acordo com os ARNs e níveis de acesso. Considere o trecho da tabela abaixo:
| Ações | Nível de Acesso | Tipos de Recurso |
|---|---|---|
| ssm:GetParameter | Leitura | parâmetro |
| ssm:DescribeParameters | Listagem | parâmetro |
| ssm:PutParameter | Escrita | parâmetro |
| secretsmanager:PutResourcePolicy | Gerenciamento de permissões | segredo |
| secretsmanager:TagResource | Marcação | segredo |
O Policy Sentry agrega toda essa documentação em um único banco de dados e usa esse banco de dados para gerar políticas de acordo com ações, recursos e níveis de acesso.
brew tap salesforce/policy_sentry https://github.com/salesforce/policy_sentry
brew install policy_sentry
pip3 install --user policy_sentry
Para habilitar o autocompletar do Bash, coloque isso no seu .bashrc:
eval "$(_POLICY_SENTRY_COMPLETE=bash_source policy_sentry)"
Para habilitar o autocompletar do ZSH, coloque isso no seu .zshrc:
eval "$(_POLICY_SENTRY_COMPLETE=zsh_source policy_sentry)"
policy_sentry create-template --output-file crud.yml --template-type crud
mode: crud
name: ''
# Specify resource ARNs
read:
- ''
write:
- ''
list:
- ''
tagging:
- ''
permissions-management:
- ''
# Actions that do not support resource constraints
wildcard-only:
single-actions: # standalone actions
- ''
# Service-wide - like 's3' or 'ec2'
service-read:
- ''
service-write:
- ''
service-list:
- ''
service-tagging:
- ''
service-permissions-management:
- ''
# Skip resource constraint requirements by listing actions here.
skip-resource-constraints:
- ''
# Exclude actions from the output by specifying them here. Accepts wildcards, like kms:Delete*
exclude-actions:
- ''
# If this policy needs to include an AssumeRole action
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"
]
}
]
}
Observe como a política acima reconhece os ARNs fornecidos pelo usuário, junto com o nível de acesso solicitado. Por exemplo, o SID SecretsmanagerTaggingSecret contém apenas ações de Marcação atribuídas ao tipo de recurso secreto.
Isso acelera rapidamente o tempo para desenvolver políticas IAM e garante que todas as políticas criadas limitem o acesso exatamente ao que sua função precisa acessar. Dessa forma, os desenvolvedores só precisam determinar os recursos que precisam acessar, e abstraímos a complexidade das políticas IAM de seus processos de desenvolvimento.
# Crie modelos primeiro!!! Assim você pode apenas colar os valores necessários em vez de lembrar o formato YAML
# Modo CRUD
policy_sentry create-template --output-file tmp.yml --template-type crud
# Modo Actions
policy_sentry create-template --output-file tmp.yml --template-type actions
# Escreva política com base em níveis de acesso específicos de recurso
policy_sentry write-policy --input-file examples/yml/crud.yml
# Escreva política com base em uma lista de ações
policy_sentry write-policy --input-file examples/yml/actions.yml
###############
# Tabela de Ações
###############
# NOTA: Use --fmt yaml ou --fmt json para mudar o formato de saída. Padrão é json para consulta
# Obtenha uma lista de ações que não suportam restrições de recurso
policy_sentry query action-table --service s3 --resource-type "*" --fmt yaml
# Obtenha uma lista de ações no nível "Write" no S3 que não suportam restrições de recurso
policy_sentry query action-table --service s3 --access-level write --resource-type "*" --fmt yaml
# Obtenha uma lista de todas as ações IAM em TODOS os serviços que têm acesso "Permissions management"
policy_sentry query action-table --service all --access-level permissions-management
# Obtenha uma lista de todas as Ações IAM disponíveis para o serviço RAM
policy_sentry query action-table --service ram
# Obtenha detalhes sobre a ação IAM `ram:TagResource`
policy_sentry query action-table --service ram --name tagresource
# Obtenha uma lista de todas as ações IAM no serviço RAM que têm o nível de acesso Permissions management
policy_sentry query action-table --service ram --access-level permissions-management
# Obtenha uma lista de todas as ações IAM no serviço SES que suportam a chave de condição `ses:FeedbackAddress`
policy_sentry query action-table --service ses --condition ses:FeedbackAddress
###########
# Tabela ARN
###########
# Obtenha uma lista de todos os formatos RAW de ARN disponíveis através do serviço SSM
policy_sentry query arn-table --service ssm
# Obtenha o formato raw ARN para o ARN `cloud9` com o nome curto `environment`
policy_sentry query arn-table --service cloud9 --name environment
# Obtenha pares chave/valor de todos os formatos RAW de ARN mais seus nomes curtos
policy_sentry query arn-table --service cloud9 --list-arn-types
######################
# Tabela de Chaves de Condição
######################
# Obtenha uma lista de todas as chaves de condição disponíveis para o serviço Cloud9
policy_sentry query condition-table --service cloud9
# Obtenha detalhes sobre a chave de condição intitulada `cloud9:Permissions`
policy_sentry query condition-table --service cloud9 --name cloud9:Permissions
# Inicialize a pasta de configuração do policy_sentry e crie as tabelas do banco de dados IAM
policy_sentry initialize
# Obtenha a versão mais recente da documentação AWS para experimentar novos serviços
policy_sentry initialize --fetch
# Substitua os Níveis de Acesso especificando seus próprios Níveis de Acesso (exemplo: corrigindo níveis de 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: Cria os modelos de arquivo YML para uso nos tipos de comando write-policy.
write-policy: Aproveita um arquivo YAML para escrever políticas para você
query: Consulte as tabelas do banco de dados IAM. Isso pode ajudar ao preencher os modelos do Policy Sentry, ou apenas consultar o banco de dados para conhecimento rápido.
action-table)arn-table)condition-table)initialize: (Opcional). Cria um banco de dados SQLite que contém todos os serviços disponíveis através da documentação de Ações, Recursos e Chaves de Condição. Veja a documentação.
Se você está desenvolvendo seu próprio código Python e deseja importar o Policy Sentry como um pacote de terceiros, você pode pular a inicialização e aproveitar o arquivo de banco de dados local que está incluído no próprio pacote Python.
Isso é especialmente útil para desenvolvedores que desejam aproveitar as capacidades do Policy Sentry que exigem o uso do banco de dados IAM (como consultar a tabela do banco de dados IAM). Dessa forma, você não precisa inicializar o banco de dados e pode consultá-lo imediatamente.
O exemplo de código está localizado aqui. Também é mostrado abaixo.
from policy_sentry.querying.actions import get_actions_for_service
def example():
actions = get_actions_for_service('cloud9') # Então você pode usar qualquer método que exija acesso ao banco de dados.
for action in actions:
print(action)
if __name__ == '__main__':
example()
Os resultados serão parecidos com:
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
Se você prefere usar Docker em vez de instalar o script com Python, também oferecemos suporte. A partir da raiz do repositório, use isso para construir a imagem docker:
docker build -t kmcquade/policy_sentry .
Use isso para executar alguns comandos básicos:
# Comandos básicos sem argumentos
docker run -i --rm kmcquade/policy_sentry:latest "--help"
docker run -i --rm kmcquade/policy_sentry:latest "query"
# Consulte o banco de dados
docker run -i --rm kmcquade/policy_sentry:latest "query action-table --service all --access-level permissions-management"
O comando write-policy também suporta passar a configuração YML via STDIN. Se você estiver usando o método Docker, experimente aqui:
# Escreva políticas passando a configuração via 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"
O módulo Terraform é publicado e mantido aqui.