Bạn có biết, trong Linux chúng ta có thể tăng cường bảo mật máy chủ mà không cần viết thêm bất kỳ dòng code nào không? Thực tế là nếu bạn không dùng PAM cũng không sao cả, SSH service của bạn vẫn hoạt động bình thường…OK..
Nhưng vấn đề trong bảo mật là…
❌ Bất kỳ user nào có thông tin đăng nhập hợp lệ đều có thể SSH vào server.
❌ User có thể SSH vào lúc 2 giờ sáng.
❌ Một tài khoản có thể mở hàng chục SSH session cùng lúc.
Và nhiều System Admin nghĩ rằng:
👉 “Firewall là đủ rồi.”
Có một số điều chúng ta cần nhớ trong môi trường doanh nghiệp, việc kiểm soát:
• Ai được quyền SSH vào server
• Được đăng nhập vào server vào khoảng thời gian nào
• Được phép mở bao nhiêu session cho SSH User
thường quan trọng không kém việc mở hay đóng port 22.
Điều thú vị là… Hầu hết các cơ chế này đã có sẵn trong Linux từ rất lâu. Tuy nhiên rất nhiều người chưa bao giờ sử dụng chúng. Đơn giản chỉ cần áp dụng PAM (Pluggable Authentication Modules), bạn có thể:
✅ Giới hạn số lượng SSH login của user
✅ Chỉ cho phép đăng nhập vào server trong giờ hành chính
✅ Tạo danh sách user được phép SSH vào server
✅ Tăng cường bảo mật SSH theo cách mà nhiều doanh nghiệp đang áp dụng
Tất cả những thiết lập trên đều có thể thực hiện dễ dàng bằng PAM và các file cấu hình liên quan. Trong bài viết này, mình sẽ hướng dẫn chi tiết từng bước để thực hiện các chính sách bảo mật này trên Linux Server.
Contents
Thư mục cấu hình PAM
Đầu tiên, chúng ta cần biết các file cấu hình PAM nằm ở đâu. Mặc định, toàn bộ cấu hình PAM được lưu trong thư mục /etc/pam.d. Hãy mở terminal và chạy:
cd /etc/pam.d
ls
Bạn sẽ thấy rất nhiều file cấu hình tương ứng với các dịch vụ hệ thống, ví dụ như sshd, login, su, sudo… Bên cạnh đó còn có các file cấu hình dùng chung như common-auth, common-account, common-session. Khi một người dùng cố gắng đăng nhập hoặc truy cập một dịch vụ, PAM sẽ đọc những file này để quyết định cấp quyền hay từ chối. Ở đây chúng ta tập trung vào dịch vụ SSH (sshd) vì đây là cách phổ biến để quản lý server Linux.

Giới hạn số phiên SSH
Giả sử chúng ta muốn một user chỉ được phép có tối đa một phiên SSH đang hoạt động cùng lúc. Để làm điều đó, chúng ta dùng mô-đun pam_limits.so. Đầu tiên, mở file cấu hình PAM cho SSH với lệnh sau:
sudo vim /etc/pam.d/sshd
Trong file này, bạn sẽ thấy rằng pam_limits.so đã được load sẵn (thường là có một dòng như session required pam_limits.so). Nghĩa là chúng ta có thể dùng các giới hạn tài nguyên. Và việc tiếp theo là mở file /etc/security/limits.conf để thiết lập giới hạn SSH login:
sudo vim /etc/security/limits.conf
Cuối file, thêm dòng sau (với joe là tên user):
joe - maxlogins 1
Dòng này có nghĩa: người dùng joe chỉ được tối đa 1 lần đăng nhập đồng thời vào server. Sau khi lưu lại, thiết lập này sẽ có hiệu lực ngay lập tức mà không cần phải khởi động lại dịch vụ SSH hay reboot máy chủ .

Để kiểm tra, bạn có thể chạy lệnh who trên terminal hiện tại sẽ thấy đã có một phiên đăng nhập của user joe. Bây giờ mở một cửa sổ terminal khác và thử SSH vào server:
ssh joe@192.168.114.4
Sau khi nhập mật khẩu, phiên SSH thứ hai sẽ ngay lập tức bị từ chối với thông báo lỗi “Too many logins” (hoặc tương tự). Điều này là đúng vì mỗi phiên SSH được tính bằng một lần đăng nhập; khi vượt quá maxlogins, SSH sẽ tự động ngắt kết nối. Quy tắc maxlogins được định nghĩa trong PAM như là số đăng nhập tối đa cho một user, và không áp dụng cho user root. Như vậy, với thiết lập này, user thường sẽ không thể mở hơn một phiên SSH cùng một lúc trên server.

Nếu muốn gỡ giới hạn này để tiếp tục kiểm thử, bạn chỉ cần xóa hoặc comment dòng
joe - maxlogins 1 trong file /etc/security/limits.conf. Sau đó lưu lại, và bây giờ thử đăng nhập SSH lại từ cửa sổ terminal khác sẽ thấy đăng nhập được ngay. Như đã nói, PAM thực hiện thay đổi ngay lập tức mà không cần phải khởi động lại bất cứ dịch vụ gì.
Giới hạn SSH theo khung giờ
Tiếp theo, hãy đặt trường hợp công ty bạn có quy tắc bảo mật là chỉ cho phép truy cập server trong giờ hành chính (ví dụ Thứ Hai–Thứ Sáu, 8h–18h). Để thực hiện, chúng ta dùng mô-đun pam_time.so. Mô-đun này không xác thực người dùng mà chỉ có tác dụng giới hạn truy cập theo thời gian trong ngày, ngày trong tuần và dịch vụ đang truy cập.
Để thực hiện các việc trên đầu tiên, mở file cấu hình PAM của SSH:
sudo vim /etc/pam.d/sshd
Trong phần account, thêm dòng sau:
account required pam_time.so
Dòng này sẽ kích hoạt việc kiểm tra thời gian user đăng nhập qua file /etc/security/time.conf (hoặc file thay thế nếu dùng tùy chọn conffile).

Và tiếp theo chúng ta cần mở file cấu hình thời gian cho SSH user:
sudo vim /etc/security/time.conf
Trong file này, mỗi quy tắc có dạng dịch vụ;ttys;người_dùng;thời_gian. Ví dụ thêm dòng:
sshd;*;joe;Wk0800-1800
Giải thích quy tắc trên: sshd là dịch vụ SSH, * áp dụng cho mọi terminal, joe là tên user, và Wk0800-1800 nghĩa là từ Thứ Hai đến Thứ Sáu (Weekday) từ 08:00 đến 18:00. Như vậy, user joe chỉ được phép đăng nhập SSH vào khung giờ 8h–18h các ngày trong tuần. Lưu file lại, và thử đăng nhập SSH ngoài khung giờ đó: bạn sẽ thấy ngay lập tức kết nối bị ngắt sau khi nhập mật khẩu. PAM sẽ tự động từ chối login của user joe vì “ngoài khung giờ được phép” và cũng không cần khởi động lại dịch vụ gì.
Cú pháp cơ bản của quy tắc pam_time: dịch vụ; thiết bị; người dùng; thời gian. Bạn có thể kết hợp nhiều điều kiện (ví dụ để chỉ các ngày Thứ Hai/Thứ Tư/Thứ Sáu thì viết MoWeFr hoặc MOWedsFr tùy hệ thống); hoặc sử dụng Wk cho tất cả ngày trong tuần, Wd cho thứ 7–CN (weekend). Trong ví dụ trên, "Wk0800-1800" có nghĩa là các ngày trong tuần từ 8 giờ sáng đến 6 giờ chiều.
Cho phép chỉ một số người dùng mới có thể SSH vào Server
Cuối cùng, giả sử bạn muốn hạn chế danh sách người được SSH. Ví dụ công ty hoặc dự án chỉ cho phép 1–2 người mới được phép SSH vào Server, còn lại các users khác đều bị từ chối. Chúng ta sẽ dùng mô-đun pam_listfile.so. Với mô-đun này, bạn có thể định nghĩa một file danh sách, ví dụ /etc/ssh/ssh.allow, liệt kê tên các user được “allow” (cho phép) hoặc ngược lại.
Mở file /etc/pam.d/sshd và thêm dòng (thường ở phần auth):
auth required pam_listfile.so item=user sense=allow file=/etc/ssh/ssh.allow
Giải thích: item=user nghĩa chúng ta kiểm tra theo user, sense=allow nghĩa là chỉ cho phép những user có tên trong file ssl.allow được truy cập SSH vào Server.

Tiếp theo, tạo file /etc/ssh/ssh.allow:
sudo vim /etc/ssh/ssh.allow
Và thêm vào nội dung (nhơ là mỗi user một dòng):
joe
Lưu lại nội dung file. Quy tắc trên giờ đây có hiệu lực: chỉ user joe trong file /etc/ssh/ssh.allow mới được SSH vào server. Theo tài liệu, “với cấu hình này, chỉ những user được liệt kê trong file ACL mới được phép truy cập”. Các user khác sẽ bị từ chối SSH vào server.
Để kiểm chứng, hãy thử đăng nhập SSH bằng một user khác (ví dụ phuongho). Bạn sẽ thấy ngay sau khi nhập mật khẩu, truy cập sẽ bị từ chối.

Để cho phuongho cũng được phép, chỉ cần thêm phuongho vào file /etc/ssh/ssh.allow, mỗi user trên một dòng. Sau khi lưu file này, hãy thử SSH lại, và lần này phuongho sẽ đăng nhập thành công. Như vậy chúng ta đã có thể xây dựng thành công một danh sách cho phép SSH là rất đơn giản với PAM và với một file văn bản.
Tóm tắt
Trong bài viết, chúng ta đã khám phá một số cách thực tế để tăng cường bảo mật SSH trên Linux bằng PAM:
- Giới hạn số phiên SSH: Dùng
pam_limits.sovớimaxloginstrong/etc/security/limits.confđể quy định số phiên đăng nhập tối đa cho mỗi user. Mỗi kết nối SSH được tính là một đăng nhập; vượt quá thì SSH sẽ từ chối SSH Login ngay. - Giới hạn giờ đăng nhập SSH: Dùng
pam_time.sovà file/etc/security/time.confđể chỉ cho phép user đăng nhập trong các khung giờ/ngày cho trước. - Cho phép chỉ những user xác định trong danh sách mới có thể SSH: dùng
pam_listfile.sovà file cho phép/etc/ssh/ssh.allowđể lọc user. Chỉ những tên xuất hiện trong file danh sách cho phép SSH mới được SSH vào server.
Tất cả những thiết lập này đều áp dụng ngay lập tức mà không cần phải khởi động lại dịch vụ SSH hay reboot máy chủ. Đây là những kỹ thuật thực tiễn, phổ biến trong quản trị hệ thống doanh nghiệp, giúp bảo vệ server trước các truy cập trái phép bằng cách tận dụng chính các cơ chế có sẵn của Linux.
Nếu bạn thấy bài viết hữu ích, hãy Like và Chia sẻ để ủng hộ nhé! Đừng quên Đăng ký (Subscribe) kênh youtube của mình hoặc theo dõi blog của mình để cập nhật thêm nhiều bài viết hướng dẫn Linux, DevOps khác. Nếu bạn có câu hỏi hoặc muốn mình làm các video/bài viết nâng cao hơn về bảo mật Linux và SSH, hãy để lại bình luận với từ khóa “PAM” bên dưới nhé. Cảm ơn các bạn đã theo dõi blog và hẹn gặp lại với bài viết mới!
Hashtags: #Linux #PAM #SSH #DevOps #BảoMật #QuảnTrịHệThống


