Especificación de información confidencial mediante Secrets Manager - Amazon Elastic Container Service

Especificación de información confidencial mediante Secrets Manager

Amazon ECS permite introducir información confidencial en los contenedores, la almacena en secretos de AWS Secrets Manager y, a continuación, la referencia en la definición de contenedor. La información confidencial almacenada en secretos de Secrets Manager se puede exponer a un contenedor como variables de entorno o como parte de la configuración del registro.

Cuando introduce un secreto como variable de entorno, puede especificar el contenido completo de un secreto, una clave JSON específica dentro de un secreto o una versión específica de un secreto que vaya a introducir. Este proceso ayuda a controlar la información confidencial expuesta al contenedor. Para obtener más información acerca del control de versiones secretas, consulte Términos y conceptos clave de AWS Secrets Manager en la Guía del usuario de AWS Secrets Manager.

Consideraciones para la especificación de información confidencial mediante Secrets Manager

Cuando se utilice Secrets Manager para especificar información confidencial para contenedores, se debe tener en cuenta lo siguiente.

  • Para las tareas de Amazon ECS alojadas en AWS Fargate, se debe tener en cuenta lo siguiente:

    • Para introducir el contenido completo de un secreto como variable de entorno o en una configuración de registro, debe usar la versión 1.3.0 de la plataforma o una posterior. Para obtener información, consulte Versiones de la plataforma AWS Fargate.

    • Para introducir una versión o clave JSON específica de un secreto como variable de entorno o en una configuración de registro, debe usar la versión 1.4.0 de la plataforma o una posterior. Para obtener información, consulte Versiones de la plataforma AWS Fargate.

  • Para las tareas de Amazon ECS alojadas en EC2, se debe tener en cuenta lo siguiente:

    • Para introducir un secreto utilizando una versión o clave JSON específica de un secreto, la instancia de contenedor debe tener la versión 1.37.0 del agente de contenedor o una posterior. No obstante, recomendamos utilizar la versión del agente de contenedor más reciente. Para obtener información sobre la comprobación de la versión del agente y la actualización a la versión más reciente, consulte Actualización del agente de contenedor de Amazon ECS.

      Para introducir el contenido completo de un secreto como variable de entorno o un secreto en una configuración de registro, la instancia de contenedor debe tener la versión 1.22.0 del agente de contenedor o una posterior.

  • Solo se admiten los secretos que almacenan datos de texto, que son secretos creados con el parámetro SecretString de la API CreateSecret. No se admiten secretos que almacenan datos binarios, que son secretos creados con el parámetro SecretBinary de la API CreateSecret.

  • Cuando utilice una definición de tareas que haga referencia a secretos de Secrets Manager para recuperar información confidencial de los contenedores, si también está utilizando puntos de enlace de la VPC de interfaz, debe crear los puntos de enlace de la VPC de la interfaz para Secrets Manager. Para obtener más información, consulte Utilización de Secrets Manager con puntos de enlace de la VPC en la Guía del usuario de AWS Secrets Manager.

  • Los datos confidenciales se inyectan en el contenedor al iniciar el contenedor. Si el secreto se actualiza posteriormente o se rota, el contenedor no recibirá automáticamente el valor actualizado. Debe lanzar una nueva tarea o, si su tarea forma parte de un servicio, puede actualizar el servicio y utilizar la opción Force new deployment (Forzar nueva implementación) para forzar que el servicio lance una nueva tarea.

  • La VPC que utiliza la tarea debe tener habilitada la resolución DNS.

  • Para las tareas de Windows configuradas para utilizar el controlador de registros awslogs, debe también establecer la variable de entorno ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE en la instancia del contenedor. Esto se puede hacer con User Data (Datos de usuario) mediante el uso de la siguiente sintaxis:

    <powershell> [Environment]::SetEnvironmentVariable("ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE", $TRUE, "Machine") Initialize-ECSAgent -Cluster <cluster name> -EnableTaskIAMRole -LoggingDrivers '["json-file","awslogs"]' </powershell>

Permisos de IAM requeridos para los secretos de Amazon ECS

Para utilizar esta característica, debe tener el rol de ejecución de tareas de Amazon ECS y hacer referencia a él en la definición de tareas. Esto permite que el agente de contenedor extraiga los recursos necesarios de Secrets Manager. Para obtener más información, consulte Rol de IAM de ejecución de tareas de Amazon ECS.

Para proporcionar acceso a los secretos de Secrets Manager que cree, agregue manualmente los siguientes permisos como una política insertada al rol de ejecución de tareas. Para obtener más información, consulte Adición y eliminación de políticas de IAM.

  • secretsmanager:GetSecretValue: obligatorio si se referencia un secreto de Secrets Manager.

  • kms:Decrypt: obligatorio solo si el secreto utiliza una clave de KMS personalizada y no la clave predeterminada. El ARN de su clave personalizada debe añadirse como un recurso.

La siguiente política insertada de ejemplo agrega los permisos necesarios.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "kms:Decrypt" ], "Resource": [ "arn:aws:secretsmanager:<region>:<aws_account_id>:secret:<secret_name>", "arn:aws:kms:<region>:<aws_account_id>:key/<key_id>" ] } ] }

Introducción de información confidencial como variable de entorno

Dentro de la definición de contenedor, puede especificar lo siguiente:

  • El objeto secrets que contiene el nombre de la variable de entorno que se va a establecer en el contenedor

  • Nombre de recurso de Amazon (ARN) del secreto de Secrets Manager

  • Parámetros adicionales que contienen información confidencial que se debe presentar al contenedor

En el ejemplo siguiente, se muestra la sintaxis completa que se debe especificar para el secreto de Secrets Manager.

arn:aws:secretsmanager:region:aws_account_id:secret:secret-name:json-key:version-stage:version-id

En la siguiente sección se describen los parámetros adicionales. Estos parámetros son opcionales, pero si no los utiliza, debe incluir los dos puntos y coma : para utilizar los valores predeterminados. A continuación se ofrecen ejemplos para obtener más contexto.

json-key

Especifica el nombre de la clave en un par clave-valor con el valor que desea establecer como valor de variable de entorno. Solo se admiten valores en formato JSON. Si no especifica una clave JSON, se usa el contenido completo del secreto.

version-stage

Especifica la etiqueta de ensayo de la versión de un secreto que desea utilizar. Si se especifica una etiqueta de ensayo de versión, no se puede especificar un ID de versión. Si no se especifica ninguna etapa de versión, el comportamiento predeterminado consiste en recuperar el secreto con la etiqueta de ensayo AWSCURRENT.

Las etiquetas de ensayo se utilizan para realizar un seguimiento de las distintas versiones de un secreto cuando se actualizan o rotan. Cada versión de un secreto tiene una o varias etiquetas de ensayo y un ID. Para obtener más información, consulte Términos y conceptos clave para AWS Secrets Manager en la Guía del usuario de AWS Secrets Manager.

version-id

Especifica el identificador único de la versión del secreto que desea utilizar. Si se especifica un ID de versión, no se puede especificar una etiqueta de ensayo de versión. Si no se especifica ningún ID de versión, el comportamiento predeterminado consiste en recuperar el secreto con la etiqueta de ensayo AWSCURRENT.

Los ID de versión se utilizan para realizar un seguimiento de las distintas versiones de un secreto cuando se actualizan o rotan. Cada versión de un secreto tiene un ID. Para obtener más información, consulte Términos y conceptos clave para AWS Secrets Manager en la Guía del usuario de AWS Secrets Manager.

Para ver el tutorial completo acerca de la creación de un secreto de Secrets Manager y la introducción de este en un contenedor como variable de entorno, consulte Tutorial: Especificación de información confidencial mediante secretos de Secrets Manager.

Definiciones de contenedor de ejemplo

En los siguientes ejemplos, se muestran las formas en las que se pueden referenciar secretos de Secrets Manager en las definiciones de contenedor.

ejemplo hacer referencia a un secreto completo

A continuación, se incluye un fragmento de código de una definición de tareas que muestra el formato cuando se referencia el texto completo de un secreto de Secrets Manager.

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf" }] }] }

ejemplo hacer referencia a una clave específica dentro de un secreto

A continuación se muestra un ejemplo de salida de un comando get-secret-value que muestra el contenido de un secreto junto con la etiqueta de ensayo de versión y el ID de versión asociados con ella.

{
    "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf",
    "Name": "appauthexample",
    "VersionId": "871d9eca-18aa-46a9-8785-981ddEXAMPLE",
    "SecretString": "{\"username1\":\"password1\",\"username2\":\"password2\",\"username3\":\"password3\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1581968848.921
}

Haga referencia a una clave específica de la salida anterior en una definición de contenedor especificando el nombre de clave al final del ARN.

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1::" }] }] }

ejemplo hacer referencia a una versión de secreto específica

A continuación se muestra una salida de ejemplo de un comando describe-secret que muestra el contenido sin cifrar de un secreto junto con los metadatos de todas las versiones del secreto.

{
    "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf",
    "Name": "appauthexample",
    "Description": "Example of a secret containing application authorization data.",
    "RotationEnabled": false,
    "LastChangedDate": 1581968848.926,
    "LastAccessedDate": 1581897600.0,
    "Tags": [],
    "VersionIdsToStages": {
        "871d9eca-18aa-46a9-8785-981ddEXAMPLE": [
            "AWSCURRENT"
        ],
        "9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE": [
            "AWSPREVIOUS"
        ]
    }
}

Haga referencia a una etiqueta de ensayo de versión específica de la salida anterior en una definición de contenedor especificando el nombre de clave al final del ARN.

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf::AWSPREVIOUS:" }] }] }

Haga referencia a un ID de versión específico de la salida anterior en una definición de contenedor especificando el nombre de clave al final del ARN.

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:::9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE" }] }] }

ejemplo hacer referencia a una clave específica y una etiqueta de ensayo de versión de un secreto

A continuación se muestra cómo hacer referencia tanto a una clave específica dentro de un secreto como a una etiqueta de ensayo de versión específica.

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1:AWSPREVIOUS:" }] }] }

Para especificar una clave y un ID de versión específicos, utilice la sintaxis siguiente.

{ "containerDefinitions": [{ "secrets": [{ "name": "environment_variable_name", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1::9d4cb84b-ad69-40c0-a0ab-cead3EXAMPLE" }] }] }

Introducción de información confidencial en una configuración de registros

En la definición de contenedor, al especificar una logConfiguration, puede especificar secretOptions con el nombre de la opción del controlador de registros para definir el contenedor y el ARN completo del secreto de Secrets Manager que contiene la información confidencial que se va a presentar al contenedor.

A continuación, se incluye un fragmento de código de una definición de tareas que muestra el formato cuando se referencia un secreto de Secrets Manager.

{ "containerDefinitions": [{ "logConfiguration": [{ "logDriver": "splunk", "options": { "splunk-url": "https://cloud.splunk.com:8080" }, "secretOptions": [{ "name": "splunk-token", "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf" }] }] }] }

Creación de un secreto de AWS Secrets Manager

Puede utilizar la consola de Secrets Manager para crear un secreto con su información confidencial. Para obtener más información, consulte Creación de un secreto básico en la Guía del usuario de AWS Secrets Manager.

Para crear un secreto básico

Utilice Secrets Manager para crear un secreto con su información confidencial.

  1. Abra la consola de Secrets Manager enhttps://console.aws.amazon.com/secretsmanager/.

  2. Elija Store a new secret (Almacenar un nuevo secreto).

  3. En Select secret type (Seleccionar tipo de secreto), elija Other type of secrets (Otro tipo de secretos).

  4. Especifique los detalles de su secreto personalizado como pares de clave y valor. Por ejemplo, puede especificar una clave UserName y, a continuación, proporcionar el nombre de usuario como su valor. Agregue una segunda clave con el nombre Password y el texto de la contraseña como su valor. Además, podría agregar entradas para el nombre de base de datos, la dirección del servidor, el puerto TCP, etc. Puede añadir tantas parejas como sea necesario para almacenar la información que necesite.

    Como opción, puede elegir la pestaña Plaintext (Texto no cifrado) y escribir el valor del secreto del modo que prefiera.

  5. Seleccione la clave de cifrado de AWS KMS que desea usar para cifrar el texto protegido en el secreto. Si no elige ninguna, Secrets Manager comprueba si existe una clave predeterminada para la cuenta y la utiliza si existe. Si no existe una clave predeterminada, Secrets Manager crea una automáticamente. También puede elegir Add new key (Añadir nueva clave) para crear una clave de KMS personalizada específicamente para este secreto. Para crear su propia clave de KMS, debe tener permisos para crear claves de KMS en su cuenta.

  6. Elija Next (Siguiente).

  7. En Secret name (Nombre del secreto), escriba una ruta y un nombre opcionales, tales como production/MyAwesomeAppSecret o development/TestSecret y elija Next (Siguiente). Opcionalmente, puede añadir una descripción para ayudarle a recordar el objetivo de este secreto más adelante.

    El nombre del secreto debe estar formado por letras ASCII, dígitos o cualquiera de los siguientes caracteres: /_+=.@-

  8. (Opcional) En este punto puede configurar la rotación para su secreto. Para este procedimiento, deje seleccionado Disable automatic rotation (Deshabilitar la rotación automática) y, a continuación, elija Next (Siguiente).

    Para obtener información sobre cómo configurar la rotación en secretos nuevos o existentes, consulte Rotación de sus secretos de AWS Secrets Manager.

  9. Revise la configuración y, a continuación, elija Store secret (Almacenar secreto) para guardar todo lo que ingresó como nuevo secreto en Secrets Manager.

Creación de una definición de tareas que haga referencia a información confidencial

Puede utilizar la consola de Amazon ECS para crear una definición de tareas que haga referencia a un secreto de Secrets Manager.

Para crear una definición de tarea que especifique un secreto

  1. Abra la consola de Amazon ECS en https://console.aws.amazon.com/ecs/.

  2. En el panel de navegación, elija Task Definitions (Definiciones de tareas) y Create New Task Definition (Crear nueva definición de tareas).

  3. En la página Select launch type compatibility (Seleccionar compatibilidad del tipo de lanzamiento), elija el tipo de lanzamiento para las tareas y elija Next step (Paso siguiente).

    nota

    Este paso solo es válido para las regiones que actualmente admiten Amazon ECS con Fargate de AWS. Para obtener más información, consulte Amazon ECS alojado en AWS Fargate.

  4. En Task Definition Name (Nombre de definición de tareas), escriba un nombre para la definición de tareas. Se admiten hasta 255 letras (mayúsculas y minúsculas), números, guiones y caracteres de subrayado.

  5. En Task execution role (Rol de ejecución de tareas), seleccione el rol de ejecución de tareas existente o elija Create new role (Crear nuevo rol) para crearlo. Este rol permite a Amazon ECS extraer imágenes privadas para su tarea. Para obtener más información, consulte Permisos de IAM requeridos para la autenticación de registros privados.

    importante

    Si el campo Task execution role (Rol de ejecución de tareas) no aparece, elija Configure via JSON (Configurar mediante JSON) y añada manualmente el campo executionRoleArn para especificar el rol de ejecución de tareas. En el siguiente código se muestra la sintaxis:

    "executionRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole"
  6. Para cada contenedor que vaya a crear en su definición de tarea, siga los pasos que se describen a continuación:

    1. En Container Definitions (Definiciones de contenedor), elija Add container (Añadir contenedor).

    2. En Container name (Nombre del contenedor), escriba un nombre para el contenedor. Se admiten hasta 255 letras (mayúsculas y minúsculas), números, guiones y caracteres de subrayado.

    3. En Image (Imagen), escriba el nombre de la imagen o la ruta a su imagen privada. Se admiten hasta 255 letras (mayúsculas y minúsculas), números, guiones y caracteres de subrayado.

    4. Amplíe Advanced container configuration (Configuración avanzada del contenedor).

    5. Para que la información confidencial se inyecte como variables de entorno, en Environment (Entorno), en Environment variables (Variables de entorno), complete los campos siguientes:

      1. En Key (Clave), escriba el nombre de la variable del entorno que se establece en el contenedor. Se corresponde con el campo name de la sección secrets de una definición de contenedor.

      2. En Value (Valor), elija ValueFrom. En Add value (Agregar valor), ingrese el ARN del secreto de Secrets Manager que contiene los datos que se van a presentar al contenedor como variable de entorno.

    6. Para información confidencial a la que se hace referencia en la configuración de registros para un contenedor, en Storage and Logging (Almacenamiento y registro), en Log configuration (Configuración de registro), complete los campos siguientes:

      1. Desactive la opción Auto-configure CloudWatch Logs (Configurar automáticamente de CloudWatch Logs).

      2. En Log options (Opciones de registro), en Key (Clave), introduzca el nombre de la opción de configuración de registro que desea establecer.

      3. En Value (Valor), elija ValueFrom. En Add value (Agregar valor), ingrese el ARN completo del secreto de Secrets Manager que contiene los datos que se van a presentar en su configuración de registros como opción de registro.

    7. Rellene el resto de los campos obligatorios y todos los campos opcionales que va a usar en sus definiciones de contenedor. Hay más parámetros de definición de contenedor disponibles en el menú Advanced container configuration (Configuración avanzada del contenedor). Para obtener más información, consulte Parámetros de definición de tarea.

    8. Elija Agregar.

  7. Cuando se añadan los contenedores, elija Create (Crear).