Có thể làm điều này bằng cách kết nối các mô-đun PAM lại với nhau. Nhưng trước khi tôi đi vào bất kỳ chi tiết nào:
Cấu hình PAM có thể không chính xác và SILL ngăn bạn đăng nhập vào hệ thống của bạn
Rất may, bạn luôn có thể khởi động vào chế độ người dùng duy nhất và khắc phục sự cố, nhưng chỉ cần cảnh báo rằng PAM không phải là thứ bạn muốn gây rối hơn mức cần thiết.
Dù sao, ý tưởng đằng sau điều này là có thể sử dụng các mô-đun PAM xếp chồng để đảm bảo rằng pam-google-authenticator
, pam_unix
(điều này kiểm tra mật khẩu của bạn) và mô-đun chứng chỉ đều phải thành công để cho phép bạn truy cập. Theo mặc định, PAM được cấu hình để cho phép bất kỳ mô-đun xác thực nào xác thực bạn, bỏ qua các mô-đun khác.
Trong /etc/pam.d/common-auth, bạn sẽ thấy ở gần đầu một dòng trông tương tự như sau:
auth [success=2 default=ignore] pam_unix.so nullok_secure try_first_pass
Điều này nói với PAM rằng sẽ pam_unix.so
thành công, nó sẽ bỏ qua hai quy tắc tiếp theo (thường là một mô-đun xác thực khác và sau đó pam_deny.so
) và tiến tới các mô-đun tùy chọn. Tuy nhiên, nếu mô-đun thất bại, thì nó sẽ bị bỏ qua và điều khiển sẽ chuyển sang mô-đun tiếp theo trong chuỗi. Điều này tiếp tục xuống từng mô-đun xác thực cho đến khi kiểm soát bỏ qua khối tùy chọn hoặc PAM nhấn pam_deny.so và không thành công ngay tại đó.
Điều này có thể được tận dụng để đảm bảo rằng pam-google-authenticator
, pam_unix.so
và mô-đun PAM chứng chỉ của bạn đều phải thành công để cho phép bạn truy cập. Tôi không biết tên của mô-đun xác thực Google hoặc mô-đun chứng chỉ bạn đang sử dụng, nhưng bạn sẽ có thể tìm thấy chúng trong tệp xác thực chung của bạn. Vì vậy, bằng cách đặt một cái gì đó như thế này ở đầu:
auth requisite pam_unix.so nullok_secure
auth requisite pam_google_authenticator.so
auth requisite pam_certificate_auth.so
auth [success=<n>] pam_permit.so
Thay thế <n>
bằng số lượng mô-đun giữa mô-đun pam_permit.so ở đây và pam_permit.so
mô-đun tiếp theo - nói cách khác, điều này nên được đặt thành mô-đun auth hàng đầu nhất [thành công = n mặc định = bỏ qua] mã + 1. Cú pháp này hơi thú vị , nhưng về cơ bản bỏ qua các mô-đun auth sau khi các mô-đun trên đã thành công.
Tất nhiên, bạn có thể tự hỏi làm thế nào để giới hạn xác thực ba bước này chỉ trong tài khoản người dùng của bạn. Điều này có thể được thực hiện với một pam_succeed_if.so
mô-đun và nên được chèn phía trên khối xác thực ba bước được mô tả ở trên:
auth [success=ignore default=4] pam_succeed_if.so user = <username>
Nơi <username>
được thay thế bởi tên người dùng của bạn. Dòng này chỉ đơn giản nói rằng pam_succeed_if.so thành công (còn gọi là tên người dùng của bạn khớp với tên người dùng trên dòng đó) thì PAM nên tiếp tục với các mô-đun tiếp theo, đó là các mô-đun auth ba bước. Mặt khác, PAM nên chuyển sang các mô-đun thực, cách mô-đun này 4 mô-đun.
Để khớp nhiều thứ, ví dụ như thành viên của một nhóm cùng với một tên người dùng nhất định, ví dụ: phải sử dụng nhiều dòng:
auth [success=1 default=ignore] pam_succeed_if.so user = <username>
auth [success=ignore default=4] pam_succeed_if.so user ingroup <group>
Trước khi thực hiện bất kỳ thao tác nào trong số này, tôi sẽ sao lưu tệp chung-auth và cũng tự làm quen với chế độ người dùng đơn và cách khôi phục tệp cũ trong trường hợp khẩn cấp. Cấu hình này chưa được tôi kiểm tra, nhưng nó sẽ hoạt động.
Để thử nghiệm điều này lần đầu tiên, hãy mở một hoặc hai vỏ gốc và chỉ để chúng một mình. Chúng hoạt động như dự phòng trong trường hợp có bất cứ điều gì sai, vì bạn có thể dễ dàng thay thế auth chung bằng bản sao lưu. Sau đó, thực hiện những thay đổi này. Tiếp theo, hãy thử sử dụng su
để đăng nhập vào tài khoản người dùng của bạn - bạn cần trải qua quy trình xác thực ba bước.
Tài liệu đầy đủ cho pam_succeed_if.so
mô-đun có thể được tìm thấy tại http://linux.die.net/man/8/pam_succeed_if