PAM 介紹 PAM全稱叫作Pluggable Authentication Modules,譯為可插拔驗證模塊。1995年起源於sun公司,PAM是一個框架,通過PAM框架提供的介面,應用程式可以不關心基層具體的實現過程,直接調用介面實現身份驗證功能。PAM還有一個功能就是在用戶空間就是先對用戶的 ...
PAM 介紹
PAM全稱叫作Pluggable Authentication Modules,譯為可插拔驗證模塊。1995年起源於sun公司,PAM是一個框架,通過PAM框架提供的介面,應用程式可以不關心基層具體的實現過程,直接調用介面實現身份驗證功能。PAM還有一個功能就是在用戶空間就是先對用戶的資源進行限制。
PAM不是Linux內核的一個模塊,而是一個許多Linux發行版系統的標準組件,使用這個組件為系統和應用程式提供身份驗證的框架。
PAM由三部分組成,模塊、庫和配置文件。通過編寫配置文件調用指定的庫和模塊,實現為特定的應用程式或服務實現身份驗證管理以及資源限制的功能。
一般情況下,庫文件、模塊文件和配置文件的存放路徑如下:
-
庫文件和模塊文件:/lib/security 或 /lib64/security 目錄中(ubuntu2004中,是放在/usr/lib/x86_64-linux-gnu/security)
-
配置文件:主配置文件是:/etc/pam.conf 子配置文件時:/etc/pam.d/
例如:
在ubuntu2004中,pam的庫和模塊文件在:/usr/lib/x86_64-linux-gnu/security下
PAM 有一個主配置文件 /etc/pam.conf,這個文件使用得不多;更常見的是每個服務或程式都有其自己的配置文件,這些文件位於 /etc/pam.d/ 目錄中。
身份驗證管理
(1)創建配置文件
要使用PAM模塊來實現對應用程式的身份驗證進行管理,需要在/etc/pam.d/目錄中創建一個和程式同名的配置文件
一般情況下也不上去創建什麼配置文件,首先程式得支持pam,常見對應得文件才會生效。對於一些簡單的使用,會修改pam自帶的一些配置文件進行相關身份驗證管理就行了。
例如:SSH服務的PAM配置文件是/etc/pam.d/sshd
(2)編輯配置
PAM的配置文件格式是:
操作類型 控制標誌 模塊名稱 模塊參數
操作類型:
表明定義的這條PAM規則是用來做什麼的。
-
auth: 驗證用戶身份。
-
account: 驗證用戶是否有權進行所請求的操作
-
password: 密碼管理
-
session: 設置用戶登錄前後的會話環境
控制的標誌:
描述了當關聯的模塊執行失敗時應如何處理。
-
required: 該模塊必須執行成功。如果失敗,用戶不會立即得知,但最終的認證會失敗
-
requisite: 如果該模塊失敗,立即返回並告訴用戶認證失敗
-
sufficient: 如果該模塊成功,那麼整體認證可以被認為是成功的(除非之前有 required 模塊失敗)
-
optional: 這個模塊的執行結果不是必需的,除非它是唯一的模塊
常用模塊:
PAM的模塊很多,一般常用的就這些。
-
pam_unix.so :處理 UNIX 風格的用戶密碼驗證和更新策略
-
pam_pwquality.so : 這個模塊定義了密碼複雜度的要求。通過它,管理員可以設置密碼的長度、字元類型、舊密碼的記憶等多種策略。
-
pam_tally2.so :定義登錄失敗次數的跟蹤功能、用戶鎖定功能
-
pam_limits.so :在用戶級別實現對其可使用的資源的限制
用戶密碼策略管理
如果要設置用戶密碼的最小長度是8,每90天改一次密碼,一天最多修改一次密碼。這個時候就需要使用 pam_unix.so 庫,通過這個庫可以處理密碼驗證相關的操作。
(1)編輯 /etc/login.defs
這個配置文件為Linux系統中的用戶賬戶管理定義了一系列預設參數。這些參數主要涉及用戶登錄、賬戶行為、密碼策略等。
雖然/etc/login.defs 與 PAM 有關聯,但它是一個獨立的配置文件,不是由PAM直接管理的,所以不遵循PAM的配置文件格式。
但 /etc/login.defs 才是負責提供了某些預設的策略設置,而pam_unix.so 是實際執行身份驗證的模塊
(1)修改配置文件
將配置文件中的以下變數進行修改,即可實現用戶密碼管理
sudo vim /etc/login.defs
# 密碼有效期
PASS_MAX_DAYS 90
# 多久可以改一次密碼 0表示不限制
PASS_MIN_DAYS 1
# 密碼的最小長度
PASS_MIN_LEN 8
# 密碼過期之前多少天開始警告用戶
PASS_WARN_AGE 28
密碼複雜度配置
如果我想設置密碼最小長度是8為,必須包含兩個大寫字母,一個小寫字母,四個數字和一個其它符號。可以通過 pam_pwquality.so模塊實現,在配置文件中找到和pam_pwquality.so模塊相關的行,併在該行中指定參數即可實現。
(1)編輯配置文件
這個配置文件根據Linux發行版的不同可能所有不同,在Red Hat系列中,配置文件是:/etc/pam.d/system-auth。在debian系列中,配置文件是:/etc/pam.d/common-password
(2)修改配置文件的值
sudo vim /etc/pam.d/common-password
password requisite pam_pwquality.so retry=3 minlen=8 ucredit=-2 lcredit=-1 dcredit=-4 ocredit=-1
說明:
-
minlen=8: 密碼的最小長度應為8個字元
-
ucredit=-2: 密碼中必須至少包含2個大寫字母
-
lcredit=-1: 密碼中必須至少包含1個小寫字母
-
dcredit=-4: 密碼中必須至少包含4個數字
-
ocredit=-1: 密碼中必須至少包含1個其他的符號(例如,標點符號)
登錄限制配置
如果我想配置限制非法登錄次數為10次,10次後鎖定普通賬號及ROOT賬號10分鐘,可以通過調用pam_tally2.so模塊實現,因為當用戶嘗試通過命令行界面登錄系統時,login程式會使用這個文件中定義的PAM模塊來處理認證、賬戶管理、會話管理以及密碼管理。
(1)編輯配置文件
登錄限制相關的配置是編輯/etc/pam.d/login文件
sudo vim /etc/pam.d/login
(2)修改配置文件
找到 pam_tally2.so 所在行,然後添加相關參數,如果沒有就加一行。
auth required pam_tally2.so deny=10 onerr=fail even_deny_root unlock_time=600 root_unlock_time=600
空閑退出終端
如果想設置空閑指定時間自動退出終端,可以使用shell的 TMOUT這個環境變數實現。預設這個變數是0,即表示不限制,如果設置為非0,空閑了指定時間就會退出shell終端。
一般做法是將這個環境變數定義在 /etc/profile 這個shell腳本中實現持久化生效。
sudo vim /etc/profile
export TMOUT=300
用戶資源管理
在用戶空間對用戶的資源使用進行限制,這是pam的兩大基礎功能之一。具體實現就是通過pam_limits.so 模塊實現的,但是有一點不同的是,這個模塊是單獨設計了配置文件,是通過/etc/security/limits.conf(或 /etc/security/limits.d/ 目錄下的文件)定義相關規則,後臺調用pam_limits.so 模塊實現。
所以/etc/security/limits.conf配置文件的風格和PAM的標準風格是不一樣的。具體格式就是:
要對誰進行限制 限制的類型(通常是 soft 或 hard) 限制的資源類型 資源的限制值
限制類型說明:
常用的限制是軟限制和硬限制,軟限制是超過了資源限制值,只會警告你,不會拒絕你。而限制則是,超過資源限制值,直接拒絕你的操作。
資源類型說明:
資源類型常用的有兩種,用戶打開文件數量和用戶可以擁有的最大進程數量,在一些高併發的場景下,預設的值(1024)可能不滿足需求。
-
nofile:(number of file)描述用戶打開文件的數量
-
nproc:(number of process)描述用戶可以擁有的最大進程數量
例如:
* hard nofile 2048
表示對所有用戶(*)進行強制限制,限制用戶最為可以打開的文件數量(nofile:number of files)為2048個
ulimit 命令
如果想查看當前用戶在當前的 shell 會話中的一些資源限制,可以使用ulimit的 -a 參數來查看,如果想臨時修改的話,通過 ulimit 對應參數 對應參數值 這種方式修改即可。
查看當前用戶在當前shell中的資源限制:
ulimit -a
AppArmor 介紹
AppArmor是Linux的一個內核安全模塊,它是 基於路徑來限製程序能夠訪問的資源,從而增強系統的安全性。大多數情況下,在 Ubuntu 和 openSUSE 等發行版中預設啟用了AppArmor模塊,Red Hat系列的發行版預設啟動的是SELinux模塊。
AppArmor一般是用在 特定路徑下隔離應用程式的環境,例如可以限制一個進程只能訪問必要的文件和目錄,此時該進程不會被允許訪問系統上的任何其他文件或目錄。
AppArmor有兩種工作模式:
enforce(強制)模式和complain(投訴)模式,強制模式下不符合策略的操作會被拒絕。而投訴模式下不會組織不符合策略的操作,只會記錄到日誌。
AppArmor規則策略文件:
AppArmor為進程定義的策略規則是存放在 /etc/apparmor.d/ 目錄中,策略規則文件命名方式按照 進程所在的絕對路徑命名(需要把/換為.)
例如:
為 /usr/sbin/named 定義的 AppArmor 策略文件將命名為 usr.sbin.named。因為named進程的路徑是:/usr/sbin/named
AppArmor 策略文件也是特別簡單的,只需要在配置文件裡面加入相關文件路徑,然後指定許可權。策略生效後進程就只能按照定義的策略隊則許可權去訪問一個文件了,給指定進程加了策略後,
配置文件格式如下:
進程的絕對路徑 flags=(attach_disconnected) {
文件絕對路徑 運行操作的許可權,
}
-
r:代表讀取許可權
-
w:代表寫入許可權
-
k:允許指定進程鎖定文件
-
l:代錶鏈接許可權
-
m:代表執行許可權,並將文件作為共用對象載入
例如:
給某個進程A編寫一個策略文件,策略規則是只能以讀許可權訪問B文件,那麼除了B文件他有讀許可權,其它目錄相對於這個進程來說,什麼操作許可權都沒有。
/path/A flags=(attach_disconnected) {
/path/to/file/B r, # 允許進程只讀訪問文件A
}
管理工具
AppAemor提供了很多工具來對策略進行管理
aa-status
aa-status是用於顯示當前系統上運行的AppArmor策略狀態,直接在命令行輸入這個命令就可以顯示相關信息
ehigh@ubuntu:~$ sudo aa-status
# 表示載入了25個策略配置文件
25 profiles are loaded.
# 25個策略配置文件用的都是enfoce模式
25 profiles are in enforce mode.
# 有25個策略文件處於強制模式,並且列出對應的進程路徑
/usr/bin/evince
/usr/bin/evince-previewer
/usr/bin/evince-previewer//sanitized_helper
/usr/bin/evince-thumbnailer
/usr/bin/evince//sanitized_helper
/usr/bin/man
/usr/lib/NetworkManager/nm-dhcp-client.action
/usr/lib/NetworkManager/nm-dhcp-helper
/usr/lib/connman/scripts/dhclient-script
/usr/lib/cups/backend/cups-pdf
/usr/sbin/cups-browsed
/usr/sbin/cupsd
/usr/sbin/cupsd//third_party
/usr/sbin/mysqld
/usr/sbin/named
/usr/sbin/ntpd
/usr/sbin/tcpdump
/{,usr/}sbin/dhclient
docker-default
ippusbxd
lsb_release
man_filter
man_groff
nvidia_modprobe
nvidia_modprobe//kmod
# 0個策略配置用的complain模式
0 profiles are in complain mode.
# 系統上有5個正在運行的進程有定義的AppArmor策略
5 processes have profiles defined.
# 這5個有定義的AppArmor策略的進程都處於強制模式。然後列出了這些進程及其ID,
5 processes are in enforce mode.
/usr/sbin/cups-browsed (2804193)
/usr/sbin/cupsd (2804192)
/usr/sbin/mysqld (2560)
/usr/sbin/named (493443)
/usr/sbin/ntpd (958691)
# 沒有進程處於投訴模式
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
例如:
sudo aa-status | grep named
/usr/sbin/named:表示 /usr/sbin/named 有一個與之關聯的 AppArmor 策略
/usr/sbin/named (493443):表示當前正在運行的 /usr/sbin/named 進程有一個進程 ID 為 493443,並且該進程受到上面提到的 AppArmor 策略的保護
aa-enforce
aa-enforce:是用來將指定的AppArmor策略設置為強制模式,使用時指定策略文件的路徑就行了。
aa-enforce <PROFILE_PATH>
# 重新載入生效
apparmor_parser -r /path/to/profile
aa-complain
aa-complain 工具用於將指定的AppArmor策略設置為投訴模式。
aa-complain <PROFILE_PATH>
# 重新載入生效
apparmor_parser -r /path/to/profile
禁用 AppAemor
(1)停止apparmor服務
sudo systemctl stop apparmor
(2)禁用apparmor服務
sudo systemctl disable apparmor