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 日发布。
此 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 仓库 中找到此模块的其他配置提示和文档。
