Cấu hình và sử dụng PAM trong Linux Image Cấu hình và sử dụng PAM trong Linux

Bài viết này sẽ giới thiệu với các bạn về cách cấu hình và sử dụng PAM trên hệ điều hành Linux. Từ đây giúp chúng ta học Linux một cách dể dàng hơn.

1. Giới thiệu PAM

Linux PAM là gọi tắt của Pluggable Authentication Modules được hổ trợ cung cấp để xác thực động cho các ứng dụng và dịch vụ trên hệ điều hành Linux. Đây là một cơ chế xác thực thông qua PAM thay vì hỏi người dùng user và password. PAM chịu trách nhiệm xác thực các tệp đang được chạy. Điều này cho phép các nhà phát triển viết các ứng dụng yêu cầu xác thực độc lập với xác thực hệ thống.

Pam Module Interfaces:

  • Auth: Là module chịu trách nhiệm cho mục đích xác thực. Nó xác minh mật khẩu.
  • Account: Sau khi người dùng đã xác thực bằng thông tin chính xác, phần account sẽ kiểm tra tính hợp lệ của tài khoản như hạn chế đăng nhập hoặc thời gian đăng nhập,...
  • Password: Được sử dụng để thay đổi mật khẩu.
  • Session: Quản lý các session, chứa tài khoản hoạt động của người dùng, tạo hộp thư, tạo thư mục chính của người dùng,...

Lưu ý: PAM có khả năng thay đổi tính bảo mật của hệ thống Linux. Nếu chúng ta cấu hình sai lệch có thể vô hiệu hóa quyền truy cập vào hệ thống một phần hoặc hoàn toàn. Chẳng hạn, việc vô tình xóa các file cấu hình trong /etc/pam.d/*/ hoặc /etc/pam.conf có thể khóa chúng ta khỏi hệ thống.

Các bản phân phối Linux hiện đại đã hỗ trợ Linux-PAM. Trong bài viết này, chúng ta sẽ tìm hiểu cách cấu hình PAM nâng cao trong các hệ thống CentOS 8.

2. Các ví dụ về PAM trên CentOS 8

Ví dụ 1: Cách kiểm tra một chương trình là PAM-aware

Để có thể sử dụng được PAM thì một ứng dụng hoặc một chương trình cần phải được chương trình hỗ trợ PAM, nó cần được viết và biên dịch cụ thể để sử dụng PAM. Để tìm hiểu xem một chương trình có phải là chương trình hỗ trợ PAM hay không chúng ta sẽ kiểm tra xem đã được biên dịch với thư viện PAM bằng lệnh ldd:

Trong ví dụ này chúng ta kiểm tra sshd có là chương trình hỗ trợ PAM không:

[root@blogd-net-lab01 ~]# ldd /usr/sbin/sshd | grep libpam.so
	libpam.so.0 => /lib64/libpam.so.0 (0x00007f6a9daf7000)

Như chúng ta thấy trong đầu ra tồn tại tệp lipbpam.so xác nhận truy vấn.

Ví dụ 2: Cấu hình của LINUX-PAM nằm trong thư mục /etc/pam.d//etc/pam.conf. Mở terminal của hệ điều hành Linux và chúng ta có thể truy cập vào thư mục pam bằng cách gõ lệnh:

[root@blogd-net-lab01 ~]# cd /etc/pam.d/
[root@blogd-net-lab01 pam.d]# ls -l
total 88
-rw-r--r--. 1 root root 272 May 11  2019 atd
-rw-r--r--. 1 root root 192 Nov  9 06:28 chfn
-rw-r--r--. 1 root root 192 Nov  9 06:28 chsh
-rw-r--r--. 1 root root 721 Sep 13  2019 cockpit
-rw-r--r--. 1 root root 232 May 11  2019 config-util
-rw-r--r--. 1 root root 328 Nov  8 23:47 crond
...

Thực hiện xem file PAM của sshd ở ví dụ trên bằng trình soạn thảo văn bản vi:

[root@blogd-net-lab01 pam.d]# vi sshd
#%PAM-1.0
auth       substack     password-auth
auth       include      postlogin
account    required     pam_sepermit.so
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    optional     pam_motd.so
session    include      password-auth
session    include      postlogin

Cú pháp của tệp cấu hình như sau. Tệp được tạo thành từ một danh sách các quy tắc được viết trên một dòng duy nhất (chúng có thể mở rộng quy tắc bằng cách sử dụng kí tự \) và các comment được đặt sau dấu # và kéo dài đến cuối dòng.

Định dạng của mã trong PAM:

service type control-flag module module-arguments 

Trong đó:

  • service: Tên của ứng dụng hoặc dịch vụ.
  • type: Loại module type/context/interface.
  • control-flag: Cho biết nhiệm vụ của PAM-API nếu module không thành công trong việc xác thực.
  • module: Tên tệp tuyệt đối hoặc tên đường dẫn tương đối của PAM.
  • module-arguments: Danh sách mã được phân tách bằng dấu cách để kiểm soát module.

Các phần trong mã được phân tách với nhau bằng dấu Tab.

Cú pháp của mỗi tệp trong /etc/pam.d/ tương tự như cú pháp của tệp chính và được tạo thành dòng có dạng sau:

type control-flag module module-arguments

Đây là một ví dụ về định nghĩa quy tắc (không sử dụng đối số module-arguments) được tìm thấy trong tệp /etc/pam.d/sshd, không cho phép đăng nhập non-root khi /etc/nologin còn tồn tại:

account required pam_nologin.so

Ví dụ 3: Các Control Flags trong PAM bao gồm:

  • Requisite: PAM library loại bỏ quá trình xác thực khi gặp bất kỳ thông báo thất bại của module nào.
  • Require: Điều kiện cần thiết, nhưng nếu module không tải được vì bất kỳ lý do gì, nó tiếp tục tải các module khác và trả về thất bại khi kết thúc thực thi.
  • Sufficient: Nếu module trả về thành công, thì việc xử lý các module khác không còn cần thiết nữa.
  • Optional: module này được thực hiện thành công hay thất bại cũng không quan trọng, không ảnh hưởng quá trình xác thực.

Ví dụ 4: Các Management Groups trong PAM gồm:

  • Auth Group: Dùng để xác thực người dùng.
  • Account Group: Kiểm soát quyền truy cập vào dịch vụ như số lần bạn nên sử dụng dịch vụ này.
  • Session Group: Chịu trách nhiệm quản lí session group.
  • Password Group: Sử dụng khi thay đổi password.

Ví dụ 5: Giới thiệu về module order:

Thứ tự rất quan trọng trong PAM linux vì mỗi module sẽ phụ thuộc vào module trước đó trên ngăn xếp.

Chúng ta thử cấu hình đăng nhập như sau:

auth required pam_unix.so

auth optional pam_deny.so

Thứ tự như bên trên thì nó sẽ hoạt động chính xác, nhưng nó sẽ không hoạt động nếu chúng ta thay đổi thứ tự như thế này:

auth optional pam_deny.so

auth required pam_unix.so

Không ai có thể đăng nhập vào hệ thống, vì vậy thứ tự trong PAM rất quan trọng.

Ví dụ 6: Tìm hiểu về các PAM Modules trên Linux

Trong hệ thống của chúng ta thì các PAM Modules được tích hợp sẵn, vì vậy chúng ta có thể sử dụng chúng một cách hoàn hảo.

pam_succeed_if Module

Module này cho phép truy cập cho các nhóm được chỉ định. Chúng ta có thể xác thực tài khoản người dùng như bên dưới:

auth required pam_succeed_if.so gid=1000,2000

Dòng bên trên dùng để thiết lập chỉ những người dùng trong nhóm có ID 1000 hoặc 2000 mới được phép đăng nhập.

Chúng ta cũng có thể sử dụng uid thay thế id người dùng.

auth requisite pam_succeed_if.so uid >= 1000

Trong ví dụ trên thì id người dùng nào lớn hơn hoặc bằng 1000 đều có thể đăng nhập.

Chúng ta cũng có thể kết hợp pam_succeed_if cùng với tham số ingroup như sau:

auth required pam_succeed_if.so user ingroup blogdgroup

Chỉ những người dùng có trong nhóm blogdgroup mới có thể đăng nhập.

pam_nologin Module

Module này chỉ cho phép user root để đăng nhập:

auth required pam_nologin.so

Chúng ta có thể sửa đổi tệp đăng nhập với dòng này và tạo tệp /etc/nologin, để cho mỗi user root có thể đăng nhập. Module này được sử dụng với auth nhóm quản lý tài khoản.

pam_access Module

Module này hoạt động giống như pam_succeed_if module ngoại trừ pam_access module kiểm tra việc ghi nhật ký từ các máy chủ được nối mạng, trong khi pam_succeed_if module thì có có kiểm tra:

account required pam_access.so accessfile=/etc/security/access.conf

Chúng ta có thể thiết lập quy tắc bằng trình soạn thảo vi tại:

[root@blogd-net-lab01 ~]# vi /etc/security/access.conf

Chỉnh sửa tập tin như sau:

+:blogdgroup
-:ALL:ALL

Các thiết lập trên chỉ cho những user thuộc blogdgroup mới được phép đăng nhập.

Trong đó:

  • +: Cho phép đăng nhập.
  • -: Không cho phép đăng nhập.

Module này được sử dụng với các group để quản lý auth, account, session, and password.

pam_deny Module

Module này được dùng để hạn chế quyền truy cập. Nó sẽ luôn trả về non-OK. Chúng ta có thể sử dụng nó ở cuối để bảo vệ tài khoản của chúng ta khỏi mọi cấu hình sai. Nếu chúng ta sử dụng nó ở đầu ngăn xếp, dịch vụ của chúng ra sẽ bị tắt:

auth required pam_deny.so

auth required pam_unix.so

Module này được sử dụng với các group để quản lý auth, account, session, and password.

pam_unix Module

Module này được sử dụng để kiểm tra thông tin đăng nhập của người dùng đối với file /etc/shadow.

auth required pam_unix.so

Module này sử dụng trong nhiều dịch vụ trên hệ thống của chúng ta. Sử dụng với các nhóm quản lý auth, session, password.

pam_localuser Module

Module này dùng để kiểm tra xem user có được liệt kê trong /etc/shadow

account sufficient pam_localuser.so

pam_mysql Module

Thay vì kiểm tra thông tin đăng nhập của người dùng dựa trên /etc/shadow chúng ta có thể sử dụng cơ sở dữ liệu MySQL làm phụ trợ bằng pam_mysql Module.

Nó có dạng như sau:

auth sufficient pam_mysql.so user=blogduser passwd=mypassword host=localhost db=mydb table=users usercolumn=username passwdcolumn=password

Các tham số cho pam_mysql sử dụng để xác thực người dùng.

Chúng ta có thể cài đặt nếu mysql không có trên hệ thống của chúng ta như bên dưới:

yum install libpam-mysql

pam_cracklib Module

Module này đảm bảo rằng chúng ta sẽ sử dụng mật khẩu mạnh.

password required pam_cracklib.so retry=4 minlen=12 difok=6

Các thông số trên có ý nghĩa như sau:

  • Độ dài mật khẩu tối thiểu = 12
  • Bốn lần để chọn một mật khẩu mạnh, nếu không nó sẽ thoát.
  • Mật khẩu mới của chúng ta phải có 6 ký tự mới từ mật khẩu cũ.

pam_rootok Module

Module này dùng để kiểm tra xem ID người dùng bằng 0 có nghĩa là chỉ người dùng root mới có thể chạy dịch vụ này.

auth sufficient   pam_rootok.so

pam_limits Module

Module được sử dụng để đặt giới hạn cho tài nguyên hệ thống, user root cũng bị ảnh hưởng bởi các giới hạn này.

Các cấu hình giới hạn là trong:

[root@blogd-net-lab01 ~]# vi /etc/security/limits.conf

Có dạng như sau:

session  required  pam_limits.so

Chúng ta có thể sử dụng để bảo vệ tài nguyên hệ thống.

Các giới hạn trong tệp /etc/security/limits.conf có thể hard hoặc mềm.

  • Hard: Người dùng không thể thay đổi giá trị của nó, nhưng root có thể.

  • Soft: Người dùng bình thường có thể thay đổi nó.

Các giới hạn có thể là fsize, cpu, nproc, nproc, data và nhiều giới hạn khác.

Ví dụ:

@blogdgroup        hard    nproc           50

blogduser          hard    cpu           5000

Giới hạn đầu tiên cho các thành viên nhóm blogdgroup là đặt số lượng quy trình cho mỗi user là 50. Giới hạn thứ hai cho người dùng có tên blogduser, giới hạn thời gian CPU là 5000 phút.

Ví dụ 7: Cách hạn chế quyền truy cập root vào dịch vụ SSH qua PAM

Chúng ta sẽ định cấu hình bằng cách sử dụng PAM để vô hiệu hóa quyền truy cập của người dùng root vào hệ thống thông qua SSH và các chương trình đăng nhập. Chúng ta có thể sử dụng module /lib/security/pam_listfile.so để giới hạn các đặc quyền của các tài khoản cụ thể. Mở và chỉnh sửa tệp cho dịch vụ trong thư mục /etc/pam.d/ như sau:

[root@blogd-net-lab01 ~]# vi /etc/pam.d/sshd

Hoặc

[root@blogd-net-lab01 ~]# vi /etc/pam.d/login

Thêm quy tắc này vào trong file:

auth    required       pam_listfile.so \
        onerr=succeed  item=user  sense=deny  file=/etc/ssh/deniedusers

Trong đó:

  • auth: Là loại module.
  • required: Điều kiện cần thiết, nhưng nếu module không tải được vì bất kỳ lý do gì, nó tiếp tục tải các module khác và trả về thất bại khi kết thúc thực thi.
  • pam_listfile.so: Module cung cấp cách từ chối hoặc cho phép các dịch vụ dựa trên một tệp tùy ý.
  • onerr=succeed: Đối số Module.
  • item = user: Đối số module chỉ định nội dung được liệt kê trong tệp và cần được kiểm tra.
  • sense=deny: Đối số module chỉ định hành động sẽ thực hiện nếu được tìm thấy trong tệp.
  • file=/etc/ssh/deniedusers: Đối số module chỉ định tệp chứa một item trên mỗi dòng.

Tiếp theo, chúng ta cần tạo tập tin /etc/ssh/deniedusers và thêm user root vào:

[root@blogd-net-lab01 ~]# vim /etc/ssh/deniedusers

Lưu các thay đổi và đóng tệp, sau đó đặt các quyền cần thiết trên đó:

[root@blogd-net-lab01 ~]# chmod 600 /etc/ssh/deniedusers

Các quy tắc trên sẽ yêu cầu PAM tham khảo tệp /etc/ssh/deniedusers và từ chối quyền truy cập vào SSH và các dịch vụ đăng nhập cho bất kỳ người dùng được liệt kê trong file này.

Ví dụ 8: Để biết thêm thông tin, chúng ta thực hiện kiểm tra trang man pam.d :

[root@blogd-net-lab01 ~]# man pam.d
PAM.CONF(5)                                           Linux-PAM Manual                                          PAM.CONF(5)

NAME
       pam.conf, pam.d - PAM configuration files

DESCRIPTION
       When a PAM aware privilege granting application is started, it activates its attachment to the PAM-API. This
       activation performs a number of tasks, the most important being the reading of the configuration file(s):
       /etc/pam.conf. Alternatively, this may be the contents of the /etc/pam.d/ directory. The presence of this directory
       will cause Linux-PAM to ignore /etc/pam.conf.
...

Cuối cùng, chúng ta có thể tìm thấy module toàn diện về cú pháp tệp cấu hình và tất cả các Module PAM trong tài liệu dành cho Linux-PAM.

Chúng ta có thể chỉnh sửa bất kỳ tệp dịch vụ PAM nào trong /etc/pam.d/ và sử dụng các Module chúng ta muốn bảo vệ dịch vụ của chúng ta theo cách chúng ta muốn.

3. Lời kết

Qua bài trên, giúp cho chúng ta cách cấu hình và sử dụng PAM trên hệ điều hành Linux. Từ đây giúp chúng ta có thể tạo các module để bảo vệ các dịch vụ của chúng ta khi chúng ta cần thiết lập.