Cách cài đặt Multi- Factor Authentication( bộ xác thực đa yếu tố) trên Ubuntu 16.04

6 năm trước

 

Mở đầu

  • Một yếu tố bảo mật là thông tin được sử dụng để xác thực rằng bạn có quyền thực hiện một hành động nào đó, chẳng hạn đăng nhập vào hệ thống. Mật mã và các token là các loại yếu tố bảo mật.
  • Một kênh truyền xác thực (authentication channel) là cách hệ thống xác thực dùng để gửi và nhận các thông điệp bảo mật. Điện thoại hay máy tính là các kênh truyền.
  • Bộ xác thực đa yếu tố là một hệ thống xác thực bao gồm nhiều hơn một yếu tố bảo mật.

3 loại yếu tố xác thực:

  1. Something you know: Thứ bạn biết, chẳng hạn mật khẩu...
  2. Something you have: Thứ bạn có, như SSH key...
  3. Something you are, thứ chỉ riêng bạn có, như dấu vân tay, giọng nói...

Một yếu tố xác nhận thường dùng là ứng dụng OATH-TOTP, như Google Authenticator. OATH-TOTP (Open Authentication Time-Based One-Time Password) một giao thức mở giúp tạo ra mật khẩu sử dụng một lần, bao gồm dãy 6 số và thay đổi liên tục sau mỗi 30 giây.

Bài viết sẽ đề cập đến cách kích hoạt xác thực SSH sử dụng app OATH- TOTP để thêm vào SSH key. Quá trình đăng nhập qua SSH sẽ yêu cầu 2 yếu tố bảo mật thông qua 2 kênh truyền khác nhau, làm tăng tính bảo mật của hệ thống. Bên cạnh đó là một số trường hợp sử dụng MFA khác cùng với những mẹo hữu ích.

 

Yêu cầu

 

 

Bước 1 – Cài đặt PAM của Google

 

PAM (Pluggable Authentication Module) là một cơ sở xác thực được sử dụng trên các hệ thống Linux. Bởi vì Google tạo ra OATH-TOTP nên họ cũng phát triển PAM có chứa TOTPs để tương thích với bất kì ứng dụng OATH-TOTP nào, chẳng hạn như Google Authenticator hay Authy.

Update bộ nhớ cache của kho ứng dụng Ubuntu:

sudo apt-get update 

 

Cài PAM:

sudo apt-get install libpam-google-authenticator

 

Chạy ứng dụng khởi tạo:

google-authenticator 

 

Sau khi chạy lệnh, bạn sẽ phải trả lời một số câu hỏi để thiết lập các tùy chọn.

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

PAM này cho phép bạn lựa chọn token time-based hay sequential-based. Nếu sử dụng sequential-based có nghĩa là mã code sẽ bắt đầu tại một điểm nhất định và sau đó gia tăng sau mỗi lần sử dụng. Nếu chọn time-based có nghĩa là mã thay đổi ngẫu nhiên sau một khoảng thời gian nhất định. Chúng ta sẽ chọn time-based bởi nó tương tự như Google Authenticator, vì thế, hãy gõ  y để chấp thuận.

Sau câu trả lời này, rất nhiều thông tin xuất hiện, trong đó có một mã QR code lớn. Lúc này, hãy sử dụng ứng dụng xác thực trên điện thoại của bạn để quét mã QR đó. Nếu không, bạn cũng có thể gõ thủ công mã bí mật. Sau khi thêm, bạn sẽ thấy một mã bao gồm 6 chữ số cứ 30 giây lại đổi một lần trên ứng dụng của bạn.

 

Note: Hãy đảm bảo bạn ghi lại mã bí mật, mã xác minh và mã khôi phục ở một nơi an toàn. Trong đó, mã khôi phục là cách duy nhất để bạn lấy lại quyền đăng nhập của mình.

 

Câu tiếp theo sẽ là:.

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

Tùy chọn nếu bạn muốn mỗi token chỉ được sử dụng một lần, và ghi key cùng với các tùy chọn vào file .google_authenticator . Hãy chọn “Yes” bởi nếu “Không”, chương trình sẽ bỏ qua và trình xác thực sẽ không hoạt động.

 

OutputBy 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
 

Bằng cách trả lời “Yes”, mã bạn vừa sử dụng để đăng nhập sẽ hết hạn ngay sau khi sử dụng, ngăn chặn việc hacker chụp lại mã và tấn công tài khoản.

OutputBy 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
 

Trả lời “Yes” có nghĩa là bạn cho phép 8 mã hợp lệ trong một cửa sổ di chuyển 4 phút; “No” là bạn giới hạn nó thành 3 mã hợp lệ trong một cửa sổ di chuyển 1 phút rưỡi. Trừ khi bạn thấy có vấn đề với cửa sổ 1 phút rưỡi, nếu không hãy cứ trả lời “No”.

OutputIf 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
 

Câu hỏi này nhằm muốn làm rõ việc bạn có muốn giới hạn tốc độ và số lần đăng nhập hay không. Khi hacker muốn tấn công, hắn chỉ có tối đa 3 lần thử mật khẩu, mỗi lần lại thay đổi mã xác minh sau 30s trước khi bị phát hiện và ngăn chặn. Nếu bạn chưa cài đặt cấu hình giới hạn tốc độ trực tiếp vào SSH thì hãy tiến hành cài đặt ngay.

 

Note: Sau khi hoàn tất bước 1 này, nếu bạn muốn sao lưu khóa bí mật của mình, bạn có thể sao chép tệp ~/.google-authenticator đến một địa chỉ tin cậy. Điều này sẽ giúp bạn khôi phục tài khoản khi cần.

 

Bước 2 – Cấu hình SSH

Vì ta sẽ thay đổi SSH trên SSH ban đầu, không ngắt kết nối trên SSH ban đầu mà hãy mở phiên bản SSH khác và thực hiện kiểm tra. Mục đích nhằm tránh việc thiết bị khóa máy khỏi máy chủ nếu phát sinh lỗi trong quá trình cấu hình SSH.

Để bắt đầu, hãy mở tệp tin cấu hình sshd

sudo nano /etc/pam.d/sshd 

 

Thêm dòng sau vào cuối tệp

/etc/pam.d/sshd
. . .
# Standard Un*x password updating.@include common-passwordauth required pam_google_authenticator.so nullok

Chữ nullok ở cuối cho biết rằng phương thức xác thực này là tùy chọn, cho phép người dùng không có mã thông báo OATH-TOTP vẫn có thể đăng nhập sử dụng khóa SSH của họ. Nếu đã có, bạn có thể xóa chữ này ở cuối dòng. Sau đó, lưu và đóng tập tin lại.

Lưu và đóng file.

Mở file cấu hình SSH:

sudo nano /etc/ssh/sshd_config 

 

Tìm đến ChallengeResponseAuthentication và đặt lại giá trị của nó thành yes.

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

Lưu và đóng file, sau đó restart SSH. Việc restart dịch vụ sshd  không làm dwungf những tiến trình đang chạy nên ta sẽ không bị mất kết nối SSH. 

sudo systemctl restart sshd.service 

 

Để kiểm tra lại mọi thứ có hoạt động như bình thường hay không, hãy mở một terminal khác, đăng nhập qua SSH. Nếu bạn đã tạo SSH key và đang sử dụng nó, bạn sẽ nhận thấy rằng bạn không cần phải nhập mật khẩu của người dùng hoặc mã xác minh MFA. Đó là do SSH key đã ghi đè lên tất cả các tùy chọn xác thực khác theo mặc định.

Tiếp theo, để kích hoạt SSH key thành một yếu tố xác thực và nhận mã xác minh, chúng ta cần cho SSH biết các yếu tố nào sẽ sử dụng để ngăn chặn khóa SSH ghi đè lên tất cả các tùy chọn khác.

 

Bước 3 – Khiến SSH nhận thức về MFA (Multi-Factor Authentication)

 

Mở lại file cấu hình sshd 

sudo nano /etc/ssh/sshd_config 

 

Thêm những dòng sau vào dưới:

/etc/ssh/sshd_config
. . .
UsePAM yesAuthenticationMethods publickey,password publickey,keyboard-interactive

Điều này cho SSH biết phương pháp xác thực nào là cần thiết và chúng ta cần mã SSH, mật khẩu hay mã xác minh (hay cả ba yếu tố này). Sau đó, lưu và đóng tệp tin.

Tiếp theo, mở file cấu hình PAM sshd một lần nữa.

sudo nano /etc/pam.d/sshd 

 

Tìm dòng @include common-auth và đánh dấu nó với kí tự # , để PAM không yêu cầu mật khẩu đến những truy cập này.

/etc/pam.d/sshd
. . .
# Standard Un*x authentication.#@include common-auth
. . .

Lư và đóng file rồi restart SSH:

sudo systemctl restart sshd.service 

 

Bây giờ, hãy thử đăng nhập vào máy chủ một lần nữa. Lần này, SSH nên yêu cầu mã xác minh để đăng nhập. Mặc dù bạn không thấy dấu hiệu nào cho biết khóa SSH của bạn đã được sử dụng nhưng quá trình đăng nhập của bạn đã sử dụng qua 2 yếu tố. Nếu muốn xác minh, bạn có thể thêm -v vào sau lệnh SSH. Đến cuối output, bạn sẽ thấy SSH sử dụng khóa SSH và sau đó yêu cầu mã xác thực. 

Example SSH output\. . .
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/sammy/.ssh/id_rsa
debug1: Server accepts key: pkalg rsa-sha2-512 blen 279
Authenticated with partial success.
debug1: Authentications that can continue: password,keyboard-interactive
debug1: Next authentication method: keyboard-interactive
Verification code:

 

Ở đoạn cuối của output, bạn sẽ thấy SSH sử dụng SSH key, sau đó yêu cầu mã xác nhận. Giờ đây bạn đã có thể log in vào server qua SSH với một SSH key và một one-time password. 

 

Bước 4 – Thêm yếu tố xác thực thứ ba (tùy chọn)

 

Có 3 dạng xác thwujc được lưu trong sshd_config là:

  1. publickey (SSH key)
  2. password publickey (password)
  3. keyboard-interactive (mã xác nhận)

Khi đăng nhập, bạn chỉ sử dụng đến 2 yếu tố là khóa SSH và mã xác nhận, yếu tố còn lại là tùy chọn do bạn. Cách để sử dụng cả 3 yếu tố như sau:

Mở file cấu hình PAM sshd 

sudo nano /etc/pam.d/sshd 

 

Tìm đến dòng #@include common-auth, rồi uncomment nó bằng cách xóa đi kí tự # ở đầu. 

Lưu rồi đóng file, sau đó khởi động lại SSH:

sudo systemctl restart sshd.service 

 

Bằng cách kích hoạt tùy chọn @include common-auth, PAM sẽ yêu cầu mật khẩu bên cạnh SSH key và mã xác nhận. Ta đã có một hệ thống xác nhận đa yếu tố với 3 yếu tố: SSH key, passowrd và mã xác nhận.

Dưới đây là một số cách khác để thực hiện MFA cùng một số mẹo nhỏ có thể hữu ích với bạn.

 

Tip 1 – Khôi phục quyền truy cập

 

Mất SSH key hay TOTP key

Nếu bạn bị mất SSH key hay TOTP key, quá trình khôi phục có thể được chia ra thành một vài bước. Đầu tiên là quay trở lại mà không cần biết mã xác minh và thứ hai là tìm khóa bí mật hay tạo lại mật khẩu để đăng nhập MFA bình thường.

Nếu đang dùng Cloud Server của Vicloud, bạn có thể dễ dàng sử dụng bộ điều hướng ảo (virtual console ) từ bảng điều khiển để login với username và password của mình.

Nếu không bạn sẽ cần một administrative user với quyền sudo,đã được cấu hình SSH key nhưng chưa kích hoạt MFA.

Có 2 cách để giải quyết là:

  1. Khôi phục key
  2. Generate a new key

Trong thư mục chính của mỗi người dùng, secret key và file cấu hình Google Authenticator được lưu trong~/.google-authenticator. Dòng đầu tiên của tệp này là thứ ta cần tìm. Cách nhanh chóng để lấy được khoá là thực hiện lệnh sau đây:

head -n 1 /home/sammy/.google_authenticator

 

Tiếp theo là lấy key hiển thị trên màn hình để nhập vào TOTP app.

Nếu không thể sử dụng khóa hiện tại, bạn có thể xóa tệp tin ~/.google-authenticator. Điều này cho phép người dùng đăng nhập lại mà chỉ sử dụng một yếu tố (trong trường hợp bạn chưa thực thi MFA). Sau đó, máy tính có thể chạy google-authenticator để tạo ra một khoá mới.

Mất quyền truy cập vào ứng dụng TOTP

 

Nếu bạn cần đăng nhập vào máy chủ của mình nhưng không có quyền truy cập vào ứng dụng TOTP để lấy mã xác minh, bạn vẫn có thể đăng nhập bằng mã khôi phục đã được hiển thị khi bạn tạo khóa bí mật lần đầu tiên. Lưu ý rằng các mã khôi phục này chỉ được sử dụng một lần nên nếu đã sử dụng để đăng nhập thì không thể sử dụng làm mã xác minh nữa.

 

Tip 2 – Thay đổi cài đặt xác thực

 

Nếu bạn muốn thay đổi cài đặt MFA sau cấu hình ban đầu, thay vì tạo cấu hình mới với cài đặt đã cập nhật, bạn chỉ cần chỉnh sửa tệp ~/.google-authenticator. Tập tin này được trình bày theo cách sau:

.google-authenticator layout

Có một dòng trong phần tùy chọn được đặt trong tập tin này, nếu bạn trả lời “không” với một tùy chọn cụ thể trong quá trình thiết lập ban đầu, dòng tương ứng sẽ bị loại bỏ khỏi tệp.

Dưới đây là những thay đổi bạn có thể thực hiện với tệp này:

  • Để bật mã tuần tự thay vì mã thời gian, thay đổi dòng  " TOTP_AUTH thành " HOTP_COUNTER 1.
  • Để cho phép sử dụng một mã nhiều lần, loại bỏ dòng " DISALLOW_REUSE.
  • Để mở rộng cửa sổ hết hạn mã đến 4 phút, thêm dòng  " WINDOW_SIZE 17.
  • Để vô hiệu hóa nhiều đăng nhập không thành công (giới hạn tỉ lệ),hãy xóa dòng " RATE_LIMIT 3 30.
  • Để thay đổi ngưỡng giới hạn tốc độ, hãy tìm dòng  " RATE_LIMIT 3 30 và tùy chỉnh các giá trị số.  3 là số lần truy cập tối đa trong một khoảng thời gian, và 30 là độ dài khoảng thời gian, đơn vị giây.
  • Để vô hiệu hóa việc sử dụng các mã khôi phục, hãy xóa năm số 8 ở cuối tệp.
 

Tip 3 – Tránh MFA cho một số tài khoản

 

Có thể xảy ra tình huống một vài tài khoản ứng dụng cần quyền truy cập SSH mà MFA không được bật. Nếu ứng dụng không có cách để yêu cầu mã xác minh, yêu cầu có thể bị kẹt khi kết nối SSH quá hạn. Miễn là một vài tùy chọn trong /etc/pam.d/sshd được đặt chính xác, bạn có thể kiểm soát các yếu tố được sử dụng trên cơ sở từng người dùng.

Để thiết lập MFA cho một số tài khoản và SSH cho những tài khoản khác, hãy đảm bảo các cài đặt sau trong /etc/pam.d/sshd đang hoạt động:

/etc/pam.d/sshd
# PAM configuration for the Secure Shell service
# Standard Un*x authentication.
#@include common-auth
. . .
# Standard Un*x password updating.
@include common-password
auth required pam_google_authenticator.so nullok

 

Ở đây,@include common-auth được nhắc đến bởi vì mật khẩu cần phải được vô hiệu hoá. MFA không thể hoạt động nếu một số tài khoản đang vô hiệu hóa MFA, do đó, hãy bỏ tùy chọn nullok ở dòng cuối cùng đi.

Sau khi thiết lập cấu hình này, chỉ cần chạy google-authenticator là bạn đã hoàn thành.

 

Tip 4 – Tự động Thiết lập với Configuration Management

 

Nhiều quản trị viên sử dụng các công cụ quản lý cấu hình để quản lý các hệ thống của họ. Nếu bạn muốn sử dụng một hệ thống như thế này để cài đặt một khóa bí mật khi một tài khoản người dùng mới được tạo ra, hãy thực hiện như sau:

google-authenticator hỗ trợ thiết bị chuyển mạch dòng lệnh để thiết lập tất cả các tùy chọn trong một lệnh không tương tác. Để xem tất cả các tùy chọn, bạn có thể gõ google-authenticator --help. Dưới đây là lệnh sẽ thiết lập mọi thứ như trong Bước 1 phần trước đã hướng dẫn:

google-authenticator -t -d -f -r 3 -R 30 -W 

 

Dòng này sẽ thay tất cả câu trả lời mà chúng ta phải thực hiện, sau đó, lưu nó vào một tệp tin rồi xuất ra khóa bí mật, mã QR và mã khôi phục. Hãy bỏ -q, nếu không sẽ không có bất kỳ kết quả đầu ra nào. Nếu bạn sử dụng lệnh này tự động, hãy nhớ lưu lại khóa bí mật và mã khôi phục sẵn cho người dùng.

 

Tip 5 – Yêu cầu MFA với tất cả người dùng

 

Nếu bạn muốn bật xác thực đa yếu tố MFA cho tất cả người dùng ngay cả khi họ đăng nhập lần đầu tiên hay bạn không muốn người dùng sử dụng tài khoản của họ tự tạo ra key thì có một cách dễ dàng để xử lý. Bạn chỉ cần sử dụng cùng một tệp tin xác thực .google-authenticator cho mỗi người dùng là sẽ không có dữ liệu người dùng cụ thể nào được lưu trữ trong tệp.

Để thực hiện việc này, sau khi tạo tệp cấu hình, người dùng được quyền sao chép tệp vào thư mục gốc của mọi thư mục chính và thay đổi các quyền thích hợp cho người dùng. Bạn cũng có thể sao chép tập tin vào /etc/skel/ và nó sẽ tự động sao chép vào thư mục chính của người dùng mới khi tạo.

 

Cảnh báo: Điều này có thể trở thành một nguy cơ bảo mật vì tất cả mọi người đang cùng chia sẻ yếu tố xác thực thứ hai. Nếu thông tin bị rò rỉ thì mọi người chỉ còn sử dụng một yếu tố xác thực. Hãy xem xét vấn đề trước khi bạn sử dụng cách thức này.

 

Một phương pháp khác để bắt buộc người dùng tạo secret key là sử dụng một bash script để:

  1. Tạo một TOTP token
  2. Dùng nó để download Google Authenticator app và quét mã QR được hiển thị
  3. Chạy ứng dụng google-authenticator cho chúng sau khi chắc chắn file .google-authenticator tồn tại

Tổng kết

 

Với hai yếu tố xác thực (an SSH key + MFA token) trên hai kênh truyền (máy tính cá nhân+ điện thoại thông minh),bạn đã ngăn chặn đáng kể những truy cập trái phép và giảm nguy cơ tấn công mạng qua SSH , qua đó tăng đáng kể tính bảo mật của hệ thống.