跳转至

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,于 2017 年 3 月 6 日发布。


Gitter chat

此 nginx 模块可以使用 Amazon 的 V4 身份验证 API 代理请求到经过身份验证的 S3 后端。此模块的第一个版本是为 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 编码形式

可选参数:
  -h, --help            显示此帮助信息并退出
  -k SECRET_KEY, --secret-key SECRET_KEY
                        使用 AWS IAM 生成的密钥。不要将其与访问密钥 ID 混淆
  -r REGION, --region REGION
                        此密钥将使用的 AWS 区域。例如:
                        us-east-1
  -s SERVICE, --service SERVICE
                        此密钥将使用的 AWS 服务。
                        示例:s3
  -d DATE, --date DATE  以 yyyymmdd 格式生成此密钥的日期
  --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 调用。这是因为签名请求体比较复杂,尚未实现。

GitHub

您可以在 nginx-module-aws-auth 的 GitHub 仓库 中找到此模块的其他配置提示和文档。