Cockpit vs Webmin: Mana Sesuai Untuk Pelayan Ubuntu?
Ketahui perbezaan antara Cockpit dan Webmin untuk pengurusan pelayan Linux. Kami bandingkan fungsi konfigurasi, keselamatan port, dan sebab Ansible lebih baik untuk skala.
Cockpit vs Webmin: jawapan ringkas
Cockpit dan Webmin kedua-duanya merupakan panel web untuk mengurus pelayan Linux melalui pelayar, namun ia menjawab keperluan yang berbeza. Cockpit disertakan dalam repositori pengedaran anda dan membaca status mesin melalui systemd, journald, polkit dan udisks, justeru ia memaparkan pelayan yang masih anda uruskan melalui SSH. Webmin lebih lama dan jauh lebih meluas: ia menulis fail konfigurasi untuk Apache, BIND, Postfix, MariaDB dan berpuluh-puluh servis lain yang tidak disentuh oleh Cockpit, serta menjalankan pelayan webnya sendiri sebagai root untuk melakukan tugas tersebut.
Pasang Cockpit apabila anda mahukan paparan langsung bagi satu mesin, pembaca log dan terminal kecemasan. Pasang Webmin apabila anda memerlukan editor berasaskan borang untuk servis yang anda tidak mahu konfigurasikan secara manual. Jangan letakkan kedua-duanya pada port awam dengan log masuk kata laluan. Jika anda sudah menguruskan lebih daripada dua atau tiga pelayan, jawapan yang jujur selalunya adalah tidak perlu menggunakan kedua-duanya, dan kaedah SSH berserta Ansible lebih berskala berbanding mana-mana panel.
Perkara yang boleh diubah oleh setiap panel
Pemasangan asas Cockpit adalah kecil, dan kebanyakan bahagian merupakan pakej berasingan yang boleh ditinggalkan:
- servis dan pemasa systemd: mula, henti, aktifkan, dan baca fail unit
- jurnal, ditapis mengikut unit dan keutamaan, yang merupakan
journalctldengan pemilih tarikh - akaun tempatan, keahlian kumpulan, dan kunci SSH yang dibenarkan
- storan dengan
cockpit-storaged: partition, kumpulan volum LVM, sistem fail dan titik lekap - kontena dengan
cockpit-podman, yang hanya menguruskan Podman - kemas kini pakej dengan
cockpit-packagekit - graf CPU, memori, cakera dan rangkaian dengan
cockpit-pcp - terminal root dalam tab pelayar
Dua bahagian kelihatan rosak pada VPS Ubuntu sedangkan sebenarnya tidak. Halaman Networking Cockpit ialah antaramuka untuk NetworkManager, manakala imej pelayan Ubuntu menggunakan netplan dengan systemd-networkd, jadi halaman tersebut hilang atau kosong. Jangan pasang NetworkManager pada mesin jauh untuk mendapatkannya semula, kerana ia akan mengambil alih antaramuka dan kesilapan di situ akan menyebabkan anda kehilangan sesi SSH. Kawalan firewall Cockpit ialah antaramuka untuk firewalld, manakala Ubuntu menggunakan ufw, jadi anda tidak mendapat sebarang kawalan firewall. Anda perlu terus menjalankan sudo ufw status dalam terminal.
Webmin meliputi skop yang lebih luas, kerana ia merupakan koleksi modul bagi setiap servis dan bukannya satu program tunggal:
- konfigurasi Apache, nginx, BIND, Postfix, Dovecot, MariaDB, PostgreSQL dan Samba melalui borang
- pengguna, kumpulan dan kuota cakera
- kerja cron dan jam sistem
- kemas kini pakej, serta pengurus fail dengan fungsi muat naik dan muat turun
- antaramuka firewall, termasuk satu untuk iptables dan satu untuk firewalld
- sandaran fail konfigurasi, dan modul kluster yang menolak satu perubahan ke pelayan Webmin yang lain
Webmin menyunting fail sebenar di bawah /etc. Tiada pangkalan data tersembunyi di sebalik borang tersebut, jadi jika /etc berada dalam kawalan versi, sudo git -C /etc diff selepas menyimpan borang akan menunjukkan dengan tepat apa yang ditulis oleh modul tersebut. Itu adalah cara terpantas untuk mempelajari apa yang sebenarnya dilakukan oleh mana-mana halaman Webmin. Panduan pemasangan dan log masuk pertama Webmin meneliti pepohon modul secara terperinci. Virtualmin dan Usermin adalah produk berasingan yang dibina di atas enjin yang sama, untuk pengehosan kongsi dan untuk pengguna akhir, dan ia mewarisi segala yang dinyatakan di sini mengenai pendedahan.
Cara setiap satu mengesahkan identiti
Cockpit tidak mempunyai pangkalan data pengguna sendiri. Halaman log masuknya menjalankan stack PAM (pluggable authentication modules) dalam /etc/pam.d/cockpit, jadi akaun yang digunakan adalah akaun Unix anda dan kata laluan adalah kata laluan Unix anda. Akses root ditolak secara lalai kerana /etc/cockpit/disallowed-users menyenaraikannya. Tindakan yang memerlukan keistimewaan dilakukan melalui polkit, dan antara muka akan meminta kata laluan anda sekali lagi sebelum membuat sebarang perubahan. Inilah sebabnya pengepala halaman mungkin memaparkan "Limited access" sehingga anda meningkatkan keistimewaan.
Reka bentuk ini mempunyai satu kesan yang sering ditemui pada pelayan yang diperketatkan (hardened). Jika anda telah mengikuti log masuk SSH kunci sahaja dengan pengesahan kata laluan dilumpuhkan, akaun tersebut mungkin tidak mempunyai kata laluan yang boleh digunakan, jadi log masuk Cockpit akan ditolak walaupun ssh masih berfungsi. Semak perkara ini pada pelayan:
sudo passwd -S deployOutput yang bermula dengan deploy L bermakna kata laluan dikunci, jadi PAM tidak mempunyai apa-apa untuk diterima dan tiada kata laluan yang anda taip akan berfungsi. P bermakna kata laluan yang boleh digunakan telah ditetapkan. Halaman log masuk Cockpit sendiri tidak menerima kunci SSH. Kunci hanya digunakan apabila Cockpit membuat sambungan seterusnya dari mesin yang anda log masuk ke hos lain.
Webmin menyimpan pengguna sendiri dalam /etc/webmin/miniserv.users, berasingan daripada /etc/passwd, dan ia juga boleh dikonfigurasikan untuk mengesahkan identiti terhadap akaun Unix. Pengguna Webmin yang diberikan semua modul adalah root pada mesin tersebut, tidak kira apa yang dinyatakan oleh shell log masuk mereka. Webmin didatangkan dengan sokongan TOTP (time-based one-time password) sendiri dan fungsi menyekat hos selepas percubaan log masuk gagal berulang kali; kedua-duanya diaktifkan di dalam Webmin Configuration. Cockpit hanya mendapat faktor kedua jika anda menambahkannya pada PAM, contohnya dengan libpam-google-authenticator.
Cara setiap satunya dikemas kini
Cockpit dibungkus oleh pengedaran anda. Pada Ubuntu 24.04, ia datang daripada arkib, dan projek huluan (upstream) mengesyorkan poket backports untuk binaan yang lebih baharu:
. /etc/os-release
sudo apt update
sudo apt install -t ${VERSION_CODENAME}-backports cockpit
sudo systemctl status cockpit.socket
apt policy cockpitapt policy mencetak versi yang anda pasang dan repositori asalnya. Jika backports tidak membawa binaan yang lebih baharu, apt akan kembali kepada versi arkib, yang mana ia adalah memadai. cockpit.socket sepatutnya membaca active (listening). Pembaikan keselamatan kemudiannya tiba melalui proses unattended-upgrades yang sama seperti kernel anda, daripada penerbit yang sudah anda percayai.
Webmin tidak terdapat dalam arkib Ubuntu. Pemasangan rasmi menambah repositori dan kunci penandatangan Webmin sendiri terlebih dahulu:
curl -o webmin-setup-repo.sh https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh
sudo sh webmin-setup-repo.sh
sudo apt-get install webmin --install-recommendsBaca skrip tersebut sebelum anda menjalankannya, kerana ia berjalan sebagai root. Sejak itu, setiap apt upgrade pada pelayan juga akan menarik data daripada repositori Webmin, jadi anda telah menambah penerbit kedua dengan kepercayaan tahap root pada mesin tersebut. Itulah kos sebenar Webmin, dan ia wajar diberikan contoh yang jelas: CVE-2019-15107 merupakan pintu belakang (backdoor) dalam beberapa pakej 1.9x yang membolehkan pelaksanaan arahan tanpa pengesahan, dan ia sampai kepada pengguna kerana hos binaan projek tersebut telah diceroboh, bukan repositori sumbernya. Pembungkusan pengedaran tidak menjadikan perkara itu mustahil. Ia hanya menambah langkah binaan dan semakan yang tidak anda selenggara sendiri.
Mengapa kedua-duanya tidak patut berada pada port awam
Cockpit mendengar pada TCP 9090 dan Webmin pada TCP 10000, kedua-duanya melalui TLS (transport layer security) dengan sijil yang ditandatangani sendiri, jadi perkara pertama yang anda lihat ialah amaran pelayar. Mencipta dan mempercayai sijil yang ditandatangani sendiri menjelaskan perkara yang diberitahu dan tidak diberitahu oleh amaran tersebut. Kedua-dua port diimbas secara berterusan, dan kedua-dua panel membawa kepada root, jadi kata laluan yang diteka atau digunakan semula bermakna pelayan telah diceroboh sepenuhnya.
Corak yang selamat adalah dengan mengikat panel ke localhost dan mencapainya melalui SSH tunnel. Untuk Cockpit, ganti unit soket:
sudo systemctl edit cockpit.socket[Socket]
ListenStream=
ListenStream=127.0.0.1:9090ListenStream= kosong pada barisnya sendiri adalah wajib. systemd menambah pada tetapan senarai, jadi tanpanya unit tersebut mengekalkan 0.0.0.0:9090 asal dan menambah alamat baharu, dan panel anda masih awam. Gunakan penggantian tersebut dan semak perkara yang sedang mendengar:
sudo systemctl daemon-reload
sudo systemctl restart cockpit.socket
sudo ss -lntp | grep 9090Output mesti menunjukkan 127.0.0.1:9090. Alamat *:9090 atau 0.0.0.0:9090 bermakna penggantian tidak berkesan. Sekarang buka tunnel dari mesin anda sendiri dan layari ke https://localhost:9090:
ssh -N -L 9090:127.0.0.1:9090 deploy@203.0.113.10Pastikan port tempatan sama dengan port jauh. Cockpit membandingkan pengepala Origin pelayar dengan alamat yang ia percaya sedang dihidangkan, jadi tunnel dari port tempatan 9999 memuatkan halaman log masuk dan kemudian gagal semasa log masuk, dan journalctl -u cockpit merekodkan asal yang ditolak. Jika anda memerlukan port tempatan yang berbeza, namakannya dalam /etc/cockpit/cockpit.conf:
[WebService]
Origins = https://localhost:9999 https://127.0.0.1:9999Mulakan semula dengan sudo systemctl restart cockpit.socket untuk mengambilnya. Untuk Webmin, tetapan yang setara terdapat dalam /etc/webmin/miniserv.conf:
bind=127.0.0.1sudo systemctl restart webmin
sudo ss -lntp | grep 10000
ssh -N -L 10000:127.0.0.1:10000 deploy@203.0.113.10Webmin juga menyemak pengepala Referer pada hantaran borang dan menolak permintaan yang kelihatan datang dari hos lain, yang merupakan punca kegagalan percubaan pertama pada reverse proxy. Baris referers= dalam fail yang sama ialah tempat anda membenarkan hostname proksi, dan webprefix= ialah tempat anda memberitahu Webmin bahawa ia berada di bawah satu path.
Reverse proxy yang disahkan adalah pilihan lain: nginx di hadapan, dengan lapisan daftar masuk tunggal Authentik melakukan log masuk. Ia berfungsi, dan ia adalah pilihan kedua terbaik. Panel masih berjalan sebagai root di belakang proksi, dan anda kini menyelenggara dua pintu hadapan dan bukannya satu. Tunnel tidak menambah sebarang servis pendengaran ke internet langsung, dan ia menggunakan semula kunci SSH yang anda sudah lindungi.
Panel mana yang sesuai untuk pelayan yang sudah menjalankan servis pengeluaran
Cockpit, atas dua sebab yang penting apabila orang lain bergantung pada mesin tersebut. Ia diaktifkan melalui soket, jadi cockpit-ws hanya berjalan semasa sesi dibuka dan tiada daemon root kekal yang menunggu pada port. Ia juga tidak memiliki apa-apa: buang pakej tersebut dan setiap servis akan terus berjalan seperti biasa, kerana Cockpit tidak menyimpan sebarang konfigurasi miliknya sendiri. miniserv.pl milik Webmin kekal aktif sama ada seseorang sedang log masuk atau tidak. Semak kos penggunaan memori anda dengan systemctl status webmin, yang memaparkan memori residen bagi proses yang sedang berjalan.
Jika anda memerlukan modul DNS atau mel Webmin, sediakan pelayan khusus untuknya. Kotak Webmin yang melakukan satu tugas, terikat pada 127.0.0.1, merupakan risiko yang terkawal. Webmin yang berkongsi hos dengan aplikasi yang menghadap pelanggan adalah tidak selamat. Lakukan kerja asas sebelum mana-mana panel dipasang: sepuluh minit pertama pada VPS baharu merangkumi pengguna bukan root dan firewall yang diandaikan sudah tersedia oleh kedua-dua panel tersebut.
Apabila jawapan bukan salah satu daripadanya
Panel adalah khusus untuk setiap pelayan dan bersifat manual, serta tidak meninggalkan rekod tentang apa yang diubah atau sebabnya. Ini memadai untuk satu mesin. Pada lima mesin, anda akan mengulangi kerja yang sama, dan pada dua puluh mesin, anda akan meneka pelayan mana yang terlepas perubahan tersebut. Cockpit boleh menambah hos lain ke dalam satu sesi melalui SSH, tetapi versi terkini melumpuhkan fungsi tersebut secara lalai dan memerlukan AllowMultiHost=yes dalam /etc/cockpit/cockpit.conf, dan ia tetap memaksa anda melakukan klik yang sama sebanyak lima kali.
Alternatifnya ialah SSH biasa dengan konfigurasi anda disimpan dalam repositori git. Mengurus beberapa pelayan Linux dari satu lokasi membincangkan bentuk persediaan tersebut, dan playbook Ansible pertama menggunakan peraturan firewall yang sama pada setiap hos daripada satu fail yang boleh anda semak sebagai diff. Kerja kontena juga menggunakan cara yang sama: docker compose up -d melalui SSH daripada fail dalam git, seperti dalam panduan asas Docker Compose, adalah lebih baik daripada mengklik melalui mana-mana panel, dan Cockpit sendiri tidak menguruskan Docker sejak awal lagi.
Gunakan panel untuk perkara yang sukar dilakukan oleh terminal, seperti membaca graf metrik atau mengenal pasti unit mana daripada empat puluh unit yang gagal. Gunakan kod untuk sebarang perkara yang akan anda lakukan lebih daripada dua kali.
Mod kegagalan dan rentetan yang akan anda lihat
Cockpit menolak kata laluan yang diterima oleh SSH. Akaun tersebut hanya menggunakan kunci. sudo passwd -S alice mencetak L dalam medan kedua, jadi PAM tidak mempunyai kata laluan untuk disemak. Tetapkan satu dengan sudo passwd alice, atau kekalkan akaun tersebut untuk SSH dan log masuk ke Cockpit sebagai pengguna lain.
Cockpit menolak root walaupun dengan kata laluan yang betul. /etc/cockpit/disallowed-users menyenaraikan root. Log masuk sebagai pengguna biasa dengan hak sudo. Itu adalah laluan yang disasarkan, kerana polkit kemudian merekodkan manusia mana yang melakukan eskalasi.
Cockpit tidak menunjukkan halaman Networking atau Firewall. Halaman tersebut memerlukan NetworkManager dan firewalld. VPS Ubuntu menjalankan netplan dengan systemd-networkd dan ufw, jadi halaman tersebut tidak muncul. Tiada apa-apa yang rosak, dan penyelesaiannya adalah dengan terus menggunakan ufw melalui SSH.
Halaman log masuk Cockpit dimuatkan melalui terowong, kemudian log masuk gagal. Port tempatan anda berbeza daripada port jauh, jadi semakan Origin gagal dan journalctl -u cockpit menunjukkannya. Padankan port tersebut, atau tetapkan Origins dalam /etc/cockpit/cockpit.conf.
Penghantaran borang Webmin gagal selepas anda meletakkannya di belakang proksi. Semakan Referer menolaknya. Tambahkan nama hos proksi ke referers= dalam /etc/webmin/miniserv.conf, dan tetapkan webprefix= apabila panel dihidangkan di bawah satu path.
Anda tidak pasti sama ada panel terdedah. sudo ss -lntp | grep -E '9090|10000' menjawab perkara itu daripada pelayan itu sendiri, dan Webmin menulis setiap percubaan log masuk ke /var/webmin/miniserv.log, yang wajar dibaca sekali selepas sebarang perubahan pada cara ia mendengar.
FAQ
Adakah Cockpit atau Webmin lebih baik untuk VPS Ubuntu tunggal?
Bagi kebanyakan pengguna, Cockpit adalah lebih baik kerana ia datang daripada repositori rasmi Ubuntu, dikemaskini bersama sistem yang lain, dan hanya berjalan semasa sesi pelayar dibuka. Pilih Webmin jika anda memerlukan penyunting berasaskan borang untuk servis yang tidak disokong oleh Cockpit, seperti BIND atau Postfix, namun anda perlu menerima hakikat bahawa pelayan webnya berjalan sebagai root sepanjang masa dan kemaskininya datang daripada repositori Webmin sendiri.
Bolehkah saya menjalankan Cockpit dan Webmin pada pelayan yang sama?
Boleh. Kedua-duanya menggunakan port yang berbeza, iaitu 9090 dan 10000, dan tidak bercanggah kerana setiap satu menyunting sistem secara terus dan bukannya menguasai sistem tersebut. Walau bagaimanapun, ini adalah amalan yang kurang baik. Setiap panel merupakan log masuk berkeupayaan root yang berasingan pada mesin yang sama, jadi anda menggandakan risiko pendedahan hanya untuk menjimatkan beberapa klik. Jika anda memasang kedua-duanya, ikat (bind) kedua-duanya ke 127.0.0.1 dan akses melalui SSH tunnel.
Adakah selamat untuk membuka port 9090 atau 10000 ke internet?
Tidak, jika menggunakan log masuk kata laluan. Kedua-dua panel memberikan akses kepada root, dan kedua-dua port tersebut akan ditemui oleh pengimbas rutin dalam masa beberapa jam selepas dibuka. Ikat panel ke 127.0.0.1, kemudian jalankan ssh -N -L 9090:127.0.0.1:9090 user@host dan layari ke https://localhost:9090. Sahkan dengan sudo ss -lntp | grep 9090, yang sepatutnya memaparkan 127.0.0.1:9090 dan bukannya 0.0.0.0:9090. Reverse proxy yang mempunyai pengesahan (authenticated) merupakan pilihan kedua yang boleh diterima.
Mengapa log masuk Cockpit saya gagal sedangkan SSH dengan kunci berfungsi?
Cockpit melakukan pengesahan melalui PAM dengan kata laluan Unix, dan halaman log masuknya tidak menerima kunci SSH. Pada pelayan yang diperketatkan (hardened), akaun tersebut selalunya tidak mempunyai kata laluan yang boleh digunakan. Jalankan sudo passwd -S youruser: tanda L pada medan kedua bermaksud kata laluan dikunci, jadi PAM tidak mempunyai apa-apa untuk diterima dan setiap percubaan akan ditolak. Tetapkan kata laluan dengan sudo passwd youruser, atau gunakan akaun lain untuk panel tersebut.
Adakah Cockpit menguruskan kontena Docker?
Tidak. Halaman kontena Cockpit datang daripada cockpit-podman dan menguruskan Podman. Modul Docker lama telah digugurkan bertahun-tahun yang lalu dan tidak akan dikembalikan. Jika servis anda berjalan di bawah Docker, uruskannya dengan fail compose dalam kawalan versi melalui SSH, dan biarkan Cockpit menguruskan sistem di sekelilingnya, seperti journal dan cakera.