Autorizar llamadas directas a los AWS servicios mediante el proveedor de AWS IoT Core credenciales - AWS IoT Core

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.

Autorizar llamadas directas a los AWS servicios mediante el proveedor de AWS IoT Core credenciales

Los dispositivos pueden usar certificados X.509 para conectarse AWS IoT Core mediante los protocolos de autenticación mutua TLS. Otros AWS servicios no admiten la autenticación basada en certificados, pero se pueden llamar a ellos mediante AWS credenciales en formato AWS Signature Version 4. El algoritmo Signature de la versión 4 normalmente requiere que la persona que llama tenga un identificador de clave de acceso y una clave de acceso secreta. AWS IoT Core tiene un proveedor de credenciales que le permite utilizar el certificado X.509 integrado como identidad única del dispositivo para AWS autenticar las solicitudes. Así se elimina la necesidad de almacenar un ID de clave de acceso y una clave de acceso secreta en el dispositivo.

El proveedor de credenciales autentica a un intermediario mediante un certificado X.509 y emite un token de seguridad temporal con privilegios limitados. El token se puede usar para firmar y autenticar cualquier solicitud. AWS Esta forma de autenticar sus AWS solicitudes requiere que cree y configure un rol AWS Identity and Access Management (de IAM) y que adjunte las políticas de IAM adecuadas al rol para que el proveedor de credenciales pueda asumir el rol en su nombre. Para obtener más información sobre AWS IoT Core e IAM, consulte Administración de identidades y accesos para AWS IoT.

AWS IoT requiere que los dispositivos envíen la extensión de indicación del nombre del servidor (SNI) al protocolo Transport Layer Security (TLS) y proporcionen la dirección completa del punto final en el campo. host_name El campo host_name debe contener el punto de conexión al que está llamando y debe ser:

  • El endpointAddress devuelto por aws iot describe-endpoint --endpoint-type iot:CredentialProvider.

Las conexiones que intenten realizar los dispositivos sin el valor de host_name correcto fallarán.

En el siguiente diagrama se ilustra el flujo de trabajo del proveedor de credenciales.

AWS IoT Core flujo de trabajo del proveedor de credenciales.
  1. El AWS IoT Core dispositivo realiza una solicitud HTTPS al proveedor de credenciales para obtener un token de seguridad. La solicitud incluye el certificado X.509 del dispositivo para autenticación.

  2. El proveedor de credenciales reenvía la solicitud al módulo de AWS IoT Core autenticación y autorización para validar el certificado y comprobar que el dispositivo tiene permiso para solicitar el token de seguridad.

  3. Si el certificado es válido y tiene permiso para solicitar un token de seguridad, el módulo de AWS IoT Core autenticación y autorización se devuelve correctamente. De lo contrario, envía una excepción al dispositivo.

  4. Después de validar correctamente el certificado, el proveedor de credenciales invoca a AWS Security Token Service (AWS STS) para asumir el rol de IAM que creó para el mismo.

  5. AWS STS devuelve un token de seguridad temporal con privilegios limitados al proveedor de credenciales.

  6. El proveedor de credenciales devuelve el token de seguridad al dispositivo.

  7. El dispositivo usa el token de seguridad para firmar una AWS solicitud con la versión 4 de AWS Signature.

  8. El servicio solicitado invoca a IAM para validar la firma y autorizar la solicitud frente a políticas de acceso asociadas al rol de IAM que creó para el proveedor de credenciales.

  9. Si IAM valida la firma correctamente y autoriza la solicitud, la solicitud se realiza correctamente. De lo contrario, IAM envía una excepción.

En la siguiente sección se describe cómo utilizar un certificado para obtener un token de seguridad. Se ha escrito suponiendo que ya ha registrado un dispositivo y creado y activado su propio certificado para el mismo.

Cómo utilizar un certificado para obtener un token de seguridad

  1. Configure el rol de IAM que el proveedor de credenciales asume en nombre de su dispositivo. Asocie la siguiente política de confianza al rol.

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"Service": "credentials.iot.amazonaws.com"}, "Action": "sts:AssumeRole" } }

    Para cada AWS servicio al que desee llamar, adjunte una política de acceso al rol. El proveedor de credenciales admite las siguientes variables de políticas:

    • credentials-iot:ThingName

    • credentials-iot:ThingTypeName

    • credentials-iot:AwsCertificateId

    Cuando el dispositivo proporciona el nombre de objeto en su solicitud a un servicio de AWS , el proveedor de credenciales agrega credentials-iot:ThingName y credentials-iot:ThingTypeName como variables de contexto para el token de seguridad. El proveedor de credenciales proporciona credentials-iot:AwsCertificateId como una variable de contexto incluso si el dispositivo no proporciona el nombre de la cosa en la solicitud. Transfiera el nombre de la cosa como valor del encabezado de solicitud HTTP x-amzn-iot-thingname.

    Estas tres variables solo funcionan para las políticas de IAM, no para las políticas de AWS IoT Core .

  2. Asegúrese de que el usuario que realiza el siguiente paso (la creación de un alias de rol) tiene permiso para transferir a AWS IoT Core el rol que se acaba de crear. La siguiente política otorga ambos iam:GetRole iam:PassRole permisos a un AWS usuario. El permiso iam:GetRole permite al usuario obtener información acerca del rol que acaba de crear. El iam:PassRole permiso permite al usuario transferir la función a otro AWS servicio.

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::your Cuenta de AWS id:role/your role name" } }
  3. Cree un alias de AWS IoT Core rol. El dispositivo que va a realizar llamadas directas a AWS los servicios debe saber qué función ARN utilizar al conectarse. AWS IoT Core La codificación de forma rígida de un ARN de rol no es una buena solución, ya que requiere actualizar el dispositivo cada vez que el ARN del rol cambia. Una solución mejor consiste en utilizar la API CreateRoleAlias para crear un alias de rol que apunte al ARN del rol. Si el ARN del rol cambia, solo tiene que actualizar el alias de rol. No es necesario realizar ningún cambio en el dispositivo. Esta API adopta los siguiente parámetros:

    roleAlias

    Obligatorio. Una cadena arbitraria que identifica el alias del rol. Sirve como clave principal en el modelo de datos del alias de rol. Contiene 1-128 caracteres y debe incluir únicamente caracteres alfanuméricos y los símbolos =, @ y -. Se permiten los caracteres alfabéticos en mayúsculas y minúsculas.

    roleArn

    Obligatorio. El ARN del rol al que hace referencia el alias del rol.

    credentialDurationSeconds

    Opcional. El tiempo (en segundos) que la credencial es válida. El valor mínimo es de 900 segundos (15 minutos). El valor máximo es de 43 200 segundos (12 horas). El valor predeterminado es de 3600 segundos (1 hora).

    nota

    El proveedor de AWS IoT Core credenciales puede emitir una credencial con una duración máxima de 43.200 segundos (12 horas). Hacer que la credencial sea válida durante un máximo de 12 horas puede ayudar a reducir el número de llamadas al proveedor de credenciales al almacenar la credencial en caché durante más tiempo.

    El valor credentialDurationSeconds debe ser menor o igual que la duración máxima de la sesión del rol de IAM a la que hace referencia el alias del rol.

    Para obtener más información sobre esta API, consulte. CreateRoleAlias

  4. Asocie una política al certificado de dispositivo. La política asociada al certificado del dispositivo debe conceder permiso al dispositivo para asumir el rol. Para ello, puede conceder permiso para la acción iot:AssumeRoleWithCertificate al alias de rol, como en el ejemplo siguiente.

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"iot:AssumeRoleWithCertificate", "Resource":"arn:aws:iot:your region:your_aws_account_id:rolealias/your role alias" } ] }
  5. Realice una solicitud HTTPS al proveedor de credenciales para obtener un token de seguridad. Proporcione la información siguiente:

    • Certificado: dado que se trata de una solicitud HTTP a través de autenticación mutua de TLS, debe proporcionar el certificado y la clave privada a su cliente al realizar la solicitud. Use el mismo certificado y la misma clave privada con los que registró su certificado AWS IoT Core.

      Para asegurarse de que el dispositivo se está comunicando con AWS IoT Core (y no con un servicio que se hace pasar por él), consulte Autenticación de servidor, siga los enlaces para descargar los certificados de CA correspondientes y, a continuación, cópielos en su dispositivo.

    • RoleAlias: el nombre del alias de rol que creó para el proveedor de credenciales.

    • ThingName: El nombre de la cosa que creaste cuando la registraste AWS IoT Core . Esto se transfiere como valor del encabezado HTTP x-amzn-iot-thingname. Este valor solo es obligatorio si se utilizan los atributos de las cosas como variables de política en nuestras AWS IoT Core políticas de IAM.

      nota

      Los ThingNamedatos que proporcione x-amzn-iot-thingname deben coincidir con el nombre del recurso AWS IoT Thing asignado a un certificado. Si no coincide, se devuelve un error 403.

    Ejecute el siguiente comando AWS CLI para obtener el punto final del proveedor de credenciales para su Cuenta de AWS. Para obtener más información sobre esta API, consulte DescribeEndpoint.

    aws iot describe-endpoint --endpoint-type iot:CredentialProvider

    El siguiente objeto de JSON es la salida de ejemplo del comando describe-endpoint. Contiene el endpointAddress que utiliza para solicitar un token de seguridad.

    { "endpointAddress": "your_aws_account_specific_prefix.credentials.iot.your region.amazonaws.com" }

    Utilice el punto de conexión para realizar una solicitud HTTPS al proveedor de credenciales para devolver un token de seguridad. El ejemplo de comando siguiente utiliza curl, pero puede utilizar cualquier cliente HTTP.

    curl --cert your certificate --key your device certificate key pair -H "x-amzn-iot-thingname: your thing name" --cacert AmazonRootCA1.pem https://your endpoint /role-aliases/your role alias/credentials

    Este comando devuelve un objeto de token de seguridad objeto que contiene un accessKeyId, una secretAccessKey, un sessionToken y un vencimiento. El siguiente objeto de JSON es la salida de ejemplo del comando curl.

    {"credentials":{"accessKeyId":"access key","secretAccessKey":"secret access key","sessionToken":"session token","expiration":"2018-01-18T09:18:06Z"}}

    A continuación, puede usar los sessionToken valores accessKeyIdsecretAccessKey, y para firmar las solicitudes a AWS los servicios. Para ver una end-to-end demostración, consulte Cómo eliminar la necesidad de AWS credenciales codificadas en los dispositivos mediante el uso de la entrada del blog sobre el proveedor de AWS IoT credenciales en el blog de AWS seguridad.