Linux PAM和AppArmor

来源:https://www.cnblogs.com/heyongshen/archive/2023/11/02/17803060.html
-Advertisement-
Play Games

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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • /** * 1、業務場景 * 1、定時執行時,可能出現數據量大,執行不完,線程直接被終止掉,丟數據。 */ import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; ...
  • 本人是tex新手,如果各位大佬有更好的方法歡迎分享,不勝感激。 適用情況 本文適用於使用\begin{thebibliography}和\bibitem排序的情況,如果使用bibtex排序那麼網上很多教程。 在使用tex發現不會自動排序非常僵硬,即如下情況: 在參考文獻的位置引用排在第二個,但是在原 ...
  • 物以類聚,聚類演算法使用最優化的演算法來計算數據點之間的距離,並將它們分組到最近的簇中。 Scipy的聚類模塊中,進一步分為兩個聚類子模塊: vq(vector quantization):提供了一種基於向量量化的聚類演算法。 vq模塊支持多種向量量化演算法,包括K-means、GMM(高斯混合模型)和WA ...
  • 馬哥原創:用Python採集小紅書評論,抓取欄位包含:筆記鏈接,頁碼,評論者昵稱,評論者id,評論者主頁鏈接,評論時間,評論IP屬地,評論點贊數,評論級別,評論內容。 ...
  • 在C#中,List集合是一種泛型集合,可以存儲任何類型的對象。克隆一個List集合可以通過以下幾種方式實現: 使用List的構造函數 使用List的構造函數可以創建一個新的List對象,並將原始List中的元素複製到新List中。例如: List<int> list1 = new List<int> ...
  • 在C#中,字典(Dictionary)是一種特殊的集合,用於存儲鍵/值對。這是一種關聯數組,其中每個元素都包含一個鍵(Key)和一個值(Value)。 下麵是一個簡單的C#字典的例子: //字典:泛型;key - value,增刪查改 都很快; // 字典如果數據量太大的話,也會影響效率. // 字 ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他程式中的線程數爆高,讓我幫忙看下怎麼回事,這種線程數爆高的情況找問題相對比較容易,就讓朋友丟一個dump給我,看看便知。 二:為什麼會爆高 1. 查看托管線程 別人說的話不一定是真,得自己拿數據出來說話,可以用 !t 命令觀察一下便知。 0:000> ...
  • netfilter介紹 防火牆是作用與內網和外網之間,根據定義的策略來過濾流量的軟體或者硬體。在Linux內核中,自帶了防火牆模塊netfilter,通過netfilter可以是實現網路流量的過過濾,以及NAT、連接跟蹤等功能。 通過用戶空間的iptables、firewalld等工具,可以實現相關 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...