Zum Inhalt

aws-auth: NGINX-Modul zum Proxying zu authentifizierten AWS-Diensten

Installation

Sie können dieses Modul in jeder RHEL-basierten Distribution installieren, einschließlich, aber nicht beschränkt auf:

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

Aktivieren Sie das Modul, indem Sie Folgendes an den Anfang von /etc/nginx/nginx.conf hinzufügen:

load_module modules/ngx_http_aws_auth_module.so;

Dieses Dokument beschreibt nginx-module-aws-auth v2.1.1, veröffentlicht am 06. März 2017.


Gitter chat

Dieses NGINX-Modul kann Anfragen an authentifizierte S3-Backends über Amazons V4-Authentifizierungs-API proxyen. Die erste Version dieses Moduls wurde für das V2-Authentifizierungsprotokoll geschrieben und ist im AuthV2-Branch zu finden.

Anwendungsbeispiel

Implementiert das Proxying von authentifizierten Anfragen an S3.

  server {
    listen     8000;

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

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

    # Dies ist ein Beispiel, das nicht den Serverstamm für den Proxy-Stamm verwendet
    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;
    }

    # Dies ist ein Beispiel, das einen spezifischen S3-Endpunkt verwendet, der Standardendpunkt ist 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;
    }
  }

Sicherheitsüberlegungen

Das V4-Protokoll benötigt keinen Zugriff auf die tatsächlichen geheimen Schlüssel, die man vom IAM-Dienst erhält. Der richtige Weg, den IAM-Schlüssel zu verwenden, besteht darin, tatsächlich einen scoped signing key zu generieren und diesen signing key zu verwenden, um auf S3 zuzugreifen. Dieses NGINX-Modul benötigt den signing key und nicht den tatsächlichen geheimen Schlüssel. Es ist eine unsichere Praxis, den geheimen Schlüssel auf Ihrem NGINX-Server zu belassen.

Beachten Sie, dass signing keys nur eine Gültigkeit von einer Woche haben. Daher müssen sie ständig aktualisiert werden. Bitte verwenden Sie Ihr bevorzugtes Konfigurationsmanagementsystem wie SaltStack, Puppet, Chef usw., um die signing keys an Ihre NGINX-Cluster zu verteilen. Vergessen Sie nicht, den Server nach dem Platzieren des neuen signing keys mit HUP neu zu laden, da NGINX die Konfiguration nur beim Start liest.

Ein eigenständiges Python-Skript wurde bereitgestellt, um den signing key zu generieren

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

Bekannte Einschränkungen

Die 2.x-Version des Moduls unterstützt derzeit nur GET- und HEAD-Anfragen. Dies liegt daran, dass das Signieren des Anfragekörpers komplex ist und noch nicht implementiert wurde.

GitHub

Sie finden zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-aws-auth.