我已经安装了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; } } }
之后,我可以访问jenkinsink.mydomain.ru中的Jenkinks,它需要密码。 但是我仍然可以访问http://mydomain.ru:8080/中的 Jenkinks,没有任何密码。 我如何禁止访问http://mydomain.ru:8080/中的 Jenkinks?
Jenkins似乎在监听端口8080,所以nginx无法控制它 – 你需要去jenkins的configuration文件,并告诉它监听127.0.0.1(仅限本地连接),在那里我猜测它是目前设置到0.0.0.0(全部开放)
您可以通过使用--httpListenAddress (如localhost)来限制Jenkins绑定到哪个地址。 请参阅: 启动和访问Jenkins以及如何让Jenkins停止侦听远程连接?
在Linux上,这可以在/etc/default/jenkins文件中的JAVA_ARGS中进行configuration,但可能会因您的Linux发行版或操作系统而异。
您也可以考虑使用反向代理身份validation插件,以将身份validation委托给您在Jenkins之前运行的反向代理。
这里有一些额外的笔记:
- 确保客户端不能绕过反向代理。 如果他们可以直接向Jenkins发送请求,那么恶意客户端可以以任意值发送任意头名,从而危及Jenkins的安全性
- 确保您configuration反向代理来擦除用于传递已validation的用户名的标头。 这可以防止恶意客户端设置具有任意值的头部名称,这会破坏安全性。
- 如果您的授权需要很简单(例如,每个有效的用户都可以完全访问并且其他人都无法访问),那么您就不需要使用这个插件,因为您可以在反向代理中同时进行身份validation和授权。
- 点击
http://yourserver/whoAmI查看Apache发送给Jenkins的实际HTTP头。 这对于故障排除很有用。
您也可以在Docker容器中运行jenkins,并对可用的端口进行全面控制。 我连接了2个jenkinsdocker集装箱,一个是nginx,用于反向代理。 主机无法访问jenkins容器,而是通过传递给nginx的url将其路由到同一个dockernetworking上的隔离容器。