
Cloudsplaining è uno strumento di valutazione della sicurezza AWS IAM che identifica le violazioni del principio del minimo privilegio e genera un report prioritizzato per il rischio.
Per la documentazione completa, visita il progetto su ReadTheDocs.
Cloudsplaining identifica le violazioni del principio del minimo privilegio nelle policy IAM AWS e genera un report HTML di bell'aspetto. Può scansionare tutte le policy nel tuo account AWS, su più account AWS, o può scansionare un singolo file di policy.
Aiuta a identificare le azioni IAM che non sfruttano i vincoli delle risorse. Aiuta inoltre a dare priorità al processo di remediation segnalando le policy IAM che presentano i seguenti rischi per l'account AWS in questione senza restrizioni:
s3:GetObject, ssm:GetParameter, secretsmanager:GetSecretValue)Cloudsplaining identifica anche i Ruoli IAM che possono essere assunti da Servizi di Calcolo AWS (come EC2, ECS, EKS o Lambda), poiché possono presentare un rischio maggiore rispetto ai ruoli definiti dall'utente - specialmente se il servizio di calcolo AWS si trova su un'istanza direttamente o indirettamente esposta a internet. Segnalare questi ruoli è particolarmente utile per penetration tester (o aggressori) in determinati scenari. Ad esempio, se un aggressore ottiene i privilegi per eseguire ssm:SendCommand e ci sono istanze EC2 privilegiate con l'agente SSM installato, può effettivamente avere i privilegi di quelle istanze EC2. L'esecuzione remota di codice tramite AWS Systems Manager Agent era già un percorso noto di escalation/sfruttamento, ma Cloudsplaining può rendere più facile il processo di identificazione di questi casi. Vedi il report di esempio per alcuni esempi.
Puoi anche specificare un file di esclusioni personalizzato per filtrare i risultati che sono falsi positivi per vari motivi. Ad esempio, le Policy Utente sono permissive per progettazione, mentre i ruoli di Sistema sono generalmente più restrittivi. Potresti anche avere esclusioni specifiche per la strategia multi-account della tua organizzazione o per l'architettura delle applicazioni AWS.
Policy Sentry ci ha rivelato che è possibile finalmente scrivere policy IAM secondo il principio del minimo privilegio in modo scalabile. Prima del rilascio di Policy Sentry, era fin troppo facile trovare documenti di policy IAM privi di vincoli sulle risorse. Considera la policy seguente, che consente al principale IAM (un ruolo o un utente) di eseguire s3:PutObject su qualsiasi bucket S3 nell'account AWS:```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": "*"
}
]
}
Questo è male. Idealmente, l'accesso dovrebbe essere limitato in base agli ARN delle risorse, come segue:```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
Policy Sentry rende tutto molto semplice. Una volta che gli sviluppatori di Infrastructure as Code o gli amministratori AWS acquisiscono familiarità con lo strumento (che è abbastanza facile da usare), abbiamo scoperto che l'adozione inizia molto rapidamente. Tuttavia, se hai utilizzato AWS, probabilmente c'è un arretrato molto grande di policy IAM che potrebbero beneficiare di un miglioramento. Se hai centinaia di account AWS con dozzine di policy ciascuno, come possiamo blindare quegli account AWS identificando programmaticamente le policy che dovrebbero essere corrette?
Ecco perché abbiamo scritto Cloudsplaining.
Cloudsplaining identifica le violazioni del principio del minimo privilegio nelle policy IAM AWS e genera un bel report HTML. Può scansionare tutte le policy nel tuo account AWS, su più account AWS, oppure scansionare un singolo file di policy.
brew tap salesforce/cloudsplaining https://github.com/salesforce/cloudsplaining brew install cloudsplaining
#### Pip3```bash
pip3 install --user cloudsplaining
cloudsplaining dalla riga di comando lanciando cloudsplaining --help.Per abilitare il completamento Bash, inserisci questo nel tuo .bashrc:```bash
eval "$(_CLOUDSPLAINING_COMPLETE=bash_source cloudsplaining)"
Per abilitare il completamento di ZSH, metti questo nel tuo .zshrc:```bash
eval "$(_CLOUDSPLAINING_COMPLETE=zsh_source cloudsplaining)"
Puoi anche scansionare un singolo file policy per identificare i rischi invece di un intero account.```bash cloudsplaining scan-policy-file --input-file examples/policies/explicit-actions.json
L'output includerà una descrizione del finding e un elenco delle azioni IAM che non sfruttano vincoli di risorsa.
L'output sarà simile al seguente:```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
Possiamo scansionare un intero account AWS e generare report. Per farlo, utilizziamo la chiamata API AWS IAM get-account-authorization-details, che scarica un file JSON di grandi dimensioni (circa 100KB per account) contenente tutti i dettagli IAM dell'account. Include dati su utenti, gruppi, ruoli, policy gestite dal cliente e policy gestite da AWS.
È necessario disporre di credenziali AWS configurate che possano essere utilizzate dalla CLI.
È necessario disporre dei privilegi per eseguire iam:GetAccountAuthorizationDetails. La policy arn:aws:iam::aws:policy/SecurityAudit include questo, così come molte altre che consentono l'accesso in lettura al servizio IAM.
Per scaricare i dettagli di autorizzazione dell'account, assicurati di essere autenticato su AWS, quindi esegui il comando download di cloudsplaining:```bash
cloudsplaining download
* Se preferisci utilizzare il file `~/.aws/credentials` invece delle variabili d'ambiente, puoi specificare il nome del profilo:```bash
cloudsplaining download --profile myprofile
Scaricherà un file JSON nella directory corrente che contiene le informazioni di dettaglio sull'autorizzazione del tuo account.
Lo strumento Cloudsplaining non cerca di comprendere il contesto dietro tutto ciò che è presente nel tuo account AWS. È possibile comprendere il contesto dietro alcune di queste cose a livello programmatico - se la policy è applicata a un profilo di istanza, se la policy è allegata, se le policy IAM inline sono in uso, e se le policy gestite da AWS sono in uso. Solo tu conosci il contesto dietro la progettazione della tua infrastruttura AWS e la strategia IAM.
Pertanto, è importante eliminare i falsi positivi che dipendono dal contesto. Puoi farlo con un file delle esclusioni. Abbiamo incluso un comando che genererà un file delle esclusioni per te in modo che tu non debba ricordare il formato richiesto.
Puoi creare un template di esclusioni tramite il seguente comando:
cloudsplaining create-exclusions-file
``````bash
cloudsplaining create-exclusions-file
Questo genererà un file nella directory corrente intitolato exclusions.yml.
Ora, quando esegui il comando scan, puoi utilizzare il file delle esclusioni in questo modo:```bash
cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
Per maggiori informazioni sulla struttura del file di esclusioni, consulta [Filtrare i falsi positivi](#filtering-false-positives)
#### Scansione del file dei dettagli di autorizzazione
Ora che abbiamo scaricato il file di autorizzazione dell'account, possiamo scansionare *tutte* le policy AWS IAM con `cloudsplaining`.
Esegui il seguente comando:```bash
cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
Creerà un report HTML come questo:
Creerà anche un file di dati JSON grezzo:
default-iam-results.json: Questo contiene l'output JSON grezzo del report. Puoi utilizzare questo file di dati per operare sui risultati della scansione per vari scopi. Ad esempio, potresti scrivere uno script Python che analizzi questi dati e apra automaticamente ticket JIRA o Work Items di Salesforce. Un esempio di voce è mostrato sotto. L'esempio completo può essere visualizzato su 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"
]
}
]
}Vedi la cartella [examples/files](https://github.com/salesforce/cloudsplaining/blob/master/examples/files) per un output di esempio.
#### Filtrare i falsi positivi
I vincoli delle risorse sono una best practice - specialmente per i ruoli di sistema/profili di istanza - ma a volte sono intenzionali. Ad esempio, considera una situazione in cui una policy IAM personalizzata viene utilizzata su un profilo di istanza per un'istanza EC2 che esegue il provisioning di Terraform. *In questo caso, le autorizzazioni estese sono requisiti di progettazione* - quindi non vogliamo includerli nei risultati.
Puoi creare un template di esclusioni tramite il seguente comando:```bash
cloudsplaining create-exclusions-file
Questo genererà un file nella directory corrente intitolato exclusions.yml.
Il file di esclusioni predefinito ha il seguente aspetto:```yaml
policies:
roles:
include-actions:
exclude-actions:
* Fai tutte le aggiunte o modifiche che desideri.
* Sotto `policies`, elenca il percorso dei nomi delle policy che vuoi escludere.
* Se vuoi escludere un ruolo intitolato `MyRole`, elenca `MyRole` o `MyR*` nella lista `roles`.
* Puoi seguire lo stesso approccio per le liste `users` e `groups`.
Ora quando esegui il comando `scan`, puoi usare il file di esclusioni in questo modo:```bash
cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
Se il tuo utente IAM o ruolo IAM ha autorizzazioni sts:AssumeRole su un ruolo IAM comune in più account AWS, puoi utilizzare il comando scan-multi-account.
Questo diagramma illustra come funziona il processo:

Nota: Se sei nuovo alla configurazione dell'accesso tra account, consulta il tutorial ufficiale AWS sulla delega dell'accesso tra account AWS utilizzando i ruoli IAM. Questo può aiutarti a configurare l'architettura sopra descritta.
* Questo genererà un file chiamato `multi-account-config.yml` con il seguente contenuto:```yaml
accounts:
default_account: 123456789012
prod: 123456789013
test: 123456789014
Nota: osserva come il formato del file sopra include
account_name: accountID. Modifica il contenuto del file in base al nome dell'account e all'ID dell'account desiderati. Includi quanti ID account desideri.
Per il passaggio successivo, supponiamo che:
CommonSecurityRole.scanning-user.sts:AssumeRole per assumere il CommonSecurityRole in tutti gli account di destinazione specificati nel file YAML creato in precedenza.my-results-bucketUtilizzando i dati sopra, puoi eseguire il seguente comando:```bash
cloudsplaining scan-multi-account
-c multi-account-config.yml
--profile scanning-user
--role-name CommonSecurityRole \
--output-bucket my-results-bucket
> Nota che se esegui quanto sopra senza il flag `--profile`, verrà eseguito secondo il [ordine di precedenza delle credenziali AWS](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default) standard (cioè variabili d'ambiente, profili di credenziali, credenziali del container ECS e infine credenziali del profilo dell'istanza EC2).
## Personalizzazione delle Guide e degli Allegati
Cloudsplaining supporta la personalizzazione delle sezioni Guide e Allegati del report HTML per includere raccomandazioni di sicurezza e documentazione specifiche dell'organizzazione.
### Come Funziona
Posiziona i file HTML nella directory principale del progetto:
- `custom-guidance.html` - Contenuto personalizzato per la guida di sicurezza
- `custom-appendices.html` - Contenuto personalizzato per gli allegati
### Comportamento
- **I file non esistono**: Vengono mostrati i consigli di sicurezza predefiniti di AWS
- **I file esistono con contenuto**: Viene mostrato il tuo contenuto HTML personalizzato
- **I file esistono ma sono vuoti**: Le schede vengono nascoste completamente
- **Configurazione mista**: Ogni scheda funziona in modo indipendente
### Esempio di Utilizzo```bash
# Create custom guidance
echo '<h1>Company Security Guidelines</h1>
<p>Follow these organization-specific steps:</p>
<ul>
<li>Review with security team</li>
<li>Document in JIRA ticket</li>
<li>Get approval before remediation</li>
</ul>' > custom-guidance.html
# Create custom appendices
echo '<h1>Internal Resources</h1>
<p>Additional company resources:</p>
<ul>
<li><a href="https://internal.company.com/security">Security Portal</a></li>
<li><a href="https://wiki.company.com/iam">IAM Best Practices</a></li>
</ul>' > custom-appendices.html
cloudsplaining scan --input-file account-data.json --output reports/
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
**Eseguirà la scansione di tutti i criteri per impostazione predefinita?**
No, eseguirà la scansione solo dei criteri associati ai principali IAM.
**Il comando di download scaricherà tutte le versioni dei criteri?**
Non per impostazione predefinita. Se desideri farlo, specifica il flag `--include-non-default-policy-versions`. Nota che lo strumento `scan` attualmente non opera sulle versioni non predefinite.
**Ho seguito le istruzioni di installazione ma non riesco affatto a eseguire il programma tramite riga di comando. Cosa devo fare?**
Probabilmente è un problema con il tuo PATH. La variabile d'ambiente PATH non sta considerando i pacchetti binari installati da `pip3`. Su un Mac, puoi probabilmente risolvere inserendo il comando qui sotto, a seconda delle versioni che hai installato. YMMV.```bash
export PATH=$HOME/Library/Python/3.7/bin/:$PATH
Ho seguito le istruzioni di installazione, ma ricevo un ModuleNotFoundError che dice No module named policy_sentry.analysis.expand. Cosa dovrei fare?
Prova ad aggiornare all'ultima versione di Cloudsplaining. Questo errore è stato corretto nella versione 0.0.10.