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

发表回复

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