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

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

Установка на Debian/Ubuntu

Эти документы относятся к пакету APT nginx-module-aws-auth, предоставляемому репозиторием GetPageSpeed Extras.

  1. Настройте APT-репозиторий, как описано в настройке APT-репозитория.
  2. Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-aws-auth
Показать дистрибутивы и архитектуры
| Дистрибутив | Версия            | Компонент   | Архитектуры   |
|-------------|-------------------|-------------|----------------|
| debian      | bookworm          | main        | amd64, arm64   |
| debian      | bookworm-mainline | main        | amd64, arm64   |
| debian      | trixie            | main        | amd64, arm64   |
| debian      | trixie-mainline   | main        | amd64, arm64   |
| ubuntu      | focal             | main        | amd64, arm64   |
| ubuntu      | focal-mainline    | main        | amd64, arm64   |
| ubuntu      | jammy             | main        | amd64, arm64   |
| ubuntu      | jammy-mainline    | main        | amd64, arm64   |
| ubuntu      | noble             | main        | amd64, arm64   |
| ubuntu      | noble-mainline    | main        | amd64, arm64   |

Чат в Gitter

Этот модуль 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]

Генерирует подписанный ключ AWS S3 в его закодированном в base64 формате

optional arguments:
  -h, --help            показать это сообщение и выйти
  -k SECRET_KEY, --secret-key SECRET_KEY
                        Секретный ключ, сгенерированный с помощью AWS IAM. Не путайте
                        это с идентификатором доступа
  -r REGION, --region REGION
                        AWS регион, где будет использоваться этот ключ. Пример:
                        us-east-1
  -s SERVICE, --service SERVICE
                        AWS сервис, для которого будет использоваться этот ключ.
                        Пример: s3
  -d DATE, --date DATE  Дата, на которую этот ключ генерируется в формате yyyymmdd
                        format
  --no-base64           Отключает вывод в формате base64 закодированной строки. Это НЕ
                        рекомендуется
  -v, --verbose         Производит подробный вывод на 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. Это связано с тем, что подписание тела запроса является сложным и еще не было реализовано.