Pular para conteúdo

aws-auth: Módulo NGINX para proxy para serviços AWS autenticados

Instalação

Você pode instalar este módulo em qualquer distribuição baseada em RHEL, incluindo, mas não se limitando a:

  • RedHat Enterprise Linux 7, 8, 9 e 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 e Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-aws-auth
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-aws-auth

Ative o módulo adicionando o seguinte no topo de /etc/nginx/nginx.conf:

load_module modules/ngx_http_aws_auth_module.so;

Este documento descreve o nginx-module-aws-auth v2.1.1 lançado em 06 de março de 2017.


Gitter chat

Este módulo nginx pode fazer proxy de requisições para backends S3 autenticados usando a API de autenticação V4 da Amazon. A primeira versão deste módulo foi escrita para o protocolo de autenticação V2 e pode ser encontrada no branch AuthV2.

Exemplo de uso

Implementa o proxy de requisições autenticadas para S3.

  server {
    listen     8000;

    aws_access_key your_aws_access_key; # Exemplo AKIDEXAMPLE
    aws_key_scope scope_of_generated_signing_key; #Exemplo 20150830/us-east-1/service/aws4_request
    aws_signing_key signing_key_generated_using_script; #Exemplo L4vRLWAO92X5L3Sqk5QydUSdB0nC9+1wfqLMOKLbRp4=
    aws_s3_bucket your_s3_bucket;

    location / {
      aws_sign;
      proxy_pass http://your_s3_bucket.s3.amazonaws.com;
    }

    # Este é um exemplo que não usa a raiz do servidor para a raiz do proxy
    location /myfiles {

      rewrite /myfiles/(.*) /$1 break;
      proxy_pass http://your_s3_bucket.s3.amazonaws.com/$1;

      aws_access_key your_aws_access_key;
      aws_key_scope scope_of_generated_signing_key;
      aws_signing_key signing_key_generated_using_script;
    }

    # Este é um exemplo que usa um endpoint s3 específico, o endpoint padrão é s3.amazonaws.com
    location /s3_beijing {

      rewrite /s3_beijing/(.*) /$1 break;
      proxy_pass http://your_s3_bucket.s3.cn-north-1.amazonaws.com.cn/$1;

      aws_sign;
      aws_endpoint "s3.cn-north-1.amazonaws.com.cn";
      aws_access_key your_aws_access_key;
      aws_key_scope scope_of_generated_signing_key;
      aws_signing_key signing_key_generated_using_script;
    }
  }

Considerações de segurança

O protocolo V4 não precisa de acesso às chaves secretas reais que se obtém do serviço IAM. A maneira correta de usar a chave IAM é realmente gerar uma chave de assinatura com escopo e usar essa chave de assinatura para acessar o S3. Este módulo nginx requer a chave de assinatura e não a chave secreta real. É uma prática insegura deixar a chave secreta residir em seu servidor nginx.

Note que as chaves de assinatura têm uma validade de apenas uma semana. Portanto, elas precisam ser atualizadas constantemente. Por favor, use seu sistema de gerenciamento de configuração favorito, como saltstack, puppet, chef, etc., para distribuir as chaves de assinatura para seus clusters nginx. Não se esqueça de HUP o servidor após colocar a nova chave de assinatura, pois o nginx lê a configuração apenas no momento da inicialização.

Um script python autônomo foi fornecido para gerar a chave de assinatura

./generate_signing_key -h
usage: generate_signing_key [-h] -k ACCESS_KEY -r REGION [-s SERVICE]
                            [-d DATE] [--no-base64] [-v]

Generate AWS S3 signing key in it's base64 encoded form

optional arguments:
  -h, --help            show this help message and exit
  -k SECRET_KEY, --secret-key SECRET_KEY
                        The secret key generated using AWS IAM. Do not confuse
                        this with the access key id
  -r REGION, --region REGION
                        The AWS region where this key would be used. Example:
                        us-east-1
  -s SERVICE, --service SERVICE
                        The AWS service for which this key would be used.
                        Example: s3
  -d DATE, --date DATE  The date on which this key is generated in yyyymmdd
                        format
  --no-base64           Disable output as a base64 encoded string. This NOT
                        recommended
  -v, --verbose         Produce verbose output on stderr


./generate_signing_key -k wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY -r us-east-1
L4vRLWAO92X5L3Sqk5QydUSdB0nC9+1wfqLMOKLbRp4=
20160902/us-east-1/s3/aws4_request

Limitações conhecidas

A versão 2.x do módulo atualmente suporta apenas chamadas GET e HEAD. Isso ocorre porque assinar o corpo da requisição é complexo e ainda não foi implementado.

GitHub

Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório GitHub do nginx-module-aws-auth.