Agente de AWS Secrets Manager - AWS Secrets Manager

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Agente de AWS Secrets Manager

El Agente de AWS Secrets Manager es un servicio HTTP del lado del cliente que puede utilizar para estandarizar el consumo de secretos de Secrets Manager en entornos como AWS Lambda, Amazon Elastic Container Service, Amazon Elastic Kubernetes Service y Amazon Elastic Compute Cloud. El Agente de Secrets Manager puede recuperar y almacenar en caché los secretos de la memoria para que sus aplicaciones puedan consumirlos directamente desde el caché. Esto significa que puede obtener los secretos que su aplicación necesita del servidor local en lugar de tener que realizar llamadas a Secrets Manager. El Agente de Secrets Manager solo puede realizar solicitudes de lectura a Secrets Manager, no puede modificar secretos.

El Agente de Secrets Manager utiliza las credenciales de AWS que usted proporciona en su entorno para realizar llamadas a Secrets Manager. El Agente de Secrets Manager ofrece protección contra la falsificación de solicitudes del lado del servidor (SSRF) para ayudar a mejorar la seguridad del secreto. Puede configurar el Agente de Secrets Manager estableciendo el número máximo de conexiones, el tiempo de vida (TTL), el puerto HTTP del servidor local y el tamaño de la caché.

Como el Agente de Secrets Manager utiliza una caché en memoria, se restablece cuando se reinicia el Agente de Secrets Manager. El Agente de Secrets Manager actualiza periódicamente el valor secreto almacenado en caché. La actualización se produce cuando se intenta leer un secreto del Agente de Secrets Manager después de que el TTL haya caducado. La frecuencia de actualización predeterminada (TTL) es de 300 segundos y puede cambiarla mediante un Archivo de configuración que se pasa al Agente de Secrets Manager mediante el argumento de la línea de comandos --config. El Agente de Secrets Manager no incluye la invalidación del caché. Por ejemplo, si un secreto rota antes de que caduque la entrada del caché, el Agente de Secrets Manager podría devolver un valor secreto obsoleto.

El Agente de Secrets Manager devuelve los valores secretos en el mismo formato que la respuesta de GetSecretValue. Los valores secretos no se cifran en caché.

Para descargar el código fuente, consulte https://github.com/aws/aws-secretsmanager-agent en GitHub.

Paso 1: crear el binario del Agente de Secrets Manager

Para crear el binario del Agente de Secrets Manager de forma nativa, necesita las herramientas de desarrollo estándar y las herramientas de Rust. Como alternativa, puede realizar una compilación cruzada para los sistemas que lo admitan, o puede usar Rust de forma cruzada para realizar una compilación cruzada.

RPM-based systems
  1. En sistemas basados en RPM, como AL2023, puede instalar las herramientas de desarrollo mediante el grupo de herramientas de desarrollo.

    sudo yum -y groupinstall "Development Tools"
  2. Siga las instrucciones de Instalar Rust en la documentación de Rust.

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh . "$HOME/.cargo/env"
  3. Cree el agente mediante el comando cargo build:

    cargo build --release

    Encontrará el ejecutable en target/release/aws-secrets-manager-agent.

Debian-based systems
  1. En sistemas basados en Debian, como Ubuntu, puede instalar las herramientas de desarrollador mediante el paquete build-essential.

    sudo apt install build-essential
  2. Siga las instrucciones de Instalar Rust en la documentación de Rust.

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh . "$HOME/.cargo/env"
  3. Cree el agente mediante el comando cargo build:

    cargo build --release

    Encontrará el ejecutable en target/release/aws-secrets-manager-agent.

Windows

Para compilar en Windows, siga las instrucciones de Configurar el entorno de desarrollo en Windows para Rust en la documentación de Microsoft Windows.

Cross-compile natively

En las distribuciones en las que está disponible el paquete mingw-w64, como Ubuntu, puede realizar compilaciones cruzadas de forma nativa.

# Install the cross compile tool chain sudo add-apt-repository universe sudo apt install -y mingw-w64 # Install the rust build targets rustup target add x86_64-pc-windows-gnu # Cross compile the agent for Windows cargo build --release --target x86_64-pc-windows-gnu

Encontrará el ejecutable en target/x86_64-pc-windows-gnu/release/aws-secrets-manager-agent.exe.

Cross compile with Rust cross

Si las herramientas de compilación cruzada no están disponibles de forma nativa en el sistema, puede utilizar el proyecto cruzado de Rust. Para obtener más información, consulte https://github.com/cross-rs/cross.

importante

Recomendamos 32 GB de espacio en disco para el entorno de compilación.

# Install and start docker sudo yum -y install docker sudo systemctl start docker sudo systemctl enable docker # Make docker start after reboot # Give ourselves permission to run the docker images without sudo sudo usermod -aG docker $USER newgrp docker # Install cross and cross compile the executable cargo install cross cross build --release --target x86_64-pc-windows-gnu

Paso 2: instalar el Agente de Secrets Manager

Según el tipo de procesamiento, tiene varias opciones para instalar el Agente de Secrets Manager.

Amazon EKS, Amazon EC2, and Amazon ECS
Instalar el Agente de Secrets Manager
  1. Use el script de install que se proporciona en el repositorio.

    El script genera un token SSRF aleatorio al inicio y lo almacena en el archivo/var/run/awssmatoken. El grupo awssmatokenreader que crea el script de instalación puede leer el token.

  2. Para permitir que la aplicación lea el archivo de token, debe añadir, al grupo awssmatokenreader, la cuenta de usuario con la que se ejecuta la aplicación. Por ejemplo, puede conceder permisos para que la aplicación lea el archivo de token con el siguiente comando usermod, donde <APP_USER> es el ID de usuario con el que se ejecuta la aplicación.

    sudo usermod -aG awssmatokenreader <APP_USER>
Docker

Puede ejecutar el Agente de Secrets Manager como un contenedor lateral junto con la aplicación mediante Docker. Luego, su aplicación puede recuperar los secretos del servidor HTTP local que proporciona el Agente de Secrets Manager. Para obtener más información sobre Docker, consulte la documentación de Docker.

Crear un contenedor lateral para el Agente de Secrets Manager con Docker
  1. Cree un Dockerfile para el contenedor lateral del Agente de Secrets Manager. En el siguiente ejemplo, se crea un contenedor de Docker con el binario del Agente de Secrets Manager.

    # Use the latest Debian image as the base FROM debian:latest # Set the working directory inside the container WORKDIR /app # Copy the Secrets Manager Agent binary to the container COPY secrets-manager-agent . # Install any necessary dependencies RUN apt-get update && apt-get install -y ca-certificates # Set the entry point to run the Secrets Manager Agent binary ENTRYPOINT ["./secrets-manager-agent"]
  2. Cree un Dockerfile para su aplicación cliente.

  3. Cree un archivo de Docker Compose para ejecutar ambos contenedores, asegurándose de que utilizan la misma interfaz de red. Esto es necesario porque el Agente de Secrets Manager no acepta solicitudes desde fuera de la interfaz localhost. El siguiente ejemplo muestra un archivo de Docker Compose en el que la clave network_mode adjunta el contenedor secrets-manager-agent al espacio de nombres de red del contenedor client-application, lo que les permite compartir la misma interfaz de red.

    importante

    Debe cargar las credenciales AWS y el token de la SSRF para que la aplicación pueda utilizar el Agente de Secrets Manager. Consulte lo siguiente:

    version: '3' services: client-application: container_name: client-application build: context: . dockerfile: Dockerfile.client command: tail -f /dev/null # Keep the container running secrets-manager-agent: container_name: secrets-manager-agent build: context: . dockerfile: Dockerfile.agent network_mode: "container:client-application" # Attach to the client-application container's network depends_on: - client-application
  4. Copie el binario secrets-manager-agent en el mismo directorio que contiene sus archivos Dockerfiles y Docker Compose.

  5. Cree y ejecute los contenedores en función de los Dockerfiles proporcionados mediante el siguiente comando docker-compose.

    docker-compose up --build
  6. En su contenedor de clientes, ahora puede usar el Agente de Secrets Manager para recuperar secretos. Para obtener más información, consulte Paso 3: recuperar secretos con el Agente de Secrets Manager.

AWS Lambda

Puede empaquetar el Agente de Secrets Manager como una extensión de AWS Lambda. A continuación, puede añadirla a la función de Lambda como una capa y llamar al Agente de Secrets Manager desde la función de Lambda para obtener los secretos.

Las siguientes instrucciones muestran cómo obtener un secreto llamado MyTest mediante el script secrets-manager-agent-extension.sh de ejemplo de https://github.com/aws/aws-secretsmanager-agent para instalar el Agente de Secrets Manager como una extensión de Lambda.

nota

El script de ejemplo usa el comando curl, que se incluye en los tiempos de ejecución basados en Amazon Linux 2023, como Python 3.12 y Node.js 2.0. Si utiliza un entorno de tiempo de ejecución basado en Amazon Linux 2, como Python 3.11 o Node.js 18, primero debe instalar curl en la imagen de contenedor de Lambda. Para obtener instrucciones, consulte Cómo puedo utilizar paquetes binarios nativos de AMI de Amazon Linux 2 con Lambda en AWS Re:post.

Crear una extensión de Lambda que empaquete el Agente de Secrets Manager
  1. Cree una función de Lambda de Python que consulte http://localhost:2773/secretsmanager/get?secretId=MyTest para obtener el secreto. Asegúrese de implementar la lógica de reintento en el código de la aplicación para adaptarse a los retrasos en la inicialización y el registro de la extensión de Lambda.

  2. Desde la raíz del paquete de códigos del Agente de Secrets Manager, ejecute los siguientes comandos para probar la extensión de Lambda.

    AWS_ACCOUNT_ID=<AWS_ACCOUNT_ID> LAMBDA_ARN=<LAMBDA_ARN> # Build the release binary cargo build --release --target=x86_64-unknown-linux-gnu # Copy the release binary into the `bin` folder mkdir -p ./bin cp ./target/x86_64-unknown-linux-gnu/release/aws_secretsmanager_agent ./bin/secrets-manager-agent # Copy the `secrets-manager-agent-extension.sh` script into the `extensions` folder. mkdir -p ./extensions cp aws_secretsmanager_agent/examples/example-lambda-extension/secrets-manager-agent-extension.sh ./extensions # Zip the extension shell script and the binary zip secrets-manager-agent-extension.zip bin/* extensions/* # Publish the layer version LAYER_VERSION_ARN=$(aws lambda publish-layer-version \ --layer-name secrets-manager-agent-extension \ --zip-file "fileb://secrets-manager-agent-extension.zip" | jq -r '.LayerVersionArn') # Attach the layer version to the Lambda function aws lambda update-function-configuration \ --function-name $LAMBDA_ARN \ --layers "$LAYER_VERSION_ARN"
  3. Invoque la función de Lambda para comprobar que el secreto se está recuperando correctamente.

Paso 3: recuperar secretos con el Agente de Secrets Manager

Para usar el agente, debe llamar al punto de conexión local del Agente de Secrets Manager e incluir el nombre o el ARN del secreto como parámetro de consulta. De forma predeterminada, el Agente de Secrets Manager recupera la versión AWSCURRENT del secreto. Para recuperar una versión diferente, puede configurar versionStage o versionId.

Para ayudar a proteger al Agente de Secrets Manager, debe incluir un encabezado de token SSRF como parte de cada solicitud: X-Aws-Parameters-Secrets-Token. El Agente de Secrets Manager rechaza las solicitudes que no tengan este encabezado o que tengan un token SSRF no válido. Puede personalizar el nombre del encabezado de SSRF en Archivo de configuración.

El Agente de Secrets Manager usa el SDK de AWS para Rust, que usa la cadena de proveedores de credenciales predeterminada. La identidad de estas credenciales de IAM determina los permisos que tiene el Agente de Secrets Manager para recuperar los secretos.

Permisos necesarios:

  • secretsmanager:DescribeSecret

  • secretsmanager:GetSecretValue

Para obtener más información, consulte Referencia de permisos.

importante

Tras introducir el valor secreto en el Agente de Secrets Manager, cualquier usuario con acceso al entorno informático y al token SSRF podrá acceder al secreto desde la memoria caché del Agente de Secrets Manager. Para obtener más información, consulte Consideraciones de seguridad.

curl

El siguiente ejemplo de curl muestra cómo obtener un secreto del Agente de Secrets Manager. El ejemplo se basa en la presencia de la SSRF en un archivo, que es donde se almacena mediante el script de instalación.

curl -v -H \ "X-Aws-Parameters-Secrets-Token: $(</var/run/awssmatoken)" \ 'http://localhost:2773/secretsmanager/get?secretId=<YOUR_SECRET_ID>}'; \ echo
Python

El siguiente ejemplo de Python muestra cómo obtener un valor secreto del Agente de Secrets Manager. El ejemplo se basa en la presencia de la SSRF en un archivo, que es donde se almacena mediante el script de instalación.

import requests import json # Function that fetches the secret from Secrets Manager Agent for the provided secret id. def get_secret(): # Construct the URL for the GET request url = f"http://localhost:2773/secretsmanager/get?secretId=<YOUR_SECRET_ID>}" # Get the SSRF token from the token file with open('/var/run/awssmatoken') as fp: token = fp.read() headers = { "X-Aws-Parameters-Secrets-Token": token.strip() } try: # Send the GET request with headers response = requests.get(url, headers=headers) # Check if the request was successful if response.status_code == 200: # Return the secret value return response.text else: # Handle error cases raise Exception(f"Status code {response.status_code} - {response.text}") except Exception as e: # Handle network errors raise Exception(f"Error: {e}")

Configuración del Agente de Secrets Manager

Para cambiar la configuración del Agente de Secrets Manager, cree un archivo de configuración TOML y, a continuación, realice una llamada ./aws-secrets-manager-agent --config config.toml.

La siguiente lista muestra las opciones que puede configurar para el Agente de Secrets Manager.

  • log_level: el nivel de detalle indicado en los registros del Agente de Secrets Manager: DEBUG, INFO, WARN, ERROR o NONE. El valor predeterminado es INFO.

  • http_port: el puerto del servidor HTTP local, en el rango de 1024 a 65535. El valor predeterminado es 2773.

  • region: la región de AWS que se va a utilizar para las solicitudes. Si no se especifica ninguna región, el Agente de Secrets Manager determina la región a partir del SDK. Para obtener más información, consulte Especifique las credenciales y regiones predeterminadas en la Guía para desarrolladores del SDK de AWS para Rust.

  • ttl_seconds: el TTL en segundos de los elementos almacenados en caché, en el rango de 1 a 3600. El valor predeterminado es 300. Esta configuración no se utiliza si el tamaño de la caché es 0.

  • cache_size: el número máximo de secretos que se pueden almacenar en caché, en el rango de 0 a 1000. 0 indica que no hay almacenamiento en caché. El valor predeterminado es 1000.

  • ssrf_headers: lista de nombres de encabezados que el Agente de Secrets Manager comprueba en busca del token SSRF. El valor predeterminado es “X-Aws-Parameters-Secrets-Token, X-Vault-Token”.

  • ssrf_env_variables: una lista de nombres de variables de entorno que el Agente de Secrets Manager comprueba en busca del token SSRF. La variable de entorno puede contener el token o una referencia al archivo del token, como en: AWS_TOKEN=file:///var/run/awssmatoken. El valor predeterminado es “AWS_TOKEN, AWS_SESSION_TOKEN”.

  • path_prefix: el prefijo URI que se utiliza para determinar si la solicitud es una solicitud basada en una ruta. El valor predeterminado es “/v1/”.

  • max_conn: el número máximo de conexiones desde clientes HTTP que permite el Agente de Secrets Manager, entre 1 y 1000. El valor predeterminado es 800.

Registro

El Agente de Secrets Manager registra los errores localmente en el archivo logs/secrets_manager_agent.log. Cuando la aplicación llama al Agente de Secrets Manager para obtener un secreto, esas llamadas aparecen en el registro local. No aparecen en los registros de CloudTrail.

El Agente de Secrets Manager crea un nuevo archivo de registro cuando el archivo alcanza los 10 MB y almacena hasta cinco archivos de registro en total.

El registro no va a Secrets Manager, CloudTrail ni CloudWatch. Las solicitudes para obtener secretos del Agente de Secrets Manager no aparecen en esos registros. Cuando el Agente de Secrets Manager llama a Secrets Manager para obtener un secreto, esa llamada se registra en CloudTrail con una cadena de agente de usuario que contiene aws-secrets-manager-agent.

Puede configurar el registro en Archivo de configuración.

Consideraciones de seguridad

En el caso de una arquitectura de agente, el dominio de confianza es el lugar donde se puede acceder al punto de conexión del agente y al token SSRF, que suele ser todo el host. El dominio de confianza del Agente de Secrets Manager debe coincidir con el dominio en el que están disponibles las credenciales de Secrets Manager para mantener la misma postura de seguridad. Por ejemplo, en Amazon EC2, el dominio de confianza del Agente de Secrets Manager sería el mismo que el dominio de las credenciales cuando se utilizan roles para Amazon EC2.

Las aplicaciones que velan por la seguridad que aún no utilizan una solución de agente con las credenciales de Secrets Manager bloqueadas en la aplicación deberían considerar la posibilidad de utilizar los SDK de AWS o las soluciones de almacenamiento en caché específicos del idioma. Para obtener más información, consulte Obtener secretos de AWS Secrets Manager.