TL;DR

SSH (OpenSSH) là giao thức quản trị từ xa mặc định trên mọi server Linux - và vì thế nó là mục tiêu số 1 của hacker. Checklist 16 bước này bao phủ toàn bộ attack surface: tắt root login, chuyển sang public key authentication, giới hạn 3 lần thử, timeout 20 giây, vô hiệu X11 forwarding và tunneling. Kết hợp thêm Fail2Ban + firewall là bạn có defense-in-depth hoàn chỉnh.

OpenSSH hardening checklist

Cửa ngõ mà hacker không bao giờ bỏ qua

SSH chạy trên hầu hết server Linux - Ubuntu, Debian, CentOS, FreeBSD - thường với cấu hình mặc định. Cổng 22 mở công khai là lý do hàng triệu bot tự động quét liên tục để tìm password yếu, tài khoản root bị lộ, hoặc giao thức cũ dễ khai thác. Một server không hardening SSH đồng nghĩa với:

  • Root brute-force: root tồn tại trên mọi server, tên đăng nhập đã biết trước - hacker chỉ cần đoán password
  • DoS qua hanging sessions: bots mở hàng chục session không xác thực để làm cạn kiệt tài nguyên
  • Lateral movement: server bị chiếm làm jump host để tấn công mạng nội bộ qua SSH tunneling
  • Malicious server-to-client: X11 forwarding cho phép server bị compromise gửi lệnh độc hại ngược về client

16 bước hardening thực chiến

Authentication - Ưu tiên số 1

  • Disable SSH Root Logins (PermitRootLogin no): Root tồn tại trên mọi hệ thống, tên đăng nhập đã biết. Tắt login trực tiếp = ẩn một nửa credential ngay lập tức.
  • Use Public Key Authentication (PubkeyAuthentication yes + PasswordAuthentication no): Public key gần như không thể brute-force. Tắt password authentication sau khi đã cấu hình key.
  • Disable User SSH Passwordless Connection Requests (PermitEmptyPasswords no): Không bao giờ cho phép account không có password đăng nhập qua SSH.
  • Use SSH Keys with Passphrases: Mã hóa private key bằng passphrase - ngay cả khi file key bị đánh cắp, kẻ tấn công vẫn cần passphrase để dùng.
  • Implement Two-Factor Authentication (2FA): Thêm TOTP qua libpam-google-authenticator làm lớp xác thực thứ ba sau key authentication.

Giới hạn kết nối và phiên làm việc

  • Configure a Limit for Password Attempts (MaxAuthTries 3): Mặc định là 6. Hạ xuống 3, server drop connection sau 3 lần thất bại. Lưu ý: mỗi key được load trong ssh-agent tính là 1 lần thử - đừng load quá nhiều key nếu dùng setting này.
  • Configure SSH Idle Timeout (ClientAliveInterval 120 + ClientAliveCountMax 3): Session tự ngắt sau 6 phút không hoạt động (120s x 3 lần check).
  • LoginGraceTime 20: Mặc định 2 phút. Giảm xuống 20 giây để chặn DoS dạng giữ session treo. Không dùng nếu bạn xác thực qua MFA email vì 20s không đủ để nhận OTP.
  • MaxStartups 10:30:100: Giới hạn concurrent unauthenticated connections. Bắt đầu drop ngẫu nhiên 30% sau 10 kết nối, hard cap tại 100. Ngẫu nhiên hóa giúp chống DoS hiệu quả hơn hard limit đơn giản.
  • Change Default Port (Port 2222 hoặc port khác dưới 1024): Giảm bot noise và log ồn ào. Không bảo vệ khỏi targeted port scan nhưng có giá trị với internal servers.

Thu hẹp attack surface

  • Disable Unused SSH Features - SSHv1 (Protocol 2): SSHv1 có lỗ hổng đã biết, bị tắt mặc định từ OpenSSH 7.0+. Vẫn explicit disable để chắc chắn. Nếu thấy SSH-1.99 khi test - SSHv1 đang bật, cần tắt ngay.
  • Disable X11 Forwarding (X11Forwarding no): X11 mở channel ngược từ server về client. Server bị compromise có thể gửi lệnh độc hại về màn hình client qua channel này.
  • Disable tunneling và port forwarding (AllowAgentForwarding no, AllowTcpForwarding no, PermitTunnel no): Chặn dùng server làm jump host tấn công mạng nội bộ sau khi chiếm được account.
  • Tắt auth methods không dùng (KerberosAuthentication no, GSSAPIAuthentication no): Mỗi auth method không cần thiết là một attack surface thêm vào.

Monitoring và hạ tầng

  • Keep OpenSSH Up to Date: Update thường xuyên để vá CVE mới. Kiểm tra ssh -V và so với phiên bản mới nhất của distro.
  • Enable SSH Logging + Monitor SSH Logs: Forward log vào remote syslog hoặc SIEM. Authentication failure được log từ N/2 lần thất bại (với MaxAuthTries 3, cảnh báo bắt đầu sau 1 lần). Tích hợp với Fail2Ban để auto-ban IP.
  • Implement Firewall Rules: Dùng iptables hoặc nftables để giới hạn IP được phép kết nối SSH. Kết hợp với AllowUsers *@10.10.0.0/16 trong sshd_config là defense-in-depth hoàn chỉnh.
  • Regularly Audit SSH Server Configuration: Chạy ssh-audit hoặc Lynis định kỳ, review user accounts và SSH keys không còn dùng.

Con số phải nhớ

DirectiveMặc địnhKhuyến nghịMục đích
MaxAuthTries63Drop sau 3 lần fail
LoginGraceTime120s20sChặn DoS hanging sessions
ClientAliveInterval-120sCheck client còn kết nối
ClientAliveCountMax-3Session timeout = 6 phút
MaxStartups10:30:10010:30:100Default đã hợp lý
PermitRootLoginyesnoBắt buộc tắt
PasswordAuthenticationyesnoChuyển sang key-based

Sai lầm tự khóa server

Hardening sai cách nguy hiểm không kém để nguyên cấu hình mặc định:

  • Quá nhiều key trong ssh-agent + MaxAuthTries 3: Mỗi key được thử là 1 lần. Nếu agent load 5 key mà key đúng xếp thứ 4, bạn bị kick ra trước khi key đúng được thử.
  • IP động trong allowlist: ISP thay đổi IP của bạn = tự khóa khỏi server. Chỉ dùng IP tĩnh, VPN appliance, hoặc bastion host.
  • LoginGraceTime 20s + MFA qua email: 20 giây không đủ để nhận OTP. Tăng LoginGraceTime lên 60-120s nếu dùng email MFA.
  • Tắt cipher hiện đại trên legacy clients: Forcing curve25519 có thể chặn client cũ chưa support. Deploy theo từng nhóm và test trước.
  • Match block không để cuối file: Mọi config bên dưới Match block đều áp dụng cho điều kiện match đó, bất kể indent. Luôn để Match block ở cuối sshd_config.

Quy trình deploy an toàn: backup config → sshd -t validate syntax → systemctl reload ssh.service (không phải restart) → test trong terminal mới trước khi đóng session cũ.

Kiểm tra và duy trì sau khi hardening

Hardening không phải việc một lần - OpenSSH update thường xuyên, ciphers lỗi thời, user accounts cũ không xóa đều là rủi ro tích lũy:

  • ssh-audit: Tool scan từ xa, phân tích cipher/MAC đang dùng, flag vulnerabilities theo version OpenSSH. Chạy định kỳ từ bên ngoài server.
  • Lynis: Tool audit local toàn diện (open-source, shell script), kiểm tra cả sshd_config lẫn config đang load thực tế. Dùng lynis audit system.
  • sshd -T: Xem full effective configuration đang chạy - không phải chỉ những gì trong file, mà là giá trị thực sự sau khi apply defaults của phiên bản OpenSSH đang dùng.
  • Review định kỳ: User accounts không dùng, SSH keys hết hạn, VPN/IP allowlist còn chính xác.

Nguồn tham khảo

Checklist gốc: sysxplore on X. Tài liệu kỹ thuật: Linux Audit, DigitalOcean, Ittavern SSH Hardening Guide v2.