Ubuntu服务器安装Cockpit面板记录

前言介绍

Cockpit是由红帽公司(Red Hat)开发的一款服务器管理面板。

这个服务器面板适合中小型企业业务用途的管理,包括了很多基本的功能,比如性能仪表盘、网络、磁盘、用户的管理。
这些基础功能免费,也是自由软件。有了Cockpit,添加用户SSH密钥、执行系统更新、配置防火墙这些低级任务操作轻而易举,
节约了去终端的时间、减少指令残留污染终端历史。

详细介绍

Cockpit一般会预装在各类红帽系服务器的系统上(RHEL、CentOS、Fedora Server、OpenSUSE),
非红帽系统比如Debian系也可以用,也包括Ubuntu这样的系统。
网上亦有在HP MicroServer Gen8这样的NAS向服务器安装Cockpit管理的案例,
适合老派服务器维护者,对应Windows的Admin Center。

比如说此前我就用Cockpit控制了一个接了声卡的数播虚拟机,去重启总是宕机的Mopidy服务,比手动去终端敲指令省事,毕竟重复任务有些愚蠢。后期会发文章介绍。

Cockpit本身对系统的破坏性小,不像那些主机面板有自己的配置文件,Cockpit的配置都是与系统同步,兼容性很好。
此外Cockpit也是一个可扩展的管理平台,因此可以开发相应的插件以扩展功能。
有管理ZFS的、管理容器的、管理SMB/NFS网络共享的、管理虚拟机的、管理集群的……
不过像Web服务器那种暂时还很稀少,管理Nginx略显麻烦,不过编辑Nginx文件本身也不应该是Cockpit该干的事情。

Cockpit新版的界面强行迎合了MD3和GTK4那样的圆角UI,个人觉得缺少了企业级的严谨美学,不过其实也没有不能接受。稳定为重,因此Cockpit没啥可以美化的空间。

本文以安装了Webinoly的Ubuntu 24.04 LTS为环境配置蓝本,通过Webinoly的Nginx反向代理+客户端私有CA证书验证(类似网银盾)实现安全访问,并配置firewalld防火墙设定。

安装

Ubuntu Backports软件源提供了Cockpit的支持,可使用如下命令检测版本号安装:

. /etc/os-release
sudo apt install -t ${VERSION_CODENAME}-backports cockpit

安装之后,通过任意的服务器地址+9090端口,用非root权限的管理员用户即可访问Cockpit面板,
如果没有这样的用户,请先 adduser
现在来确认一下Cockpit在HTTP端口是否运行正常吧。

修改端口

安全起见、以及后面防火墙的配置需要,并不建议直接访问Cockpit的HTTP 9090端口。
因此,需要修改Cockpit的系统监听端口仅允许本地访问。

编辑 /etc/systemd/system/cockpit.socket.d/listen.conf 配置文件:

[Socket]
ListenStream=
ListenStream=127.0.0.1:9090

第一行设置为空是有意为之的,参见 https://cockpit-project.org/guide/latest/guide#listen

可以使用SSH转发的方式将其转到本地客户机的127.0.0.1:9090端口进行访问,VSCode也行。像VPS这类服务器,尽量不要直接通过HTTP协议访问公网地址操作Cockpit管理面板。

不过SSH直接转发端口有一些弊端:

  • 手机不方便直接访问
  • 浏览器会提示不安全,没有证书认证不便统一管理

稍后,将配置使用Nginx反向代理,配置自签名CA的客户端证书(mTLS)通过HTTPS访问加强安全性。

NGINX 反代

反代建议使用域名,这样使用mTLS会方便一些。
既可以使用现有的真实域名、也可以通过修改hosts劫持访问一个不存在的域名(比如OpenWRT可以做到编辑路由器hosts文件,实现局域网内的访问)
如果使用真实域名,Cloudflare或第三方CDN、证书商申领mTLS证书也可以实现类似的保护效果,细节略有不同、但认证原理大致相似,下文不表。

创建自签证书

可以通过openssl创建,也可以使用mkcert这类自动化工具。

#!/usr/bin/env bash
openssl genpkey -algorithm RSA -out ca.key
openssl req -new -x509 -key ca.key -out ca.crt
openssl genpkey -algorithm RSA -out server.key
openssl req -new -key server.key -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
openssl genpkey -algorithm RSA -out client.key
openssl req -new -key client.key -out client.csr
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt -certfile ca.crt

参考了:https://predmet.ch/infra/cockpit_mtls

mkcert更简单:

# 生成自签CA(位于./.local/share/mkcert)
mkcert -install
# 签发服务端证书
mkcert your.domain *.your.domain IP.add.re.ss
# 签发客户端证书
mkcert -client your.domain *.your.domain IP.add.re.ss
# 依然参照
openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt -certfile ca.crt

以下是mkcert的使用参数

    -cert-file FILE, -key-file FILE, -p12-file FILE
        Customize the output paths.

    -client
        Generate a certificate for client authentication.

    -ecdsa
        Generate a certificate with an ECDSA key.

    -pkcs12
        Generate a ".p12" PKCS #12 file, also know as a ".pfx" file,
        containing certificate and key for legacy applications.

    -csr CSR
        Generate a certificate based on the supplied CSR. Conflicts with
        all other flags and arguments except -install and -cert-file.

最终的目的是导出一份p12/pfx文件,并安装到设备的信任区域。Windows需要手动指定受信任根证书颁发者区域,Android

创建域名反代

使用Webinoly的site命令创建空白网站(纯HTML):

site your.domain -empty 
site your.domain -ssl=on -ssl-crt=/dir/crt.file -ssl-key=/dir/key.file 

导航到 sites-available 目录中的域名配置,定位到WebinolyCustom部分,添加反代配置后保存重载。

# WebinolyCustom

    location / {
        # Required to proxy the connection to Cockpit
        proxy_pass http://127.0.0.1:9090;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_ssl_verify off;
        # Required for web sockets to function
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        # Pass ETag header from Cockpit to clients.
        # See: https://github.com/cockpit-project/cockpit/issues/5239
        gzip off;
       }

# WebinolyCustomEnd

如有需要,可一并更改端口号。
测试域名访问,不过直接访问而没做Cockpit端回源验证,大概率直接白屏或登不进去。
因此需要编辑 /etc/cockpit/cockpit.conf 配置文件:

[WebService]
Origins = https://your.domain:port wss://your.domain:port https://127.0.0.1:9090 wss://127.0.0.1:9090
ProtocolHeader = X-Forwarded-Proto
ForwardedForHeader = X-Forwarded-For

此时访问浏览器应该可以正常访问了。接下来是客户端证书验证:

配置mTLS(客户端证书验证)

回到域名配置文件,定位到 # WebinolySSLCustomCert 部分,插入客户端证书CA的配置代码:

ssl_client_certificate "/dir/ca.crt";
ssl_verify_client on;

保存重载,此时回到浏览器再次测试域名,可使用隐私模式或者额外的浏览器尝试,
此时应该提示有提示使用证书的界面(类似于网银盾)

插件

Cockpit提供了一些插件,可在此处查看:
https://cockpit-project.org/applications
因为安装在Ubuntu的VPS上,而非红帽系Linux,所以仅简短介绍一些能用的插件。Cockpit插件本身不多,详细了解还请查看上文applications介绍页。

安装防火墙

Cockpit支持管理基于firewalld的防火墙规则,通过apt方式安装防火墙:

apt install firewalld
firewall-cmd --state

在「网络」页面下,新冒出「防火墙」栏目,「编辑规则和区域」可进入防火墙规则的编辑页面。

诊断报告

apt-get install cockpit-sosreport

软件包管理器

基于PackageKit的Cockpit软件包管理插件,
不过实测Ubuntu使用不佳,Debian好一些,仅供参考。

https://github.com/hatlabs/cockpit-package-manager-debian/releases/tag/v0.1.1-1

安装:

sudo dpkg -i cockpit-package-manager_0.1.1-1_all.deb
sudo apt-get install -f  # Install any missing dependencies

《Ubuntu服务器安装Cockpit面板记录》上的3个想法

  1. 这玩意我去年还在用Ubuntu时就发现了,确实好用,可惜在Ubuntu上有时候会有一些奇怪的BUG,比如虚拟机功能抽搐。
    后面服务器系统因故迁移到Debian,再用这个面板简直不要太香,简直可以说是完美适配了。
    附图(不知道这里的评论区支不支持HTML代码):

    1. Ubuntu 22.x之前确实会有不少Bug,比如网络服务无法启动导致apt更新功能不能使用,不过24.x这种问题的概率发生的很少了,并且Debian 12也没有问题;另毕竟Cockpit是RedHat系发行版的工具,作为自由软件移植到Ubuntu有问题也是情理之中。(而不是商用技术保障……当然我是因为Webinoly才安装Ubuntu,不然早戴红帽了233,自组的Bazzite也是Fedora)
      用它开虚拟机的话不是很合适,VPS这种场景也没法使用(TOS限制嵌套虚拟化),我主要还是使用它的系统管理工具,能比CLI直观一些。至于Local场景偏开发调试的虚拟机功能,还是老老实实上PVE部署吧!后者无论是管理还是备份都方便很多。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

To respond on your own website, enter the URL of your response which should contain a link to this post's permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post's URL again. (Find out more about Webmentions.)