Saltar a contenido

aws-auth: Módulo NGINX para hacer proxy a servicios autenticados de AWS

Instalación

Puedes instalar este módulo en cualquier distribución basada en RHEL, incluyendo, pero no limitado a:

  • RedHat Enterprise Linux 7, 8, 9 y 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 y 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

Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:

load_module modules/ngx_http_aws_auth_module.so;

Este documento describe nginx-module-aws-auth v2.1.1 lanzado el 06 de marzo de 2017.


Gitter chat

Este módulo de nginx puede hacer proxy a solicitudes a backends S3 autenticados utilizando la API de autenticación V4 de Amazon. La primera versión de este módulo fue escrita para el protocolo de autenticación V2 y se puede encontrar en la rama AuthV2.

Ejemplo de uso

Implementa el proxy de solicitudes autenticadas a S3.

  server {
    listen     8000;

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

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

    # Este es un ejemplo que no utiliza la raíz del servidor para la raíz del 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 es un ejemplo que utiliza un endpoint específico de s3, el endpoint por defecto es 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;
    }
  }

Consideraciones de seguridad

El protocolo V4 no necesita acceso a las claves secretas reales que se obtienen del servicio IAM. La forma correcta de usar la clave IAM es generar una clave de firma con alcance y usar esta clave de firma para acceder a S3. Este módulo de nginx requiere la clave de firma y no la clave secreta real. Es una práctica insegura permitir que la clave secreta resida en tu servidor nginx.

Ten en cuenta que las claves de firma tienen una validez de solo una semana. Por lo tanto, necesitan ser refrescadas constantemente. Por favor, utiliza tu sistema de gestión de configuración favorito como saltstack, puppet, chef, etc., para distribuir las claves de firma a tus clústeres de nginx. No olvides hacer HUP al servidor después de colocar la nueva clave de firma, ya que nginx lee la configuración solo al inicio.

Se ha proporcionado un script de Python independiente para generar la clave de firma

./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
                        La clave secreta generada usando AWS IAM. No confundir
                        esto con el ID de clave de acceso
  -r REGION, --region REGION
                        La región de AWS donde se utilizaría esta clave. Ejemplo:
                        us-east-1
  -s SERVICE, --service SERVICE
                        El servicio de AWS para el cual se utilizaría esta clave.
                        Ejemplo: s3
  -d DATE, --date DATE  La fecha en la que se genera esta clave en formato yyyymmdd

  --no-base64           Deshabilitar la salida como una cadena codificada en base64. Esto NO
                        es recomendado
  -v, --verbose         Producir salida detallada en stderr


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

Limitaciones conocidas

La versión 2.x del módulo actualmente solo tiene soporte para llamadas GET y HEAD. Esto se debe a que firmar el cuerpo de la solicitud es complejo y aún no se ha implementado.

GitHub

Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-aws-auth.