Cockpit 是什么
Cockpit 是 RedHat 维护的一套 linux 服务器管理面板,具备很强的开放能力,可以集成各种应用到管理面板菜单上。
通过 Cockpit,运维人员能够以直观的图形化界面管理 Podman 容器、监控服务器状态、开关防火墙等。
如何使用
sudo apt install cockpit # debian 系 linux 安装 Cockpit。
sudo 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。
配置写入后,请用
sudo nginx -t
检测配置格式是否正确。确认无误后使用
sudo 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
。配置无误使用
sudo 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 托管的绝大多数页面,例如博客的管理后台、私人网盘的登录页、敏感的不想被他人访问的页面等。
若有疏漏不当之处,诚请批评雅正。