Autorización de llamadas directas a los servicios de AWS - 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.

Autorización de llamadas directas a los servicios de AWS

Los dispositivos pueden utilizar certificados X.509 para conectarse a AWS IoT Core mediante protocolos de autenticación mutua de TLS. Otros servicios de AWS no admiten la autenticación de certificados, sino que se pueden llamar a través de las credenciales de AWS en formato AWS Signature Version 4. LaAlgoritmo Signature Version 4Normalmente requiere que el autor de la llamada tenga un ID de clave de acceso y una clave de acceso secreta. AWS IoT Core tiene un proveedor de credenciales que le permite utilizar lacertificado X.509como la identidad única del dispositivo para autenticar las solicitudes de AWS. 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 utilizar para firmar y autenticar cualquier solicitud de AWS. Esta forma de autenticación de sus solicitudes de AWS requiere que cree y configure una función de AWS Identity and Access Management (IAM) y adjunte las políticas de IAM adecuadas para la función, de modo que el proveedor de credenciales pueda asumir el rol en su nombre. Para obtener más información sobre AWS IoT Core y IAM, consulteAdministración de identidades y accesos para AWS IoT.

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


                Flujo de trabajo de proveedor de credenciales de AWS IoT Core
  1. El dispositivo de AWS IoT Core realiza una solicitud HTTPS al proveedor de credenciales para 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 autenticación y autorización de AWS IoT Core para validar el certificado y verificar 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 autenticación y autorización de AWS IoT Core indica que se ha realizado 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 laAWS 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 utiliza el token de seguridad para firmar una solicitud de AWS con AWS Signature Version 4.

  8. El servicio solicitado invoca a IAM para validar la firma y autorizar la solicitud frente a políticas de acceso adjuntas 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. Adjunte 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 servicio de AWS 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 añade 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 del objeto en la solicitud. Transfiera el nombre del objeto 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 el rol que se acaba de crear a AWS IoT Core. La política siguiente otorga permisos iam:GetRole y iam:PassRole a un usuario de AWS. El permiso iam:GetRole permite al usuario obtener información acerca del rol que acaba de crear. El permiso iam:PassRole permite al usuario transmitir el rol a otro servicio de AWS.

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::your aws account id:role/your role name" } }
  3. Cree un alias de rol de AWS IoT Core. El dispositivo que va a realizar llamadas directas a servicios de AWS debe conocer qué ARN de rol usar cuando se conecta a 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.

    credentialDurationInSeconds

    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 3 600 segundos (60 minutos). El valor de predeterminado es de 3600 segundos.

    nota

    Aunque la duración de las credenciales especificada en la función de IAM puede ser más larga, cuando AWS IoT Core Credential Provider emite la credencial, su duración máxima es de 3.600 segundos (60 minutos).

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

  4. Adjunte una política al certificado de dispositivo. La política adjunta 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:

    • Certificate: 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. Utilice el mismo certificado y clave privada que utilizó cuando registró su certificado en AWS IoT Core.

      Para asegurarse de que su dispositivo se está comunicando con AWS IoT Core (y no un servicio suplantado), consulteAutenticación del servidor, siga los enlaces para descargar los certificados CA adecuados y, a continuación, cópielos a su dispositivo.

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

    • ThingName: El nombre de objeto que creó al registrar su objeto de AWS IoT Core. Esto se transfiere como valor del encabezado HTTP x-amzn-iot-thingname. Este valor es obligatorio únicamente si utiliza atributos de objetos como variables de política en AWS IoT Core o políticas de IAM.

    Ejecute el siguiente comando en la CLI de AWS para obtener el punto de enlace 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 enlace 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 utilizar los valores accessKeyId, secretAccessKey y sessionToken para firmar solicitudes a los servicios de AWS. Para ver una demostración integral, consulteCómo eliminar la necesidad de credenciales de AWS codificadas en los dispositivos mediante el proveedor de credenciales de AWS IoTPublicación del blog enBlog de seguridad de AWS.