Hướng dẫn cài đặt 2FA cho SSH bằng Google Authenticator (bảo mật VPS 2025)

Tác giả: Tran Thao 09 tháng 08, 2025

Nếu SSH Key đã biến cửa chính vào VPS của bạn thành một cánh cửa sắt, thì việc thêm Xác thực hai yếu tố (2FA) giống như lắp thêm một hệ thống khóa sinh trắc học. Kể cả khi kẻ xấu có được chìa khóa, chúng vẫn sẽ bị chặn lại bởi lớp xác thực thứ hai này.

Chào mừng bạn đến với bài viết chuyên sâu về Lớp phòng thủ thứ 8, một phần trong hướng dẫn toàn diện Bảo mật VPS từ A-Z: 10 lớp phòng thủ thiết yếu (cập nhật 2025) của chúng tôi. Chúng tôi sẽ chỉ cho bạn từng bước để cài đặt 2FA cho SSH bằng Google Authenticator một cách an toàn và chi tiết nhất.

Tóm tắt nhanh quy trình cài đặt

Trước khi đi sâu vào chi tiết, đây là 4 bước chính chúng ta sẽ thực hiện để bật 2FA cho SSH:

  1. Cài đặt thư viện cần thiết: Sử dụng apt hoặc dnf để cài đặt gói libpam-google-authenticator.
  2. Tạo khóa 2FA cho người dùng: Chạy lệnh google-authenticator và làm theo hướng dẫn để tạo khóa bí mật, mã QR và các mã dự phòng.
  3. Cấu hình hệ thống: Chỉnh sửa file /etc/pam.d/sshd/etc/ssh/sshd_config để yêu cầu mã xác thực khi đăng nhập.
  4. Khởi động lại và kiểm tra: Áp dụng các thay đổi bằng cách khởi động lại dịch vụ sshd và thử đăng nhập từ một terminal mới.

Tại sao lại là Google Authenticator mà không phải SMS?

Bạn có thể thắc mắc tại sao chúng ta không dùng mã OTP gửi qua SMS cho tiện. Lý do là vì phương thức SMS ngày càng lộ rõ những điểm yếu, đặc biệt là lỗ hổng “SIM Swapping”, nơi kẻ tấn công có thể lừa nhà mạng để chiếm quyền kiểm soát số điện thoại của bạn.

Các ứng dụng như Google Authenticator, Authy, Microsoft Authenticator hoạt động dựa trên thuật toán TOTP (Time-Based One-Time Password). Mã được tạo ra ngay trên thiết bị của bạn, không cần truyền qua bất kỳ mạng viễn thông nào, khiến nó an toàn và đáng tin cậy hơn rất nhiều.

Chuẩn bị trước khi cài đặt

Trước khi đi vào các dòng lệnh, hãy đảm bảo bạn đã có trong tay bộ công cụ cần thiết. Việc chuẩn bị kỹ lưỡng sẽ giúp quá trình diễn ra suôn sẻ.

  • Tài khoản người dùng sudo: Như đã thực hiện ở Lớp 1: Quản lý user và phân quyền, mọi thao tác của chúng ta sẽ được thực hiện qua một tài khoản người dùng thường đã được cấp quyền sudo, không bao giờ dùng root trực tiếp.
  • Truy cập SSH bằng SSH Key: Bạn đã phải hoàn thành Lớp 3: Gia cố bằng SSH KeyLớp 4: Khóa các lối vào không an toàn, tức là bạn đang truy cập VPS bằng SSH Key thay vì mật khẩu.
  • Ứng dụng xác thực (Authenticator App): Một chiếc điện thoại thông minh đã cài đặt ứng dụng có khả năng tạo mã TOTP.
    • Google Authenticator: Phổ biến, đơn giản.
    • Authy: Một lựa chọn thay thế tuyệt vời, có tính năng sao lưu và đồng bộ trên nhiều thiết bị.
    • Microsoft Authenticator: Một lựa chọn mạnh mẽ khác.
Tìm và cài đặt ứng dụng

Tìm và cài đặt ứng dụng “Authenticator” trên điện thoại là bước chuẩn bị đầu tiên và quan trọng nhất.

Bước 1: Cài đặt “Trái tim” của 2FA – Thư viện libpam-google-authenticator

Để bắt đầu, chúng ta cần cài đặt một gói phần mềm nhỏ nhưng cực kỳ quan trọng. Gói này hoạt động như một “người phiên dịch” giữa dịch vụ SSH và ứng dụng Google Authenticator của bạn.

PAM là gì?

Bạn có thể hình dung PAM (Pluggable Authentication Modules) như một trung tâm điều phối an ninh cho hệ điều hành Linux. Thay vì mỗi ứng dụng (như SSH, login, sudo…) phải tự xây dựng cơ chế xác thực riêng, chúng chỉ cần gửi yêu cầu đến PAM. PAM sẽ quyết định xem yêu cầu đó có hợp lệ hay không dựa trên các quy tắc đã được định sẵn.

Bằng cách cài đặt libpam-google-authenticator, chúng ta đang thêm một “chuyên gia xác thực Google” vào trung tâm an ninh PAM này.

Thực hiện cài đặt

Hãy mở terminal và chạy lệnh tương ứng với hệ điều hành của bạn:

  • Trên Ubuntu/Debian:
sudo apt update
sudo apt install libpam-google-authenticator -y
Kết quả trên terminal sau khi chạy lệnh sudo apt install libpam-google-authenticator thành công.

Kết quả trên terminal sau khi chạy lệnh sudo apt install libpam-google-authenticator thành công.

  • Trên CentOS/RHEL/AlmaLinux:

Với các hệ điều hành này, gói cần thiết nằm trong kho lưu trữ EPEL (Extra Packages for Enterprise Linux). Lệnh đầu tiên sẽ cài đặt kho lưu trữ này nếu bạn chưa có.

sudo dnf install epel-release -y
sudo dnf install google-authenticator -y

Bước 2: Tạo “Chìa khóa số” – Cấu hình 2FA cho tài khoản của bạn

Đây là bước quan trọng và thú vị nhất. Chúng ta sẽ tạo ra một liên kết bí mật giữa tài khoản người dùng trên VPS và ứng dụng xác thực trên điện thoại của bạn.

Lưu ý: Hãy thực hiện lệnh này dưới tài khoản người dùng sudo mà bạn thường dùng để đăng nhập SSH, không phải tài khoản root.

google-authenticator
Chạy lệnh google-authenticator để tạo mã QR, khóa bí mật và mã dự phòng. Hãy đảm bảo lưu lại cẩn thận các thông tin được đánh dấu.

Chạy lệnh google-authenticator để tạo mã QR, khóa bí mật và mã dự phòng. Hãy đảm bảo lưu lại cẩn thận các thông tin được đánh dấu.

Lệnh này sẽ khởi chạy một trình cấu hình tương tác. Đừng lo lắng, chúng ta sẽ đi qua từng câu hỏi một.

Phân tích chi tiết các câu hỏi cấu hình

Trình cấu hình sẽ hỏi bạn 5 câu hỏi để thiết lập các quy tắc cho mã 2FA.

Câu hỏi Gợi ý Ý nghĩa
Do you want authentication tokens to be time-based (y/n) y BẮT BUỘC. Tạo mã dựa trên thời gian (TOTP), là tiêu chuẩn của các ứng dụng 2FA.
Do you want me to update your ".google_authenticator" file (y/n) y Tự động tạo và lưu file cấu hình vào thư mục của người dùng (~/.google_authenticator).
Do you want to disallow multiple uses of the same token... (y/n) y Mỗi mã OTP chỉ được dùng một lần duy nhất trong vòng 30 giây. Tăng cường bảo mật.
Do you want to increase the original generation time limit... (y/n) n Không cho phép mã cũ hơn hoặc mới hơn quá nhiều so với thời gian hiện tại. Giữ n nếu đồng hồ của bạn chính xác.
Do you want to enable rate-limiting... (y/n) y Chống tấn công brute-force. Chỉ cho phép 3 lần thử sai trong mỗi 30 giây.

Sau khi trả lời xong, màn hình sẽ hiển thị những thông tin TỐI QUAN TRỌNG. Hãy dừng lại và xử lý chúng một cách cẩn thận.

Mã QR, khóa bí mật và mã dự phòng: Bộ ba bất khả xâm phạm

  1. Mã QR (QR Code):
    • Hành động: Mở ứng dụng Google Authenticator (hoặc Authy) trên điện thoại, nhấn vào dấu + và chọn “Scan a QR code”. Hướng camera của điện thoại vào mã QR trên màn hình terminal.

      them-tai-khoan-moi-vao-google-authenticator

      them-tai-khoan-moi-vao-google-authenticator

    • Mục đích: Đây là cách nhanh nhất để chuyển khóa bí mật vào điện thoại của bạn.
  2. Khóa bí mật (Secret Key):
    • Hành động: Ngay bên dưới mã QR là một chuỗi ký tự. Đây chính là “linh hồn” của mã QR. Hãy sao chép và cất giữ chuỗi khóa này ở một nơi cực kỳ an toàn, ví dụ như trong trình quản lý mật khẩu (Bitwarden, 1Password) hoặc một file văn bản được mã hóa.
    • Mục đích: Nếu bạn bị mất điện thoại, bạn có thể dùng khóa bí mật này để thiết lập lại 2FA trên một thiết bị mới mà không cần truy cập vào VPS.
  3. Mã dự phòng (Emergency Scratch Codes):
    • Hành động: Đây là 5 mã, mỗi mã dùng được một lần. Hãy sao chép và lưu chúng vào một nơi riêng biệt với khóa bí mật. Một số người còn in chúng ra giấy và cất vào két sắt.
    • Mục đích: Đây là tấm vé bảo hiểm của bạn. Nếu bạn mất cả điện thoại và khóa bí mật, những mã này là con đường duy nhất để bạn đăng nhập và khôi phục lại tài khoản của mình.

Tuyệt đối không bỏ qua bước lưu trữ khóa bí mật và mã dự phòng. Chỉ quét mã QR là chưa đủ và rất rủi ro.

Mẹo bảo mật: Kiểm tra quyền của file cấu hình

Công cụ google-authenticator đã tạo ra một file ẩn là ~/.google_authenticator để lưu trữ khóa bí mật và các thông tin cấu hình của bạn. File này cực kỳ nhạy cảm. Mặc dù công cụ thường tự động đặt quyền phù hợp, bạn nên kiểm tra lại để đảm bảo an toàn.

Chạy lệnh sau:

ls -l ~/.google_authenticator

Kết quả trả về nên là -rw-------, tương đương với quyền 600. Điều này đảm bảo chỉ duy nhất tài khoản của bạn mới có quyền đọc và ghi file này, ngăn chặn những người dùng khác trên cùng hệ thống xem được khóa bí mật của bạn.

Bước 3: Cấu hình hệ thống để bật 2FA cho SSH

Bây giờ, chúng ta cần ra lệnh cho dịch vụ SSH sử dụng cơ chế xác thực mà chúng ta vừa tạo. Việc này gồm hai phần: chỉnh sửa cấu hình PAM và tinh chỉnh cấu hình SSH.

Cấu hình PAM: Thêm “chuyên gia Google” vào quy trình

Chúng ta cần báo cho trung tâm an ninh PAM biết rằng dịch vụ SSH (sshd) sẽ cần đến “chuyên gia” google_authenticator mà chúng ta đã cài đặt.

Mở file cấu hình PAM cho SSH:

sudo nano /etc/pam.d/sshd

Thêm dòng sau vào đầu file:

auth required pam_google_authenticator.so nullok
Thêm dòng auth required pam_google_authenticator.so vào đầu file /etc/pam.d/sshd để yêu cầu xác thực 2FA.

Thêm dòng auth required pam_google_authenticator.so vào đầu file /etc/pam.d/sshd để yêu cầu xác thực 2FA.

Giải thích chuyên sâu về nullok:
nullok là viết tắt của “null okay”. Nó ra lệnh cho PAM rằng: “Nếu một người dùng chưa có file cấu hình ~/.google_authenticator, hãy bỏ qua bước xác thực này và cho họ đi tiếp”.

Đây là một tính năng cực kỳ hữu ích khi bạn triển khai 2FA trên một máy chủ có nhiều người dùng. Bạn có thể bật 2FA mà không làm gián đoạn công việc của những người chưa kịp cài đặt.

Khi nào nên xóa nullok?

Như đã giải thích, nullok là một tùy chọn linh hoạt cho giai đoạn chuyển đổi. Sau khi tất cả người dùng cần truy cập SSH trên máy chủ đã hoàn tất việc cấu hình 2FA, bạn nên cân nhắc quay lại file /etc/pam.d/sshd và xóa tùy chọn nullok, chỉ để lại:

auth required pam_google_authenticator.so

Việc này sẽ thực thi chính sách bảo mật một cách tuyệt đối. Kể từ thời điểm đó, bất kỳ tài khoản nào cố gắng đăng nhập qua SSH mà không có 2FA sẽ bị từ chối.

Mẹo nâng cao: Cân bằng giữa an toàn và tiện lợi với grace_period

Bảo mật tuyệt đối là mục tiêu hàng đầu, nhưng đôi khi việc phải nhập mã 2FA cho mỗi lần kết nối lại có thể gây bất tiện, đặc biệt khi bạn làm việc liên tục từ một địa chỉ IP tin cậy (như máy tính ở văn phòng).

Để giải quyết vấn đề này, mô-đun Google Authenticator cung cấp một tùy chọn hữu ích là grace_period. Nó cho phép bạn không cần nhập lại mã OTP trong một khoảng thời gian nhất định sau lần đăng nhập thành công đầu tiên.

Hãy quay lại file /etc/pam.d/sshd và thêm tùy chọn này vào dòng bạn đã tạo:

# Cho phép đăng nhập lại trong vòng 1 giờ (3600 giây) mà không cần mã 2FA
auth required pam_google_authenticator.so nullok grace_period=3600

Với cài đặt này, sau khi bạn đăng nhập thành công, mọi kết nối SSH tiếp theo từ cùng một địa chỉ IP trong vòng 1 giờ (3600 giây) sẽ được miễn nhập mã 2FA. Đây là một cách tuyệt vời để cân bằng giữa sự an toàn và tính tiện lợi trong công việc hàng ngày.

Cấu hình SSHD: Bắt buộc chuỗi xác thực

Đây là bước cuối cùng để buộc SSH phải hỏi mã 2FA. Chúng ta sẽ “dạy” cho dịch vụ SSH (sshd) một quy trình đăng nhập mới.

Mở file cấu hình chính của SSH:

sudo nano /etc/ssh/sshd_config

Hãy tìm và đảm bảo 4 dòng sau được thiết lập chính xác như bên dưới. Chúng có thể nằm rải rác trong file, hãy dùng chức năng tìm kiếm (Ctrl + W trong nano) để tìm chúng.

# 1. Bật xác thực tương tác qua bàn phím (hiện đại, thay thế cho ChallengeResponseAuthentication)
KbdInteractiveAuthentication yes

# 2. Ra lệnh cho SSH sử dụng các mô-đun PAM đã cấu hình ở trên
UsePAM yes

# 3. Đảm bảo chỉ cho phép SSH Key và đã tắt mật khẩu
PubkeyAuthentication yes
PasswordAuthentication no

# 4. DÒNG QUAN TRỌNG NHẤT: Định nghĩa chuỗi xác thực
AuthenticationMethods publickey,keyboard-interactive

Lưu ý về KbdInteractiveAuthentication: Trong các phiên bản OpenSSH cũ, tùy chọn này có một tên gọi khác là ChallengeResponseAuthentication. Mặc dù tên gọi cũ vẫn có thể hoạt động để tương thích ngược, KbdInteractiveAuthentication là tên gọi chính thức và hiện đại. Sử dụng nó sẽ đảm bảo cấu hình của bạn luôn chính xác và không nhận cảnh báo lỗi thời trong tương lai.

Giải phẫu dòng lệnh AuthenticationMethods:
Dòng này là chỉ thị rõ ràng nhất về quy trình đăng nhập. Nó ra lệnh cho SSH: “Một phiên đăng nhập thành công phải thỏa mãn hai điều kiện tuần tự, được phân cách bởi dấu phẩy”.

    • publickey: Điều kiện đầu tiên, người dùng phải xác thực thành công bằng SSH Key.
    • keyboard-interactive: Ngay sau khi vượt qua điều kiện đầu, người dùng phải tiếp tục vượt qua điều kiện thứ hai, đó là một lời nhắc tương tác qua bàn phím. Trong trường hợp của chúng ta, PAM sẽ tiếp quản và hiển thị lời nhắc nhập mã OTP.

Bước 4: Khởi động lại và kiểm tra cẩn thận

Tất cả các mảnh ghép đã vào đúng vị trí. Giờ là lúc áp dụng thay đổi bằng cách khởi động lại dịch vụ SSH.

sudo systemctl restart sshd

CẢNH BÁO: KHÔNG ĐÓNG CỬA SỔ TERMINAL HIỆN TẠI!

Đây là nguyên tắc vàng để tránh tự khóa mình khỏi VPS. Cửa sổ terminal bạn đang dùng để cấu hình chính là lối thoát hiểm của bạn nếu có sự cố xảy ra.

Hãy mở một cửa sổ terminal mới và thử đăng nhập lại vào VPS.

# Nếu bạn không đổi cổng SSH
ssh ten_user@your_vps_ip

# Nếu bạn đã đổi cổng ở Lớp 5
ssh ten_user@your_vps_ip -p SO_CONG_MOI

Lúc này, quá trình đăng nhập sẽ diễn ra như sau:

  1. Máy chủ xác thực SSH Key của bạn (như bình thường).
  2. Ngay sau đó, terminal sẽ hiện thêm một dòng:
    Verification code:
  3. Bạn hãy bình tĩnh mở ứng dụng Google Authenticator trên điện thoại, nhập 6 con số đang hiển thị và nhấn Enter.
Màn hình đăng nhập SSH sẽ yêu cầu

Màn hình đăng nhập SSH sẽ yêu cầu “Verification code” sau khi xác thực bằng mật khẩu hoặc SSH Key thành công.

Nếu đăng nhập thành công, xin chúc mừng! Bạn đã xây dựng xong lớp phòng thủ thứ 8. Nếu thất bại, hãy quay lại cửa sổ terminal cũ để kiểm tra lại các file cấu hình.

Câu hỏi thường gặp (FAQ)

1. Tôi không đăng nhập được, báo lỗi “Permission denied”. Phải làm sao?

Đây là lỗi phổ biến nhất. Hãy bình tĩnh và dùng cửa sổ terminal cũ để kiểm tra:

  • Kiểm tra file /etc/pam.d/sshd: Dòng auth required pam_google_authenticator.so... đã được thêm vào đầu file chưa? Có gõ sai chính tả không?
  • Kiểm tra file /etc/ssh/sshd_config: Bốn dòng KbdInteractiveAuthentication, UsePAM, PubkeyAuthenticationAuthenticationMethods đã được thiết lập đúng giá trị yes/no và đúng chuỗi chưa?
  • Khởi động lại dịch vụ: Bạn đã chạy lệnh sudo systemctl restart sshd sau khi thay đổi chưa?

2. Tôi bị khóa hoàn toàn khỏi VPS! Cứu với!

Nếu bạn lỡ đóng cả hai cửa sổ terminal và không vào được, đừng hoảng sợ. Hầu hết các nhà cung cấp VPS đều có một “cửa hậu”.

  1. Đăng nhập vào bảng điều khiển trên website của nhà cung cấp VPS.
  2. Tìm đến mục “Console Access” hoặc “Web Console”. Nó sẽ mở một cửa sổ terminal giả lập ngay trên trình duyệt, cho phép bạn truy cập trực tiếp vào máy chủ.
  3. Dùng Console để đăng nhập bằng tài khoản và mật khẩu (nếu có) hoặc SSH key.
  4. Sau khi vào được, hãy dùng nano để chỉnh sửa lại các file cấu hình bị lỗi, sau đó khởi động lại SSH.

3. Mã 2FA của tôi luôn báo sai dù tôi nhập đúng!

Nguyên nhân của vấn đề này gần như 100% là do lệch múi giờ hoặc đồng hồ giữa VPS và điện thoại của bạn. Thuật toán TOTP cực kỳ nhạy cảm với thời gian.

  • Trên điện thoại: Hãy vào phần Cài đặt -> Ngày & Giờ và đảm bảo bạn đã bật “Đặt giờ tự động”.
  • Trên VPS: Chạy lệnh date để xem giờ hiện tại của máy chủ. Nếu nó bị sai, hãy cài đặt một dịch vụ đồng bộ thời gian như chrony.
sudo apt install chrony # Trên Ubuntu/Debian
sudo systemctl enable --now chrony

4. Tôi có thể dùng Authy thay cho Google Authenticator không?

Hoàn toàn có thể. Authy là một lựa chọn tuyệt vời và tương thích 100% với libpam-google-authenticator. Ưu điểm lớn nhất của Authy là tính năng sao lưu mã 2FA trên đám mây và mã hóa bằng mật khẩu. Điều này giúp bạn dễ dàng khôi phục trên thiết bị mới mà không cần đến secret key.

5. Làm thế nào để cấp 2FA cho một người dùng khác trên cùng VPS?

Rất đơn giản. Bạn chỉ cần yêu cầu người dùng đó đăng nhập vào tài khoản của họ trên VPS và lặp lại Bước 2 (google-authenticator). Mọi cấu hình ở Bước 3 đã được áp dụng cho toàn bộ hệ thống.

Kết luận

Chúc mừng bạn đã hoàn thành việc gia cố cho cánh cửa chính vào VPS bằng một lớp khóa bảo mật cực kỳ mạnh mẽ. Giờ đây, máy chủ của bạn được bảo vệ bởi “thứ bạn có” (SSH Key)“thứ bạn sở hữu” (điện thoại), một sự kết hợp đủ sức làm nản lòng hầu hết những kẻ tấn công.

Bảo mật là một hành trình liên tục. Để tiếp tục củng cố pháo đài số của mình, hãy quay trở lại bài viết chính và cùng chúng tôi tìm hiểu Lớp 9: Tự kiểm toán hệ thống với Lynis.

Tài liệu tham khảo