Introducción
El 22 de febrero de 2024, Amazon Web Services (AWS) anunció la posibilidad de compartir parámetros de Systems Manager Parameter Store entre cuentas.
Es una funcionalidad nueva en Parameter Store, pero AWS Secrets Manager siempre soportó secretos entre cuentas. Ahora que los parámetros de Parameter Store también pueden compartirse, ¿conviene usar Parameter Store en lugar de Secrets Manager para almacenar y compartir secretos?
En este artículo se repasan las diferencias entre Secrets Manager y Parameter Store y se detallan los pasos para crear y compartir un parámetro secreto entre cuentas de AWS.
Secrets Manager vs. parámetros cifrados
Características y limitaciones de Secrets Manager
- Los secretos se cifran automáticamente con claves KMS
- Los secretos pueden rotarse de forma automática
- Tamaño máximo del secreto: 64 KB
- Los secretos se pueden crear desde la consola web de administración, la CLI, CloudFormation, Terraform, etc.
- Los secretos pueden replicarse automáticamente entre regiones
- Soporta hasta 10.000 solicitudes
GetSecretValuepor segundo - Accesible desde un amplio conjunto de servicios de AWS y desde servicios de terceros como Hashicorp Vault
- Precios: USD 0,40 por secreto al mes; USD 0,05 por cada 10.000 llamadas a la API
- Los secretos se comparten modificando la política de recursos del propio secreto
Características y limitaciones de Parameter Store
- Los parámetros se pueden cifrar con claves KMS al usar el tipo
SecureString - No soporta rotación automática
- Tamaño máximo del parámetro avanzado: 8 KB
- Los parámetros
SecureStringno se pueden crear con CloudFormation, pero sí desde la consola web, la CLI, Terraform, etc. - Los parámetros son regionales y no se replican automáticamente
- Soporta hasta 10.000 solicitudes
GetParameterpor segundo (40 por defecto) - Accesible desde una lista más reducida de servicios de AWS
- Precios: USD 0,05 por parámetro compartido al mes; USD 0,05 por cada 10.000 llamadas a la API
- Los parámetros se comparten mediante Resource Access Manager (RAM)
Tanto Secrets Manager como Parameter Store funcionan con doitintl/secrets-init, una herramienta de código abierto que simplifica la integración de los servicios de gestión de secretos con workloads que corren en clústeres de Kubernetes. Tenemos un artículo del blog con más información acá.
¿Cuál elegir?
Secrets Manager sigue siendo el primer servicio que deberías considerar para almacenar secretos. Fue diseñado desde el inicio con ese propósito, tiene amplio soporte entre servicios e incluye funcionalidades como la rotación automática y un tamaño de secreto mayor que el de los parámetros de Parameter Store.
Aun así, Parameter Store puede ser una alternativa para compartir secretos si:
- Manejas una cantidad enorme de secretos y el ahorro sería significativo (USD 0,05 vs. USD 0,40 por secreto al mes)
- Ya tienes parámetros secretos en Parameter Store y no necesitas las funcionalidades adicionales de Secrets Manager
Crear y compartir un parámetro secreto cifrado
La documentación de Parameter Store incluye un paso a paso para crear y compartir un parámetro. Crear y compartir un parámetro SecureString es un proceso similar, con la diferencia de que también hay que compartir la clave KMS usada para cifrarlo.
1. Crea una clave en KMS
Primero, crea una clave KMS simétrica en AWS para cifrar el parámetro. AWS documenta el proceso completo acá.

Captura del proceso de creación de la clave KMS. Crear un alias es opcional, pero recomendable.
En la política de la clave, agrega una condición que permita que las otras cuentas la usen. Si quieres compartir esta clave y el parámetro con toda tu organización de AWS, puedes incluir un Condition en la política como se explica en este artículo de AWS re:Post.

Captura de la pantalla de revisión final del proceso de creación de la clave KMS
2. Crea un parámetro Advanced en Parameter Store
Una vez creada la clave KMS, crea el parámetro en Parameter Store tal como lo documenta AWS acá.
Elige el nivel Advanced, el tipo SecureString y selecciona la clave KMS que creaste antes.

Solo se pueden almacenar parámetros Advanced. Si elegiste por error un parámetro estándar, no pasa nada: lo puedes cambiar después.
3. Comparte el parámetro con Resource Access Manager (RAM)
Una vez creado el parámetro, abre Resource Access Manager y crea un nuevo Resource Share para el parámetro, tal como lo documenta AWS acá.
Usa la política AWSRAMDefaultPermissionsSSMParameterReadOnly en el paso Associate managed permissions y especifica las cuentas que deberían tener acceso al parámetro (o toda tu organización de AWS si lo prefieres) en el paso Grant access to principals.

Ten en cuenta que las etiquetas asociadas al resource share no modifican las etiquetas del parámetro

El permiso AWSRAMDefaultPermissionsSSMParameterReadOnly alcanza si solo se necesita acceso de lectura

En este ejemplo, solo el ID de cuenta 123456789012 tendrá acceso al parámetro compartido. No agregues la cuenta donde ya existe el parámetro.

El último paso es simplemente una pantalla de revisión
4. Acepta el resource share
Una vez creado el resource share, puede que las cuentas externas tengan que aceptar la invitación.
Si las cuentas compartidas pertenecen a tu organización de AWS y el uso compartido de recursos dentro de la organización está habilitado, esto sucede automáticamente.
Para cuentas que no estén en tu organización, o si el uso compartido de recursos dentro de la organización no está habilitado, el resource share deberá aceptarse desde cada cuenta.
5. Verifica que puedes acceder al parámetro compartido
Una vez creado y compartido el parámetro, ¡toca probarlo!
Una forma rápida de probar el acceso desde una cuenta externa es usar la AWS CLI (desde una terminal local o con AWS CloudShell):
aws ssm get-parameter --name <ARN completo del parámetro> --with-decryption
A continuación, un ejemplo de la salida con el valor del parámetro descifrado:

Si prefieres no exponer el valor del parámetro secreto, puedes omitir el flag with-decryption
Referencias
- 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
Poder compartir parámetros de Parameter Store es una excelente incorporación, sobre todo cuando se trata de parámetros no secretos que se comparten desde una cuenta central hacia toda una organización de AWS. Para gestionar secretos, en cambio, Secrets Manager debería ser la primera opción.
Ejemplo de código
¿Quieres probarlo con Infrastructure-as-Code? Este gist de GitHub incluye código de ejemplo en Terraform para crear un parámetro cifrado y compartido en toda tu AWS Organization.
Más información
En DoiT International brindamos experiencia y soporte para Secrets Manager, Parameter Store y otros servicios cloud. Si quieres saber más sobre la consultoría con DoiT, visita https://www.doit.com/services/.