Autorização de chamadas diretas para serviços da AWS usando o provedor de credenciais do AWS IoT Core
Os dispositivos podem usar certificados X.509 para se conectar ao AWS IoT Core usando protocolos de autenticação mútua TLS. Outros serviços da AWS não são compatíveis com autenticação realizada por meio de certificado, mas podem ser chamados usando credenciais da AWS no formato do AWS Signature versão 4. O algoritmo do Signature versão 4 normalmente exige que o chamador tenha um ID de chave de acesso e uma chave de acesso secreta. O AWS IoT Core tem um provedor de credenciais que permite usar o certificado X.509 integrado como a identidade de dispositivo exclusiva para autenticar solicitações da AWS. Isso elimina a necessidade de armazenar um ID de chave de acesso e uma chave de acesso secreta em seu dispositivo.
O provedor de credenciais autentica um chamador usando um certificado X.509 e emite um token de segurança temporário e de privilégio limitado. Esse token pode ser usado para assinar e autenticar qualquer solicitação da AWS. Essa forma de autenticar solicitações da AWS requer que você crie e configure um perfil do AWS Identity and Access Management (IAM) e anexe políticas do IAM adequadas ao perfil para que o provedor de credenciais possa assumir o perfil em seu nome. Para obter mais informações sobre AWS IoT Core e o IAM, consulte Gerenciamento de identidade e acesso para o AWS IoT.
A AWS IoT requer que os dispositivos enviem a extensão SNI (Server Name Indication)host_name. O campo host_name deve conter o endpoint que você está chamando e deve ser:
-
O
endpointAddressretornado poraws iot describe-endpoint.--endpoint-type iot:CredentialProvider
As conexões tentadas por dispositivos sem o valor host_name correto não funcionarão.
O diagrama a seguir mostra o fluxo de trabalho do provedor de credenciais.
-
O dispositivo do AWS IoT Core faz uma solicitação HTTPS ao provedor de credenciais para receber um token de segurança. A solicitação inclui o dispositivo certificado X.509 para autenticação.
-
O provedor de credenciais encaminha a solicitação ao módulo de autenticação e autorização do AWS IoT Core para validar o certificado e verificar se o dispositivo tem permissão para solicitar o token de segurança.
-
Se o certificado for válido e tiver permissão para solicitar um token de segurança, o módulo de autenticação e autorização do AWS IoT Core retornará uma resposta de êxito. Do contrário, envia uma exceção ao dispositivo.
-
Depois de validar o certificado, o provedor de credenciais chama o AWS Security Token Service (AWS STS) para assumir o perfil do IAM que você criou para ele.
-
AWS STSO retorna um token de segurança temporário e de privilégio limitado para o provedor de credenciais.
-
O provedor de credenciais retorna o token de segurança para o dispositivo.
-
O dispositivo usa o token de segurança para assinar uma solicitação da AWS com o AWS Signature versão 4.
-
O serviço solicitado chama o IAM para validar a assinatura e autorizar a solicitação comparativamente às políticas de acesso anexadas à perfil do IAM que você criou para o provedor de credenciais.
-
Se o IAM validar a assinatura e autorizar a solicitação, a solicitação será concluída com êxito. Do contrário, o IAM envia uma exceção.
A seção a seguir descreve como se deve usar um certificado para obter um token de segurança. Ele é escrito com a suposição de que você já tenha registrado um dispositivo e criado e ativado seu próprio certificado para ele.
Como usar um certificado para obter um token de segurança
-
Configure o perfil do IAM que o provedor de credenciais assume em nome de seu dispositivo. Anexe à função as políticas de confiança a seguir.
Para cada serviço da AWS que você deseja chamar, anexe uma política de acesso ao perfil. O provedor de credenciais comporta as seguintes variáveis de política:
-
credentials-iot:ThingName -
credentials-iot:ThingTypeName -
credentials-iot:AwsCertificateId
Quando o dispositivo fornece o nome do objeto em sua solicitação a um serviço da AWS, o provedor de credenciais adiciona
credentials-iot:ThingNameecredentials-iot:ThingTypeNamecomo variáveis de contexto ao token de segurança. O provedor de credenciais fornececredentials-iot:AwsCertificateIdcomo uma variável de contexto, mesmo que o dispositivo não forneça o nome do objeto na solicitação. Você passa o nome do objeto como o valor do cabeçalho da solicitação HTTPx-amzn-iot-thingname.Essas três variáveis funcionam apenas para políticas do IAM, e não para políticas da AWS IoT Core.
-
-
O usuário que executar a próxima etapa (criar um alias de função) deve ter permissão para transmitir a função recém-criada ao AWS IoT Core. A política a seguir fornece as permissões
iam:GetRoleeiam:PassRolepara um usuário da AWS. A permissãoiam:GetRolepermite que o usuário obtenha informações sobre a função que você acabou de criar. A permissãoiam:PassRolepermite que o usuário transmita o perfil para outro serviço da AWS. -
Crie um alias de função do AWS IoT Core. O dispositivo que fará chamadas diretas para os serviços da AWS deve saber qual ARN de perfil usar ao se conectar ao AWS IoT Core. Fixar o ARN da função no código não é uma boa solução porque isso requer que você atualize o dispositivo toda vez que o ARN da função for alterado. Uma solução mais adequada é usar a API
CreateRoleAliaspara criar um alias de função que aponte para o ARN da função. Se o ARN da função for alterado, basta atualizar o alias da função. Nenhuma alteração é necessária no dispositivo. Essa API usa os seguintes parâmetros:roleAlias-
Obrigatório. Uma string arbitrária que identifica o alias da função. Funciona como chave primária no modelo de dados do alias da função. Contém de 1 a 128 caracteres e deve incluir apenas caracteres alfanuméricos e os símbolos =, @ e -. Caracteres alfabéticos em maiúsculas e minúsculas são permitidos. Os nomes de alias de perfil diferenciam maiúsculas de minúsculas.
roleArn-
Obrigatório. O ARN da função ao qual o alias da função se refere.
credentialDurationSeconds-
Opcional. Por quanto tempo (em segundos) a credencial é válida. O valor mínimo é 900 segundos (15 minutos). O valor máximo é de 43.200 segundos (12 horas). O valor padrão é de 3.600 segundos (uma hora).
Importante
O provedor de credenciais do AWS IoT Core pode emitir uma credencial com uma vida útil máxima de 43.200 segundos (12 horas). Ter a credencial válida por até 12 horas pode ajudar a reduzir o número de chamadas para o provedor de credenciais, armazenando a credencial em cache por mais tempo.
O valor
credentialDurationSecondsdeve ser menor que ou igual à duração máxima da sessão do perfil do IAM à qual o alias do perfil faz referência. Para obter mais informações, consulte Modificar a duração máxima da sessão de um perfil (API da AWS) no Guia do usuário do AWS Identity and Access Management.
Para obter mais informações sobre essa API, consulte CreateRoleAlias.
-
Anexe uma política a um certificado de dispositivo. A política anexada ao certificado do dispositivo deve conceder permissão ao dispositivo para assumir a função. Para isso, conceda permissão para a ação
iot:AssumeRoleWithCertificatedo alias da função, como no exemplo a seguir. -
Faça uma solicitação HTTPS ao provedor de credenciais para receber um token de segurança. Forneça as informações a seguir:
-
Certificado: como se trata de uma solicitação HTTP por meio de autenticação TLS mútua, é necessário fornecer o certificado e a chave privada para o cliente quando estiver fazendo a solicitação. Use o certificado e a chave privada que você usou quando registrou o certificado no AWS IoT Core.
Para garantir que o dispositivo esteja se comunicando com o AWS IoT Core (e não um serviço se passando por ele), consulte Autenticação de servidor, siga os links para fazer download dos certificados CA apropriados e copie-os no dispositivo.
-
RoleAlias: o nome do alias da função que você criou para o provedor de credenciais. Os nomes de alias de função diferenciam maiúsculas de minúsculas e devem corresponder ao alias de função criado no AWS IoT Core.
-
ThingName: o nome do objeto que você criou ao registrar o objeto do AWS IoT Core. Ele é passado como o valor do cabeçalho HTTP
x-amzn-iot-thingname. Esse valor é necessário somente quando você usa atributos de objetos como variáveis de política nas políticas da AWS IoT Core ou do IAM.nota
O ThingName fornecido em
x-amzn-iot-thingnamedeve corresponder ao nome do recurso do objeto de AWS IoT atribuído a um certificado. Se não corresponder, um erro 403 será retornado.
Execute o comando a seguir na AWS CLI para obter o endpoint do provedor de credenciais para sua Conta da AWS. Para obter mais informações sobre essa API, consulte DescribeEndpoint. Para endpoints habilitados para FIPS, consulte AWS IoT Core: endpoints do provedor de credenciais.
aws iot describe-endpoint --endpoint-type iot:CredentialProviderO objeto JSON a seguir é uma saída de exemplo do comando describe-endpoint. Ele contém o
endpointAddressque você usa para solicitar um token de segurança.{ "endpointAddress": "your_aws_account_specific_prefix.credentials.iot.your region.amazonaws.com" }Use o endpoint para fazer uma solicitação HTTPS ao provedor de credenciais para que retorne um token de segurança. O comando de exemplo a seguir usa
curl, mas é possível usar qualquer cliente HTTP.nota
O nome roleAlias diferencia maiúsculas de minúsculas e deve corresponder ao alias de função criado na AWS IoT.
curl --certyour certificate--keyyour private key-H "x-amzn-iot-thingname:your thing name" --cacert AmazonRootCA1.pem https://your endpoint/role-aliases/your role alias/credentialsEsse comando retorna um objeto de token de segurança que contém um
accessKeyId, umasecretAccessKey, umsessionTokene uma expiração. O objeto JSON a seguir é uma saída de exemplo do comandocurl.{"credentials":{"accessKeyId":"access key","secretAccessKey":"secret access key","sessionToken":"session token","expiration":"2018-01-18T09:18:06Z"}}Em seguida, você pode usar os valores
accessKeyId,secretAccessKeyesessionTokena fim de assinar solicitações para os serviços da AWS. Para obter uma demonstração completa, consulte a postagem do blog Como eliminar a necessidade de credenciais da AWS com codificação rígida em dispositivos usando o provedor de credenciais do AWS IoTno Blog de segurança da AWS. -