Hướng dẫn xác thực đa yếu tố cho SSH trên Ubuntu 14.04

4 năm trước

 

Giới thiệu

Một yếu tố xác thực là một phần thông tin được sử dụng để chứng minh bạn có quyền thực hiện hành động, chẳng hạn như đăng nhập vào một hệ thống. Kênh xác thực là cách thức một hệ thống xác thực cung cấp một yếu tố cho người dùng hoặc yêu cầu người dùng trả lời. Mật khẩu và thẻ an ninh là những ví dụ về các yếu tố xác thực; máy tính và điện thoại là ví dụ về các kênh

SSH sử dụng mật khẩu để xác thực theo mặc định và hầu hết các hướng dẫn làm cứng SSH khuyên bạn nên sử dụng khóa SSH thay thế. Tuy nhiên, đây vẫn chỉ là một yếu tố. Nếu một người  xấu đã xâm nhập máy tính của bạn, thì họ cũng có thể sử dụng khóa của bạn để thỏa hiệp với các máy chủ của bạn

Để chống lại nó, trong bài hướng dẫn này chúng ta sẽ thiết lập xác thực đa yếu tố. Xác thực đa yếu tố(MFA) yêu cầu nhiều hơn một yếu để để xác thực hay để đăng nhập. Điều này có nghĩa là những người xấu sẽ phải thoả hiệp nhiều thứ để đăng nhập vào. Loại khác của các yếu tố thường thường là:

  1. Cái mà bạn biết, như là mật khẩu hoặc các câu hỏi bảo mật
  2. Cái gì bạn sở hữu, như là ứng dụng xác thực hay là dấu hiệu bảo mật.
  3. Cái gì mà là chính bạn, như là dấu vân tay hay giọng nói

Một yếu tố thông dụng là ứng dụng OATH-TOPP như Goggle Authenticator. OATH-TOPT ( Mật khẩu mở một lần dựa trên thời gian) là một giao thức mở tạo ta mật khẩu dùng một lần, thường là 6 chữ số được dùng lại mỗi 30 giây.

Bài viết này sẽ hướng dẫn cách để kích hoạt xác thực SSH sử dụng ứng dụng PATH-TOPT bên cạnh khoá SSH. Đăng nhập vào server của bạn thông qua SSH sau đó sẽ yêu cầu 2 yếu tố trên 2 kênh cho nên sẽ làm nó an toàn hơn chỉ một mật khẩu hoặc duy nhất 1 khoá SSH.

 

Điều kiện cần 

Để làm theo bài hướng dẫn này bạn cần:

  • Một Cloud Server Ubuntu 14.04 tại ViCloud.

  • Một người dùng sudo chưa root có khoá SSH

  • Một Smartphone hay máy tính bảng đã cài đặt ứng dụng OATH-TOTP như Google Authenticator (có trên iOS, Android).

 

Bước 1 — Cài đặt libpam-google-authenticator

Trong bước này chúng ta sẽ cài đặt và cấu hình Google's PAM.

PAM, viết tắt của Pluggable Authentication Module, là một thiết bị xác thực được sử dụng trên các hệ thống Linux để xác thực người dùng. Bởi vì Google đã tạo một ứng dụng OATH-TOTP, họ cũng đã tạo một PAM tạo ra TOTP và hoàn toàn tương thích với bất kỳ ứng dụng OATH-TOTP nào.

Đầu tiên update kho cache của Ubuntu.

$ sudo apt-get update 

Sau đó cài đặt PAM

$ sudo apt-get install libpam-google-authenticator 

Khi đã cài đặt PAM, chúng ta sẽ sử dụng một ứng dụng trợ giúp đã được cài đặt với PAM để tạo ra một khóa TOTP cho người dùng mà bạn muốn thêm yếu tố thứ hai vào. Khóa này được tạo ra trên cơ sở người dùng dựa trên người dùng, không phải là hệ thống rộng. Điều này có nghĩa là mọi người dùng muốn sử dụng ứng dụng xác thực TOTP sẽ cần phải đăng nhập và chạy ứng dụng trợ giúp để lấy chìa khóa của chính họ

$ google-authenticator 

Sau khi bạn chạy command này thì bạn sẽ bị hỏi một vài câu hỏi.Câu đầu tiên hỏi xem liệu rằng có nên xác thực dựa trên thời gian.

PAM này cho phép các thẻ dựa trên thời gian hoặc tuần tự. Sử dụng mã thông báo tuần tự có nghĩa là mã bắt đầu tại một điểm nhất định và sau đó gia tăng mã sau mỗi lần sử dụng. Sử dụng mã thời gian mã thay đổi ngẫu nhiên sau một thời gian nhất định trôi qua. Chúng tôi sẽ tiếp tục với dựa thời gian vì đó là những ứng dụng như Google Authenticator dự kiến, vì vậy hãy trả lời yes 

Do you want authentication tokens to be time-based (y/n) y

Sau khi trả lời câu hỏi này, rất nhiều output sẽ di chuyển qua, bao gồm mã QR lớn. Đảm bảo bạn ghi lại khóa bí mật, mã xác minh, mã số trường hợp khẩn cấp ở nơi an toàn, như trình quản lý mật khẩu

Tại thời điểm này, sử dụng ứng dụng xác thực của bạn trên điện thoại của bạn để quét mã QR hoặc gõ thủ công khóa bí mật. Nếu mã QR quá lớn để quét, bạn có thể sử dụng URL ở trên mã QR để có phiên bản nhỏ hơn. Sau khi được thêm, bạn sẽ thấy một mã sáu chữ số thay đổi mỗi 30 giây trong ứng dụng của bạn

Câu hỏi còn lại thông báo cho PAM cách thức hoạt động. Chúng ta sẽ đi qua nó từng cái một.

Do you want me to update your "~/.google_authenticator" file (y/n) y

Điều này về cơ bản tạo key và các tùy chọn cho tệp .google_authenticator. Nếu bạn nói No, chương trình sẽ bỏ và không có gì được tạo ra, có nghĩa là trình xác thực sẽ không hoạt động

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y

Bằng cách trả lời yes ở đây, bạn đang ngăn chặn tấn công lập lại bằng cách làm cho mỗi mã hết hạn ngay sau khi sử dụng. Điều này ngăn cản kẻ tấn công chụp mã bạn vừa sử dụng và đăng nhập vào nó

By default, tokens are good for 30 seconds and in order to compensate for
possible time-skew between the client and the server, we allow an extra
token before and after the current time. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to do so (y/n) n

Khi trả lời yes ở đây cho phép lên đến 8 mã hợp lệ trong một cửa sổ di chuyển bốn phút. Bằng cách trả lời no, chúng tôi giới hạn nó thành 3 mã hợp lệ trong một cửa sổ cán 1:30 phút. Trừ khi bạn tìm ra vấn đề với cửa sổ phút 1:30, không có sự lựa chọn an toàn hơn.

If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) y

Số lần giới hạn có nghĩa là kẻ tấn công từ xa chỉ có thể thử số lần đoán nhất định trước khi bị chặn. Nếu bạn chưa cấu hình số lần giới hạn trực tiếp vào SSH, làm như vậy bây giờ là một kỹ thuật rất an toàn.

 

Bước 2 — Cấu hình OpenSSH

Bước tiếp theo sẽ là cấu hình SSH để dùng khoá TOTP. Chúng ta sẽ cần thông báo cho SSH về PAM và sau đó cấu hình SSH để dùng nó.

Đầu tiên mở cấu hình sshd để edit sử dụng nano hoặc trình chỉnh sửa văn bản yêu thích của bạn.

$ sudo nano /etc/pam.d/sshd 

Thêm dòng sau vào cuối file.

. . .
# Standard Un*x password updating.@include common-passwordauth required pam_google_authenticator.so nullok

Từ "nullok" ở cuối nói với PAM rằng phương pháp xác thực này là tùy chọn. Điều này cho phép người dùng không có phím OATH-TOTP vẫn đăng nhập sử dụng khóa SSH của họ. Khi tất cả người dùng có một phím OATH-TOTP, bạn có thể xóa "nullok" trên dòng này để làm cho nó bắt buộc dùng MFA.

Lưu và đóng file lại.

Tiếp theo chúng ta sẽ cấu hình SSH để hỗ trợ kiểu xác thực này. Mở file cấu hình SSH để edit.

$ sudo nano /etc/ssh/sshd_config 

Tìm ChallengeResponseAuthentication và thay đổi là yes

. . .
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes. . .

Lưu và đóng file lại, sau đó khởi động lại SSH để load lại file cấu hình.

$ sudo service ssh restart 
 

Bước 3 — SSH nhận MFA

Trong bước này chúng ta sẽ kiểm tra xem liệu rằng khoá SSH có hoạt động không.

Đầu tiên mở terminal khác và thử SSH vào server. Bạn sẽ nhận thấy rằng bạn đăng nhập vào phiên thứ hai này bằng khóa SSH của bạn mà không cần nhập mã xác minh hoặc mật khẩu của bạn. Điều này là do một phím SSH ghi đè lên tất cả các tùy chọn xác thực khác theo mặc định. Chúng tôi cần cho SSH sử dụng mã TOTP và sử dụng khóa SSH thay cho mật khẩu của bạn

 Bây giờ mở lại file cấu hình sshd.

$ sudo nano /etc/ssh/sshd_config 

Tìm dòng PasswordAuthentication, bỏ ghi chú bằng các xoá dấu  # ở cầu dòng và upadate giá trị là  no. Nó sẽ báo cho SSH không được nhắc về mật khẩu.

. . .
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no. . .

Sau đó thêm dòng sau vào cuối file. Nó sẽ bảo SSH xem phương pháp xác minh nào được yêu cầu.

. . .
UsePAM yesAuthenticationMethods publickey,keyboard-interactive

Lưu vào đóng file.

Sau đó mở file cấu hình PAM sshd.

$ sudo nano /etc/pam.d/sshd 

Tìm dòng @include common-auth và ghi chú nó bằng cách thêm dấu # làm kí tự đầu. Nó sẽ bảo PAM không được nhắc về mật khẩu, trước đó chúng ta đã bảo SSH không được làm tương tự trong sshd_config.

. . .
# Standard Un*x authentication.#@include common-auth
. . .

Lưu và đóng file rồi sau đó khởi động lại SSH.

$ sudo service ssh restart 

Bây giờ thử đăng nhập lại vào server. Bạn nên thấy bạn đã xác thực một phần với khoá SSH và sau đó được nhắc về code xác minh.Nó trông như sau:

Example login output
ssh sammy@your_server_ipAuthenticated with partial success.
Verification code:

Nhập code xác minh từ app OAUTH-TOTP của bạn và bạn sẽ đăng nhập vào server. Bây giờ bạn đã bật MFA cho SSH!

 

Kết luận

Giống như bất kỳ hệ thống nào bạn bảo mật, bạn sẽ có trách nhiệm quản lý bảo mật đó. Trong trường hợp này, điều đó có nghĩa là không mất chìa khoá SSH hoặc khoá bí mật TOTP của bạn. Tuy nhiên, đôi khi điều xảy ra, và bạn có thể mất quyền kiểm soát các khoá giúp bạn vào server.

Sau đây là một số gợi ý giúp bạn giành lại quyền truy cập vào server:

  • Nếu bạn không có ứng dụng TOTP , sử dụng mã khôi phục của bạn làm mã xác minh. Điều này xảy ra nếu bạn nhận được một chiếc điện thoại mới và quên xuất khẩu chìa khóa ra khỏi điện thoại cũ, hoặc nếu điện thoại của bạn hỏng.

  • Nếu bạn mất khoá bí mật và bản sao lưu, dùng console thông qua bảng điều khiển CloudServer để đăng nhập. Sau đó đổi tên hoặc xoá file~/.google_authenticator. Điều này sẽ làm cho PAM không nhận ra cấu hình của bạn và sẽ không nhắc nhở bạn về code. Chắn chắn rằng /etc/pam.d/sshd vẫn thêm "nullok" như trong bước 2; nếu bạn thay đổi điều này thì hãy nhớ khởi động lại.

  • Nếu bạn làm mất khoá SSH, tiếp tục dùng console để đăng nhập và xoá public cũ của bạn khỏi ~/.ssh/authorized_hosts. Sau đó bạn có thể thay thế khoá mới.

Khi có hai yếu tố (khóa SSH + mã MFA) trên hai kênh (máy tính của bạn + điện thoại của bạn),bạn đã khiến hầu hết các tác nhân bên ngoài không thể sử dụng SSH và xâm nhập vào máy của bạn thông qua SSH và tăng đáng kể tính bảo mật máy của bạn