Перейти к содержанию

aws-auth: NGINX модуль для проксирования к аутентифицированным AWS сервисам

Установка

Вы можете установить этот модуль в любой дистрибутив, основанный на RHEL, включая, но не ограничиваясь:

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

Включите модуль, добавив следующее в начало файла /etc/nginx/nginx.conf:

load_module modules/ngx_http_aws_auth_module.so;

Этот документ описывает nginx-module-aws-auth v2.1.1, выпущенный 6 марта 2017 года.


Gitter chat

Этот модуль nginx может проксировать запросы к аутентифицированным S3 бэкендам, используя API аутентификации V4 от Amazon. Первая версия этого модуля была написана для протокола аутентификации V2 и доступна в ветке AuthV2.

Пример использования

Реализует проксирование аутентифицированных запросов к S3.

  server {
    listen     8000;

    aws_access_key your_aws_access_key; # Пример AKIDEXAMPLE
    aws_key_scope scope_of_generated_signing_key; # Пример 20150830/us-east-1/service/aws4_request
    aws_signing_key signing_key_generated_using_script; # Пример L4vRLWAO92X5L3Sqk5QydUSdB0nC9+1wfqLMOKLbRp4=
    aws_s3_bucket your_s3_bucket;

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

    # Это пример, который не использует корень сервера для корня прокси
    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;
    }

    # Это пример, который использует конкретную конечную точку s3, по умолчанию конечная точка - 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;
    }
  }

Соображения по безопасности

Протокол V4 не требует доступа к фактическим секретным ключам, которые можно получить из сервиса IAM. Правильный способ использования IAM ключа - это фактически сгенерировать ключ подписи с областью действия и использовать этот ключ подписи для доступа к S3. Этот модуль nginx требует ключ подписи, а не фактический секретный ключ. Хранение секретного ключа на вашем сервере nginx является небезопасной практикой.

Обратите внимание, что ключи подписи имеют срок действия всего одну неделю. Поэтому их необходимо постоянно обновлять. Пожалуйста, используйте вашу любимую систему управления конфигурацией, такую как saltstack, puppet, chef и т.д., чтобы распределить ключи подписи по вашим кластерам nginx. Не забудьте выполнить HUP сервера после размещения нового ключа подписи, так как nginx читает конфигурацию только при запуске.

Предоставлен отдельный скрипт на Python для генерации ключа подписи:

./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

Известные ограничения

Версия 2.x модуля в настоящее время поддерживает только вызовы GET и HEAD. Это связано с тем, что подпись тела запроса является сложной и еще не была реализована.

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-aws-auth.