Vấn đề thực tế: Server mới cài xong nhưng chưa dùng được
Lần đầu mình dựng một VPS chạy Fedora Server, cảm giác sau khi cài xong là “xong rồi, dùng thôi”. Nhưng chỉ sau 3 ngày, log báo có hàng trăm lần brute-force vào port 22, root login bị thử liên tục, và firewall thì gần như không chặn được gì đáng kể vì mình chưa cấu hình rule nào cả.
Fedora Server không phải distro “cài xong là an toàn”. Nó cho bạn một nền tảng sạch, nhưng mọi thứ còn lại — bảo mật, user management, dịch vụ mạng — bạn phải tự làm. Mình dùng Fedora làm máy development chính đã 2 năm và khá hài lòng với tốc độ cập nhật package, nhưng phần server thì cần thêm vài bước cấu hình mới thực sự ready.
Phân tích nguyên nhân: Tại sao Fedora Server mặc định chưa đủ?
Fedora ưu tiên linh hoạt hơn là thiết lập sẵn theo kiểu phòng thủ. Sau khi cài minimal install, đây là những thứ mặc định bạn sẽ gặp:
- SSH daemon đang chạy và mặc định cho phép đăng nhập bằng password — dễ bị brute-force.
- firewalld bật sẵn nhưng zone mặc định
publicvẫn mở nhiều service không cần thiết. - SELinux ở chế độ Enforcing — tốt cho bảo mật, nhưng nhiều người tắt đi vì gặp lỗi mà không hiểu nguyên nhân.
- Không có fail2ban — brute-force có thể thử mãi không bị block.
- Root account chưa bị vô hiệu hóa SSH trên một số cấu hình cài đặt.
Vấn đề không phải ở Fedora, mà ở chỗ nhiều người bỏ qua bước hardening ban đầu vì nghĩ đó là việc làm sau.
Các cách giải quyết
Cách 1: Dùng Ansible để tự động hóa
Nếu bạn quản lý nhiều server, Ansible là lựa chọn hợp lý. Viết một playbook chạy một lần là xong tất cả. Nhược điểm: overhead cho người mới, cần hiểu YAML và module syntax trước.
Cách 2: Script shell một lần chạy
Viết bash script cài đặt tất cả, chạy sau khi provisioning. Nhanh hơn Ansible nhưng khó maintain hơn, dễ có bug nếu không test kỹ.
Cách 3: Cấu hình thủ công từng bước (khuyến nghị cho người mới)
Tốn thời gian hơn, nhưng bạn hiểu từng thứ đang làm gì. Khi gặp lỗi sau này, bạn biết kiểm tra ở đâu. Đây là cách mình dùng khi mới bắt đầu và vẫn dùng khi cần debug.
Cách tốt nhất: Quy trình cấu hình ban đầu từng bước
Bước 1: Cài đặt Fedora Server
Tải ISO từ trang chính thức Fedora. Khi cài, chọn Fedora Server Edition với cấu hình minimal để tránh cài thừa package. Trong quá trình cài, tạo root password và tạo luôn một non-root user.
Sau khi boot lần đầu, cập nhật hệ thống ngay:
sudo dnf update -y
sudo reboot
Lý do reboot: nếu kernel được cập nhật, cần khởi động lại để dùng kernel mới.
Bước 2: Tạo user và phân quyền sudo
Root account vẫn có trên hệ thống sau khi cài, nhưng dùng nó trực tiếp là thói quen xấu — một lệnh nhầm có thể xóa cả server mà không có checkpoint nào. Tạo một user riêng và cấp quyền sudo:
# Tạo user mới
useradd -m -s /bin/bash sysadmin
passwd sysadmin
# Thêm vào group wheel (sudo trên Fedora)
usermod -aG wheel sysadmin
# Kiểm tra
id sysadmin
Từ bây giờ, đăng nhập bằng user này, không dùng root.
Bước 3: Khóa SSH đúng cách
SSH là cổng vào duy nhất của bạn — và cũng là thứ bị tấn công nhiều nhất. Mình từng bỏ qua bước này và trả giá bằng hàng nghìn dòng log brute-force mỗi ngày, kèm CPU spike bất thường vào ban đêm.
Trước tiên, copy SSH public key lên server (làm từ máy local của bạn):
# Trên máy local
ssh-keygen -t ed25519 -C "[email protected]"
ssh-copy-id sysadmin@your_server_ip
Sau đó, chỉnh file cấu hình SSH trên server:
sudo nano /etc/ssh/sshd_config
Tìm và sửa các dòng sau:
Port 2222 # Đổi port mặc định (tùy chọn nhưng giảm noise)
PermitRootLogin no # Không cho root login qua SSH
PasswordAuthentication no # Chỉ dùng SSH key
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 30
# Khởi động lại SSH (ĐỪNG đóng session hiện tại)
sudo systemctl restart sshd
# Mở terminal mới, thử connect trước khi đóng session cũ
ssh -p 2222 sysadmin@your_server_ip
Lưu ý: nếu đổi port SSH, phải mở port đó trong firewall trước khi restart sshd. Bỏ qua bước này đồng nghĩa với tự khóa mình ra ngoài server.
Bước 4: Cấu hình firewalld
Fedora dùng firewalld với zone-based approach. Mình thấy cách này khá tiện khi đã quen.
# Kiểm tra zone hiện tại
sudo firewall-cmd --get-active-zones
# Xem rule đang có
sudo firewall-cmd --list-all
# Nếu đã đổi port SSH sang 2222
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --remove-service=ssh # Bỏ rule port 22 cũ
# Chỉ mở những gì cần thiết (ví dụ: web server)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# Reload để áp dụng
sudo firewall-cmd --reload
# Kiểm tra lại
sudo firewall-cmd --list-all
Bước 5: Giữ SELinux — đừng tắt nó
Hàng chục hướng dẫn trên Stack Overflow và các forum Linux đều bảo “tắt SELinux cho đỡ phiền”. Mình không đồng ý với lời khuyên đó. SELinux là lớp bảo vệ thứ hai — nó chặn ngay cả khi attacker đã bypass được lớp đầu tiên, ví dụ qua một web app có lỗ hổng RCE.
# Kiểm tra trạng thái SELinux
sudo sestatus
# Đảm bảo đang ở Enforcing mode
sudo getenforce
Nếu gặp lỗi liên quan SELinux, dùng audit2allow để phân tích thay vì tắt đi:
# Xem log SELinux bị deny
sudo ausearch -m avc -ts recent
# Hoặc dùng sealert nếu đã cài setroubleshoot
sudo sealert -a /var/log/audit/audit.log
Bước 6: Cài fail2ban
fail2ban tự động block IP sau N lần đăng nhập thất bại. Trên server mình, tool này chặn trung bình 80–150 IP mỗi ngày — gần hết là bot quét tự động từ các botnet.
# Cài đặt
sudo dnf install fail2ban -y
# Tạo file config local (không sửa file gốc)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Thêm hoặc sửa section [sshd]. Fedora dùng systemd-journald nên cần chỉ rõ backend:
[sshd]
enabled = true
port = 2222
filter = sshd
backend = systemd
maxretry = 3
bantime = 3600
findtime = 600
# Bật và khởi động service
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Kiểm tra status
sudo fail2ban-client status sshd
Bước 7: Thiết lập automatic security updates
Fedora có dnf-automatic để tự động cài security update:
sudo dnf install dnf-automatic -y
# Chỉnh cấu hình: chỉ download security updates
sudo nano /etc/dnf/automatic.conf
[commands]
upgrade_type = security
apply_updates = yes
# Bật timer
sudo systemctl enable --now dnf-automatic.timer
sudo systemctl status dnf-automatic.timer
Kiểm tra tổng thể sau khi cấu hình
# Các service đang chạy
sudo systemctl list-units --type=service --state=running
# Kiểm tra port đang lắng nghe
sudo ss -tlnp
# Xem log đăng nhập gần đây
sudo journalctl -u sshd --since "1 hour ago"
# Kiểm tra fail2ban đang hoạt động
sudo fail2ban-client status
Sau khi xong 7 bước trên, server đã đủ vững để chạy production ở mức cơ bản. Mình thường mất khoảng 30–45 phút để hoàn thành quy trình này trên một server mới, và tất cả các bước đều có thể script hóa lại để dùng cho lần sau.
Một điều mình học được: đừng chờ đến khi có sự cố mới đi hardening. Làm ngay sau khi cài — tiết kiệm rất nhiều đau đầu về sau.

