Khung nền tảng của bảo mật Linux
Khi bạn nhập mật khẩu vào terminal Linux hoặc thực hiện lệnh sudo, bạn không chỉ đang tương tác với một ứng dụng duy nhất. Bạn đang làm việc với Pluggable Authentication Modules, hay còn gọi là PAM. Hãy coi PAM như một công cụ logic trung tâm để xác thực danh tính. Thay vì mọi dịch vụ như SSH hay FTP phải tự viết mã kiểm tra mật khẩu riêng, chúng sẽ giao phó nhiệm vụ đó cho thư viện mô-đun của PAM.
Tôi đã quản lý hàng chục máy chủ Linux trong vài năm qua và tôi đã học được một bài học xương máu: PAM vừa mạnh mẽ vừa nguy hiểm. Chỉ một ký tự đặt sai chỗ trong tệp cấu hình có thể khóa mọi người dùng khỏi hệ thống, bao gồm cả tài khoản root. Hướng dẫn này sẽ phân tích cách PAM hoạt động và cách triển khai các chính sách bảo mật tùy chỉnh một cách an toàn.
Bắt đầu nhanh: Kiểm tra thiết lập hiện tại của bạn
Trước khi sửa đổi hệ thống bảo mật, bạn cần biết các quy tắc nằm ở đâu. Mọi tệp cấu hình PAM đều nằm trong thư mục /etc/pam.d/. Các tệp này thường được đặt tên theo dịch vụ mà chúng điều khiển.
Chạy lệnh sau để xem những ứng dụng nào hiện đang sử dụng PAM:
ls /etc/pam.d/
Các tệp phổ biến bao gồm sshd, sudo, và common-auth. Để xem cách SSH xử lý đăng nhập, hãy kiểm tra cấu hình của nó:
cat /etc/pam.d/sshd
Một mục nhập PAM tiêu chuẩn sẽ trông như thế này:
auth required pam_unix.so shadow nodelay
Cú pháp tuân theo một mẫu nghiêm ngặt gồm bốn phần: [loại] [điều khiển] [đường-dẫn-mô-đun] [đối số]. Một khi bạn hiểu bốn cột này, toàn bộ hệ thống sẽ trở nên minh bạch.
Kiến trúc: Cách PAM ra quyết định
Để tùy chỉnh kiểm soát truy cập hiệu quả, bạn phải hiểu bốn nhóm quản lý và các cờ logic quyết định sự thành công hay thất bại.
Bốn nhóm quản lý
- auth: Nhóm này xác nhận danh tính. Nó thường yêu cầu mật khẩu hoặc xác thực khóa mật mã.
- account: Nhóm này kiểm tra xem người dùng hiện có được phép truy cập hệ thống hay không. Nó xác minh xem tài khoản có hết hạn hay không hoặc người dùng có đang cố gắng đăng nhập trong giờ bị hạn chế hay không.
- password: Nhóm này xử lý việc cập nhật thông tin xác thực. Nó chịu trách nhiệm thực thi các quy tắc về độ phức tạp (như yêu cầu kết hợp số và ký tự đặc biệt) và cập nhật tệp
/etc/shadow. - session: Nhóm này thiết lập môi trường. Nó xử lý các tác vụ như gắn (mount) thư mục cá nhân, thiết lập biến môi trường và ghi nhật ký thời gian phiên làm việc.
Cờ điều khiển (Control Flags): Định nghĩa Logic
Cờ điều khiển cho PAM biết phải làm gì nếu một mô-đun thành công hoặc thất bại. Đây là nơi hầu hết các lỗi cấu hình xảy ra.
- required: Mô-đun phải trả về kết quả thành công. Nếu thất bại, người dùng cuối cùng sẽ bị từ chối, nhưng PAM sẽ tiếp tục chạy các mô-đun khác trong stack để người dùng không biết chính xác lỗi xảy ra ở đâu.
- requisite: Đây là yêu cầu bắt buộc cứng. Nếu mô-đun này thất bại, PAM sẽ dừng ngay lập tức và hủy bỏ nỗ lực xác thực.
- sufficient: Nếu mô-đun này vượt qua và không có mô-đun “required” nào trước đó thất bại, PAM sẽ cấp quyền truy cập ngay lập tức mà không cần kiểm tra phần còn lại của stack.
- optional: Các mô-đun này chỉ quan trọng nếu không có mô-đun nào khác trong stack đưa ra kết quả đạt hoặc không đạt dứt khoát.
Các chính sách bảo mật thực tế
Ngoài lý thuyết, PAM cho phép bạn giải quyết các vấn đề bảo mật thực tế chỉ với vài dòng mã. Hãy xem xét hai cấu hình có tác động lớn.
1. Vô hiệu hóa Brute Force với pam_faillock
Các tập lệnh tự động liên tục dò tìm các cổng SSH. Bạn có thể sử dụng pam_faillock để vô hiệu hóa tài khoản sau nhiều lần thất bại liên tiếp. Trên các hệ thống hiện đại như Ubuntu 22.04 hoặc AlmaLinux 9, bạn sẽ sửa đổi stack auth trong /etc/pam.d/common-auth hoặc system-auth.
# Khóa tài khoản sau 5 lần thử thất bại trong 15 phút
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=900
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900
account required pam_faillock.so
Trong ví dụ này, unlock_time=900 đảm bảo thời gian chờ là 15 phút. Thay đổi đơn giản này giúp loại bỏ hiệu quả lợi ích kinh tế của hầu hết các cuộc tấn công brute-force tự động.
2. Thực thi giờ làm việc với pam_time
Nếu bạn quản lý một máy trạm nhạy cảm chỉ nên được truy cập trong giờ hành chính, pam_time.so là công cụ tốt nhất cho bạn. Đầu tiên, thêm mô-đun vào /etc/pam.d/login:
account required pam_time.so
Tiếp theo, xác định các ràng buộc của bạn trong /etc/security/time.conf:
login;*;developer;MoTuWeThFr0900-1700
Quy tắc cụ thể này giới hạn người dùng “developer” chỉ được đăng nhập vào các ngày trong tuần từ 9:00 sáng đến 5:00 chiều. Bất kỳ nỗ lực nào ngoài khung giờ này sẽ bị nhóm quản lý tài khoản từ chối.
An toàn là trên hết: Tránh bị khóa khỏi hệ thống
Sửa đổi PAM là một công việc đầy rủi ro. Nếu bạn làm hỏng common-auth, bạn có thể mất khả năng sử dụng sudo, khiến bạn không thể sửa chính tệp mà bạn đã làm hỏng. Đây là cách để giữ an toàn.
Quy tắc phiên hoạt động
Đừng bao giờ đóng cửa sổ SSH hiện tại khi đang chỉnh sửa các tệp PAM. Trước khi lưu, hãy mở một terminal riêng biệt và thử đăng nhập bằng một người dùng khác hoặc chạy sudo -v. Nếu các thay đổi của bạn làm hỏng hệ thống, phiên làm việc ban đầu của bạn vẫn đang mở với quyền root, cho phép bạn khôi phục tệp ngay lập tức. Tôi đã từng mất hàng giờ trong bảng điều khiển phục hồi (recovery console) vì bỏ qua điều này—đừng mắc sai lầm đó.
Mô phỏng với pamtester
Bạn không cần phải đoán xem các quy tắc của mình có hoạt động hay không. Hãy cài đặt tiện ích pamtester để mô phỏng các nỗ lực đăng nhập một cách an toàn. Ví dụ:
pamtester sshd web-admin authenticate
Lệnh này kiểm tra xem người dùng “web-admin” có thể vượt qua stack xác thực SSH hay không mà không cần thực hiện chu kỳ đăng xuất-đăng nhập thực tế.
Theo dõi log trong thời gian thực
Các lỗi PAM được ghi lại chi tiết. Hãy mở một cửa sổ thứ hai chạy tail -f trên các tệp log bảo mật của bạn trong khi kiểm tra. Trên Debian/Ubuntu, hãy sử dụng /var/log/auth.log; trên các hệ thống dựa trên RHEL, hãy kiểm tra /var/log/secure. Các bản ghi này sẽ cho bạn biết chính xác mô-đun nào đang từ chối truy cập, biến một trò chơi phỏng đoán thành một lần sửa lỗi trong 30 giây.
Tóm tắt
PAM cung cấp một cách linh hoạt, thống nhất để quản lý bảo mật trên toàn bộ môi trường Linux của bạn. Bằng cách làm chủ bốn nhóm quản lý và hiểu cách các cờ điều khiển xếp chồng lên nhau, bạn có thể triển khai bảo mật cấp doanh nghiệp như MFA và truy cập theo thời gian. Chỉ cần nhớ: luôn mở một terminal dự phòng và để các bản log dẫn đường cho việc khắc phục lỗi của bạn.

