Autorización de llamadas directas aAWSservicios que utilizanAWS IoT Coreproveedor de 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.

Autorización de llamadas directas aAWSservicios que utilizanAWS IoT Coreproveedor de credenciales

Los dispositivos pueden utilizar certificados X.509 para conectarse a AWS IoT Core mediante protocolos de autenticación mutua de TLS. OtroAWSLos servicios no admiten la autenticación basada en certificados, sino que se pueden llamar a través deAWScredenciales deAWSFormato 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 Coretiene un proveedor de credenciales que le permite utilizar lacertificado X.509como identidad de dispositivo única para autenticarseAWSsolicitudes. 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 cualquierAWSrequest. Esta forma de autenticar tuAWSrequiere que cree y configure unAWS Identity and Access Management(IAM)y adjunte las políticas de IAM adecuadas para el rol, de modo que el proveedor de credenciales pueda asumir el rol en su nombre. Para obtener más información acerca deAWS IoT Coree IAM, véaseIdentity and Access Management en AWS IoT.

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


                AWS IoT CoreFlujo de trabajo de proveedor de credenciales de .
  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 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 utiliza el token de seguridad para firmar unAWSsolicite conAWSSignature 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 cadaAWSservicio al que desea llamar, asocie 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 unAWSservicio, añade el proveedor de credencialescredentials-iot:ThingNameycredentials-iot:ThingTypeNamecomo variables de contexto del 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 a AWS IoT Core el rol que se acaba de crear. La siguiente política da ambosiam:GetRoleyiam:PassRolepermisos para unAWSusuario. El permiso iam:GetRole permite al usuario obtener información acerca del rol que acaba de crear. Laiam:PassRolepermite al usuario transmitir el rol a otroAWSservicioservicio

    { "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. Crear un alias de rol de AWS IoT Core. El dispositivo que va a realizar llamadas directas aAWSLos servicios deben saber qué ARN de rol usar cuando se conecta aAWS 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 3,600 segundos (1 hora).

    nota

    LaAWS IoT CoreEl proveedor de credenciales puede emitir una credencial con una vida útil 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 almacenando la credencial durante más tiempo.

    LacredentialDurationSecondsdebe ser menor o igual que la duración máxima de sesión del rol de IAM que hace referencia el alias de rol.

    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:

    • 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. Utilice el mismo certificado y clave privada utilizados cuando registró su certificado con AWS IoT Core.

      Para asegurarse de que un dispositivo se comunica con AWS IoT Core (y no con un servicio que lo suplante), consulte Autenticación del servidor, siga los enlaces para descargar los certificados de entidad de certificación apropiados y, a continuación, cópielos en el dispositivo.

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

    • ThingName: El nombre de objeto que creó cuando registró suAWS IoT Corecosa. 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.

      nota

      LaThingNameque proporcionas enx-amzn-iot-thingnamedebe coincidir con el nombre de laAWS IoTRecurso de cosa asignado a un certificado. Si no coincide, se devuelve un error 403.

    Ejecute el siguiente comando en laAWS CLIpara obtener el punto de enlace del proveedor de credenciales para suCuenta 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 elaccessKeyId,secretAccessKey, ysessionTokenvalores a los que firmar las solicitudesAWSServicios de . Para un end-to-end demostración, véaseCómo eliminar la necesidad de codificar de forma rígidaAWSCredenciales en dispositivos mediante elAWS IoTProveedor de credencialesEntrada del blog en laAWSBlog de seguridad.