Cockpit vs Webmin: Pilih Panel Server Linux yang Tepat
Bandingkan Cockpit dan Webmin di VPS Ubuntu: perubahan yang dapat dilakukan, cara login, risiko port publik, serta alasan SSH plus Ansible sering lebih tepat.
Cockpit vs Webmin: jawaban singkat
Cockpit dan Webmin sama-sama merupakan panel web untuk mengelola server Linux melalui browser, tetapi keduanya menjawab kebutuhan yang berbeda. Cockpit dirilis dalam repositori distribusi Anda sendiri dan membaca mesin melalui systemd, journald, polkit, serta udisks. Karena itu, Cockpit menampilkan server yang tetap Anda kelola melalui SSH. Webmin lebih lama dan cakupannya jauh lebih luas. Webmin menulis file konfigurasi untuk Apache, BIND, Postfix, MariaDB, serta puluhan service lain yang tidak pernah disentuh Cockpit. Untuk melakukannya, Webmin menjalankan web server sendiri sebagai root.
Install Cockpit jika Anda memerlukan tampilan langsung satu server, pembaca log, dan terminal darurat. Install Webmin jika Anda memerlukan editor berbasis formulir untuk service yang tidak ingin Anda konfigurasi secara manual. Jangan tempatkan salah satunya pada port publik dengan login berbasis password. Jika Anda sudah menjalankan lebih dari dua atau tiga server, jawaban yang jujur sering kali adalah tidak menggunakan keduanya. Pendekatan SSH plus Ansible lebih mudah diskalakan daripada panel apa pun.
Hal yang benar-benar dapat diubah oleh setiap panel
Instalasi dasar Cockpit berukuran kecil, dan sebagian besar area tersedia sebagai paket terpisah yang dapat Anda abaikan:
- service dan timer systemd: memulai, menghentikan, mengaktifkan, serta membaca unit file
- journal yang difilter berdasarkan unit dan prioritas, yang dapat dibaca dengan
journalctlserta pemilih tanggal - akun lokal, keanggotaan grup, dan kunci SSH yang diotorisasi
- penyimpanan dengan
cockpit-storaged: partisi, volume group LVM, filesystem, dan titik mount - container dengan
cockpit-podman, yang hanya mengelola Podman - pembaruan paket dengan
cockpit-packagekit - grafik CPU, memori, disk, dan jaringan dengan
cockpit-pcp - terminal root pada tab browser
Dua area tampak rusak pada VPS Ubuntu, padahal sebenarnya tidak. Halaman Networking Cockpit adalah front end untuk NetworkManager, sedangkan image server Ubuntu menggunakan netplan dengan systemd-networkd. Karena itu, halaman tersebut tidak tersedia atau kosong. Jangan menginstal NetworkManager pada server remote hanya untuk menampilkannya kembali, karena NetworkManager akan mengambil alih interface. Kesalahan konfigurasi dapat memutus sesi SSH Anda. Kontrol firewall Cockpit adalah front end untuk firewalld, sedangkan Ubuntu menggunakan ufw. Akibatnya, Anda tidak mendapatkan kontrol firewall sama sekali. Anda tetap menjalankan sudo ufw status di terminal.
Webmin mencakup lebih banyak area karena Webmin merupakan kumpulan modul per service, bukan satu program:
- konfigurasi Apache, nginx, BIND, Postfix, Dovecot, MariaDB, PostgreSQL, dan Samba melalui formulir
- pengguna, grup, dan kuota disk
- cron job dan jam sistem
- pembaruan paket, serta file manager dengan fitur upload dan download
- front end firewall, termasuk satu untuk iptables dan satu untuk firewalld
- backup file konfigurasi, serta modul cluster yang menerapkan satu perubahan ke server Webmin lain
Webmin mengedit file sebenarnya di bawah /etc. Tidak ada database tersembunyi di balik formulir tersebut. Jadi, jika /etc berada dalam version control, sudo git -C /etc diff setelah Anda menyimpan formulir akan menampilkan persis apa yang ditulis modul. Ini adalah cara tercepat untuk mengetahui fungsi sebenarnya dari setiap halaman Webmin. Panduan instalasi dan login pertama Webmin membahas struktur modul secara terperinci. Virtualmin dan Usermin adalah produk terpisah yang dibangun di atas engine yang sama, masing-masing untuk shared hosting dan pengguna akhir. Keduanya juga mewarisi semua hal yang dijelaskan di sini tentang eksposur.
Bagaimana masing-masing melakukan autentikasi
Cockpit tidak memiliki database pengguna. Halaman loginnya menjalankan stack PAM (pluggable authentication modules) di /etc/pam.d/cockpit. Karena itu, akun yang digunakan adalah akun Unix, dan password yang digunakan adalah password Unix. Secara default, root ditolak karena /etc/cockpit/disallowed-users mencantumkannya. Tindakan yang memerlukan hak istimewa diproses melalui polkit. Antarmuka juga meminta password Anda lagi sebelum mengubah apa pun. Karena itu, header halaman dapat menampilkan "Limited access" sampai Anda melakukan eskalasi hak akses.
Desain ini menimbulkan satu konsekuensi pada server yang diperketat keamanannya. Jika Anda mengikuti login SSH hanya dengan key dengan autentikasi password dinonaktifkan, akun tersebut mungkin sama sekali tidak memiliki password yang dapat digunakan. Akibatnya, login Cockpit ditolak, sedangkan ssh tetap berfungsi. Periksa statusnya di server:
sudo passwd -S deployOutput yang diawali deploy L berarti password terkunci. PAM tidak memiliki password yang dapat diterima, sehingga password apa pun yang Anda masukkan tidak akan berfungsi. P berarti password yang dapat digunakan telah ditetapkan. Halaman login Cockpit sendiri tidak menerima SSH key. Key hanya digunakan ketika Cockpit terhubung dari mesin yang Anda masuki ke host lain.
Webmin menyimpan penggunanya sendiri di /etc/webmin/miniserv.users, terpisah dari /etc/passwd, dan juga dapat dikonfigurasi untuk melakukan autentikasi terhadap akun Unix. Pengguna Webmin yang diberi akses ke semua modul memiliki hak root pada mesin tersebut, apa pun shell login yang ditetapkan untuknya. Webmin menyediakan dukungan TOTP (time-based one-time password) dan pemblokiran host setelah login gagal berulang kali. Keduanya diaktifkan melalui Webmin Configuration. Cockpit hanya mendapatkan faktor kedua jika Anda menambahkannya ke PAM, misalnya dengan libpam-google-authenticator.
Cara masing-masing diperbarui
Cockpit dipaketkan oleh distribusi Anda. Pada Ubuntu 24.04, Cockpit berasal dari archive, dan proyek upstream merekomendasikan pocket backports untuk mendapatkan build yang lebih baru:
. /etc/os-release
sudo apt update
sudo apt install -t ${VERSION_CODENAME}-backports cockpit
sudo systemctl status cockpit.socket
apt policy cockpitapt policy menampilkan versi yang Anda instal dan repository asalnya. Jika backports tidak menyediakan build yang lebih baru, apt menggunakan versi dari archive, dan itu tidak masalah. cockpit.socket harus menampilkan active (listening). Perbaikan keamanan kemudian diterima melalui proses unattended-upgrades yang sama seperti kernel Anda, dari publisher yang sudah Anda percayai.
Webmin tidak tersedia dalam archive Ubuntu. Instalasi resmi terlebih dahulu menambahkan repository dan signing key milik Webmin:
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 script tersebut sebelum menjalankannya karena script itu berjalan sebagai root. Setelah itu, setiap apt upgrade pada server juga mengambil paket dari repository Webmin. Dengan demikian, Anda menambahkan publisher kedua yang memiliki kepercayaan tingkat root pada server. Itulah biaya sebenarnya menggunakan Webmin, dan hal ini perlu dijelaskan dengan contoh yang jelas: CVE-2019-15107 merupakan backdoor dalam beberapa package 1.9x yang memungkinkan eksekusi perintah tanpa autentikasi. Backdoor tersebut menjangkau pengguna karena build host proyek telah dibobol, bukan karena source repository-nya. Pemaketan oleh distribusi tidak membuat hal itu mustahil. Namun, cara ini menambahkan tahap build dan review yang tidak perlu Anda kelola sendiri.
Mengapa keduanya tidak boleh menggunakan port publik
Cockpit mendengarkan pada TCP 9090 dan Webmin pada TCP 10000, keduanya menggunakan TLS (transport layer security) dengan sertifikat yang ditandatangani sendiri. Karena itu, hal pertama yang Anda lihat adalah peringatan browser. Membuat dan memercayai sertifikat yang ditandatangani sendiri menjelaskan hal-hal yang dapat dan tidak dapat disimpulkan dari peringatan tersebut. Kedua port dipindai terus-menerus, dan kedua panel memberikan akses ke root. Karena itu, kata sandi yang berhasil ditebak atau digunakan ulang dapat menyebabkan server sepenuhnya disusupi.
Pola yang aman adalah mengikat panel ke localhost dan mengaksesnya melalui tunnel SSH. Untuk Cockpit, timpa socket unit:
sudo systemctl edit cockpit.socket[Socket]
ListenStream=
ListenStream=127.0.0.1:9090Baris kosong ListenStream= harus berdiri sendiri. systemd menambahkan nilai pada pengaturan berbentuk daftar. Tanpa baris tersebut, unit tetap menggunakan 0.0.0.0:9090 yang asli dan menambahkan alamat baru, sehingga panel Anda masih dapat diakses publik. Terapkan penggantian tersebut dan periksa apa yang sedang mendengarkan:
sudo systemctl daemon-reload
sudo systemctl restart cockpit.socket
sudo ss -lntp | grep 9090Output harus menampilkan 127.0.0.1:9090. Alamat *:9090 atau 0.0.0.0:9090 berarti penggantian tersebut tidak diterapkan. Sekarang buka tunnel dari mesin Anda sendiri dan buka https://localhost:9090 di browser:
ssh -N -L 9090:127.0.0.1:9090 deploy@203.0.113.10Pertahankan port lokal agar sama dengan port remote. Cockpit membandingkan header Origin dari browser dengan alamat yang menurutnya digunakan untuk melayani permintaan. Karena itu, tunnel dari port lokal 9999 dapat memuat halaman login, tetapi proses login kemudian gagal, dan journalctl -u cockpit mencatat origin yang ditolak. Jika Anda memerlukan port lokal yang berbeda, tetapkan port tersebut di /etc/cockpit/cockpit.conf:
[WebService]
Origins = https://localhost:9999 https://127.0.0.1:9999Restart dengan sudo systemctl restart cockpit.socket agar pengaturan tersebut diterapkan. Untuk Webmin, pengaturan yang setara berada di /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 memeriksa header Referer pada pengiriman formulir dan menolak permintaan yang tampaknya berasal dari host lain. Hal inilah yang menyebabkan upaya awal menggunakan reverse proxy gagal. Baris referers= dalam file yang sama digunakan untuk mengizinkan hostname proxy, sedangkan webprefix= digunakan untuk memberi tahu Webmin bahwa panel tersebut berada di bawah suatu path.
Pilihan lainnya adalah reverse proxy yang memerlukan autentikasi: nginx berada di depan, dengan lapisan single sign-on Authentik yang menangani login. Cara ini berfungsi, dan merupakan pilihan terbaik kedua. Panel tetap berjalan sebagai root di belakang proxy, dan sekarang Anda memelihara dua pintu masuk, bukan satu. Tunnel sama sekali tidak menambahkan service yang mendengarkan di Internet, serta menggunakan kembali kunci SSH yang sudah Anda lindungi.
Panel mana yang cocok pada server yang sudah menjalankan layanan produksi
Cockpit, karena dua alasan yang penting ketika ada orang lain yang bergantung pada mesin tersebut. Cockpit diaktifkan melalui socket, sehingga cockpit-ws hanya berjalan selama ada sesi yang terbuka dan tidak ada daemon root permanen yang menunggu pada sebuah port. Cockpit juga tidak mengelola apa pun: hapus paketnya, dan setiap layanan tetap berjalan persis seperti sebelumnya karena Cockpit tidak menyimpan konfigurasi sendiri. miniserv.pl milik Webmin tetap berjalan di latar belakang terlepas dari ada atau tidaknya pengguna yang login. Periksa penggunaan resource di sistem Anda dengan systemctl status webmin, yang menampilkan memori resident dari proses yang sedang berjalan.
Jika Anda memerlukan modul DNS atau mail milik Webmin, gunakan server khusus untuk modul tersebut. Server Webmin yang hanya menjalankan satu tugas dan terikat pada 127.0.0.1 memiliki risiko yang terbatas. Webmin yang berbagi host dengan aplikasi yang diakses pelanggan tidak demikian. Selesaikan konfigurasi dasar sebelum memasang panel mana pun: sepuluh menit pertama pada VPS baru membahas pengguna non-root dan firewall yang diasumsikan sudah tersedia oleh kedua panel tersebut.
Saat Keduanya Bukan Pilihan
Sebuah panel bersifat per server dan manual. Panel tidak mencatat perubahan yang dilakukan atau alasannya. Cara ini cukup untuk satu server. Pada lima server, Anda harus mengulangi langkah yang sama. Pada dua puluh server, Anda mulai menebak server mana yang belum menerima perubahan. Cockpit dapat menambahkan host lain ke satu sesi melalui SSH, tetapi versi terbaru menonaktifkan fitur tersebut secara default dan mengharuskan AllowMultiHost=yes di /etc/cockpit/cockpit.conf. Anda tetap harus mengeklik perubahan yang sama lima kali.
Alternatifnya adalah menggunakan SSH biasa dengan konfigurasi yang disimpan dalam repositori git. Mengelola beberapa server Linux dari satu tempat menjelaskan struktur pengaturan tersebut. Playbook Ansible pertama menerapkan aturan firewall yang sama ke setiap host dari satu file yang dapat Anda tinjau sebagai diff. Pengelolaan container juga dilakukan dengan cara yang sama: docker compose up -d melalui SSH dari file dalam git, seperti dijelaskan dalam panduan dasar Docker Compose, lebih baik daripada mengeklik panel apa pun. Selain itu, Cockpit memang tidak mengelola Docker.
Gunakan panel untuk hal yang sulit dilakukan melalui terminal, seperti membaca grafik metrik atau menemukan unit yang gagal di antara empat puluh unit. Gunakan kode untuk apa pun yang akan Anda lakukan lebih dari dua kali.
Mode kegagalan dan string yang akan Anda lihat
Cockpit menolak kata sandi yang diterima SSH. Akun tersebut hanya menggunakan key. sudo passwd -S alice menampilkan L pada field kedua, sehingga PAM tidak memiliki kata sandi untuk diperiksa. Tetapkan kata sandi dengan sudo passwd alice, atau gunakan akun tersebut untuk SSH dan login ke Cockpit sebagai pengguna lain.
Cockpit menolak root meskipun kata sandinya benar. /etc/cockpit/disallowed-users mencantumkan root. Login sebagai pengguna biasa yang memiliki hak sudo. Itulah jalur yang dimaksudkan, karena polkit kemudian mencatat manusia yang melakukan eskalasi hak akses.
Cockpit tidak menampilkan halaman Networking atau Firewall. Halaman tersebut memerlukan NetworkManager dan firewalld. VPS Ubuntu menggunakan netplan dengan systemd-networkd dan ufw, sehingga halaman tersebut tidak muncul. Tidak ada yang rusak, dan solusinya adalah tetap menggunakan ufw melalui SSH.
Halaman login Cockpit dimuat melalui tunnel, tetapi login gagal. Port lokal Anda berbeda dari port remote, sehingga pemeriksaan Origin gagal dan journalctl -u cockpit menampilkannya. Samakan port tersebut, atau tetapkan Origins di /etc/cockpit/cockpit.conf.
Pengiriman form Webmin gagal setelah panel ditempatkan di belakang proxy. Pemeriksaan Referer menolaknya. Tambahkan hostname proxy ke referers= di /etc/webmin/miniserv.conf, dan tetapkan webprefix= jika panel disajikan melalui suatu path.
Anda tidak yakin apakah suatu panel terekspos. sudo ss -lntp | grep -E '9090|10000' memberikan jawabannya dari server itu sendiri, dan Webmin menulis setiap upaya login ke /var/webmin/miniserv.log. Log tersebut perlu dibaca sekali setelah ada perubahan pada cara panel menerima koneksi.
FAQ
Apakah Cockpit atau Webmin lebih baik untuk satu Ubuntu VPS?
Bagi kebanyakan pengguna, Cockpit lebih baik karena berasal dari repositori Ubuntu sendiri, diperbarui bersama seluruh sistem, dan hanya berjalan selama sesi browser terbuka. Pilih Webmin jika Anda memerlukan editor berbasis formulir untuk service yang tidak ditangani Cockpit, seperti BIND atau Postfix. Sebagai konsekuensinya, web server Webmin berjalan sebagai root sepanjang waktu dan pembaruannya berasal dari repositori Webmin sendiri.
Dapatkah Cockpit dan Webmin dijalankan pada server yang sama?
Ya. Keduanya menggunakan port yang berbeda, yaitu 9090 dan 10000, sehingga tidak saling bertentangan karena masing-masing mengedit sistem secara langsung, bukan mengelola sistem secara eksklusif. Namun, ini tetap bukan pilihan yang baik. Setiap panel merupakan login terpisah yang dapat mengakses root pada mesin yang sama, sehingga Anda menggandakan permukaan serangan hanya untuk menghemat beberapa klik. Jika Anda memasang keduanya, ikat keduanya ke 127.0.0.1 dan akses melalui SSH tunnel.
Apakah aman membuka port 9090 atau 10000 ke Internet?
Tidak jika menggunakan login dengan password. Kedua panel memberikan akses ke root, dan kedua port tersebut biasanya ditemukan melalui pemindaian rutin dalam hitungan jam setelah dibuka. Ikat panel ke 127.0.0.1, lalu jalankan ssh -N -L 9090:127.0.0.1:9090 user@host dan buka https://localhost:9090 di browser. Konfirmasikan dengan sudo ss -lntp | grep 9090, yang harus menampilkan 127.0.0.1:9090, bukan 0.0.0.0:9090. Reverse proxy terautentikasi merupakan opsi kedua yang dapat diterima.
Mengapa login Cockpit saya gagal, padahal SSH dengan key dapat digunakan?
Cockpit melakukan autentikasi melalui PAM dengan password Unix, dan halaman loginnya tidak menerima SSH key. Pada server yang diperketat keamanannya, akun sering kali tidak memiliki password yang dapat digunakan. Jalankan sudo passwd -S youruser: L pada field kedua berarti password terkunci, sehingga PAM tidak memiliki kredensial yang dapat diterima dan setiap upaya login ditolak. Tetapkan password dengan sudo passwd youruser, atau gunakan akun lain untuk panel tersebut.
Apakah Cockpit mengelola container Docker?
Tidak. Halaman container Cockpit berasal dari cockpit-podman dan mengelola Podman. Modul Docker lama telah dihapus beberapa tahun lalu dan tidak akan dikembalikan. Jika service Anda berjalan di bawah Docker, kelola service tersebut dengan compose file dalam version control melalui SSH, dan biarkan Cockpit menangani sistem di sekitarnya, seperti journal dan disk.