Autenticação personalizada com certificados de cliente X.509 - AWS IoT Core

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Autenticação personalizada com certificados de cliente X.509

Ao conectar dispositivos a AWS IoT Core, você tem vários tipos de autenticação disponíveis. Você pode usar certificados de cliente X.509 que podem ser usados para autenticar conexões de clientes e dispositivos ou definir autorizadores personalizados para gerenciar sua própria lógica de autenticação e autorização de clientes. Este tópico aborda como usar a autenticação personalizada com certificados de cliente X.509.

Usar a autenticação personalizada com certificados X.509 pode ser útil se você já autenticou seus dispositivos usando certificados X.509 e quer realizar validação adicional e autorização personalizada. Por exemplo, se você armazenar os dados de seus dispositivos, como seus números de série, no certificado do cliente X.509, depois de AWS IoT Core autenticar o certificado do cliente X.509, poderá usar um autorizador personalizado para identificar dispositivos específicos com base nas informações armazenadas no campo do certificado. CommonName O uso da autenticação personalizada com certificados X.509 pode aprimorar o gerenciamento da segurança do dispositivo ao conectar dispositivos AWS IoT Core e fornecer mais flexibilidade para gerenciar a lógica de autenticação e autorização. AWS IoT Core suporta autenticação personalizada com certificados X.509 usando o certificado X.509 e o tipo de autenticação de autorizador personalizado, que funciona com o protocolo MQTT e o protocolo HTTPS. Para obter mais informações sobre os tipos de autenticação e os protocolos de aplicativos compatíveis com os endpoints do dispositivo do AWS IoT Core , consulte Protocolos de comunicação do dispositivo.

nota

A autenticação personalizada com certificados de cliente X.509 não é suportada nas AWS GovCloud (US) regiões.

Importante

Você deve usar um endpoint criado usando configurações de domínio. Além disso, os clientes devem fornecer a extensão de Indicação de Nome do Servidor (SNI) ao se conectarem a. AWS IoT Core

Etapa 1: registre seus certificados de cliente X.509 com AWS IoT Core

Se você ainda não fez isso, registre e ative seus certificados de cliente X.509 com. AWS IoT Core Caso contrário, vá para a próxima etapa.

Para registrar e ativar seus certificados de cliente com AWS IoT Core, siga as etapas:

  1. Se você criar certificados de cliente diretamente com AWS IoT. Esses certificados de cliente serão registrados automaticamente com AWS IoT Core.

  2. Se você criar seus próprios certificados de cliente, siga estas instruções para registrá-los AWS IoT Core.

  3. Para ativar seus certificados de cliente, siga estas instruções.

Etapa 2: Criar uma função do Lambda

AWS IoT Core usa autorizadores personalizados para implementar esquemas personalizados de autenticação e autorização. Um autorizador personalizado está associado a uma função do Lambda que determina se um dispositivo está autenticado e quais operações o dispositivo tem permissão para realizar. Quando um dispositivo se conecta AWS IoT Core, AWS IoT Core recupera os detalhes do autorizador, incluindo o nome do autorizador e a função Lambda associada, e invoca a função Lambda. A função do Lambda recebe um evento que contém um objeto JSON com os dados do certificado do cliente X.509 do dispositivo. Sua função do Lambda usa esse objeto JSON do evento para avaliar a solicitação de autenticação, decidir as ações a serem tomadas e enviar uma resposta de volta.

Exemplo de evento da função do Lambda

O objeto JSON de exemplo a seguir contém todos os campos possíveis que podem ser incluídos. O objeto JSON real conterá apenas campos relevantes para a solicitação de conexão específica.

{ "token": "aToken", "signatureVerified": true, "protocols": [ "tls", "mqtt" ], "protocolData": { "tls": { "serverName": "serverName", "x509CertificatePem": "x509CertificatePem", "principalId": "principalId" }, "mqtt": { "clientId": "myClientId", "username": "myUserName", "password": "myPassword" } }, "connectionMetadata": { "id": "UUID" } }
signatureVerified

Um valor booliano que indica se a assinatura do token configurada no autorizador foi verificada ou não antes de invocar a função do Lambda do autorizador. Se o autorizador estiver configurado para desativar a assinatura do token, esse campo será falso.

protocols

Uma matriz que contém os protocolos esperados da solicitação.

protocolData

Um objeto que contém informações dos protocolos usados na conexão. Ele dá detalhes específicos do protocolo que podem ser úteis para autenticação, autorização e muito mais.

tls: este objeto contém informações relacionadas ao protocolo TLS (Transport Layer Security).

  • serverName: a string de nome de host Indicação de nome de servidor (SNI). O AWS IoT Core requer que os dispositivos enviem a extensão SNI para o protocolo Transport Layer Security (TLS) e forneçam o endereço completo do endpoint no campo host_name.

  • x509CertificatePem: o certificado X.509 no formato PEM, usado para autenticação do cliente na conexão TLS.

  • principalId: o identificador da entidade principal associado ao cliente na conexão TLS.

mqtt- Este objeto contém informações relacionadas ao protocolo MQTT.

  • clientId: uma string só precisa ser incluída no caso de o dispositivo enviar esse valor.

  • username: o nome de usuário fornecido no pacote MQTT Connect.

  • password: a senha fornecida no pacote MQTT Connect.

connectionMetadata

Metadados da conexão.

id: o ID da conexão, que você pode usar para registrar em log e solucionar problemas.

nota

Neste objeto JSON do evento, x509CertificatePem e principalId são dois novos campos na solicitação. O valor de principalId é igual ao valor de certificateId. Para obter mais informações, consulte Certificado.

Exemplo de resposta da função do Lambda

A função do Lambda deve usar informações do objeto JSON do evento para autenticar a conexão de entrada e decidir quais ações são permitidas na conexão.

O objeto JSON a seguir contém um exemplo de resposta que sua função do Lambda pode enviar.

{ "isAuthenticated": true, "principalId": "xxxxxxxx", "disconnectAfterInSeconds": 86400, "refreshAfterInSeconds": 300, "policyDocuments": [ { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Publish", "Resource": "arn:aws:iot:us-east-1:123456789012:topic/customauthtesting" } ] } ] }

Neste exemplo, essa função deve enviar uma resposta que contenha os valores a seguir.

isAuthenticated

Um valor booliano que indica se a solicitação foi autenticada.

principalId

Uma sequência alfanumérica que atua como um identificador para o token enviado pela solicitação de autorização personalizada. O valor deve ser uma sequência alfanumérica com pelo menos um e não mais que 128 caracteres. Ele identifica a conexão nos logs. O valor de principalId deve ser igual ao valor de principalId no objeto JSON do evento (ou seja, certificateID do certificado X.509).

policyDocuments

Uma lista de documentos de políticas formatados em JSON AWS IoT Core . O valor é opcional e dá suporte a variáveis de política de objeto e variáveis de política de certificado. O número máximo de documentos de política é de 10. Cada documento de política pode ter, no máximo, 2.048 caracteres. Se você tiver várias políticas anexadas ao certificado de cliente e à função do Lambda, a permissão é uma coleção de todas as políticas. Para obter mais informações sobre a criação de AWS IoT Core políticas, consulte Políticas.

disconnectAfterInSeconds

Um número inteiro que especifica a duração máxima (em segundos) da conexão com o AWS IoT Core gateway. O valor mínimo é de 300 segundos e o valor máximo é de 86.400 segundos. disconnectAfterInSeconds é válido durante a vida útil de uma conexão e não é atualizado em atualizações consecutivas de políticas.

refreshAfterInSeconds

Um número inteiro que especifica o intervalo entre as atualizações da política. Quando esse intervalo passa, AWS IoT Core invoca a função Lambda para permitir atualizações de políticas. O valor mínimo é de 300 segundos e o valor máximo é de 86.400 segundos.

Exemplo de função do Lambda

A seguir está um exemplo de uma função do Lambda do Node.js. A função examina o certificado X.509 do cliente e extrai informações relevantes, como o número de série, a impressão digital e o nome do assunto. Se as informações extraídas corresponderem aos valores esperados, o cliente terá acesso para se conectar. Esse mecanismo garante que apenas clientes autorizados com certificados válidos possam estabelecer uma conexão.

const crypto = require('crypto'); exports.handler = async (event) => { // Extract the certificate PEM from the event const certPem = event.protocolData.tls.x509CertificatePem; // Parse the certificate using Node's crypto module const cert = new crypto.X509Certificate(certPem); var effect = "Deny"; // Allow permissions only for a particular certificate serial, fingerprint, and subject if (cert.serialNumber === "7F8D2E4B9C1A5036DE8F7C4B2A91E5D80463BC9A1257" // This is a random serial && cert.fingerprint === "F2:9A:C4:1D:B5:E7:08:3F:6B:D0:4E:92:A7:C1:5B:8D:16:0F:E3:7A" // This is a random fingerprint && cert.subject === "allow.example.com") { effect = "Allow"; } return generateAuthResponse(event.protocolData.tls.principalId, effect); }; // Helper function to generate the authorization response. function generateAuthResponse(principalId, effect) { const authResponse = { isAuthenticated: true, principalId, disconnectAfterInSeconds: 3600, refreshAfterInSeconds: 300, policyDocuments: [ { Version: "2012-10-17", Statement: [ { Action: ["iot:Connect"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:client/myClientName" ] }, { Action: ["iot:Publish"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" ] }, { Action: ["iot:Subscribe"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName" ] }, { Action: ["iot:Receive"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" ] } ] } ] }; return authResponse; }

A função do Lambda anterior retorna o JSON a seguir ao receber um certificado com o número de série, a impressão digital e o assunto esperados. O valor de x509CertificatePem será o certificado do cliente fornecido no handshake TLS. Para obter mais informações, consulte Definir sua função do Lambda.

{ "isAuthenticated": true, "principalId": "principalId in the event JSON object", "policyDocuments": [ { "Version": "2012-10-17", "Statement": [ { "Action": "iot:Connect", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:client/myClientName" }, { "Action": "iot:Publish", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" }, { "Action": "iot:Subscribe", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName" }, { "Action": "iot:Receive", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" } ] } ], "disconnectAfterInSeconds": 3600, "refreshAfterInSeconds": 300 }

Etapa 3: criar um autorizador personalizado

Depois de você definir a função do Lambda, crie um autorizador personalizado para gerenciar sua própria lógica de autenticação e autorização do cliente. É possível seguir as instruções detalhadas na Etapa 3: criar um recurso de autorizador de cliente e sua autorização. Para obter mais informações, consulte Criar um autorizador.

No processo de criação do autorizador personalizado, você deve conceder a permissão do AWS IoT para invocar a função do Lambda após sua criação. Para obter instruções detalhadas, consulte Autorização AWS IoT para invocar sua função Lambda.

Etapa 4: definir o tipo de autenticação e o protocolo de aplicativo em uma configuração de domínio

Para autenticar dispositivos usando autenticação personalizada com certificados de cliente X.509, você deve definir o tipo de autenticação e o protocolo de aplicativo em uma configuração de domínio e enviar a extensão SNI. O valor de authenticationType deve ser CUSTOM_AUTH_X509 e o valor de applicationProtocol pode ser SECURE_MQTT ou HTTPS.

Definir o tipo de autenticação e o protocolo de aplicativo em uma configuração de domínio (CLI)

Se você não tiver uma configuração de domínio, use o comando create-domain-configuration para criar uma. O valor de authenticationType deve ser CUSTOM_AUTH_X509 e o valor de applicationProtocol pode ser SECURE_MQTT ou HTTPS.

aws iot create-domain-configuration \ --domain-configuration-name domainConfigurationName \ --authentication-type CUSTOM_AUTH_X509 \ --application-protocol SECURE_MQTT \ --authorizer-config '{ "defaultAuthorizerName": my-custom-authorizer }'

Se você já tiver uma configuração de domínio, use o comando update-domain-configuration e atualize authenticationType e applicationProtocol, se necessário. Observe que não é possível alterar o tipo de autenticação ou o protocolo no endpoint padrão (iot:Data-ATS).

aws iot update-domain-configuration \ --domain-configuration-name domainConfigurationName \ --authentication-type CUSTOM_AUTH_X509 \ --application-protocol SECURE_MQTT \ --authorizer-config '{ "defaultAuthorizerName": my-custom-authorizer }'
domain-configuration-name

O nome da configuração do domínio.

authentication-type

O tipo de autenticação da configuração do domínio. Para obter mais informações, consulte Escolher um tipo de autenticação.

application-protocol

O protocolo de aplicativo que os dispositivos usam para se comunicar com o AWS IoT Core. Para obter mais informações, consulte Escolhendo um protocolo de aplicativo.

--authorizer-config

Um objeto que especifica a configuração do autorizador em uma configuração de domínio.

defaultAuthorizerName

O nome do autorizador para uma configuração de domínio.

Para obter mais informações, consulte CreateDomainConfiguratione a UpdateDomainConfigurationpartir da Referência AWS IoT da API. Para obter mais informações sobre configuração de domínio, consulte Configurações de domínio.