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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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;
}

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.

Sobre Cateno Viglio Junior 19 Artigos
Carioca, arquiteto de software e entusiasta de tecnologia. Trabalho com java a 15 anos e atualmente coordeno uma área de inovação numa empresa do Rio de Janeiro. Sou fundador do codechain e participo de outras iniciativas por ai :).

Seja o primeiro a comentar

Faça um comentário

Seu e-mail não será divulgado.


*