Introduzione
Il 22 febbraio 2024 Amazon Web Services (AWS) ha annunciato la possibilità di condividere i parametri di Systems Manager Parameter Store tra più account.
Si tratta di una novità per Parameter Store, mentre AWS Secrets Manager ha sempre supportato i segreti cross-account. Ora che anche i parametri di Parameter Store si possono condividere, conviene preferirlo a Secrets Manager per archiviare e condividere segreti?
In questo articolo analizziamo le differenze tra Secrets Manager e Parameter Store e illustriamo i passaggi per creare e condividere un parametro segreto tra account AWS.
Secrets Manager vs. parametri cifrati
Funzionalità e limiti di Secrets Manager
- I segreti vengono cifrati automaticamente con chiavi KMS
- I segreti possono essere ruotati automaticamente
- Dimensione massima del segreto: 64KB
- I segreti si possono creare dalla console di gestione web, dalla CLI, con CloudFormation, Terraform, ecc.
- I segreti possono essere replicati automaticamente tra le region
- Supporta fino a 10.000 richieste
GetSecretValueal secondo - Accessibile da un ampio insieme di servizi AWS e da servizi di terze parti come Hashicorp Vault
- Costi: 0,40 $ per segreto al mese; 0,05 $ ogni 10.000 chiamate API
- I segreti si possono condividere modificandone la resource policy
Funzionalità e limiti di Parameter Store
- I parametri possono essere cifrati con chiavi KMS quando si utilizza il tipo
SecureString - La rotazione automatica non è supportata
- Dimensione massima del parametro avanzato: 8KB
- I parametri
SecureStringnon possono essere creati con CloudFormation, ma si possono creare dalla console di gestione web, dalla CLI, con Terraform, ecc. - I parametri sono regionali e non prevedono replica automatica
- Supporta fino a 10.000 richieste
GetParameteral secondo (40 di default) - Accessibile da un elenco più ridotto di servizi AWS
- Costi: 0,05 $ per parametro condiviso al mese; 0,05 $ ogni 10.000 chiamate API
- I parametri si possono condividere tramite Resource Access Manager (RAM)
Sia Secrets Manager sia Parameter Store si integrano inoltre con doitintl/secrets-init, uno strumento open source che semplifica l'integrazione dei servizi di Secrets Management con i workloads in esecuzione su cluster Kubernetes. Abbiamo dedicato all'argomento un articolo di approfondimento.
Quale scegliere?
Secrets Manager rimane il primo servizio da prendere in considerazione per archiviare i segreti. È stato progettato fin dall'inizio per questo scopo, è supportato da un'ampia gamma di servizi e offre funzionalità come la rotazione automatica e una dimensione del segreto superiore rispetto ai parametri di Parameter Store.
Parameter Store può comunque essere una valida alternativa per condividere segreti se:
- si gestisce un numero molto elevato di segreti e il risparmio sui costi diventa significativo (0,05 $ contro 0,40 $ per segreto al mese);
- si dispone già di parametri segreti in Parameter Store e non servono le funzionalità aggiuntive di Secrets Manager.
Creare e condividere un parametro segreto cifrato
La documentazione di Parameter Store contiene una guida passo passo alla creazione e condivisione di un parametro. Creare e condividere un parametro SecureString è un processo analogo, con la differenza che occorre condividere anche la chiave KMS usata per cifrare il parametro.
1. Creare una chiave in KMS
Per prima cosa, creare in AWS una chiave KMS simmetrica da utilizzare per cifrare il parametro. La documentazione completa è disponibile sul sito AWS.

Screenshot del processo di creazione della chiave KMS. La creazione di un alias è facoltativa ma consigliata.
Nella policy della chiave, inserire una condizione che ne consenta l'uso agli altri account. Per condividere chiave e parametro all'interno dell'intera AWS Organization, si può sfruttare una Condition nella policy come spiegato in questo articolo di AWS re:Post.

Screenshot della schermata finale di revisione del processo di creazione della chiave KMS
2. Creare un parametro Advanced in Parameter Store
Una volta creata la chiave KMS, creare il parametro in Parameter Store come descritto nella documentazione AWS.
Selezionare il tier Advanced, il tipo SecureString e la chiave KMS creata in precedenza.

Si possono archiviare solo parametri Advanced! Se per errore si seleziona un parametro standard, nessun problema: lo si può modificare in seguito.
3. Condividere il parametro tramite Resource Access Manager (RAM)
Una volta creato il parametro, aprire Resource Access Manager e creare un nuovo Resource Share per il parametro come descritto nella documentazione AWS.
Nello step Associate managed permissions utilizzare la policy AWSRAMDefaultPermissionsSSMParameterReadOnly e, nello step Grant access to principals, indicare gli account a cui consentire l'accesso al parametro (oppure l'intera AWS Organization, se si preferisce).

Si tenga presente che i tag associati al resource share non modificano i tag del parametro

Il permesso AWSRAMDefaultPermissionsSSMParameterReadOnly è sufficiente quando serve un accesso in sola lettura

In questo esempio, solo l'account ID 123456789012 avrà accesso al parametro condiviso. Non aggiungere l'account in cui il parametro è già presente.

L'ultimo step è semplicemente una schermata di revisione
4. Accettare il resource share
Una volta creato il resource share, gli account esterni potrebbero dover accettare l'invito.
Se gli account in condivisione fanno parte della propria AWS Organization e la condivisione delle risorse all'interno dell'organizzazione è abilitata, l'accettazione avviene in automatico.
Per gli account esterni all'organizzazione, o se la condivisione delle risorse all'interno dell'organizzazione non è abilitata, il resource share dovrà essere accettato da ogni singolo account.
5. Verificare l'accesso al parametro condiviso
Creato e condiviso correttamente il parametro, è arrivato il momento di metterlo alla prova.
Un modo rapido per verificare l'accesso al parametro da un account esterno è ricorrere alla AWS CLI (da un terminale locale o tramite AWS CloudShell):
aws ssm get-parameter --name <ARN completo del parametro> --with-decryption
Di seguito un esempio di output con il valore decifrato del parametro:

Per non visualizzare il valore del parametro segreto, è sufficiente omettere il flag with-decryption
Riferimenti
- https://github.com/doitintl/secrets-init
- https://www.doit.com/kubernetes-and-secrets-management-in-cloud/
- https://aws.amazon.com/about-aws/whats-new/2024/02/aws-systems-manager-parameter-store-cross-account-sharing/
- https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html
- https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_limits.html
- https://docs.aws.amazon.com/secretsmanager/latest/userguide/integrating.html
- https://developer.hashicorp.com/hcp/docs/vault-secrets/integrations/aws-secrets-manager
- https://aws.amazon.com/secrets-manager/pricing/
- https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_examples_cross.html
- https://docs.aws.amazon.com/general/latest/gr/ssm.html
- https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_PutParameter.html#systemsmanager-PutParameter-request-Type
- https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html
- https://aws.amazon.com/systems-manager/pricing/#Parameter_Store
- https://docs.aws.amazon.com/ram/latest/userguide/shareable.html
- https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-shared-parameters.html
- https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk
- https://repost.aws/knowledge-center/kms-key-organization-account
- https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-create-console.html
- https://docs.aws.amazon.com/ram/latest/userguide/working-with-sharing-create.html
- https://docs.aws.amazon.com/ram/latest/userguide/getting-started-sharing.html#getting-started-sharing-orgs
- https://docs.aws.amazon.com/ram/latest/userguide/working-with-shared-invitations.html
- https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html
- https://gist.github.com/enigmango/0e2332bfc0b3cbbf234a7c5968020eaf
La possibilità di condividere i parametri di Parameter Store è un'aggiunta molto utile, soprattutto per distribuire parametri non segreti da un account centrale all'interno di un'AWS Organization. Per la gestione dei segreti, però, Secrets Manager resta la prima scelta.
Esempio di codice
Vuole provarlo con un approccio Infrastructure-as-Code? Questo gist su GitHub contiene un esempio di codice Terraform per creare un parametro cifrato condiviso all'interno della propria AWS Organization.
Maggiori informazioni
In DoiT International mettiamo a disposizione competenza e supporto su Secrets Manager, Parameter Store e altri servizi cloud. Per scoprire di più sulla consulenza DoiT, visiti https://www.doit.com/services/.