Bật xác thực 2 lớp SSH bằng Google Authenticator trên Ubuntu/Debian

Cài đặt Google Authenticator PAM trên VPS
SSH là cửa ngõ quản trị quan trọng nhất trên VPS. Dù đã dùng SSH key, bạn vẫn có thể gặp rủi ro nếu private key bị lộ. Thêm một lớp xác thực thứ hai (2FA) bằng ứng dụng Google Authenticator trên điện thoại là cách nâng cao bảo mật hiệu quả. Bài này hướng dẫn bạn bật xác thực 2 lớp SSH với Google Authenticator trên Ubuntu 24.04 LTS. Các bước tương tự cho Debian 12 và AlmaLinux 9 (dùng dnf thay apt).
Yêu cầu trước: VPS chạy Ubuntu 24.04 LTS, quyền root hoặc sudo, và một ứng dụng xác thực mã OTP (Google Authenticator, Authy, hoặc Bitwarden) trên điện thoại. Đảm bảo bạn đã có phiên SSH thứ hai (kết nối dự phòng) trước khi sửa file cấu hình, đề phòng khóa mình ngoài.
sudo apt update
sudo apt install libpam-google-authenticator -y
Gói libpam-google-authenticator cung cấp module PAM xác thực OTP. Sau khi cài, chạy lệnh dưới để khởi tạo mã bí mật (secret key) cho user hiện tại. Quan trọng: Mỗi user muốn dùng 2FA phải chạy lệnh này riêng.
google-authenticator
Chương trình sẽ hỏi một loạt câu hỏi. Trả lời y cho hầu hết các lựa chọn:
- Do you want authentication tokens to be time-based (y/n) y, chọn chế độ TOTP (theo thời gian).
- Do you want me to update your "/home/username/.google_authenticator" file (y/n) y, ghi secret key vào file cấu hình.
- Do you want to disallow multiple uses of the same authentication token? (y/n) y, ngăn dùng lại mã OTP (chống replay attack).
- Do you want to enable rate-limiting? (y/n) y, giới hạn 3 lần nhập sai mỗi 30 giây.
Sau khi hoàn tất, terminal hiển thị mã QR và secret key (dạng chữ). Dùng điện thoại quét mã QR trong app Google Authenticator hoặc nhập mã thủ công. App sẽ sinh mã OTP 6 chữ số mới mỗi 30 giây.
VERIFY: Mở app và kiểm tra mã OTP hiện ra, nếu đúng định dạng 6 số là hoạt động.
Cấu hình PAM để yêu cầu mã OTP cho SSH
Module PAM đã sẵn sàng, giờ cần báo cho SSH biết dùng nó. Sửa file cấu hình PAM của SSH:
sudo nano /etc/pam.d/sshd
Thêm dòng sau vào đầu file, ngay sau các dòng comment:
auth required pam_google_authenticator.so
Dòng này buộc SSH gọi module xác thực OTP. Lưu file (Ctrl+O, Enter, Ctrl+X).
Cấu hình SSH daemon chấp nhận xác thực keyboard-interactive
SSH có thể dùng nhiều phương thức xác thực. Cần cấu hình để nó luôn hỏi mật khẩu/mã OTP dạng keyboard-interactive, không chỉ dùng publickey (nếu muốn giữ nguyên SSH key làm yếu tố thứ nhất).
sudo nano /etc/ssh/sshd_config
Kiểm tra các dòng sau, sửa hoặc thêm nếu thiếu:
ChallengeResponseAuthentication yes, bắt buộc bật chế độ hỏi đáp.UsePAM yes, đảm bảo bật PAM (mặc định yes).AuthenticationMethods publickey,keyboard-interactive, yêu cầu cả SSH key và mã OTP (ưu tiên). Nếu muốn dùng mật khẩu + mã OTP, đặtpassword,keyboard-interactive.
Ví dụ cấu hình chuẩn cho 2 lớp (key + OTP):
PubkeyAuthentication yes
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
Cảnh báo: Nếu bạn thiếu SSH key và cấu hình publickey,keyboard-interactive nhưng chưa cài key, bạn sẽ bị khóa. Luôn đảm bảo có kết nối dự phòng hoặc đã thêm public key vào ~/.ssh/authorized_keys.
Kiểm tra cú pháp cấu hình trước khi khởi động lại:
sudo sshd -t
Không có output tức là OK. Nếu có lỗi, sửa lại /etc/ssh/sshd_config.
Khởi động lại SSH và kiểm tra
Bật lại SSH daemon để áp dụng thay đổi:
sudo systemctl restart sshd
Mở một terminal mới (không đóng session cũ), thử SSH vào VPS bằng user đã cài OTP.
VERIFY: Nếu bạn thấy prompt Verification code: sau khi nhập mật khẩu hoặc xác thực key, 2FA đã hoạt động. Mở app Google Authenticator, nhập mã OTP hiện tại và Enter. Đăng nhập thành công.
Lệnh kiểm tra trạng thái SSH:
sudo systemctl status sshd
Bạn sẽ thấy active (running).
Xử lý lỗi thường gặp khi bật 2FA SSH
Lỗi "Permission denied (publickey,keyboard-interactive)." sau khi cấu hình
Nguyên nhân: SSH key chưa được cài hoặc file /etc/ssh/sshd_config sai cú pháp. Kiểm tra lại dòng AuthenticationMethods. Nếu bạn chỉ muốn dùng mật khẩu + OTP, sửa thành AuthenticationMethods password,keyboard-interactive và đảm bảo PasswordAuthentication yes.
Lỗi "Invalid verification code" liên tục
Đồng hồ hệ thống sai lệch so với điện thoại >30 giây. Cài NTP để đồng bộ thời gian chính xác:
sudo apt install chrony -y
sudo systemctl enable chrony --now
Kiểm tra độ trễ: chronyc tracking. Sau đó chạy lại google-authenticator để khởi tạo secret mới nếu cần.
Lỗi "Invalid key" khi cấu hình PAM
Kiểm tra file /etc/pam.d/sshd có dòng auth required pam_google_authenticator.so ở đúng vị trí (đầu file). Đảm bảo gói libpam-google-authenticator đã cài đúng cách. Khởi động lại SSH và xem log:
sudo journalctl -u sshd | tail -20
Câu hỏi thường gặp (FAQ)
Tôi có thể bật 2FA cho nhiều user không?
Có. Mỗi user cần chạy lệnh google-authenticator và cấu hình app trên điện thoại riêng. Không có lệnh áp cho toàn bộ user cùng lúc.
Tôi quên mất mã QR, lấy lại thế nào?
Chạy lại lệnh google-authenticator với user đó. Nó sẽ sinh secret mới và hiển thị lại QR. Nhớ cập nhật lại app.
Sao tôi không thấy prompt "Verification code" khi SSH?
Kiểm tra file /etc/ssh/sshd_config đã bật ChallengeResponseAuthentication yes và UsePAM yes chưa. Khởi động lại SSH và kiểm tra log để xem lỗi.
Tôi muốn dùng Authy thay Google Authenticator được không?
Được. Authy hỗ trợ TOTP, quét mã QR giống hệt. Ứng dụng nào hỗ trợ TOTP đều dùng được.
Bật 2FA có làm chậm đăng nhập không?
Thời gian thêm rất nhỏ (dưới 5 giây tùy tốc độ nhập mã). So với lợi ích bảo mật tăng đáng kể, việc này hoàn toàn xứng đáng.
Làm sao để tạm tắt 2FA nếu mất điện thoại?
Dùng kết nối dự phòng qua console (VNC/IPMI), xóa hoặc rename file ~/.google_authenticator của user đó, tắt dòng auth required pam_google_authenticator.so trong /etc/pam.d/sshd, rồi khởi động lại SSH.
Bài viết liên quan
- Cấu hình Nginx làm reverse proxy trên Ubuntu 24.04
- Tối ưu Linux và NVMe cho workload I/O cao trên VPS
- Dùng WireGuard VPN trên VPS trong 10 phút


