Protegendo seu AWS API Gateway com authorizers

No artigo sobre o encurtador de url, configuramos o API Gateway pra servir como backend chamando uma função do AWS Lambda. O que não foi explicado no artigo, foi como fazer a segurança da API, pois conforme desenvolvemos, qualquer pessoa que conheça a URL, poderia utiliza-la.

O desenvolvimento desta camada de segurança consiste na criação de uma função lambda que vai funcionar como authorizer. Este conceito dentro do API Gateway refere-se a uma validação de segurança que será chamada assim que a requisição foi recebida pelo API Gateway. Caso a chamada não seja autorizada, a função url-shrink nem será chamada.

O gráfico abaixo demonstra esse comportamento

Caso tenha duvida na criação da função lambda ou do uso do api gateway, sugiro dar uma segurada e olhar o artigo sobre encurtamento de URL que explico sobre o uso de diversos serviços da AWS

Lambda Function

A criação do authorizer começa criando o código de autorização que será uma lambda function. Acesse o serviço de lambda function da AWS e crie uma nova função vazia.

O seu authorizer não precisa ser uma função lambda, pode ser utilizado o AWS Cognito também, mas isso é assunto para outro artigo.

Abaixo está o código da função para construção do authorizer utilizando nodeJS

[cc lang=”javascript”]
var key = “89cf5646c51e64ba2c1495bcce54f4dd”

exports.handler = function(event, context, callback) {
switch (event.authorizationToken) {
case key:
callback(null, generatePolicy(‘url-shrink’, ‘Allow’, event.methodArn));
break;
default:
callback(“Unauthorized”);
}
};

var generatePolicy = function(principalId, effect, resource) {
var authResponse = {};

authResponse.principalId = principalId;

if (effect && resource) {
var policyDocument = {};
policyDocument.Version = ‘2012-10-17’;
policyDocument.Statement = [];
var statementOne = {};
statementOne.Action = ‘execute-api:Invoke’;
statementOne.Effect = effect;
statementOne.Resource = resource;
policyDocument.Statement[0] = statementOne;
authResponse.policyDocument = policyDocument;
}

// Optional output with custom properties of the String, Number or Boolean type.
authResponse.context = {
“auth-status”: “allowed”
};

return authResponse;
}
[/cc]

O intuito do artigo não é explicar passo a passo o código em nodeJS, mas é necessario entender a logica desta função:

  • na primeira linha informamos a chave que será utilizada como token. Neste artigo, a chave está fixa no código, você pode utilizar uma variável de ambiente lambda ou obter esse token de qualquer lugar que achar melhor, mas como trata-se de algo bem simples, vamos manter assim.
  • na terceira linha, temos a função principal, que busca no header o valor da propriedade authorizationToken e verifica se o valor informado é igual ao valor da chave informada na primeira linha
  • caso o token informado seja diferente, é retornado Unauthorized, que é o código http 401. Caso tudo esteja certo, é gerada uma policy da AWS e ela é retornada ao API gateway com as informações do que o usuário possui acesso.
  • a chamada a função generatePolicy possui 3 argumentos, referente ao principalID que será o nome da politica que você quiser atribuir, um efeito, que no nosso caso é o Allow, que permite que uma ação seja executada e o ARN que informa o objeto que está recebendo a politica. No código acima, o ARN é o valor recebido pela própria requisição (event.methodArn)

Testando a função

Antes de configurar o API Gateway, vamos testar a função. No menu superior do lambda, existem 5 botões e uma caixa de seleção de modelo de teste. Clique na caixa de seleção e selecione a opção configure test events

Vamos criar um JSON e submete-lo a função lambda que acabamos de criar. Este JSON será igual ao payload enviado pelo API Gateway. Informe o nome desejado, em event template selecione Amazon API Gateway authorizer e clique em create.

Não esqueça de modificar o valor de authorizationToken para o valor da chave que você informou na função url-shrink-authorizer

Clique em Test e o resultado será apresentado

API GATEWAY

Acesse a API criada no artigo encurtador de URL com o nome url-shortener. No menu da esquerda, selecione a opção Authorizers e clique em Create new Authorizer. 

preencha o authorizer conforme a imagem acima. Informe o nome de url-short-authorizer, selecione a lambda function que criamos url-short-authorizer e em token source informe o nome do header que usamos para enviar o token: authorizationToken.

Apos a confirmação, será exibida a mensagem abaixo, clique em Grant & Create.

O authorizer já está criado, você pode testa-lo clicando em Test.

agora você já pode associa-lo as chamadas de API que você quer aplicar este método de segurança. Vamos segurar a chamada ao encurtador de URL, que é o nosso método POST.

Clique no método POST e selecione Method Request. Nas opções de authorization, informe o authorizer que acabamos de criar.

é isso ai pessoal! qualquer dúvida e sugestão só colocar nos comentários aqui embaixo.

Related Posts

Expurgo de dados AWS DynamoDB – Time to Live
WebCrawler com nodeJS e Cheerio
AWS Experience: Encurtador de URL
× Como posso te ajudar?