利用 nginx 反向代理 cockpit
cockpit 是什么
cockpit 是 RedHat 维护的一套 linux 服务器管理面板,具备很强的开放能力,可以集成各种应用到管理面板菜单上。
通过 cockpit,运维人员能够以直观的图形化界面管理 podman 容器、监控服务器状态、开关防火墙等。
如何使用
sudo apt install cockpit # debian 系 linux 安装 cockpit。
systemctl enable cockpit.socket --now # 开启 cockpit 服务并设置开机自启。
cockpit 启动后,防火墙开放 9090 端口。
访问 https://host:9090
,host 为服务器 IP 或域名。
为什么要反向代理
服务器的管理接口一方面可以使运维人员便捷地管理服务器,一方面也增大了服务器的可攻击面。
一个好的管理接口应该是运维人员能够访问,而其他人不能(或很难)访问。
cockpit 的 9090 端口具有明显的特征,如果对外开放,其他人能轻易地访问到该管理接口。
nginx 通常监听的 80 或 443 端口没有明显的管理接口特征,因此可用以反向代理 cockpit 实现隐藏管理接口的目的。
注意: 请勿在 http 协议下反向代理 cockpit。
前置知识
阅读本篇内容,你需要具备:
-
linux: 了解基本的服务器管理命令。
-
nginx: 了解基本的配置格式。
-
cockpit: 了解基本的使用方法。
操作环境
本文基于 debian 12, nginx/stable 1.22.1-9, cockpit/stable 287-1。
其他系统或软件版本,配置大同小异,设计具体差异处,可参考官方文档。
实现思路
- 利用 nginx 的 location 配置指定 cockpit 面板的访问地址。
这里以 /manager/cockpit/ 为例。
- 在nginx 的 location 配置节中将流量转发到 cockpit。
可以通过 proxy_pass https://127.0.0.1:9090
实现。
- 修改 cockpit 的根页面地址为 /manager/cockpit/。
可以通过 /etc/cockpit/cockpit.conf 文件中的 UrlRoot 字段配置。
- 重启软件,验证效果。
提示:
修改 cockpit 的根页面地址目的在于,当 location 下的 proxy_pass 将流量转发到 cockpit 时,请求的是以 /manager/cockpit/ 开头的页面。
然而在 cockpit 中是不存在这个页面的。如果不修改 cockpit 的根页面地址,访问 cockpit 会报 404 错误。
具体配置
这里仅提供关键配置,请将配置插入相应的配置节中。
nginx.conf
请在 https 协议的 server 配置节中写入以下内容,请勿将该配置直接写入 http 协议的 server 配置节。
# 反向代理 cockpit
location ^~ /manager/cockpit/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass https://127.0.0.1:9090;
}
提示:
-
上面的配置主要做了三件事,匹配 /manager/cockpit/ 开头的请求并不在继续向下匹配,设置代理请求头,将流量转发到 cockpit。
-
配置写入后,请用
nginx -t
检测配置格式是否正确。 -
确认无误后使用
nginx -s reload
重载配置。
cockpit.conf
如果 /etc/cockpit/cockpit.conf 不存在,请执行 sudo touch /etc/cockpit/cockpit.conf 创建该配置文件,并写入以下内容:
[WebService]
Origins = https://127.0.0.1:9090 https://YourDomain
UrlRoot = /manager/cockpit/
提示:
-
/etc/cockpit/cockpit.conf 是可选的配置文件,默认不创建,因此可能需要手动创建。
-
Origins 是可接受的域,请将 YourDomain 替换成你的域名,如
www.example.com
。 -
配置无误使用
systemctl restart cockpit.socket
重启 cockpit 服务。 -
更多配置可参看 cockpit.conf
扩展内容
对于某些敏感页面,可使用 nginx 的 basic auth 设置访问密码,主要依靠 auth_basic 和 auth_basic_user_file 两个配置。
值得一提的是 cockpit 的管理面板是不能用 basic auth 加以保护的。原因在于 cockpit 和 basic auth 都使用了 Authorization 这个请求头,因此两者无法兼容。
需要提醒的是,请勿在 http 协议下使用 basic auth,因其用户名和密码仅采用 base64 编码后放入请求头中明文传输。
反向代理的作用是隐藏 cockpit 的访问入口,若想进一步保护该入口,可利用 nginx 的 $cookie_ 开头的变量,判断客户端是否具有相应的 cookie,并加以放行或阻断。
例如在 nginx 的相应 location 配置节中增加:
if ( $cookie_isallow != "ok" ) { return 404; }
以上配置可使没有 isallow 这个cookie,或该 cookie 值不为 ok 的客户端访问该地址报 404 错误。
配合特定的 php 程序下发 cookie,可实现最大化保护 cockpit 管理面板不被未经授权的访问。
以上所述的保护措施,可应用于 nginx 托管的绝大多数页面,例如博客的管理后台、私人网盘的登录页、敏感的不想被他人访问的页面等。
若有不当之处,欢迎批评指正。
文章始发于本人博客 雾芽,欢迎造访我的博客。