Cara Mengubah Port SSH dengan SELinux dan firewalld
Pelajari urutan aman mengubah port SSH di Rocky Linux dan AlmaLinux: buka port di firewalld, beri label SELinux, lalu ubah sshd_config tanpa memutus sesi.
Mengapa perubahan port SSH memerlukan tiga langkah di sini
Untuk mengubah port SSH pada Rocky Linux, AlmaLinux, CentOS Stream, atau Fedora, satu kali penyuntingan saja tidak cukup. Tiga sistem terpisah menentukan apakah koneksi pada port baru akan berfungsi. firewalld menentukan apakah paket dapat mencapai mesin. SELinux menentukan apakah sshd diizinkan mengikat nomor port tersebut. sshd_config menentukan port yang diminta daemon. Jika langkah SELinux dilewati, daemon tidak dapat start. Jika langkah firewalld dilewati, daemon tetap start dan mendengarkan, tetapi tidak ada yang dapat mengaksesnya.
Di Ubuntu, pekerjaan yang sama hanya memerlukan satu penyuntingan dan restart karena Ubuntu menggunakan AppArmor, bukan SELinux, serta tidak menyediakan profile yang membatasi port yang boleh diikat sshd. Jika ufw berjalan di sana, tambahkan satu rule. Hanya itu perbedaannya. Keluarga RHEL menyediakan firewalld yang berjalan dan SELinux dalam mode enforcing sejak instalasi baru, dan keduanya memperhatikan nomor port.
Lakukan pekerjaan ini dalam urutan berikut agar sesi Anda saat ini tetap aktif selama setiap langkah:
- Buka port baru di firewalld, dan biarkan port 22 tetap terbuka untuk sementara.
- Tambahkan label SELinux untuk port baru dengan
semanage. - Tetapkan port dalam konfigurasi sshd.
- Restart
sshd, lalu login melalui port baru dari terminal kedua sebelum menutup terminal pertama.
Temukan konsol web provider Anda (VNC atau serial) sebelum memulai, lalu pastikan Anda dapat login melalui konsol tersebut. Konsol itu adalah cara untuk mendapatkan kembali akses jika perubahan gagal. Perubahan port merupakan salah satu alasan paling umum tenant kehilangan akses ke server yang baru saja mereka bayar.
Pertama, instal semanage
semanage adalah alat untuk mengedit pengaturan kebijakan SELinux. Instalasi minimal Rocky Linux atau AlmaLinux tidak menyertakannya. Alat ini terdapat dalam policycoreutils-python-utils.
sudo dnf install -y policycoreutils-python-utilsJika perintah dijalankan sebelum paket tersebut diinstal, hasilnya adalah sudo: semanage: command not found. Pada tahap ini, banyak pembaca menyimpulkan bahwa SELinux belum diinstal dan melewati langkah ini. SELinux sudah terinstal. Hanya alat pengelolaannya yang belum tersedia. Jika sintaks dnf masih baru bagi Anda, padanan perintah dnf dan apt dapat menghubungkannya dengan perintah yang sudah Anda kenal.
Pilih port dan periksa apakah port tersebut sudah digunakan
Port TCP bebas apa pun dari 1024 hingga 65535 dapat digunakan. Lakukan dua pemeriksaan sebelum menetapkannya:
sudo ss -tlnp | grep -w 2222
sudo semanage port -l | grep -w 2222Pemeriksaan pertama menunjukkan apakah suatu proses sudah listening pada nomor tersebut. Pemeriksaan kedua menunjukkan apakah kebijakan SELinux sudah menetapkan port tersebut ke jenis service lain. Port yang bebas tidak menghasilkan keluaran dari kedua pemeriksaan. Jika kebijakan sudah menetapkan port tersebut, semanage port -a pada langkah 2 gagal dengan ValueError: Port tcp/2222 already defined. Solusinya adalah memilih nomor port lain.
Panduan ini menggunakan 2222 sebagai contoh. Port tersebut juga merupakan port pertama yang dicoba scanner setelah 22. Jadi, gunakan port yang kurang mudah ditebak pada server sebenarnya.
Langkah 1: buka port di firewalld
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports--permanent menulis aturan ke file zone pada disk dan tidak mengubah firewall yang sedang berjalan. --reload memuat konfigurasi pada disk ke firewall yang sedang berjalan. Jika reload dilewati, aturan memang ada, tetapi tidak berfungsi sampai firewalld dijalankan ulang. Ini adalah salah satu penyebab paling umum prosedur ini tampak gagal tanpa alasan.
Untuk saat ini, jangan ubah entri service ssh. Entri tersebut menjaga port 22 tetap terbuka dan menjadi akses cadangan selama pengujian.
Periksa juga panel kontrol provider Anda. Banyak host menjalankan firewall jaringan di depan VPS, di luar sistem operasi. Akibatnya, port yang sudah dibuka di firewalld tetap dapat diblokir di jaringan upstream. Panduan dasar firewalld untuk VPS menjelaskan zone serta perbedaan antara konfigurasi runtime dan permanent jika model ini masih baru bagi Anda.
Langkah 2: beri label pada port untuk SELinux
sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh_port_t-a menambahkan penetapan port baru. -t ssh_port_t adalah tipe yang digunakan oleh port SSH. Perintah kedua menampilkan semua port yang kini dicakup oleh ssh_port_t, sehingga Anda dapat memastikan nomor tersebut sudah ditambahkan sebelum mengubah daemon.
Mengapa SELinux memblokir port
SELinux (security-enhanced Linux) memberikan label kepada setiap objek di sistem, dan nomor port TCP juga merupakan objek seperti objek lainnya. Daemon SSH berjalan dalam domain terisolasi bernama sshd_t. Kebijakan mengizinkan sshd_t melakukan bind ke port TCP berlabel ssh_port_t, dan secara default hanya port 22 yang memiliki label tersebut. Jika daemon diminta melakukan bind ke 2222, kernel memeriksa labelnya, menemukan tipe umum yang ditetapkan kebijakan untuk nomor tersebut, lalu menolak izin name_bind pada socket.
Itulah sebabnya kegagalan ini tidak terlihat seperti masalah firewall. Kernel menolak operasi tersebut sebelum socket listening dibuat, sehingga sshd melaporkan error lalu keluar. Masalah firewall adalah kebalikannya: daemon berjalan dengan baik, tetapi paket dibuang saat masuk.
getenforce memberi tahu mode yang digunakan sistem. Dalam Permissive, penolakan dicatat tetapi tidak diberlakukan, sehingga perubahan port tampak berhasil lalu gagal ketika seseorang menjalankan setenforce 1 atau sistem melakukan reboot ke mode enforcing. Beri label pada port dalam kedua kondisi tersebut. Panduan dasar SELinux untuk server membahas mode, context, dan boolean secara menyeluruh. Port bukan satu-satunya objek yang terpengaruh. Kebijakan yang sama dapat mencegah container membaca direktori host yang di-mount sampai path tersebut diberi label ulang. Karena itu, panduan menginstal Docker di Rocky Linux atau AlmaLinux menyertakan langkah SELinux yang tidak pernah disebutkan dalam panduan Ubuntu.
Langkah 3: tetapkan port dalam konfigurasi sshd
Pada Rocky Linux 9 dan 10, AlmaLinux 9 dan 10, serta Fedora versi terkini, /etc/ssh/sshd_config diawali dengan baris include. Karena itu, lokasi yang rapi untuk perubahan Anda adalah file drop-in. Pembaruan paket tidak akan mengubah edit tersebut.
grep -n '^Include' /etc/ssh/sshd_config
echo 'Port 2222' | sudo tee /etc/ssh/sshd_config.d/10-port.conf
sudo sshd -tJika grep tidak menemukan baris Include, seperti pada Rocky Linux 8 dan image lama lainnya, masukkan Port 2222 langsung ke dalam /etc/ssh/sshd_config. sshd -t mem-parsing seluruh konfigurasi, termasuk drop-in, dan melaporkan error sintaks. Perbaiki semua laporan tersebut sebelum melakukan restart, karena konfigurasi yang gagal diparse berarti daemon tidak akan berjalan kembali.
Port dapat muncul lebih dari sekali, dan sshd akan mendengarkan setiap port yang tercantum. Membiarkan Port 22 bersama Port 2222 selama hari pertama merupakan langkah pengamanan sederhana, selama Anda ingat untuk menghapusnya.
Apakah sshd dijalankan oleh unit socket?
Beberapa image memulai SSH melalui aktivasi socket systemd, bukan sebagai service yang berjalan terus-menerus. Jika dikonfigurasi demikian, systemd mengelola socket yang listening dan meneruskan koneksi ke sshd. Karena itu, baris Port di sshd_config sepenuhnya diabaikan. Periksa hal ini sebelum me-restart apa pun:
systemctl is-enabled sshd.socketJawaban enabled berarti port ditetapkan pada unit socket, bukan di sshd_config:
sudo systemctl edit sshd.socket[Socket]
ListenStream=
ListenStream=2222ListenStream= tanpa nilai diperlukan. Nilai terakumulasi di berbagai drop-in. Tanpa assignment kosong untuk menghapus daftar terlebih dahulu, socket tetap listening pada 22 dan 2222. Terapkan dengan sudo systemctl daemon-reload, lalu jalankan sudo systemctl restart sshd.socket. Jika unit tersebut dinonaktifkan atau tidak ada di server Anda, bagian ini tidak berlaku.
Langkah 4: mulai ulang, lalu uji dari terminal kedua
sudo systemctl restart sshd
systemctl status sshd
sudo ss -tlnp | grep sshdBiarkan terminal ini tetap terbuka. Jangan keluar dari sesi ini. Buka terminal kedua di komputer Anda, lalu sambungkan melalui port baru:
ssh -p 2222 youruser@203.0.113.10Tutup sesi pertama hanya setelah login kedua berhasil. Jika login tersebut gagal, Anda masih memiliki shell untuk membatalkan semua perubahan. Kebiasaan ini membedakan perubahan yang selesai dalam lima menit dari pekerjaan berjam-jam melalui konsol penyedia.
Firewall melakukan drop atau SELinux menolak akses? Cara membedakannya
Dari laptop, kedua kegagalan ini terlihat hampir sama. Di server, keduanya terlihat sangat berbeda.
- Jika
systemctl status sshdmenunjukkan unit gagal, daemon tidak pernah mendapatkan socket-nya. Ini merupakan kesalahan konfigurasi atau penolakan SELinux. - Jika unit aktif dan
ss -tlnpmenunjukkan sshd terikat pada port baru, daemon tidak bermasalah. Masalahnya ada pada jalur jaringan: firewalld, firewall terpisah milik provider, atau alamat dan port yang Anda gunakan.
Untuk kasus SELinux, baca catatan audit, bukan membuat asumsi:
sudo ausearch -m AVC -ts recent
sudo journalctl -u sshd -n 50 --no-pagerPenolakan name_bind pada class tcp_socket mencantumkan proses di comm="sshd", nomor port di src=, dan label yang sebenarnya dimiliki port tersebut di tcontext=. Field terakhir itulah jawabannya. Nilai apa pun selain ssh_port_t berarti langkah 2 tidak diterapkan pada port yang Anda gunakan, biasanya karena salah mengetik nomor atau memilih protokol yang salah. Instal setroubleshoot-server jika Anda ingin sealert mengubah catatan tersebut menjadi kalimat.
Pesan yang ditulis sshd sendiri saat kernel menolak bind terlihat seperti ini:
error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.Permission denied pada port di atas 1024, yang tidak memerlukan hak istimewa root untuk melakukan bind, merupakan tanda SELinux. Address already in use pada baris yang sama menunjukkan kesalahan lain: proses lain sedang menggunakan port tersebut. Dari sisi client, perbedaan antara connection refused dan connection timed out membedakan kedua kasus jaringan tersebut, karena refusal berarti paket Anda mencapai host dan tidak ada proses yang sedang listening, sedangkan timeout berarti tidak ada respons sama sekali.
Tutup port 22 dan perbarui client Anda
Setelah beberapa login melalui port baru berhasil, hapus akses ke port 22:
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-allBiarkan label SELinux pada port 22. Label tersebut berasal dari kebijakan dasar dan tidak memberikan akses apa pun setelah firewall berhenti menerima paket yang masuk.
Selanjutnya, perbaiki client karena setiap tool yang mengasumsikan port default kini perlu diberi tahu. Simpan konfigurasi tersebut di ~/.ssh/config pada mesin Anda sekali saja, alih-alih terus-menerus mengetik -p:
Host myvps
HostName 203.0.113.10
Port 2222
User youruserscp, sftp, rsync, dan Ansible semuanya membaca file tersebut. Job backup, pemeriksaan monitoring, dan skrip cron yang menetapkan port 22 secara hardcode tidak membacanya. Cari dan perbarui semuanya selagi perubahan ini masih Anda ingat.
Apa yang didapat dan tidak didapat dari memindahkan port
Ini mengurangi kebisingan log. Pemindai otomatis terus-menerus membanjiri port 22, dan memindahkan service dari port tersebut menghapus sebagian besar baris itu dari journal sehingga kejadian yang sebenarnya lebih mudah dilihat. Ini bukan kontrol keamanan. Pemindai yang memindai seluruh rentang port tetap dapat menemukan daemon Anda dan membaca banner versinya. Anggap perubahan port sebagai pemeliharaan, lalu terapkan perlindungan yang sebenarnya dengan autentikasi hanya menggunakan key dan menonaktifkan login dengan password. Langkah-langkahnya dijelaskan dalam panduan hardening SSH untuk VPS.
Semua langkah di atas bekerja dengan cara yang sama pada kedua rebuild RHEL utama karena keduanya dibuat dari source yang sama. Lihat perbandingan Rocky Linux dan AlmaLinux jika Anda masih memilih di antara keduanya. Ada dua rebuild yang hampir identik untuk dipilih karena CentOS berhenti menjadi salah satunya pada 2020. Perubahan ini dijelaskan lengkap dalam kisah dari Red Hat ke CentOS, lalu ke Rocky dan AlmaLinux. Periksa release yang benar-benar Anda dapatkan sebelum mengikuti panduan lama apa pun, menggunakan cat /etc/os-release. Panduan yang ditulis untuk Rocky Linux 8 masih memiliki peringkat yang baik, dan langkah semanage serta firewall-cmd di dalamnya tetap benar. Namun, Rocky 8 tidak memiliki baris include sshd_config.d dan tidak memiliki socket unit yang perlu diperhatikan. Karena itu, bagian sshd dari panduan tersebut tidak sesuai dengan server saat ini.
fail2ban harus diberi tahu tentang port baru
fail2ban tidak tersedia di repositori dasar. Paket ini berasal dari EPEL (extra packages for enterprise Linux):
sudo dnf install -y epel-release
sudo dnf install -y fail2ban fail2ban-firewalldSubpaket fail2ban-firewalld membuat fail2ban menulis pemblokiran melalui firewalld. Ini yang diperlukan pada server yang aturan firewalld-nya menjadi sumber aturan utama.
Jail bawaan sshd menetapkan port = ssh, dan nama tersebut di-resolve melalui /etc/services ke port 22. Setelah perubahan ini, jail memantau port yang tidak diserang. Akibatnya, tidak ada yang diblokir sementara kegagalan login terus bertambah pada port 2222. Tetapkan port berdasarkan nomornya di /etc/fail2ban/jail.local:
[sshd]
enabled = true
port = 2222
backend = systemd
maxretry = 5
bantime = 3600backend = systemd membaca kegagalan dari journal, bukan dari /var/log/secure. Ini lebih aman pada instalasi minimal yang mungkin tidak memiliki rsyslog. Jalankan dengan sudo systemctl enable --now fail2ban, lalu periksa jail menggunakan sudo fail2ban-client status sshd. Sintaks jail sama dengan yang digunakan dalam konfigurasi fail2ban untuk SSH di Ubuntu 24.04. Hanya sumber paket dan tindakan pemblokirannya yang berbeda.
Patching lebih penting daripada port
Server dengan port SSH yang dipindahkan dan pembaruan keamanan yang belum diterapkan selama empat bulan berada dalam kondisi yang lebih buruk daripada server yang menggunakan port 22 tetapi memasang patch setiap malam. Aktifkan pembaruan otomatis dalam sesi yang sama saat Anda sudah menjadi root: pembaruan dnf otomatis di Rocky Linux dan AlmaLinux membahas timer serta pilihan antara mengunduh pembaruan dan menerapkannya. Pembaruan yang terpasang tidak me-restart daemon yang masih menjalankan kode lama. Karena itu, memeriksa layanan yang masih memerlukan restart atau reboot layak dilakukan setiap kali openssh-server atau library yang ditautkannya diperbarui dalam batch tersebut.
FAQ
Mengapa sshd gagal start setelah saya mengubah port di Rocky Linux?
Hampir selalu penyebabnya adalah label port SELinux yang belum ada. sshd berjalan dalam domain sshd_t yang dibatasi, dan policy hanya mengizinkannya melakukan bind pada port berlabel ssh_port_t, yang secara default hanya mencakup port 22. Kernel menolak bind tersebut, sehingga daemon keluar dan tidak listening, dan journalctl -u sshd berisi baris dengan bentuk error: Bind to port 2222 on 0.0.0.0 failed: Permission denied. Jalankan sudo semanage port -a -t ssh_port_t -p tcp 2222 dengan nomor port Anda sendiri, lalu restart service. Jika semanage tidak ditemukan, instal policycoreutils-python-utils terlebih dahulu.
Apakah saya masih memerlukan semanage jika SELinux berada dalam mode permissive?
Ya. Dalam mode permissive, penolakan dicatat dan bind tetap diizinkan, sehingga perubahan tampak berhasil. Label tersebut tetap belum ada. Saat seseorang menjalankan setenforce 1, atau server melakukan boot dengan SELINUX=enforcing dalam /etc/selinux/config, sshd berhenti start pada port tersebut. Menambahkan label hanya memerlukan satu perintah dan menghilangkan kegagalan yang jika tidak ditangani dapat muncul beberapa minggu kemudian tanpa penyebab yang jelas.
Port sudah diberi label dan sshd sedang berjalan, jadi mengapa koneksi saya timeout?
Daemon yang berjalan berarti SELinux tidak bermasalah, sehingga paket kemungkinan dibuang saat masuk. Periksa sudo firewall-cmd --list-ports untuk port Anda, dan pastikan Anda menjalankan firewall-cmd --reload setelah aturan --permanent, karena aturan permanen saja tidak pernah diterapkan pada firewall yang sedang berjalan. Selanjutnya, periksa control panel host Anda untuk firewall jaringan terpisah di depan VPS. Di situlah koneksi sering terblokir untuk kedua kalinya, dan tidak ada apa pun di dalam sistem operasi yang akan menampilkannya.
Port mana yang sebaiknya saya gunakan sebagai pengganti 22?
Gunakan port TCP bebas apa pun dari 1024 hingga 65535. Hindari 2222 dan 22222 pada server produksi, karena scanner akan langsung mencobanya setelah port 22. Pastikan nomor tersebut belum digunakan dengan sudo ss -tlnp, pastikan policy SELinux belum mengklaimnya dengan sudo semanage port -l, dan jangan gunakan port yang ditetapkan untuk service yang mungkin Anda instal nanti. Nomor yang tinggi dan sulit diingat tidak masalah, karena Anda cukup menuliskannya satu kali ke dalam ~/.ssh/config dan tidak perlu mengetiknya lagi.