
Genera políticas de IAM de AWS con el mínimo privilegio basadas en ARNs de recursos y niveles de acceso, automatizando la creación de políticas seguras para la infraestructura en la nube.
Para guías y documentación completa, visite el proyecto en ReadTheDocs.
Consulte la publicación del blog de ingeniería de Salesforce sobre Policy Sentry.
Redactar políticas IAM seguras a mano puede ser muy tedioso e ineficiente. Muchos desarrolladores de Infraestructura como Código han experimentado algo así:
Este proceso no es ideal ni para la seguridad ni para los desarrolladores de Infraestructura como Código. Necesitamos facilitar la redacción segura de políticas IAM y abstraer la complejidad de redactar políticas IAM de mínimo privilegio. Por eso creé esta herramienta.
Policy Sentry permite a los usuarios crear políticas IAM de mínimo privilegio en cuestión de segundos, en lugar de redactarlas tediosamente a mano. Estas políticas se delimitan según los niveles de acceso y los recursos. En caso de una violación de seguridad, esto ayuda a limitar el radio de explosión de las credenciales comprometidas, concediendo solo el acceso que las entidades IAM necesitan.
Antes de esta herramienta, podía llevar horas elaborar una política IAM con restricciones de ARN de recursos, pero ahora puede llevar cuestión de segundos. De esta forma, los desarrolladores solo tienen que determinar los recursos a los que necesitan acceder, y Policy Sentry abstrae la complejidad de las políticas IAM de sus procesos de desarrollo.
La característica estrella de Policy Sentry es que puede crear políticas IAM basadas en ARN de recursos y niveles de acceso. Nuestra funcionalidad CRUD adopta el enfoque opinado de que los desarrolladores de IAC no deberían tener que entender las complejidades de AWS IAM; nosotros deberíamos abstraer la complejidad por ellos. De hecho, los desarrolladores solo deberían poder decir...
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"...y nuestra automatización debería crear políticas que correspondan a esos niveles de acceso.
¿Cómo logramos esto? Bueno, Policy Sentry aprovecha la documentación de AWS sobre Acciones, Recursos y Claves de Condición para buscar las acciones, niveles de acceso y tipos de recursos, y genera políticas según los ARN y niveles de acceso. Considere el fragmento de tabla a continuación:
| Acciones | Nivel de acceso | Tipos de recurso |
|---|---|---|
| ssm:GetParameter | Lectura | parámetro |
| ssm:DescribeParameters | Lista | parámetro |
| ssm:PutParameter | Escritura | parámetro |
| secretsmanager:PutResourcePolicy | Administración de permisos | secreto |
| secretsmanager:TagResource | Etiquetado | secreto |
Policy Sentry agrega toda esa documentación en una única base de datos y utiliza esa base de datos para generar políticas según acciones, recursos y niveles de acceso.
brew tap salesforce/policy_sentry https://github.com/salesforce/policy_sentry
brew install policy_sentry
pip3 install --user policy_sentry
Para habilitar el completado de Bash, coloque esto en su .bashrc:
eval "$(_POLICY_SENTRY_COMPLETE=bash_source policy_sentry)"
Para habilitar el completado de ZSH, coloque esto en su .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 cómo la política anterior reconoce los ARN que el usuario proporciona, junto con el nivel de acceso solicitado. Por ejemplo, el SID SecretsmanagerTaggingSecret contiene solo acciones de Etiquetado asignadas al tipo de recurso secreto.
Esto acelera rápidamente el tiempo de desarrollo de políticas IAM y garantiza que todas las políticas creadas limiten el acceso exactamente a lo que su rol necesita. De esta manera, los desarrolladores solo tienen que determinar los recursos a los que necesitan acceder, y nosotros abstraemos la complejidad de las políticas IAM de sus procesos de desarrollo.
# ¡¡¡Cree plantillas primero!!! De esta forma solo tiene que pegar los valores que necesita en lugar de recordar el formato YAML
# Modo CRUD
policy_sentry create-template --output-file tmp.yml --template-type crud
# Modo de acciones
policy_sentry create-template --output-file tmp.yml --template-type actions
# Escribir política basada en niveles de acceso específicos de recursos
policy_sentry write-policy --input-file examples/yml/crud.yml
# Escribir política basada en una lista de acciones
policy_sentry write-policy --input-file examples/yml/actions.yml
###############
# Tabla de acciones
###############
# NOTA: Use --fmt yaml o --fmt json para cambiar el formato de salida. Por defecto es json para consultas
# Obtener una lista de acciones que no admiten restricciones de recursos
policy_sentry query action-table --service s3 --resource-type "*" --fmt yaml
# Obtener una lista de acciones de nivel "Escritura" en S3 que no admiten restricciones de recursos
policy_sentry query action-table --service s3 --access-level write --resource-type "*" --fmt yaml
# Obtener una lista de todas las acciones IAM en TODOS los servicios que tienen acceso de "Administración de permisos"
policy_sentry query action-table --service all --access-level permissions-management
# Obtener una lista de todas las acciones IAM disponibles para el servicio RAM
policy_sentry query action-table --service ram
# Obtener detalles sobre la acción IAM `ram:TagResource`
policy_sentry query action-table --service ram --name tagresource
# Obtener una lista de todas las acciones IAM bajo el servicio RAM que tienen el nivel de acceso "Administración de permisos"
policy_sentry query action-table --service ram --access-level permissions-management
# Obtener una lista de todas las acciones IAM bajo el servicio SES que admiten la clave de condición `ses:FeedbackAddress`
policy_sentry query action-table --service ses --condition ses:FeedbackAddress
###########
# Tabla de ARN
###########
# Obtener una lista de todos los formatos RAW de ARN disponibles a través del servicio SSM
policy_sentry query arn-table --service ssm
# Obtener el formato RAW de ARN para el ARN `cloud9` con el nombre corto `environment`
policy_sentry query arn-table --service cloud9 --name environment
# Obtener pares clave/valor de todos los formatos RAW de ARN más sus nombres cortos
policy_sentry query arn-table --service cloud9 --list-arn-types
######################
# Tabla de claves de condición
######################
# Obtener una lista de todas las claves de condición disponibles para el servicio Cloud9
policy_sentry query condition-table --service cloud9
# Obtener detalles sobre la clave de condición titulada `cloud9:Permissions`
policy_sentry query condition-table --service cloud9 --name cloud9:Permissions
# Inicializar la carpeta de configuración de policy_sentry y crear las tablas de la base de datos IAM
policy_sentry initialize
# Obtener la versión más reciente de la documentación de AWS para experimentar con nuevos servicios
policy_sentry initialize --fetch
# Sobrescribir los niveles de acceso especificando sus propios niveles de acceso (ejemplo: corregir niveles de Administración de permisos)
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: Crea las plantillas de archivos YML para usar en los tipos de comando write-policy.
write-policy: Utiliza un archivo YAML para escribir políticas por usted
query: Consultar las tablas de la base de datos IAM. Esto puede ayudar al completar las plantillas de Policy Sentry, o simplemente consultar la base de datos para obtener conocimiento rápido.
action-table)arn-table)condition-table)initialize: (Opcional). Crear una base de datos SQLite que contenga todos los servicios disponibles a través de la documentación de Acciones, Recursos y Claves de Condición. Consulte la documentación.
Si está desarrollando su propio código Python y desea importar Policy Sentry como un paquete de terceros, puede omitir la inicialización y aprovechar el archivo de base de datos local que viene incluido con el paquete Python en sí.
Esto es especialmente útil para desarrolladores que deseen aprovechar las capacidades de Policy Sentry que requieren el uso de la base de datos IAM (como consultar la tabla de la base de datos IAM). De esta manera, no tiene que inicializar la base de datos y puede consultarla de inmediato.
El ejemplo de código se encuentra aquí. También se muestra a continuación.
from policy_sentry.querying.actions import get_actions_for_service
def example():
actions = get_actions_for_service('cloud9') # Then you can leverage any method that requires access to the database.
for action in actions:
print(action)
if __name__ == '__main__':
example()
Los resultados se verán así:
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
Si prefiere usar Docker en lugar de instalar el script con Python, también lo admitimos. Desde la raíz del repositorio, use esto para construir la imagen Docker:
docker build -t kmcquade/policy_sentry .
Use esto para ejecutar algunos comandos básicos:
# Comandos básicos sin argumentos
docker run -i --rm kmcquade/policy_sentry:latest "--help"
docker run -i --rm kmcquade/policy_sentry:latest "query"
# Consultar la base de datos
docker run -i --rm kmcquade/policy_sentry:latest "query action-table --service all --access-level permissions-management"
El comando write-policy también admite pasar la configuración YML a través de STDIN. Si está usando el método Docker, pruébelo aquí:
# Escribir políticas pasando la configuración a través de 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"
El módulo de Terraform está publicado y mantenido aquí.