Cài đặt OpenSSH Server trên Fedora: SSH Key, Hardening cấu hình và tích hợp firewalld

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Chuyện thật xảy ra lúc 2 giờ sáng

Hồi mới setup VPS chạy Fedora, mình để SSH với password mặc định, port 22. Sáng hôm sau mở log thấy hơn 4.000 lần đăng nhập thất bại từ các IP khác nhau — brute force tự động. Không bị hack nhờ password đủ mạnh, nhưng đó là lúc mình quyết định làm đúng từ đầu: SSH Key + hardening + firewalld, không thỏa hiệp.

Mình dùng Fedora làm máy development chính đã 2 năm. Một điểm cần lưu ý: Fedora cập nhật package nhanh, OpenSSH cũng theo đó mà có version mới thường xuyên — một số option cấu hình thay đổi hoặc bị deprecated. Bài này ghi lại quy trình mình đang dùng thực tế, cập nhật cho Fedora 40/41.

Tại sao SSH mặc định lại nguy hiểm?

Fedora Server mặc định đã cài openssh-server, nhưng cấu hình out-of-the-box có mấy vấn đề:

  • Port 22 — bot scan toàn internet port này 24/7
  • PasswordAuthentication yes — brute force được
  • PermitRootLogin yes (hoặc prohibit-password) — root vẫn có thể login
  • Không giới hạn user — mọi account đều SSH được

firewalld trên Fedora mặc định cho phép SSH (port 22) qua zone public. Tức là ngay sau khi bật máy, port 22 đã mở ra internet. Ghép với cấu hình lỏng lẻo ở trên — máy chủ của bạn là mục tiêu di chuyển được ngay lập tức.

Các hướng giải quyết

Hướng 1: Đổi port SSH

Nhiều người làm mỗi việc đổi port 22 sang port khác (VD: 2222) rồi coi là xong. Thực tế thì port scan bằng nmap vẫn tìm ra trong vài phút. Đây là security through obscurity — giảm noise trong log thôi, không phải bảo mật thật sự.

Hướng 2: Fail2ban

Tự động block IP sau N lần fail. Tốt hơn, nhưng vẫn giữ password auth. Nếu attacker dùng distributed botnet với hàng trăm IP xoay vòng thì Fail2ban không hiệu quả.

Hướng 3: SSH Key + tắt Password Auth + firewalld rules

Mình chọn hướng này vì nó triệt để hơn hẳn hai hướng kia. Ba lớp kết hợp: chỉ cho phép key-based auth, hardening sshd_config, whitelist IP qua firewalld nếu có thể. Bot brute force mất tác dụng hoàn toàn — không có password để đoán, không có gì để brute force.

Thực hành: Setup SSH Key trên Fedora

Bước 1: Kiểm tra và cài OpenSSH

# Kiểm tra đã cài chưa
dnf list installed openssh-server

# Nếu chưa có
sudo dnf install -y openssh-server

# Bật và enable service
sudo systemctl enable --now sshd

# Kiểm tra trạng thái
sudo systemctl status sshd

Bước 2: Tạo SSH Key pair trên máy client

Bước này chạy trên máy local của bạn, không phải trên server:

# ED25519 — thuật toán hiện đại, an toàn hơn RSA 2048
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/fedora_server

# Nếu cần tương thích rộng hơn, dùng RSA 4096
# ssh-keygen -t rsa -b 4096 -C "[email protected]" -f ~/.ssh/fedora_server

Kết quả là 2 file: ~/.ssh/fedora_server (private key — không bao giờ share) và ~/.ssh/fedora_server.pub (public key — đưa lên server).

Bước 3: Copy public key lên server

# Cách nhanh nhất
ssh-copy-id -i ~/.ssh/fedora_server.pub username@server_ip

# Hoặc thủ công nếu ssh-copy-id không dùng được
cat ~/.ssh/fedora_server.pub | ssh username@server_ip \
  "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Bước 4: Test kết nối trước khi hardening

# Test với key vừa tạo — KHÔNG đóng session hiện tại
ssh -i ~/.ssh/fedora_server username@server_ip

# Thêm vào ~/.ssh/config để tiện dùng
Host fedora-server
    HostName server_ip
    User username
    IdentityFile ~/.ssh/fedora_server
    IdentitiesOnly yes

Quan trọng: giữ nguyên session SSH cũ đang mở trong khi làm bước hardening. Lock out bản thân là điều hoàn toàn có thể xảy ra — session cũ là đường thoát hiểm.

Hardening sshd_config

File cấu hình chính là /etc/ssh/sshd_config. Trên Fedora 40+, cách được khuyến nghị là dùng /etc/ssh/sshd_config.d/*.conf để override — không đụng file gốc, dễ rollback hơn nhiều.

# Tạo file override riêng
sudo nano /etc/ssh/sshd_config.d/99-hardening.conf

Nội dung file:

# Tắt đăng nhập bằng password
PasswordAuthentication no
KbdInteractiveAuthentication no

# Không cho root login trực tiếp
PermitRootLogin no

# Chỉ cho phép user cụ thể SSH (thay "youruser" bằng username thực)
AllowUsers youruser

# Giới hạn số lần thử xác thực
MaxAuthTries 3

# Timeout session idle (300 giây = 5 phút)
ClientAliveInterval 300
ClientAliveCountMax 2

# Tắt X11 forwarding nếu không dùng
X11Forwarding no

# Tắt các auth method không cần thiết
GSSAPIAuthentication no
UsePAM yes

Apply cấu hình:

# Kiểm tra syntax trước khi restart
sudo sshd -t

# Nếu không có lỗi
sudo systemctl restart sshd

Tích hợp firewalld

Khác với Ubuntu dùng ufw, Fedora dùng firewalld với khái niệm zoneservice. Linh hoạt hơn, nhưng cần hiểu cơ chế trước khi chỉnh.

Kiểm tra cấu hình hiện tại

# Xem zone đang active
sudo firewall-cmd --get-active-zones

# Xem service nào đang được phép trong zone public
sudo firewall-cmd --zone=public --list-services

Đổi port SSH và cập nhật firewalld

Nếu quyết định đổi port (VD: 2222) để giảm noise trong log:

# Thêm vào file hardening
echo "Port 2222" | sudo tee -a /etc/ssh/sshd_config.d/99-hardening.conf

# Cho SELinux biết port mới (Fedora dùng SELinux enforcing mặc định)
sudo semanage port -a -t ssh_port_t -p tcp 2222

# Cập nhật firewalld: bỏ service ssh mặc định (port 22), thêm port mới
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload

# Khởi động lại sshd
sudo systemctl restart sshd

Whitelist IP nếu có IP cố định

Làm việc từ IP cố định — văn phòng hoặc VPN cố định — thì đây là lớp bảo vệ mạnh nhất có thể làm:

# Tạo zone riêng cho SSH management
sudo firewall-cmd --permanent --new-zone=ssh-management
sudo firewall-cmd --permanent --zone=ssh-management --add-port=2222/tcp

# Chỉ cho phép IP của bạn
sudo firewall-cmd --permanent --zone=ssh-management --add-source=YOUR.OFFICE.IP/32

# Đảm bảo zone public KHÔNG có SSH
sudo firewall-cmd --permanent --zone=public --remove-service=ssh
sudo firewall-cmd --permanent --zone=public --remove-port=2222/tcp

sudo firewall-cmd --reload

# Verify
sudo firewall-cmd --zone=ssh-management --list-all

Rich rules cho rate limiting

Không muốn cài thêm Fail2ban? firewalld tự xử lý được rate limiting:

# Giới hạn 5 kết nối SSH mới trong 1 phút từ 1 IP
sudo firewall-cmd --permanent --add-rich-rule=\
'rule service name="ssh" limit value="5/m" accept'
sudo firewall-cmd --reload

Verify và monitor

# Kiểm tra cấu hình SSH đang chạy
sudo sshd -T | grep -E 'passwordauth|permitroot|port|allowusers'

# Xem log đăng nhập realtime
sudo journalctl -u sshd -f

# Lọc lỗi trong 1 giờ qua
sudo journalctl -u sshd --since "1 hour ago" | grep -i fail

Checklist cuối cùng

Trước khi đóng session cũ, mình check lại danh sách này:

  1. SSH với key mới hoạt động từ terminal khác ✓
  2. PasswordAuthentication no đã có hiệu lực (thử SSH với password — phải bị từ chối) ✓
  3. Root login bị chặn ✓
  4. firewall-cmd --list-all hiển thị đúng port/zone ✓
  5. SELinux không báo AVC denial cho port mới (kiểm tra: sudo ausearch -m avc -ts recent) ✓

Toàn bộ quá trình mất khoảng 15–20 phút. Lần đầu có thể mất 45 phút vì SELinux hay có error message lạ cần đọc kỹ. Nhưng sau khi quen, setup Fedora server mới nhanh hơn nhiều — sshd_config.d/ drop-in sạch, firewalld có zone rõ ràng, ít chỗ cần mò hơn so với các distro khác mình từng dùng.

Share: