容器化 Nginx Plus 无法打开或重命名 Okta JWK 文件

Containerized Nginx Plus is Unable to Open or Rename Okta JWK File

为什么我的 Nginx Plus 实例无法从 Okta 访问 JSON Web 密钥 (JWK) 文件?

这个 Nginx Plus 实例是用 Dockerfile 容器化的,类似于直接来自 Nginx 的 this 官方 Dockerfile.alpine,但有以下区别:

. . .

COPY ["cert.pem", "cert.key", "/"]

. . .

RUN . . .

. . .

        nginx-plus-module-njs \

. . .

RUN ["rm", "/etc/nginx/conf.d/default.conf"]

. . .

COPY ["frontend.conf", "openid_connect.js", "openid_connect.server_conf", "openid_connect_configuration.conf", "/etc/nginx/conf.d/"]

. . .

CMD ["nginx", "-g", "daemon off; load_module modules/ngx_http_js_module.so;"]

frontend.confopenid_connect.jsopenid_connect.server_confopenid_connect_configuration.conf 都是从 nginx-openid-connect 复制过来的,找到 here.

frontend.confopenid_connect.server_confopenid_connect_configuration.conf 都已正确配置,遵循安装过程的 this 部分。

Nginx Plus 已在 Okta 管理控制台中正确配置为 OIDC 应用程序。

当我在新的浏览器会话中输入指向我的容器化 Nginx Plus 实例的静态外部 IP 地址时,我被重定向到 https://$OKTA_DOMAIN_NAME.okta.com 并提示我登录。输入正确的凭据后,我可以在 Nginx Plus 日志中看到以下内容:

. . .
1970/01/01 00:00:01 [alert] 1#1: open() "/etc/nginx/conf.d/oidc_id_tokens.json.tmp" failed (13: Permission denied)
. . .

使用以下 COPY 指令将 oidc_id_tokens.json.tmp 添加到 Dockerfile:

COPY --chown=nginx:nginx ["empty.file", "/etc/nginx/conf.d/oidc_id_tokens.json.tmp"]

在重新部署和另一个登录流程后产生了另一个类似的错误:

. . .
1970/01/01 00:00:01 [crit] 1#1: rename() "/etc/nginx/conf.d/oidc_id_tokens.json.tmp" to "/etc/nginx/conf.d/oidc_id_tokens.json" failed (13: Permission denied)
. . .

如何允许 Nginx Plus 访问 JWK 文件?

在您链接的 nginx-openid-connect 存储库的“疑难解答”header 下,“身份验证成功但浏览器显示太多重定向”下方的最后一个项目符号指示您确保 nginx 用户有权访问 JWK 文件。

不是 指的是 Okta 用户或帐户;这是指您的 Docker 图片中的 nginx 用户。如果你:

docker run \
--entrypoint="" \
--interactive \
--tty \
$NGINX_PLUS_IMAGE_ID \
cat /etc/nginx/nginx.conf

#=>

user  nginx;
. . .

你可以看到基本的 Nginx 配置。文件使用 nginx 用户而不是 root.

我们应该 授予 nginx 访问 /etc/nginx 目录中所有文件的权限,其中:

RUN ["chown", "-R", "nginx:nginx", "/etc/nginx"]

Dockerfile 指令。