Linux 2FA: Cách bảo mật thông tin đăng nhập SSH bằng Google Authenticator và Yubikey
Các dịch vụ được kết nối Internet đặc biệt dễ bị tấn công khi đăng nhập vì bất kỳ ai trên thế giới cũng có thể đăng nhập vào tài khoản của bạn một cách thoải mái. Một số tiện ích xác thực đã được phát triển trong nhiều năm qua để chống lại điểm yếu cố hữu này trong mô hình xác thực người dùng / mật khẩu tiêu chuẩn. Phổ biến nhất là Xác thực hai yếu tố (2FA) vì 2FA yêu cầu bạn phải chứng minh bạn có quyền sở hữu một cái gì đó ngoài việc biết tên người dùng và mật khẩu. Một phương pháp nổi tiếng khác đòi hỏi người dùng phải sở hữu một thiết bị phần cứng cung cấp mật khẩu xoay.
Trong bài viết này, tôi sẽ chỉ cho bạn cách khóa máy chủ Linux SSH của bạn bằng cả hai phương pháp – bắt buộc phải có Yubikey để cung cấp mật khẩu và cần có mã thông báo Google Authenticator để hoàn tất đăng nhập.
Yubikey là một thiết bị phần cứng cung cấp các cơ chế xác thực mật mã khác nhau như Mật khẩu một lần (OTP) và Mã hóa khóa công khai (PKI). Google Authenticator là một ứng dụng phần mềm cung cấp OTP để sử dụng làm yếu tố xác thực thứ hai.
Sử dụng Google Authenticator để bảo mật thông tin đăng nhập Linux SSH của bạn
Điều đầu tiên, trước tiên – tải xuống ứng dụng di động Google Authenticator cho điện thoại hoặc máy tính bảng của bạn. Một khi bạn có điều đó, chúng tôi có thể làm việc. Nó có sẵn từ cả Play Store và App Store.
Xác thực đăng nhập Linux thường được cung cấp bởi các thư viện Mô-đun xác thực có thể cắm (PAM). Như tên cho thấy, PAM hỗ trợ bổ sung các mô đun xác thực tùy ý. Trong trường hợp này, chúng tôi sẽ chuyển sang cắm cắm vào trong lớp Google Authenticator để đăng nhập SSH thông thường để nhắc mã sau khi người dùng cung cấp mật khẩu của họ.
Để làm điều đó, chúng ta cần bắt đầu bằng cách cài đặt các thư viện PAM cần thiết:
$ sudo apt-get cài đặt libpam-google-xác thực
Đọc danh sách gói … Xong
Xây dựng cây phụ thuộc
Đọc thông tin trạng thái … Xong
Các gói bổ sung sau sẽ được cài đặt:
libqrencode3
Các gói MỚI sau đây sẽ được cài đặt:
libpam-google-xác thực libqrencode3
0 nâng cấp, 2 mới cài đặt, 0 để gỡ bỏ và 356 không được nâng cấp.
Cần lấy 46,4 kB tài liệu lưu trữ.
Sau thao tác này, 208 kB không gian đĩa bổ sung sẽ được sử dụng.
Bạn có muốn tiếp tục [Y / n] không? y
Và chạy trình xác thực lần đầu tiên:
$ google-xác thực
Sao chép các mã này ở một nơi an toàn. Nếu bạn bị mất điện thoại hoặc gặp một số vấn đề khác mà bạn không thể nhận được mã từ nó, bạn sẽ cần một trong những mã cào khẩn cấp này để đăng nhập.
Bây giờ chúng tôi cần thiết lập thông tin đăng nhập này vào ứng dụng Google Authenticator của bạn. Để làm điều này, nhấn + đăng nhập vào ứng dụng Google Authenticator của bạn và sau đó quyết định xem bạn muốn quét mã QR hay nhập khóa bí mật. Hoặc là phương pháp sẽ làm việc. Khi bạn đã thêm nó, sẽ có một mục mới trong ứng dụng Google Authenticator của bạn trông giống như thế này:
Bây giờ hãy trả lời có cho câu hỏi Bạn có muốn tôi cập nhật câu hỏi ~ / .google_authenticator (y / n) của bạn không, câu hỏi này sẽ khiến bạn có thêm câu hỏi.
Bạn có muốn không cho phép sử dụng nhiều xác thực giống nhau không
mã thông báo? Điều này hạn chế bạn đăng nhập khoảng 30 giây một lần, nhưng nó làm tăng cơ hội để bạn chú ý hoặc thậm chí ngăn chặn các cuộc tấn công trung gian (y / n) y
Theo mặc định, mã thông báo hoạt động tốt trong 30 giây và để bù cho thời gian có thể bị lệch giữa máy khách và máy chủ, chúng tôi cho phép thêm mã thông báo trước và sau thời gian hiện tại. Nếu bạn gặp sự cố với đồng bộ hóa thời gian kém, bạn có thể tăng cửa sổ từ kích thước mặc định là 1: 30 phút lên khoảng 4 phút. Bạn có muốn làm như vậy (y / n) n
Nếu máy tính mà bạn đang đăng nhập không cứng đối với các nỗ lực đăng nhập mạnh mẽ, bạn có thể kích hoạt giới hạn tốc độ cho mô-đun xác thực. Theo mặc định, điều này giới hạn kẻ tấn công không quá 3 lần đăng nhập cứ sau 30 giây.
Bạn có muốn bật giới hạn tỷ lệ (y / n) y
Bạn có thể chọn câu trả lời có ý nghĩa nhất cho bạn. Tôi chọn không cho phép sử dụng nhiều mã thông báo và cho phép giới hạn tỷ lệ. Tôi đã chọn không cho phép thời gian lệch bốn phút vì cả máy tính và điện thoại của tôi đều cập nhật thời gian của chúng theo định kỳ nên thật khó để tưởng tượng đồng hồ có thể trở nên không đồng bộ đến mức nào. Nếu bạn có ý định đăng nhập vào một hệ thống từ xa có nhiều độ trễ, bạn có thể muốn cho phép thời gian dài hơn.
Vì tò mò, nếu chúng ta xem tệp .google-Authenticator mới của chúng tôi, chúng ta có thể thấy những lựa chọn đó được lưu ở đó, cùng với các mã thông báo khẩn cấp của chúng tôi.
$ mèo .google_authenticator
NO7ZW33I34JMPCKB
RATE_LIMIT 3 30
WINDOW_SIZE 17
DISALLOW_REUSE
TOTP_AUTH
73444347
15364641
36772087
14155810
92578001
Đó là một ý tưởng tốt để đảm bảo tệp này chỉ có thể đọc được bởi người dùng của bạn, đó là cách nó được thiết lập theo mặc định:
$ ls -l .google_authenticator
-r ——– 1 jdw jdw 126 ngày 26 tháng 4 08:30 .google_authenticator
Bây giờ chúng tôi đã thiết lập Google Authenticator, nhưng hệ thống của chúng tôi không biết rằng nó phải sử dụng nó để đăng nhập. Để làm điều đó, chúng tôi cần cập nhật cấu hình Mô đun xác thực có thể cắm (PAM).
Chỉnh sửa tệp cấu hình ssh PAM dưới dạng root:
$ sudo vim /etc/pam.d/sshd
Thêm dòng này ở đâu đó, tôi đặt nó ở dưới cùng:
# Sử dụng Google Auth để đăng nhập ssh
auth yêu cầu pam_google_authenticator.so
Cần thêm một sự thay đổi; sửa đổi cài đặt thử thách và phản hồi của bạn trong tệp sshd_config bằng cách chuyển không thành có:
$ sudo vim / etc / ssh / sshd_config
# Thay đổi thành có để bật mật khẩu phản hồi thử thách (hãy cẩn thận với các vấn đề với
# một số mô-đun và chủ đề PAM)
Thử thách Phản hồi Có
Bây giờ khởi động lại daemon SSH của bạn và thử nó:
$ sudo dịch vụ ssh khởi động lại
Don mệnh đăng xuất. Để lại cho mình đăng nhập chỉ trong trường hợp bạn có thể trở lại vì một số lý do. Bắt đầu một thiết bị đầu cuối khác và SSH vào máy được cấu hình mới của bạn.
Khi tôi nhập mật khẩu của mình, tôi được nhắc nhập mã Google Authenticator hiện tại. Nhập cả hai đúng cách cho phép bạn đăng nhập:
$ ssh [email protected]
Mật khẩu: <=== gõ mật khẩu của tôi
Mã xác nhận:
Chào mừng bạn đến với Ubuntu 12.04.5 LTS (GNU / Linux 3.13.0-32-generic x86_64)
Sử dụng Yubikey để bảo mật thông tin đăng nhập Linux SSH của bạn
Bây giờ chúng tôi có một hệ thống yêu cầu tên người dùng, mật khẩu và mã thông báo Google Authenticator để đăng nhập. Điều đó khá an toàn, nhưng chúng tôi có thể làm tốt hơn nữa. Chúng tôi có thể định cấu hình hệ thống để chỉ chấp nhận mật khẩu được tạo ngẫu nhiên từ Yubikey.
Trong số ba phần dữ liệu cần thiết để đăng nhập (tên người dùng, mật khẩu, mã xác thực), không ai có thể biết trước hai phần cuối hoặc sử dụng lại chúng nếu được phát hiện.
Điều đầu tiên, trước tiên – hãy nhận một Yubikey trực tiếp từ Yubico hoặc từ một nơi như Amazon. Tôi sẽ sử dụng Nano Yubikey cho việc này.
Tiếp theo, hãy để cài đặt các gói cần thiết. Thêm Yubico PPA (Lưu trữ sản phẩm cá nhân) và cài đặt thư viện PAM libpam-yubico.
$ sudo add-apt-repository ppa: yubico / ổn định
$ sudo apt-get cập nhật
$ sudo apt-get cài đặt libpam-yubico
Bản thân tệp thư viện có tên pam_yubico.so và nên được cài đặt vào / lib / security /
$ ls -l / lib / bảo mật /
tổng số 104
-rw-r – r– 1 root 10296 ngày 19 tháng 3 năm 2013 pam_ck_connector.so
-rw-r – r– 1 root root 43480 28 tháng 3 năm 2013 pam_gnome_keyring.so
-rw-r – r– 1 root 47672 ngày 25 tháng 11 năm 2016 pam_yubico.so
$
Chúng tôi sẽ cần một bộ thông tin API Yubi. Truy cập trang API Yubico tại đây.
Và làm theo hướng dẫn. Khi bạn đã cung cấp email và Yubikey OTP của mình, trang web sẽ cung cấp cho bạn ID khách hàng và Khóa bí mật bạn có thể sử dụng:
Thông tin cuối cùng mà bạn cần sẽ là mã thông báo Yubikey của bạn. Đó chỉ là 12 chữ số đầu tiên của bất kỳ mật khẩu một lần (OTP) nào mà Yubikey của bạn phát ra. Để có được điều này, hãy tập trung con trỏ của bạn vào một cửa sổ đầu cuối hoặc trình soạn thảo văn bản – một số nơi sẽ lấy đầu vào. Sau đó chèn Yubikey của bạn vào ổ USB của bạn. Nếu nó có một nút, nhấn nó. Nếu không, chẳng hạn như mô hình Nano, thay vào đó chỉ cần ấn nhẹ Yubikey vào cổng USB. Nó sẽ viết ra một mật khẩu một lần dưới dạng một chuỗi ký tự dài. Mười hai chữ số đầu tiên là tất cả những gì chúng ta cần cho phần này. Trong trường hợp của tôi, đó là:
cccccchcdjed
Tiếp theo, định cấu hình tệp /etc/pam.d/sshd để yêu cầu yubikey đăng nhập bằng cách thêm dòng này vào đầu tệp, sử dụng id và khóa bạn nhận được từ trang web API Yubi:
auth yêu cầu pam_yubico.so id = 38399 key = lZqKSrHhyQ6dEBZnIEe2 + Uwe3NA = debug authfile = / etc / yubikey_mappings mode = client
Chúng tôi cũng phải nói với sshd daemon rằng nó không nên chấp nhận mật khẩu nữa. Nếu chúng tôi không dùng, thì nó vẫn sẽ chấp nhận mật khẩu bình thường ngoài Yubikey OTPs, đây thực sự là những gì chúng tôi muốn. Để làm điều đó, hãy nhận xét dòng này bằng cách đặt # ở phía trước của nó:
# @ bao gồm chung-auth
Bây giờ chúng tôi cần liên kết người dùng của bạn với Yubikey của bạn. Để làm điều đó, hãy chỉnh sửa tệp / etc / yubikey_mappings và thêm tên người dùng và mã thông báo Yubikey 12 ký tự của bạn được phân tách bằng dấu hai chấm:
jdw: cccccchcdjed
Nếu bạn có nhiều Yubikeys, bạn có thể thêm nhiều hơn bằng cách nối thêm các mã thông báo Yubikey bổ sung vào cùng một dòng, cách nhau bằng dấu hai chấm. Nếu tôi có ba Yubikeys, dòng của tôi sẽ trông giống như thế này:
jdw: cccccchcdjed: joewubtklruy: sgjyirtvskhg
Cuối cùng, khởi động lại phiên ssh của bạn và thử nó. Lưu ý rằng bạn nên duy trì trạng thái đăng nhập vào phiên ssh làm việc của mình trong trường hợp điều này không hoạt động.
$ sudo ssh khởi động lại
Khi được nhắc nhập mật khẩu, tôi nhấn Yubikey thay vào đó và nó đăng nhập cho tôi. Vì tôi đã bao gồm tùy chọn gỡ lỗi trong tệp etc / pam.d / sshd, tôi nhận được rất nhiều đầu ra, nhưng tôi đã giảm nó xuống cho đoạn trích này vì nó thực sự chỉ hữu ích nếu có sự cố xảy ra:
$ ssh 192.168.1.118
Mật khẩu: <=== đến từ việc nhấn Yubikey của tôi
Mã xác nhận:
Chào mừng bạn đến với Ubuntu 12.04.5 LTS (GNU / Linux 3.13.0-32-generic x86_64)
Thats tất cả để có nó. Cả hai công nghệ này đều có bản chất kỹ thuật, nhưng việc nâng hạng nặng được thực hiện bởi các thư viện PAM được cung cấp bởi các nhà cung cấp riêng lẻ. Điều đó có nghĩa là chúng tôi có thể bảo mật truy cập ssh vào các hệ thống Linux của chúng tôi với rất ít thay đổi về cấu hình.
Bối cảnh trên SMS và 2FA
Mặc dù không cần thiết phải hoàn thành hướng dẫn này, một số thông tin cơ bản về lý do SMS 2FA yếu có thể hữu ích. Có một lý do tại sao những thứ như ứng dụng Yubikeys và ứng dụng xác thực lại thích hợp hơn SMS 2FA.
Xác thực hai yếu tố SMS yếu
Định nghĩa được chấp nhận rộng rãi nhất về 2FA là một cái gì đó bạn biết và một cái gì đó bạn có. Một cái gì đó mà bạn biết là mật khẩu. Một thứ gì đó mà bạn có, thường có nghĩa là mã gồm sáu chữ số mà bạn cung cấp từ một số thiết bị mà chỉ bạn mới có quyền truy cập. Cung cấp mã chính xác là đủ bằng chứng cho thấy bạn có một cái gì đó.
Hình thức phổ biến nhất của 2FA trên internet hiện nay là sử dụng tin nhắn văn bản SMS để gửi mã 2FA khi đăng nhập. Do các điểm yếu trong giao thức SS7 và xác minh khách hàng kém trong các nhóm hỗ trợ di động, khá dễ dàng để chuyển hướng tin nhắn văn bản đến bất kỳ điện thoại nào bạn muốn. Hai điểm yếu được khai thác thường xuyên trong phương thức SMS 2FA: Thứ nhất, số điện thoại không được gắn vĩnh viễn với điện thoại, vì vậy bất kỳ ai cũng có thể nhận được tin nhắn SMS bằng mã. Thứ hai, mã xác thực SMS được gửi cho bạn thông qua một phương tiện không tin cậy và không được mã hóa. Theo định nghĩa của nó, điều này không đáp ứng yêu cầu là một thứ gì đó mà bạn có. Nó thực sự là một thứ gì đó mà tôi vừa tặng cho bạn, đó là một thứ không giống nhau.
Ứng dụng Authenticator và mã thông báo phần cứng mạnh hơn
Một giải pháp tốt hơn là sử dụng ứng dụng xác thực di động như Google Authenticator hoặc Authy. Một giải pháp tốt hơn nữa là kết hợp loại 2FA đó với mật khẩu xoay vòng, không thể đoán trước từ một thiết bị như Yubikey. Cả ứng dụng và mã thông báo phần cứng đều không truyền bất kỳ dữ liệu nào qua internet hoặc hệ thống di động, loại bỏ vectơ chặn đó. Nhược điểm là chúng khó thiết lập hơn, có nghĩa là phương thức SMS yếu hơn được sử dụng thường xuyên nhất.
Liên quan:
Tài nguyên mã hóa: Danh sách lớn các công cụ và hướng dẫn
Một cuộc tấn công vũ phu là gì?
Hướng dẫn không có biệt ngữ về bảo mật máy tính và internet
Hướng dẫn cuối cùng về bảo mật Linux trên máy tính để bàn