如何使用 Nginx 配置基本的 Jenkins HTTP 身份验证?

如何使用 Nginx 配置基本的 Jenkins HTTP 身份验证?

我已经安装了 nginx 并创建了以下主机:

server {
  listen          80;       # Listen on port 80 for IPv4 requests

  server_name     jenkins.mydomain.ru;
  root            /var/lib/jenkins;

  access_log      /var/log/nginx/jenkins_access.log;
  error_log       /var/log/nginx/jenkins_error.log;

  location / {
      auth_basic            "Restricted";
      auth_basic_user_file  /etc/nginx/passwd/htpasswd;

      proxy_pass         http://127.0.0.1:8080/;
      proxy_redirect     off;

      proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      proxy_max_temp_file_size 0;

      client_max_body_size       10m;
      client_body_buffer_size    128k;

      proxy_connect_timeout      90;
      proxy_send_timeout         90;
      proxy_read_timeout         90;

      proxy_buffer_size          4k;
      proxy_buffers              4 32k;
      proxy_busy_buffers_size    64k;
      proxy_temp_file_write_size 64k;

      # Optional configuration to detect and redirect iPhones
      if ($http_user_agent ~* '(iPhone|iPod)') {
          rewrite ^/$ /view/iphone/ redirect;
      }
  }
}

之后我可以在 jenkins.mydomain.ru 中访问 Jenkinks,并且需要密码。但我仍然可以在http://mydomain.ru:8080/无需任何密码。我如何才能禁止访问 Jenkinhttp://mydomain.ru:8080/

答案1

Jenkins 似乎正在监听端口 8080,因此 nginx 无法控制它——您需要转到 jenkins 的配置文件并告诉它监听 127.0.0.1(仅限本地连接),我猜它当前设置为 0.0.0.0(对所有人开放)

答案2

--httpListenAddress您可以使用(例如 localhost)来限制 Jenkins 绑定到哪个地址。请参阅:启动并访问 Jenkins我怎样才能让詹金斯停止监听远程连接?

在 Linux 上,可以在/etc/default/jenkins文件中的 JAVA_ARGS 中进行配置,但可能因您的 Linux 发行版或操作系统而异。

您还可以考虑使用反向代理认证插件,以便将身份验证委托给在 Jenkins 前面运行的反向代理。

以下是一些额外的说明:

  • 确保客户端无法绕过反向代理。如果他们可以直接向 Jenkins 发送请求,那么恶意客户端就可以发送任意标头名称和任意值,从而危及 Jenkins 的安全性
  • 确保配置反向代理以删除用于传递经过身份验证的用户名的标头。这可以防止恶意客户端使用任意值设置标头名称,从而破坏安全性。
  • 如果您的授权需求很简单(例如,每个有效用户都获得完全访问权限而其他人无权访问),那么您不需要使用此插件,因为您可以在反向代理中执行身份验证和授权。
  • 点击http://yourserver/whoAmI查看 Apache 发送给 Jenkins 的实际 HTTP 标头。这对于故障排除很有用。

答案3

您还可以在 docker 容器中运行 jenkins,并完全控制可用的端口。我连接了 2 个 jenkins docker 容器,其中一个是 nginx,用于反向代理。主机无法访问 jenkins 容器,但可以通过传递到 nginx 的 URL 将其路由到同一 docker 网络上的隔离容器。

相关内容