Non appena inizi a lavorare con più di un progetto o organizzazione nel cloud AWS, la prima domanda che potresti avere è come gestire le credenziali awscli e usarle in modo semplice e sicuro per ottenere accesso a tutti i tuoi account e ambienti AWS. Questo articolo tratterà aws-vault, uno strumento per archiviare e accedere in modo sicuro alle credenziali AWS in un ambiente di sviluppo.
Il problema
Non sono sempre stato un grande fan di ~/.aws/credentials
file, perché ogni volta che andavo da un nuovo cliente, dovevo aprire questo file per la modifica per aggiungere nuove credenziali. Di conseguenza, ho sempre avuto la sensazione di mostrare tutte le mie credenziali esistenti a tutte le telecamere di sicurezza dell'ufficio. Dio, benedica l'inventore degli schermi per la privacy!
Il secondo problema con le credenziali è che devono essere rinnovate di tanto in tanto. Più account hai, maggiore è lo sforzo che dedichi alla rotazione delle credenziali.
E il terzo problema:assumere ruoli in sessioni terminali e lavorare in diversi ambienti contemporaneamente.
Soluzione
Come soluzione ai primi due problemi, non molto tempo fa, ho iniziato ad utilizzare:
- aws-vault – Gestore delle credenziali AWS.
Come soluzione per gli ultimi due problemi, ho scoperto che il seguente stack di strumenti soddisfa la maggior parte delle mie esigenze:
- zsh e oh-my-zsh – terminale.
- zsh-aws-vault – Evidenziazione dell'ambiente AWS per la sessione del terminale.
Gestione delle credenziali AWS
Ecco una rapida guida introduttiva.
Installazione
Presumo che tu abbia già zsh
e oh-my-zsh
installato. 😎
Installiamo aws-vault
. Ecco l'elenco completo dei passaggi di installazione per la maggior parte delle piattaforme disponibili.
Faremo tutto per OS X (macOS):
brew cask install aws-vault
Scelta del backend aws-vault
aws-vault supporta diversi backend per memorizzare le tue credenziali. La mia preferenza è usare un file crittografato. Quindi, devi aggiungere la seguente variabile al tuo ~/.zshrc
:
export AWS_VAULT_BACKEND="file"
Spostamento delle credenziali in aws-vault
Ora apri il tuo ~/.aws/credentials
file. Per ogni profilo esistente, aggiungi le credenziali a aws-vault
.
cat ~/.aws/credentials
aws-vault add profile_1
aws-vault add profile_2
Ora, aws-vault ha AWS_VAULT_FILE_PASSPHRASE
variabile, che può essere utilizzata per interrompere aws-vault dal chiedere più e più volte la password del tuo vault. Ci sono due modi per usarlo:
Modo non sicuro
Aggiungi la seguente variabile al tuo ~/.zshrc
o ~/.bashrc
file, per impedire aws-vault dal chiedere la tua password ogni volta:
export AWS_VAULT_FILE_PASSPHRASE="my_strong_password"
Modo sicuro
Invece di memorizzare AWS_VAULT_FILE_PASSPHRASE
variabile in .*rc
file, puoi creare AWS Systems Manager Parameter Store SecureString
parametro, che contiene il tuo aws-vault
password:
aws ssm put-parameter \
--name '/laptop/aws-vault/password' \
--description 'aws-vault password on my laptop' \
--value 'my_super_secret_password' \
--type SecureString

Creiamo uno script wrapper, che chiamerà aws-vault call aws-vault e imposterà AWS_VAULT_FILE_PASSPHRASE
con un valore necessario da AWS Systems Manager Parameter Store:
mkdir -p $HOME/bin
cat > $HOME/bin/call-aws-vault.sh <<- EOF
#!/usr/bin/env bash
export PROFILE=$1
export AWS_VAULT_FILE_PASSPHRASE=$(aws ssm get-parameters --profile default --names '/laptop/aws-vault/password' --with-decryption --query 'Parameters[0].Value' --output text)
aws-vault exec -j $PROFILE
EOF
chmod +x $HOME/bin/call-aws-vault.sh
Ora puoi utilizzare questo wrapper in ~/.aws/config
così:
[profile my_new_profile]
credential_process = ~/bin/call-aws-vault.sh my_new_profile
Puoi rinominare ~/.aws/credentials e in seguito eliminalo completamente non appena esegui il test.
Cambiare i profili AWS
Per elencare tutti i tuoi profili AWS, digita:
aws-vault list
Ottimo, ora puoi cambiare facilmente ambiente e vedere dove stai lavorando:
aws-vault exec --duration 8h default
Ecco come appare finalmente:

Approccio basato sui ruoli
Bene, ok, abbiamo appena spostato tutte le nostre credenziali AWS in un deposito sicuro e configurato il nostro terminale per visualizzare il nostro attuale aws-vault sessione. Ora è il momento di discutere di come possiamo migliorare ulteriormente la soluzione.
Organizzazione con più account
Una delle migliori pratiche per organizzare l'accesso degli utenti AWS a diversi account AWS:gestire tutti gli utenti IAM in un account AWS e fornire l'accesso ad altri account AWS consentendo loro di utilizzare ruoli (sts:AssumeRole
chiamata API) da quegli account.
Ecco il tipico esempio di organizzazione AWS:

AWS ha fornito un'ottima spiegazione di Come utilizzare un singolo utente IAM per accedere facilmente a tutti i tuoi account utilizzando l'AWS CLI nel post del blog, descrivendo il processo di utilizzo del ruolo e la configurazione di awscli. Non li copierò e incollerò. Invece, ci concentreremo sul aws-vault configurazione per fare qualcosa di simile, ma senza ~/.aws/credentials file.
Supponendo che tu abbia già tutte le sovvenzioni e le autorizzazioni necessarie tra i tuoi account. In caso contrario, ecco l'ottimo articolo sull'argomento: Tutorial:delega l'accesso agli account AWS utilizzando i ruoli IAM.
Configurazione profilo predefinita
Dovresti già avere il tuo predefinito configurazione del profilo in atto nel file. Probabilmente, assomiglia a questo:
[profile default]
region = us-east-1
Configuriamo aws-vault come fonte di credenziali per il nostro profilo predefinito:
[profile default]
region = us-east-1
credential_process = /usr/local/bin/aws-vault exec -j default
Ora, se concedi le autorizzazioni al tuo utente o ruolo da impostazione predefinita profile per assumere il ruolo AWS da un altro account, sarai in grado di specificare la nuova configurazione dei profili come questa:
[profile default]
region = us-east-1
credential_process = /usr/local/bin/aws-vault exec -j default
mfa_serial = arn:aws:iam:::mfa/admin
[profile default]
region = us-east-1
credential_process = /usr/local/bin/aws-vault exec -j default
mfa_serial = arn:aws:iam:::mfa/admin
[profile account_1_role_admin]
region = us-east-1
role_arn = arn:aws:iam:::role/admin
source_profile = default
[profile account_2_role_qa]
region = us-east-1
role_arn = arn:aws:iam:::role/qa
source_profile = default
profilo_sorgente l'opzione di configurazione indicherà awscli quale account utilizzare per acquisire un ruolo per un determinato profilo.

Test
Il modo più veloce per verificare che sei in grado di assumere il ruolo è chiamare:
aws sts get-caller-identify
Dovresti vedere qualcosa di simile per il tuo default
profilo:
{
"UserId": "AIDDRCTFVGBHNJMGF3WI7R",
"Account": "01234567890",
"Arn": "arn:aws:iam::01234567890:user/admin"
}
Per testare qualsiasi altra chiamata di profilo:
aws sts get-caller-identity --profile account_1_role_admin
Dovresti vedere un output simile al seguente:
{
"UserId": "AROALKJHGFGDFV3IR2VSI:botocore-session-1584897134",
"Account": "012345678901",
"Arn": "arn:aws:sts::012345678901:assumed-role/admin/botocore-session-1584897134"
}
Supponendo il ruolo dell'account AWS
Per assumere il ruolo da qualsiasi account AWS che hai nel tuo aws-vault, esegui i seguenti comandi:
aws-vault ls
aws-vault exec --duration 8h default
Qui, assumiamo un ruolo associato al profilo predefinito per 8 ore.
Bonus:accesso alla console Web AWS senza password
Come piccolo bonus per quelli di voi che sono giunti al termine, ecco come accedere alla console Web AWS per ogni dato profilo:
aws-vault ls
aws-vault login --duration 8h default
Riepilogo
Utilizzando zsh , aws-vault e AWS sts:AssumeRole
insieme possono semplificare notevolmente e rendere più sicura la gestione di più account AWS e delle relative credenziali.
Se ti piace l'articolo, per favore, sentiti libero di diffonderlo nel mondo. E, naturalmente, se hai domande, suggerimenti o commenti, sentiti libero di usare Disqus qui sotto.
Resta sintonizzato!