Assinatura de uma solicitação HTTP
O Amazon Redshift exige que todas as solicitações que você envia para a API de gerenciamento sejam autenticadas com uma assinatura. Este tópico explica como assinar suas solicitações.
Se você estiver usando um dos Kits de Desenvolvimento de Software (SDKs) da AWS ou a AWS Command Line Interface, a assinatura da solicitação é tratada automaticamente e você pode pular esta seção. Para obter mais informações sobre como usar os SDKs da AWS, consulte Usando as interfaces de gerenciamento do Amazon Redshift. Para obter mais informações sobre como usar a interface da linha de comando do Amazon Redshift, acesse Referência da linha de comando do Amazon Redshift.
Para assinar uma solicitação, calcule uma assinatura digital usando a função de hash criptográfico. Um hash criptográfico é uma função que retorna um valor de hash exclusivo que é baseado na entrada. A entrada da função de hash inclui o texto da solicitação e a chave de acesso secreta. A função de hash retorna um valor de hash que você inclui na solicitação como sua assinatura. A assinatura é parte do cabeçalho Authorization
de sua solicitação.
Para acesso à API, é necessário ter um ID de chave de acesso e uma chave de acesso secreta. Use as chaves de acesso dedo usuário do IAM em vez das chaves de acesso dedo usuário raiz da Conta da AWS. Para obter mais informações sobre a criação de chaves de acesso, consulte Gerenciar chaves de acesso para usuários do IAM no Guia do usuário do IAM.
Depois que o Amazon Redshift recebe a solicitação, ele recalcula a assinatura usando a mesma função de hash e a mesma entrada que você usou para assinar a solicitação. Se a assinatura resultante corresponde à assinatura na solicitação, o Amazon Redshift processa a solicitação; caso contrário, a solicitação é rejeitada.
O Amazon Redshift oferece suporte à autenticação usando a assinatura versão 4 da AWS. O processo para cálculo de uma assinatura é composto de três tarefas. Essas tarefas são ilustradas no exemplo a seguir.
-
Tarefa 1: Criar uma solicitação canônica
Reorganize sua solicitação HTTP em um formato canônico. O uso de um formulário canônico é necessário porque o Amazon Redshift usa o mesmo formulário canônico para calcular a assinatura que compara com a que você enviou.
-
Tarefa 2: Criar uma string para assinar
Crie uma string que será usada como um dos valores de entrada para sua função hash criptográfica. A string, chamada string-to-sign, é uma concatenação do nome do algoritmo hash, da data da solicitação, de uma string do escopo da credencial e da solicitação canonizada da tarefa anterior. A string do escopo credencial em si é uma concatenação da data, da região e de informações do serviço.
-
Tarefa 3: Criar uma assinatura
Crie uma assinatura para sua solicitação usando uma função hash criptográfica que aceite duas strings de entrada, sua string-to-sign e uma chave derivada. A chave derivada é calculada começando com sua chave de acesso secreta e usando a string do escopo da credencial para criar uma série de códigos de autenticação de mensagem baseados em hash (HMAC-SHA256).
Exemplo de cálculo de assinatura
O exemplo a seguir mostra os detalhes da criação de uma assinatura para a solicitação CreateCluster. Você pode usar este exemplo como uma referência para verificar seu próprio método de cálculo de assinatura. Outros cálculos de referência estão incluídos no Pacote de testes do Signature versão 4 do Glossário da Amazon Web Services.
Você pode usar uma solicitação GET ou POST para enviar solicitações ao Amazon Redshift. A diferença entre as duas é que, para a solicitação GET, seus parâmetros são enviados como parâmetros de string de consulta. Para a solicitação POST, eles são incluídos no corpo da solicitação. O exemplo abaixo mostra uma solicitação POST.
O exemplo supõe o seguinte:
-
O timestamp da solicitação é
Fri, 07 Dec 2012 00:00:00 GMT
. -
O endpoint é a região Leste dos EUA (Norte da Virgínia),
us-east-1
.
A sintaxe geral da solicitação é:
https://redshift.us-east-1.amazonaws.com/ ?Action=CreateCluster &ClusterIdentifier=examplecluster &MasterUsername=masteruser &MasterUserPassword=12345678Aa &NumberOfNode=2 &NodeType=ds2.xlarge &Version=2012-12-01 &x-amz-algorithm=AWS4-HMAC-SHA256 &x-amz-credential=AKIAIOSFODNN7EXAMPLE/20121207/us-east-1/redshift/aws4_request &x-amz-date=20121207T000000Z &x-amz-signedheaders=content-type;host;x-amz-date
O formato canônico da solicitação calculada para Tarefa 1: Crie uma solicitação canônica é:
POST / content-type:application/x-www-form-urlencoded; charset=utf-8 host:redshift.us-east-1.amazonaws.com x-amz-date:20121207T000000Z content-type;host;x-amz-date 55141b5d2aff6042ccd9d2af808fdf95ac78255e25b823d2dbd720226de1625d
A última linha da solicitação canônica é o hash do corpo da solicitação. A terceira linha na solicitação canônica está vazia, pois não há parâmetros de consulta para esta API.
A string-to-sign para Tarefa 2: Crie uma string-to-sign é:
AWS4-HMAC-SHA256 20121207T000000Z 20121207/us-east-1/redshift/aws4_request 06b6bef4f4f060a5558b60c627cc6c5b5b5a959b9902b5ac2187be80cbac0714
A primeira linha da string-to-sign é o algoritmo, a segunda linha é a time stamp, a terceira linha é o escopo da credencial e a última linha é o hash da solicitação canônica da Tarefa 1: Crie uma solicitação canônica. O nome do serviço a usar no escopo da credencial é redshift
.
Para a Tarefa 3: Crie uma assinatura, a chave derivada pode ser representada como:
derived key = HMAC(HMAC(HMAC(HMAC("AWS4" + YourSecretAccessKey,"20121207"),"us-east-1"),"redshift"),"aws4_request")
A chave derivada é calculada como uma série de funções de hash. Partindo de instrução interna de HMAC na fórmula acima, você concatena a frase AWS4
com sua chave de acesso secreta e a utiliza como a chave para fazer hash dos dados “us-east-1”. O resultado desse hash se torna a chave para a próxima função de hash.
Após o cálculo da chave derivada, você a utiliza em uma função de hash que aceita duas strings de entrada, a sua string-to-sign e a chave derivada. Por exemplo, se você usar a chave de acesso secreta wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
e a string-to-sign fornecida anteriormente, a assinatura calculada será como se segue:
9a6b557aa9f38dea83d9215d8f0eae54100877f3e0735d38498d7ae489117920
A etapa final é construir o cabeçalho Authorization
. Para a chave de acesso de demonstração AKIAIOSFODNN7EXAMPLE
, o cabeçalho (com quebras de linha adicionadas por motivo de legibilidade) é:
Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20121207/us-east-1/redshift/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=9a6b557aa9f38dea83d9215d8f0eae54100877f3e0735d38498d7ae489117920