我已经安装了 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 网络上的隔离容器。