Cloudsplaining es una herramienta de evaluación de seguridad de AWS IAM que identifica violaciones del principio de mínimo privilegio y genera un informe priorizado por riesgo.
Cloudsplaining es una herramienta de evaluación de seguridad de AWS IAM que identifica violaciones del principio de mínimo privilegio y genera un informe HTML priorizado por riesgo.
Para la documentación completa, visite el proyecto en ReadTheDocs.
Cloudsplaining identifica violaciones del principio de mínimo privilegio en políticas IAM de AWS y genera un informe HTML atractivo. Puede escanear todas las políticas en su cuenta de AWS, en múltiples cuentas de AWS, o puede escanear un único archivo de política.
Ayuda a identificar acciones de IAM que no aprovechan las restricciones de recursos. También ayuda a priorizar el proceso de remediación al marcar las políticas IAM que presentan los siguientes riesgos para la cuenta de AWS en cuestión sin restricción:
s3:GetObject, ssm:GetParameter, secretsmanager:GetSecretValue)Cloudsplaining también identifica roles IAM que pueden ser asumidos por servicios de cómputo de AWS (como EC2, ECS, EKS o Lambda), ya que pueden presentar un mayor riesgo que los roles definidos por el usuario, especialmente si el servicio de cómputo de AWS está en una instancia que está expuesta directa o indirectamente a internet. Marcar estos roles es especialmente útil para probadores de penetración (o atacantes) en ciertos escenarios. Por ejemplo, si un atacante obtiene privilegios para ejecutar ssm:SendCommand y hay instancias EC2 privilegiadas con el agente SSM instalado, puede tener efectivamente los privilegios de esas instancias EC2. La ejecución remota de código a través del agente de AWS Systems Manager ya era una ruta de escalada/explotación conocida, pero Cloudsplaining puede facilitar el proceso de identificar estos casos. Consulte el informe de ejemplo para algunos ejemplos.
También puede especificar un archivo de exclusiones personalizado para filtrar resultados que son falsos positivos por diversas razones. Por ejemplo, las políticas de usuario son permisivas por diseño, mientras que los roles de sistema son generalmente más restrictivos. También puede tener exclusiones específicas para la estrategia multi-cuenta de su organización o la arquitectura de aplicaciones de AWS.
Policy Sentry nos reveló que es posible finalmente escribir políticas IAM siguiendo el principio de mínimo privilegio de manera escalable. Antes de que se lanzara Policy Sentry, era demasiado fácil encontrar documentos de política IAM que carecieran de restricciones de recursos. Considere la política a continuación, que permite al principal IAM (un rol o usuario) ejecutar s3:PutObject en cualquier bucket S3 en la cuenta de AWS:```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": "*"
}
]
}
Esto es malo. Idealmente, el acceso debería restringirse según los ARN de los recursos, así:```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
Policy Sentry hace que esto sea realmente fácil. Una vez que los desarrolladores de Infrastructure as Code o los administradores de AWS se familiaricen con la herramienta (que es bastante fácil de usar), hemos descubierto que la adopción comienza muy rápidamente. Sin embargo, si has estado usando AWS, probablemente haya una gran acumulación de políticas de IAM que podrían beneficiarse de una mejora. Si tienes cientos de cuentas de AWS con docenas de políticas en cada una, ¿cómo podemos asegurar esas cuentas de AWS identificando programáticamente las políticas que deberían arreglarse?
Por eso escribimos Cloudsplaining.
Cloudsplaining identifica violaciones del principio de mínimo privilegio en políticas de IAM de AWS y genera un bonito informe HTML. Puede escanear todas las políticas en tu cuenta de AWS, a través de múltiples cuentas de AWS, o puede escanear un único archivo de política.
brew tap salesforce/cloudsplaining https://github.com/salesforce/cloudsplaining brew install cloudsplaining
#### Pip3```bash
pip3 install --user cloudsplaining
cloudsplaining desde la línea de comandos ejecutando cloudsplaining --help.Para habilitar el completado de Bash, pon esto en tu .bashrc:```bash
eval "$(_CLOUDSPLAINING_COMPLETE=bash_source cloudsplaining)"
Para habilitar el autocompletado de ZSH, coloca esto en tu .zshrc:```bash
eval "$(_CLOUDSPLAINING_COMPLETE=zsh_source cloudsplaining)"
También puedes escanear un único archivo de política para identificar riesgos en lugar de una cuenta completa.```bash cloudsplaining scan-policy-file --input-file examples/policies/explicit-actions.json
El resultado incluirá una descripción del hallazgo y una lista de las acciones de IAM que no aprovechan las restricciones de recursos.
El resultado se parecerá a lo siguiente:```console
Issue found: Data Exfiltration
Actions: s3:GetObject
Issue found: Resource Exposure
Actions: ecr:DeleteRepositoryPolicy, ecr:SetRepositoryPolicy, s3:BypassGovernanceRetention, s3:DeleteAccessPointPolicy, s3:DeleteBucketPolicy, s3:ObjectOwnerOverrideToBucketOwner, s3:PutAccessPointPolicy, s3:PutAccountPublicAccessBlock, s3:PutBucketAcl, s3:PutBucketPolicy, s3:PutBucketPublicAccessBlock, s3:PutObjectAcl, s3:PutObjectVersionAcl
Issue found: Unrestricted Infrastructure Modification
Actions: ecr:BatchDeleteImage, ecr:CompleteLayerUpload, ecr:CreateRepository, ecr:DeleteLifecyclePolicy, ecr:DeleteRepository, ecr:DeleteRepositoryPolicy, ecr:InitiateLayerUpload, ecr:PutImage, ecr:PutImageScanningConfiguration, ecr:PutImageTagMutability, ecr:PutLifecyclePolicy, ecr:SetRepositoryPolicy, ecr:StartImageScan, ecr:StartLifecyclePolicyPreview, ecr:TagResource, ecr:UntagResource, ecr:UploadLayerPart, s3:AbortMultipartUpload, s3:BypassGovernanceRetention, s3:CreateAccessPoint, s3:CreateBucket, s3:DeleteAccessPoint, s3:DeleteAccessPointPolicy, s3:DeleteBucket, s3:DeleteBucketPolicy, s3:DeleteBucketWebsite, s3:DeleteObject, s3:DeleteObjectTagging, s3:DeleteObjectVersion, s3:DeleteObjectVersionTagging, s3:GetObject, s3:ObjectOwnerOverrideToBucketOwner, s3:PutAccelerateConfiguration, s3:PutAccessPointPolicy, s3:PutAnalyticsConfiguration, s3:PutBucketAcl, s3:PutBucketCORS, s3:PutBucketLogging, s3:PutBucketNotification, s3:PutBucketObjectLockConfiguration, s3:PutBucketPolicy, s3:PutBucketPublicAccessBlock, s3:PutBucketRequestPayment, s3:PutBucketTagging, s3:PutBucketVersioning, s3:PutBucketWebsite, s3:PutEncryptionConfiguration, s3:PutInventoryConfiguration, s3:PutLifecycleConfiguration, s3:PutMetricsConfiguration, s3:PutObject, s3:PutObjectAcl, s3:PutObjectLegalHold, s3:PutObjectRetention, s3:PutObjectTagging, s3:PutObjectVersionAcl, s3:PutObjectVersionTagging, s3:PutReplicationConfiguration, s3:ReplicateDelete, s3:ReplicateObject, s3:ReplicateTags, s3:RestoreObject, s3:UpdateJobPriority, s3:UpdateJobStatus
Podemos escanear una cuenta completa de AWS y generar informes. Para ello, aprovechamos la llamada a la API get-account-authorization-details de AWS IAM, que descarga un gran archivo JSON (alrededor de 100KB por cuenta) que contiene todos los detalles de IAM de la cuenta. Esto incluye datos sobre usuarios, grupos, roles, políticas administradas por el cliente y políticas administradas por AWS.
Debe tener credenciales de AWS configuradas que puedan ser utilizadas por la CLI.
Debe tener los privilegios para ejecutar iam:GetAccountAuthorizationDetails. La política arn:aws:iam::aws:policy/SecurityAudit incluye esto, al igual que muchas otras que permiten acceso de lectura al servicio IAM.
Para descargar los detalles de autorización de la cuenta, asegúrese de estar autenticado en AWS, luego ejecute el comando download de cloudsplaining:```bash
cloudsplaining download
* Si prefieres usar tu archivo `~/.aws/credentials` en lugar de las variables de entorno, puedes especificar el nombre del perfil:```bash
cloudsplaining download --profile myprofile
Descargará un archivo JSON en su directorio actual que contiene la información detallada de autorización de su cuenta.
La herramienta Cloudsplaining no intenta comprender el contexto detrás de todo en su cuenta de AWS. Es posible comprender el contexto detrás de algunas de estas cosas mediante programación: si la política se aplica a un perfil de instancia, si la política está adjunta, si se están utilizando políticas IAM en línea y si se utilizan Políticas administradas de AWS. Solo usted conoce el contexto detrás del diseño de su infraestructura de AWS y la estrategia IAM.
Por lo tanto, es importante eliminar los falsos positivos que dependen del contexto. Puede hacerlo con un archivo de exclusiones. Hemos incluido un comando que generará un archivo de exclusiones para que no tenga que recordar el formato requerido.
Puede crear una plantilla de exclusiones mediante el siguiente comando:
cloudsplaining create-exclusions-file```bash cloudsplaining create-exclusions-file
Esto generará un archivo en su directorio actual llamado `exclusions.yml`.
Ahora, cuando ejecute el comando `scan`, puede usar el archivo de exclusiones así:```bash
cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
Ahora que hemos descargado el archivo de autorización de la cuenta, podemos escanear todas las políticas de AWS IAM con cloudsplaining.
Ejecute el siguiente comando:```bash cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
Creará un informe HTML como [este](https://opensource.salesforce.com/cloudsplaining/):
> 
También creará un archivo de datos JSON sin procesar:
* `default-iam-results.json`: Este contiene la salida JSON sin procesar del informe. Puede usar este archivo de datos para operar sobre los resultados del escaneo para diversos propósitos. Por ejemplo, podría escribir un script de Python que analice estos datos y abra automáticamente problemas de JIRA o Work Items de Salesforce. A continuación se muestra un ejemplo de entrada. El ejemplo completo se puede ver en [examples/files/iam-results-example.json](https://github.com/salesforce/cloudsplaining/blob/master/examples/files/iam-results-example.json)```json
{
"example-authz-details": [
{
"AccountID": "012345678901",
"ManagedBy": "Customer",
"PolicyName": "InsecureUserPolicy",
"Arn": "arn:aws:iam::012345678901:user/userwithlotsofpermissions",
"ActionsCount": 2,
"ServicesCount": 1,
"Actions": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Services": [
"s3"
]
}
]
}
See the examples/files folder for sample output.
Las restricciones de recursos son una buena práctica, especialmente para roles de sistema/perfiles de instancia, pero a veces están diseñados así. Por ejemplo, considera una situación en la que se utiliza una política IAM personalizada en un perfil de instancia para una instancia EC2 que aprovisiona Terraform. En este caso, los permisos amplios son requisitos de diseño, por lo que no queremos incluirlos en los resultados.
Puedes crear una plantilla de exclusiones mediante el siguiente comando:```bash cloudsplaining create-exclusions-file
Esto generará un archivo en tu directorio actual titulado `exclusions.yml`.
El archivo de exclusiones predeterminado se ve así:```yaml
# Policy names to exclude from evaluation
# Suggestion: Add policies here that are known to be overly permissive by design, after you run the initial report.
policies:
- "AWSServiceRoleFor*"
- "*ServiceRolePolicy"
- "*ServiceLinkedRolePolicy"
- "AdministratorAccess" # Otherwise, this will take a long time
- "service-role*"
- "aws-service-role*"
# Don't evaluate these roles, users, or groups as part of the evaluation
roles:
- "service-role*"
- "aws-service-role*"
users:
- ""
groups:
- ""
# Read-only actions to include in the results, such as s3:GetObject
# By default, it includes Actions that could lead to Data Exfiltration
include-actions:
- "s3:GetObject"
- "ssm:GetParameter"
- "ssm:GetParameters"
- "ssm:GetParametersByPath"
- "secretsmanager:GetSecretValue"
# Write actions to include from the results, such as kms:Decrypt
exclude-actions:
- ""
policies, liste la ruta de los nombres de políticas que desea excluir.MyRole, liste MyRole o MyR* en la lista de roles.users y groups.Ahora, cuando ejecute el comando scan, puede usar el archivo de exclusiones de la siguiente manera:```bash
cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
### Escaneo de Múltiples Cuentas de AWS
Si tu usuario IAM o rol IAM tiene permisos `sts:AssumeRole` para un rol IAM común en múltiples cuentas de AWS, puedes usar el comando `scan-multi-account`.
Este diagrama muestra cómo funciona el proceso:

> Nota: Si eres nuevo en la configuración de acceso entre cuentas, consulta [el tutorial oficial de AWS sobre delegación de acceso entre cuentas de AWS usando roles IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html). Eso puede ayudarte a configurar la arquitectura anterior.
* Primero, necesitarás crear el archivo de configuración para múltiples cuentas. Ejecuta el siguiente comando:```bash
cloudsplaining create-multi-account-config-file \
-o multi-account-config.yml
multi-account-config.yml con el siguiente contenido:```yaml
accounts:
default_account: 123456789012
prod: 123456789013
test: 123456789014> Nota: Observe cómo el formato del archivo anterior incluye `account_name: accountID`. Edite el contenido del archivo para que coincida con el nombre de cuenta y el ID de cuenta deseados. Incluya tantos ID de cuenta como desee.
Para el siguiente paso, digamos que:
* Tenemos un rol en las cuentas de destino que se llama `CommonSecurityRole`.
* Las credenciales de su usuario IAM están bajo el perfil de credenciales de AWS llamado `scanning-user`.
* Ese usuario tiene permisos `sts:AssumeRole` para asumir el `CommonSecurityRole` en todas sus cuentas de destino especificadas en el archivo YAML que creamos anteriormente.
* Desea guardar la salida en un bucket de S3 llamado `my-results-bucket`
Usando los datos anteriores, puede ejecutar el siguiente comando:```bash
cloudsplaining scan-multi-account \
-c multi-account-config.yml \
--profile scanning-user \
--role-name CommonSecurityRole \
--output-bucket my-results-bucket
Tenga en cuenta que si ejecuta lo anterior sin la bandera
--profile, se ejecutará en el orden de precedencia de credenciales de AWS estándar (es decir, variables de entorno, perfiles de credenciales, credenciales de contenedor ECS y finalmente credenciales de perfil de instancia EC2).
Cloudsplaining admite la personalización de las secciones de Guía y Apéndices del informe HTML para incluir recomendaciones de seguridad y documentación específicas de la organización.
Coloque archivos HTML en el directorio raíz de su proyecto:
custom-guidance.html - Contenido de guía de seguridad personalizadacustom-appendices.html - Contenido de apéndices personalizadosecho '
Follow these organization-specific steps:
echo '
Additional company resources:
cloudsplaining download
cloudsplaining download --profile someprofile
cloudsplaining scan --input-file default.json
cloudsplaining scan --input-file default.json --exclusions-file exclusions.yml
cloudsplaining scan-policy-file --input-file examples/policies/wildcards.json cloudsplaining scan-policy-file --input-file examples/policies/wildcards.json --exclusions-file examples/example-exclusions.yml
cloudsplaining create-multi-account-config-file -o accounts.yml cloudsplaining scan-multi-account -c accounts.yml -r TargetRole --output-directory ./
## FAQ
**¿Escaneará todas las políticas por defecto?**
No, solo escaneará las políticas que están adjuntas a entidades IAM.
**¿El comando de descarga descargará todas las versiones de las políticas?**
No por defecto. Si desea hacerlo, especifique la bandera `--include-non-default-policy-versions`. Tenga en cuenta que la herramienta `scan` actualmente no opera sobre versiones no predeterminadas.
**Seguí las instrucciones de instalación pero no puedo ejecutar el programa desde la línea de comandos en absoluto. ¿Qué hago?**
Este es probablemente un problema con tu PATH. Tu variable de entorno PATH no está considerando los paquetes binarios instalados por `pip3`. En una Mac, puedes solucionarlo ingresando el comando a continuación, dependiendo de las versiones que tengas instaladas. YMMV.```bash
export PATH=$HOME/Library/Python/3.7/bin/:$PATH
Seguí las instrucciones de instalación, pero recibo un ModuleNotFoundError que dice No module named policy_sentry.analysis.expand. ¿Qué debo hacer?
Intenta actualizar a la última versión de Cloudsplaining. Este error se corrigió en la versión 0.0.10.