Quick start: Kích hoạt 2FA cho SSH trong 5 phút
Cần siết bảo mật gấp cho cụm server staging hoặc production mà ngại đọc lý thuyết dài dòng? Dưới đây là 4 bước thực hiện nhanh trên Ubuntu/Debian.
Bước 1: Cài đặt thư viện PAM Google Authenticator
sudo apt update
sudo apt install -y libpam-google-authenticator
(Với CentOS Stream, RHEL hoặc AlmaLinux, bạn bật repo EPEL: sudo dnf install -y epel-release && sudo dnf install -y google-authenticator)
Bước 2: Sinh mã bí mật và lưu recovery codes
Chạy trực tiếp lệnh cấu hình bằng user thông thường bạn hay dùng SSH (tránh chạy bằng root):
google-authenticator
Terminal hiển thị lần lượt các câu hỏi, bạn chọn như sau:
Do you want authentication tokens to be time-based (y/n): y- Mở app Google Authenticator hoặc 2FAS/Bitwarden trên điện thoại để quét mã QR hiển thị trên màn hình.
- LƯU NGAY 5 mã emergency scratch codes (8 chữ số) vào 1Password, Bitwarden hoặc Vault nội bộ. Mất điện thoại thì đây là chìa khóa duy nhất cứu bạn.
Do you want me to update your "~/.google_authenticator" file? (y/n): yDo you want to disallow multiple uses of the same authentication token? (y/n): y (ngăn tấn công replay).By default, a new token is generated every 30 seconds... Increase window? (y/n): n (chọn y nếu đồng hồ server thường xuyên bị drift).Do you want to enable rate-limiting? (y/n): y (giới hạn tối đa 3 lần thử đăng nhập trong vòng 30 giây).
Bước 3: Cấu hình PAM (Pluggable Authentication Module)
Mở file cấu hình PAM của SSH:
sudo nano /etc/pam.d/sshd
Thêm chỉ thị sau vào cuối file:
auth required pam_google_authenticator.so nullok
Cờ nullok cho phép user chưa kịp chạy lệnh tạo OTP vẫn SSH vào được bình thường. Thiếu cờ này, đồng nghiệp của bạn sẽ bị văng ra ngoài ngay lập tức.
Bước 4: Cập nhật SSH daemon và khởi động lại dịch vụ
Mở file cấu hình SSH server:
sudo nano /etc/ssh/sshd_config
Kiểm tra và bật 2 tham số sau (xóa dấu # nếu đang bị comment):
KbdInteractiveAuthentication yes
UsePAM yes
Lưu ý: Với các bản distro cũ (như Ubuntu 20.04 trở về trước), chỉ thị trên có tên là ChallengeResponseAuthentication yes.
Kiểm tra cú pháp trước khi reload service:
sudo sshd -t
sudo systemctl restart sshd
Lưu ý sống còn: Giữ nguyên phiên SSH hiện tại! Hãy mở thêm tab terminal mới rồi thử SSH vào xem prompt có đòi Verification code không. Thấy vào êm mới được tắt tab cũ.
Giải thích chi tiết: Cơ chế hoạt động đằng sau
PAM và SSH bắt tay nhau thế nào?
OpenSSH không trực tiếp tính toán mã OTP. Thay vào đó, nó giao toàn bộ việc xác thực danh tính cho hệ thống PAM. Luồng xử lý diễn ra như sau:
- Client gửi request SSH lên server.
sshdkiểm tra cấu hình, thấy cờKbdInteractiveAuthenticationliền chuyển quyền cho module PAM tại/etc/pam.d/sshd.- PAM kích hoạt thư viện
pam_google_authenticator.so. - Thư viện đọc secret key trong
~/.google_authenticatortại thư mục home của user, sau đó áp dụng thuật toán TOTP (RFC 6238). - Server tính toán mã OTP dựa trên timestamp hiện tại rồi so khớp với 6 số bạn nhập. Nếu trùng khớp, phiên kết nối được chấp thuận.
Tại sao SSH Key vẫn chưa đủ an toàn?
Nhiều dev hay tự tin: “Dùng SSH Key Ed25519 hoặc RSA 4096-bit thì brute-force bằng mắt, cần gì 2FA cho rách việc?”
Vấn đề hiếm khi nằm ở độ mạnh thuật toán mã hóa. Rủi ro thực sự nằm ngay tại máy trạm cá nhân của bạn. Chỉ cần laptop dính mã độc đánh cắp file, vô tình commit nhầm private key lên repo public, hoặc lỡ backup key lên Google Drive không mã hóa, server coi như toang. Lúc đó, 2FA đóng vai trò như chốt chặn vật lý thứ hai. Hacker có private key trong tay vẫn bó tay vì không có điện thoại của bạn để lấy mã OTP 30 giây.
Cấu hình nâng cao: Bắt buộc cả SSH Key VÀ 2FA
Mặc định khi thấy SSH Key hợp lệ, OpenSSH sẽ cho vào thẳng mà không hỏi thêm OTP. Để siết chặt kỷ luật bảo mật—buộc phải có SSH Key hợp lệ VÀ nhập đúng 6 số OTP—chúng ta cần thêm cơ chế xác thực chuỗi.
Mở file /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
Khai báo danh sách phương thức tuần tự ở cuối file:
AuthenticationMethods publickey,keyboard-interactive
Cấu hình này bắt buộc client phải vượt qua bước đối soát key trước, sau đó mới đến bước nhập OTP.
Tiếp theo, cấu hình lại /etc/pam.d/sshd để loại bỏ bước hỏi mật khẩu user Linux:
sudo nano /etc/pam.d/sshd
Comment dòng @include common-auth (hoặc auth substack password-auth trên RHEL/AlmaLinux) bằng dấu #:
# @include common-auth
auth required pam_google_authenticator.so
Trải nghiệm lúc này cực kỳ mượt: Bạn gõ lệnh SSH → Server tự nhận private key → Terminal hỏi Verification code: → Nhập 6 số là vào thẳng shell, không phải gõ mật khẩu tài khoản Linux thêm lần nào nữa.
Tips thực tế từ những pha toát mồ hôi trên production
Sau nhiều đợt rollout 2FA cho đội ngũ hơn 30 kỹ sư, mình rút ra 4 bài học thực chiến quan trọng:
1. Đồng bộ thời gian (NTP) là chuyện sống còn
Mã TOTP được tính theo chu kỳ cố định 30 giây. Nếu đồng hồ phần cứng của server bị drift lệch quá 30 giây so với giờ chuẩn UTC, toàn bộ mã OTP trên app sẽ bị từ chối sạch dù bạn gõ chuẩn từng số. Kiểm tra dịch vụ đồng bộ giờ trước tiên:
timedatectl status
Chỉ tiến hành khi thấy NTP service: active và System clock synchronized: yes.
2. Giữ cờ nullok ít nhất 1 tuần trong đợt rollout
Đừng vội xóa cờ nullok ngay ngày đầu tiên triển khai. Hãy giữ nguyên auth required pam_google_authenticator.so nullok trong khoảng 7 ngày. Khoảng đệm này giúp các thành viên trong team chủ động SSH vào cấu hình OTP mà không bị gián đoạn công việc hàng ngày. Khi kiểm tra thấy mọi user trong /home/ đã có file cấu hình, bạn mới xóa nullok để khóa hoàn toàn.
3. Miễn trừ 2FA cho dải mạng văn phòng hoặc VPN
Dev nhập OTP vài chục lần mỗi ngày rất dễ nản và tìm cách bypass. Nếu công ty có IP tĩnh cố định hoặc mạng VPN nội bộ (như WireGuard, Tailscale), bạn có thể whitelist cho các IP này. Thêm block cấu hình sau vào cuối file /etc/ssh/sshd_config:
Match Address 192.168.1.0/24,10.8.0.0/24
AuthenticationMethods publickey
Match Address *
AuthenticationMethods publickey,keyboard-interactive
Làm việc tại văn phòng hoặc bật VPN: Chỉ cần SSH Key là vào ngay. Ngồi quán cà phê hoặc truy cập từ IP lạ: Hệ thống lập tức kích hoạt bước đòi mã OTP.
4. Lưu trữ emergency scratch codes có kỷ luật
Mỗi khi chạy lệnh setup, hệ thống cấp đúng 5 mã dự phòng dùng một lần. Hãy quán triệt anh em copy ngay vào vault bảo mật chung của công ty. Đến lúc điện thoại rơi xuống nước hoặc đổi máy mới mà chưa kịp export 2FA, 5 dòng code ngắn này sẽ cứu bạn khỏi cảnh phải mở web console nhà mạng cloud để mount ổ đĩa cứu hộ.

