Smack¶
“幹得好,你決定清理電梯了!” - 《黑暗之星》中的電梯
Smack 是簡化的強制訪問控制核心。 Smack 是強制訪問控制的基於核心的實現,其主要設計目標包括簡單性。
Smack 不是 Linux 上唯一可用的強制訪問控制方案。 鼓勵剛接觸強制訪問控制的人員將 Smack 與其他可用機制進行比較,以確定哪種機制最適合當前的問題。
Smack 由三個主要元件組成
核心
基本實用程式,這些實用程式很有用但不是必需的
配置資料
Smack 的核心元件實現為 Linux 安全模組 (LSM) 模組。 它需要 netlabel,並且最好與支援擴充套件屬性的檔案系統一起使用,儘管並不嚴格要求 xattr 支援。 在“vanilla”發行版下執行 Smack 核心是安全的。
Smack 核心使用 CIPSO IP 選項。 某些網路配置無法容忍 IP 選項,並且可能會妨礙對使用這些選項的系統的訪問,Smack 就是這樣。
Smack 用於 Tizen 作業系統。 請訪問 http://wiki.tizen.org 以獲取有關 Smack 在 Tizen 中如何使用的資訊。
Smack 使用者空間的當前 git 儲存庫為
git://github.com/smack-team/smack.git
這應該可以在大多數現代發行版上進行構建和安裝。 smackutil 中包含五個命令
- chsmack
顯示或設定 Smack 擴充套件屬性值
- smackctl
載入 Smack 訪問規則
- smackaccess
報告具有一個標籤的程序是否有權訪問具有另一個標籤的物件
隨著 smackfs/load2 和 smackfs/cipso2 介面的引入,這兩個命令已過時。
- smackload
正確格式化要寫入 smackfs/load 的資料
- smackcipso
正確格式化要寫入 smackfs/cipso 的資料
為了與 Smack 的意圖保持一致,配置資料是最小的,並且不是嚴格要求的。 最重要的配置步驟是掛載 smackfs 偽檔案系統。 如果安裝了 smackutil,啟動指令碼將負責處理此問題,但也可以手動處理。
將此行新增到 /etc/fstab
smackfs /sys/fs/smackfs smackfs defaults 0 0
/sys/fs/smackfs 目錄由核心建立。
Smack 使用擴充套件屬性 (xattrs) 將標籤儲存在檔案系統物件上。 這些屬性儲存在擴充套件屬性安全名稱空間中。 程序必須具有 CAP_MAC_ADMIN 才能更改這些屬性中的任何一個。
Smack 使用的擴充套件屬性有
- SMACK64
用於做出訪問控制決策。 在幾乎所有情況下,分配給新檔案系統物件的標籤將是建立它的程序的標籤。
- SMACK64EXEC
Smack 標籤的一個程序,該程序執行具有此屬性集的程式檔案,將使用此屬性的值執行。
- SMACK64MMAP
不允許 Smack 標籤不允許訪問具有此屬性中包含的標籤的程序的所有訪問的檔案被 mmap。 這是共享庫的一個非常具體的用例。
- SMACK64TRANSMUTE
只能具有值“TRUE”。 如果在建立物件時此屬性存在於目錄中,並且允許對目錄進行寫入訪問的 Smack 規則(如下所述)包括轉換 (“t”) 模式,則物件將獲得目錄的標籤,而不是建立程序的標籤。 如果正在建立的物件是一個目錄,則也會設定 SMACK64TRANSMUTE 屬性。
- SMACK64IPIN
此屬性僅在套接字的檔案描述符上可用。 使用此屬性中的 Smack 標籤進行對傳遞到此套接字的資料包的訪問控制決策。
- SMACK64IPOUT
此屬性僅在套接字的檔案描述符上可用。 使用此屬性中的 Smack 標籤進行對來自此套接字的資料包的訪問控制決策。
有多種方法可以在檔案上設定 Smack 標籤
# attr -S -s SMACK64 -V "value" path
# chsmack -a value path
程序可以透過讀取 /proc/self/attr/current 來檢視它正在執行的 Smack 標籤。 具有 CAP_MAC_ADMIN 的程序可以透過寫入此處來設定程序 Smack。
大多數 Smack 配置都是透過寫入 smackfs 檔案系統中的檔案來完成的。 此偽檔案系統掛載在 /sys/fs/smackfs 上。
- 訪問
為了向後相容而提供。 建議使用 access2 介面,應改為使用它。 此介面報告具有指定 Smack 標籤的主題是否具有對具有指定 Smack 標籤的物件的特定訪問許可權。 將固定格式的訪問規則寫入此檔案。 下一次讀取將指示是否允許該訪問。 文字將是“1”表示訪問,或“0”表示拒絕。
- access2
此介面報告具有指定 Smack 標籤的主題是否具有對具有指定 Smack 標籤的物件的特定訪問許可權。 將長格式的訪問規則寫入此檔案。 下一次讀取將指示是否允許該訪問。 文字將是“1”表示訪問,或“0”表示拒絕。
- 環境
這包含應用於未標記網路資料包的 Smack 標籤。
- 更改規則
此介面允許修改現有的訪問控制規則。 寫入時接受的格式為
"%s %s %s %s"
其中第一個字串是主體標籤,第二個是物件標籤,第三個是要允許的訪問許可權,第四個是要拒絕的訪問許可權。 訪問字串只能包含字元“rwxat-”。 如果給定主體和物件的規則存在,則將透過啟用第三個字串中的許可權並停用第四個字串中的許可權來修改該規則。 如果不存在此類規則,則將使用第三個和第四個字串中指定的訪問許可權建立該規則。
- cipso
為了向後相容而提供。 建議使用 cipso2 介面,應改為使用它。 此介面允許將特定的 CIPSO 標頭分配給 Smack 標籤。 寫入時接受的格式為
"%24s%4d%4d"["%4d"]...
第一個字串是固定的 Smack 標籤。 第一個數字是要使用的級別。 第二個數字是類別的數量。 以下數字是類別
"level-3-cats-5-19 3 2 5 19"
- cipso2
此介面允許將特定的 CIPSO 標頭分配給 Smack 標籤。 寫入時接受的格式為
"%s%4d%4d"["%4d"]...
第一個字串是一個長 Smack 標籤。 第一個數字是要使用的級別。 第二個數字是類別的數量。 以下數字是類別
"level-3-cats-5-19 3 2 5 19"
- 直接
這包含用於網路資料包中 Smack 直接標籤表示的 CIPSO 級別。
- doi
這包含網路資料包中使用的 CIPSO 解釋域。
- ipv6host
此介面允許將特定的 IPv6 Internet 地址視為單標籤主機。 資料包僅從具有對主機標籤的 Smack 寫入許可權的程序傳送到單標籤主機。 從單標籤主機接收的所有資料包都將獲得指定的標籤。 寫入時接受的格式為
"%h:%h:%h:%h:%h:%h:%h:%h label" or "%h:%h:%h:%h:%h:%h:%h:%h/%d label".
不支援“::”地址快捷方式。 如果 label 為“-DELETE”,則將刪除匹配的條目。
- 載入
為了向後相容而提供。 建議使用 load2 介面,應改為使用它。 此介面允許指定除系統定義的規則之外的訪問控制規則。 寫入時接受的格式為
"%24s%24s%5s"
其中第一個字串是主體標籤,第二個是物件標籤,第三個是請求的訪問許可權。 訪問字串只能包含字元“rwxat-”,並指定允許哪種訪問許可權。 “-”是表示不允許的許可權的佔位符。 字串“r-x--”將指定讀取和執行訪問許可權。 標籤的長度限制為 23 個字元。
- 載入 2
此介面允許指定除系統定義的規則之外的訪問控制規則。 寫入時接受的格式為
"%s %s %s"
其中第一個字串是主體標籤,第二個是物件標籤,第三個是請求的訪問許可權。 訪問字串只能包含字元“rwxat-”,並指定允許哪種訪問許可權。 “-”是表示不允許的許可權的佔位符。 字串“r-x--”將指定讀取和執行訪問許可權。
- 載入自身
為了向後相容而提供。 建議使用 load-self2 介面,應改為使用它。 此介面允許定義特定於程序的訪問規則。 僅當允許訪問時才查詢這些規則,並且旨在對程序提供其他限制。 格式與 load 介面的格式相同。
- 載入自身 2
此介面允許定義特定於程序的訪問規則。 僅當允許訪問時才查詢這些規則,並且旨在對程序提供其他限制。 格式與 load2 介面的格式相同。
- 日誌記錄
這包含 Smack 日誌記錄狀態。
- 對映
這包含用於網路資料包中 Smack 對映標籤表示的 CIPSO 級別。
- 網路標籤
此介面允許將特定的 Internet 地址視為單標籤主機。 資料包在沒有 CIPSO 標頭的情況下發送到單標籤主機,但僅從具有對主機標籤的 Smack 寫入許可權的程序傳送。 從單標籤主機接收的所有資料包都將獲得指定的標籤。 寫入時接受的格式為
"%d.%d.%d.%d label" or "%d.%d.%d.%d/%d label".
如果指定的標籤為“-CIPSO”,則該地址將被視為支援 CIPSO 標頭的主機。
- 僅限 cap
這包含程序要使 CAP_MAC_ADMIN 和
CAP_MAC_OVERRIDE生效必須具有的標籤。 如果此檔案為空,則這些功能對於具有任何標籤的程序都有效。 這些值透過將所需的標籤(用空格分隔)寫入檔案來設定,或者透過將“-”寫入檔案來清除。- ptrace
這用於定義當前的 ptrace 策略
- 0 - 預設
這是依賴於 Smack 訪問規則的策略。 對於
PTRACE_READ,主體需要對物件具有讀取訪問許可權。 對於PTRACE_ATTACH,需要讀寫訪問許可權。- 1 - 精確
這是限制
PTRACE_ATTACH的策略。 僅當主體的標籤和物件的標籤相同時才允許附加。PTRACE_READ不受影響。 可以使用CAP_SYS_PTRACE覆蓋。- 2 - 嚴厲
此策略的行為類似於上面的“精確”,唯一的例外是無法使用
CAP_SYS_PTRACE覆蓋。
- 撤銷主體
在此處寫入 Smack 標籤會將具有該主體標籤的所有訪問規則的訪問許可權設定為“-”。
- 未受限
如果核心配置了
CONFIG_SECURITY_SMACK_BRINGUP,則具有CAP_MAC_ADMIN的程序可以將標籤寫入此介面。 此後,將記錄涉及該標籤的訪問,並且如果不是,則允許該訪問。 請注意,這很危險,可能會破壞系統的正確標記。 永遠不應在生產中使用它。- 重新標記自身
此介面包含程序可以轉換到的標籤列表,方法是寫入
/proc/self/attr/current。 通常,程序可以將其自己的標籤更改為任何合法值,但前提是它具有CAP_MAC_ADMIN。 此介面允許沒有CAP_MAC_ADMIN的程序將其自身重新標記為預定義列表中的標籤之一。 沒有CAP_MAC_ADMIN的程序只能更改其標籤一次。 完成後,此列表將被清除。 這些值透過將所需的標籤(用空格分隔)寫入檔案來設定,或者透過將“-”寫入檔案來清除。
如果您使用的是 smackload 實用程式,則可以在 /etc/smack/accesses 中新增訪問規則。 它們的格式為
subjectlabel objectlabel access
訪問許可權是字母 rwxatb 的組合,這些字母指定了具有 subjectlabel 的主體對具有 objectlabel 的物件允許的訪問型別。 如果沒有規則,則不允許訪問。
在 http://schaufler-ca.com 上查詢其他程式
簡化的強制訪問控制核心(白皮書)¶
Casey Schaufler casey@schaufler-ca.com
強制訪問控制¶
計算機系統採用多種方案來約束資訊在人與服務使用機器之間的共享方式。 其中一些方案允許程式或使用者決定允許哪些其他程式或使用者訪問資料片段。 這些方案稱為自主訪問控制機制,因為訪問控制是在使用者的酌情決定的情況下指定的。 其他方案不將有關使用者或程式可以訪問的內容的決策留給使用者或程式。 這些方案稱為強制訪問控制機制,因為您無法選擇哪些使用者或程式可以訪問資料片段。
Bell & LaPadula¶
從 1980 年代中期到本世紀初,強制訪問控制 (MAC) 與 Bell & LaPadula 安全模型密切相關,Bell & LaPadula 安全模型是對美國國防部標記紙質文件策略的數學描述。 這種形式的 MAC 在首都環線和斯堪的納維亞的超級計算機中心享有追隨者,但通常被認為未能滿足一般需求。
域型別強制¶
在本世紀之交,域型別強制 (DTE) 開始流行。 該方案將使用者、程式和資料組織到彼此隔離的域中。 該方案已作為流行的 Linux 發行版的元件得到廣泛部署。 維護此方案所需的管理開銷以及提供安全域對映所需的對整個系統的詳細瞭解導致該方案在大多數情況下被停用或以有限的方式使用。
Smack¶
Smack 是一種強制訪問控制機制,旨在提供有用的 MAC,同時避免其前身的缺陷。 Bell & LaPadula 的限制透過提供一種方案來解決,該方案可以根據系統及其用途的要求來控制訪問,而不是那些由神秘政府政策強加的方案。 域型別強制的複雜性透過根據已使用的訪問模式定義訪問控制來避免。
Smack 術語¶
那些處理過其他 MAC 系統的人會對用於討論 Smack 的術語很熟悉,並且對於沒有經驗的人來說也不難掌握。 有四個術語以特定方式使用,並且尤其重要
- 主體
主體是計算機系統上的一個活動實體。 在 Smack 上,主體是一個任務,它又是執行的基本單元。
- 物件
物件是計算機系統上的一個被動實體。 在 Smack 上,所有型別的檔案、IPC 和任務都可以是物件。
- 訪問
主體嘗試將資訊放入物件或從物件獲取資訊的任何嘗試都是訪問。
- 標籤
標識主體或物件的強制訪問控制特性的資料。
這些定義與安全社群中的傳統用法一致。 還有一些來自 Linux 的術語可能會出現
- 能力
具有能力的任務有權違反系統安全策略的某個方面,如特定能力所標識的。 具有一項或多項能力的任務是特權任務,而沒有能力的任務是非特權任務。
- 特權
允許違反系統安全策略的任務被認為具有特權。 截至本文撰寫之時,任務可以透過具有能力或具有 root 有效使用者來獲得特權。
Smack 基礎知識¶
Smack 是 Linux 系統的擴充套件。 它根據附加到每個主體和物件的標籤,對主體可以訪問哪些物件強制執行其他限制。
標籤¶
Smack 標籤是 ASCII 字串。 它們最多可以有 255 個字元長,但建議將其保持在 23 個字元以內。 使用特殊字元(即字母或數字以外的任何字元)的單字元標籤保留供 Smack 開發團隊使用。 Smack 標籤是非結構化的、區分大小寫的,並且對它們執行的唯一操作是相等比較。 Smack 標籤不能包含不可列印的字元、“/”(斜槓)、“"”(反斜槓)、“'”(引號)和“"”(雙引號)字元。 Smack 標籤不能以“-”開頭。 這是為特殊選項保留的。
有一些預定義的標籤
_ Pronounced "floor", a single underscore character.
^ Pronounced "hat", a single circumflex character.
* Pronounced "star", a single asterisk character.
? Pronounced "huh", a single question mark character.
@ Pronounced "web", a single at sign character.
Smack 系統上的每個任務都分配有一個標籤。 程序的 Smack 標籤通常由系統初始化機制分配。
訪問規則¶
Smack 使用 Linux 的傳統訪問模式。 這些模式是讀取、執行、寫入,偶爾還有追加。 在少數情況下,訪問模式可能不明顯。 這些包括
- 訊號
訊號是從主體任務到物件任務的寫入操作。
- Internet 域 IPC
資料包的傳輸被認為是源任務到目標任務的寫入操作。
Smack 根據附加到主體的標籤和附加到它嘗試訪問的物件的標籤來限制訪問。 強制執行的規則按順序為
拒絕標籤為“*”的任務請求的任何訪問。
允許標籤為“^”的任務請求的讀取或執行訪問。
允許在標籤為“_”的物件上請求的讀取或執行訪問。
允許在標籤為“*”的物件上請求的任何訪問。
允許任務在具有相同標籤的物件上請求的任何訪問。
允許在載入的規則集中顯式定義的任何請求的訪問。
拒絕任何其他訪問。
Smack 訪問規則¶
透過 Smack 提供的隔離,訪問分離很簡單。 在許多有趣的情況下,都需要主體對具有不同標籤的物件的有限訪問。 一個例子是熟悉的敏感性間諜模型,在該模型中,從事高度機密專案的科學家將能夠閱讀較低級別的檔案,並且她編寫的任何內容都將“天生”高度機密。 為了適應此類方案,Smack 包括一種用於指定允許標籤之間訪問的規則的機制。
訪問規則格式¶
訪問規則的格式為
subject-label object-label access
其中 subject-label 是任務的 Smack 標籤,object-label 是被訪問的事物的 Smack 標籤,access 是指定允許的訪問型別的字串。 在訪問規範中搜索描述訪問模式的字母
a:表示應授予追加訪問許可權。 r:表示應授予讀取訪問許可權。 w:表示應授予寫入訪問許可權。 x:表示應授予執行訪問許可權。 t:表示該規則請求轉換。 b:表示應報告該規則以進行啟動。
也允許使用規範字母的大寫值。 訪問模式規範可以按任何順序排列。 可接受規則的示例如
TopSecret Secret rx
Secret Unclass R
Manager Game x
User HR w
Snap Crackle rwxatb
New Old rRrRr
Closed Off -
不可接受規則的示例如
Top Secret Secret rx
Ace Ace r
Odd spells waxbeans
標籤中不允許空格。 由於主體始終可以訪問具有相同標籤的檔案,因此指定該情況的規則毫無意義。 訪問規範中只允許使用有效字母 (rwxatbRWXATB) 和破折號 (“-”) 字元。 破折號是一個佔位符,因此“a-r”與“ar”相同。 單獨的破折號用於指定不允許任何訪問。
應用訪問規則¶
Linux 的開發人員很少定義新型別的事物,通常從其他系統匯入方案和概念。 大多數情況下,其他系統是 Unix 的變體。 Unix 有許多令人喜愛的屬性,但訪問控制模型的一致性不是其中之一。 Smack 努力盡可能統一地處理訪問,同時保持底層機制的精神。
檔案系統物件(包括檔案、目錄、命名管道、符號連結和裝置)需要與模式位訪問使用的許可權密切匹配的訪問許可權。 要開啟檔案進行讀取,需要對該檔案具有讀取訪問許可權。 要搜尋目錄,需要執行訪問許可權。 使用寫入訪問許可權建立檔案需要對包含目錄具有讀取和寫入訪問許可權。 刪除檔案需要對該檔案和包含目錄具有讀取和寫入訪問許可權。 使用者可能能夠看到檔案存在,但由於對包含目錄具有讀取訪問許可權,但對不同標籤的檔案沒有讀取訪問許可權,因此無法看到其任何屬性。 這是檔名是目錄中的資料而不是檔案的一部分的工件。
如果目錄被標記為轉換 (SMACK64TRANSMUTE=TRUE) 並且允許程序在該目錄中建立物件的訪問規則包括“t”訪問許可權,則分配給新物件的標籤將是目錄的標籤,而不是建立程序的標籤。 這使得具有不同標籤的兩個程序可以更輕鬆地共享資料,而無需授予對所有檔案的訪問許可權。
IPC 物件、訊息佇列、訊號量集和記憶體段存在於平面名稱空間中,並且僅需要訪問請求才能匹配所討論的物件。
程序物件反映系統上的任務,並且用於訪問它們的 Smack 標籤與任務將用於其自身訪問嘗試的 Smack 標籤相同。 透過 kill() 系統呼叫傳送訊號是從信令者到接收者的寫入操作。 除錯程序需要讀取和寫入。 建立新任務是一個內部操作,會導致兩個具有相同 Smack 標籤的任務,並且不需要訪問檢查。
套接字是附加到程序的資料結構,並且將資料包從一個程序傳送到另一個程序要求傳送方對接收方具有寫入訪問許可權。 不需要接收方具有對傳送方的讀取訪問許可權。
設定訪問規則¶
配置檔案 /etc/smack/accesses 包含要在系統啟動時設定的規則。 這些內容將寫入特殊檔案 /sys/fs/smackfs/load2。 可以隨時新增規則並立即生效。 對於任何主體和物件標籤對,只能有一個規則,最近指定的規則將覆蓋任何較早的規範。
任務屬性¶
可以從 /proc/<pid>/attr/current 讀取程序的 Smack 標籤。 程序可以從 /proc/self/attr/current 讀取其自身的 Smack 標籤。 特權程序可以透過寫入 /proc/self/attr/current 來更改其自身的 Smack 標籤,但不能更改另一個程序的標籤。
檔案屬性¶
檔案系統物件的 Smack 標籤儲存為檔案上的擴充套件屬性,名為 SMACK64。 此屬性位於安全名稱空間中。 只有具有特權的程序才能更改它。
特權¶
具有 CAP_MAC_OVERRIDE 或 CAP_MAC_ADMIN 的程序是特權的。 CAP_MAC_OVERRIDE 允許程序訪問否則將被拒絕的物件。 CAP_MAC_ADMIN 允許程序更改 Smack 資料,包括規則和屬性。
Smack 網路¶
如前所述,Smack 對網路協議傳輸強制執行訪問控制。 由 Smack 程序傳送的每個資料包都帶有其 Smack 標籤標記。 這是透過將 CIPSO 標記新增到 IP 資料包的標頭來實現的。 預計接收到的每個資料包都具有 CIPSO 標記,該標記標識標籤,如果它缺少這樣的標記,則假定網路環境標籤。 在傳遞資料包之前,會進行檢查以確定具有資料包上標籤的主題是否具有對接收程序的寫入訪問許可權,如果不是這種情況,則丟棄該資料包。
CIPSO 配置¶
通常不需要指定 CIPSO 配置。 系統使用的預設值處理所有內部情況。 Smack 將組合 CIPSO 標籤值以匹配正在使用的 Smack 標籤,而無需進行管理干預。 進入系統的未標記資料包將被賦予環境標籤。
在可能遇到來自非 Smack 但支援 CIPSO 的系統的包的情況下,Smack 需要配置。 通常這將是 Trusted Solaris 系統,但也存在其他部署較少的系統。 CIPSO 為每個資料包提供 3 個重要值、解釋域 (DOI)、級別和類別集。 DOI 旨在標識使用相容標記方案的系統組,並且 Smack 系統上指定的 DOI 必須與遠端系統的 DOI 匹配,否則資料包將被丟棄。 預設情況下,DOI 為 3。 該值可以從 /sys/fs/smackfs/doi 讀取,並且可以透過寫入 /sys/fs/smackfs/doi 來更改。
標籤和類別集將對映到 /etc/smack/cipso 中定義的 Smack 標籤。
Smack/CIPSO 對映的格式為
smack level [category [category]*]
Smack 不期望級別或類別集以任何特定方式相關,並且不會基於它們假設或分配訪問許可權。 對映的一些示例如
TopSecret 7
TS:A,B 7 1 2
SecBDE 5 2 4 6
RAFTERS 7 12 26
“:”和“,”字元允許在 Smack 標籤中使用,但沒有特殊含義。
Smack 標籤到 CIPSO 值的對映是透過寫入 /sys/fs/smackfs/cipso2 來定義的。
除了顯式對映之外,Smack 還支援直接 CIPSO 對映。使用一個 CIPSO 級別來指示資料包中傳遞的類別集合實際上是 Smack 標籤的編碼。預設情況下,使用的級別是 250。該值可以從 /sys/fs/smackfs/direct 讀取,並透過寫入 /sys/fs/smackfs/direct 進行更改。
套接字屬性¶
有兩個與套接字關聯的屬性。這些屬性只能由特權任務設定,但任何任務都可以讀取其自身套接字的這些屬性。
- SMACK64IPIN
任務物件的 Smack 標籤。將強制執行策略的特權程式可以將其設定為星標標籤。
- SMACK64IPOUT
隨傳出資料包傳輸的 Smack 標籤。特權程式可以設定此標籤以匹配它希望與之通訊的另一個任務的標籤。
Smack Netlabel 異常¶
您經常會發現您標記的應用程式必須與外部未標記的世界進行通訊。為此,有一個特殊的檔案 /sys/fs/smackfs/netlabel,您可以在其中新增一些以下格式的例外:
@IP1 LABEL1 or
@IP2/MASK LABEL2
這意味著您的應用程式如果對 LABEL1 具有寫入許可權,則可以對 @IP1 進行未標記的訪問;如果對 LABEL2 具有寫入許可權,則可以訪問子網 @IP2/MASK。
/sys/fs/smackfs/netlabel 檔案中的條目首先按最長掩碼匹配,就像在無類別 IPv4 路由中一樣。
可以使用特殊標籤“@”和選項“-CIPSO”
@ means Internet, any application with any label has access to it
-CIPSO means standard CIPSO networking
如果您不知道 CIPSO 是什麼,也不打算使用它,您可以這樣做
echo 127.0.0.1 -CIPSO > /sys/fs/smackfs/netlabel
echo 0.0.0.0/0 @ > /sys/fs/smackfs/netlabel
如果您在 192.168.0.0/16 本地網路上使用 CIPSO,並且還需要未標記的網際網路訪問,您可以擁有
echo 127.0.0.1 -CIPSO > /sys/fs/smackfs/netlabel
echo 192.168.0.0/16 -CIPSO > /sys/fs/smackfs/netlabel
echo 0.0.0.0/0 @ > /sys/fs/smackfs/netlabel
為 Smack 編寫應用程式¶
將在 Smack 系統上執行三種應用程式。應用程式與 Smack 互動的方式將決定它在 Smack 下正常工作需要做什麼。
Smack 無感知應用程式¶
到目前為止,大多數應用程式沒有任何理由關心 Smack 的獨特屬性。由於呼叫程式對與程序關聯的 Smack 標籤沒有影響,因此唯一可能出現的問題是程序是否具有程式的執行許可權。
Smack 相關應用程式¶
可以透過向程式教授有關 Smack 的知識來改進某些程式,但這些程式本身不會做出任何安全決策。實用程式 ls(1) 就是這樣一個程式的例子。
Smack 強制應用程式¶
這些是特殊的程式,它們不僅瞭解 Smack,而且還參與系統策略的實施。在大多數情況下,這些程式用於設定使用者會話。還有一些網路服務可以為使用各種標籤執行的程序提供資訊。
檔案系統介面¶
Smack 使用擴充套件屬性維護檔案系統物件上的標籤。可以使用 getxattr(2) 獲取檔案、目錄或其他檔案系統物件的 Smack 標籤
len = getxattr("/", "security.SMACK64", value, sizeof (value));
會將根目錄的 Smack 標籤放入值中。特權程序可以使用 setxattr(2) 設定檔案系統物件的 Smack 標籤
len = strlen("Rubble");
rc = setxattr("/foo", "security.SMACK64", "Rubble", len, 0);
如果程式具有適當的許可權,則會將 /foo 的 Smack 標籤設定為“Rubble”。
套接字介面¶
可以使用 fgetxattr(2) 讀取套接字屬性。
特權程序可以使用 fsetxattr(2) 設定傳出資料包的 Smack 標籤
len = strlen("Rubble");
rc = fsetxattr(fd, "security.SMACK64IPOUT", "Rubble", len, 0);
如果程式具有適當的許可權,則會將從套接字傳出的資料包的 Smack 標籤設定為“Rubble”
rc = fsetxattr(fd, "security.SMACK64IPIN, "*", strlen("*"), 0);
如果程式具有適當的許可權,則會將 Smack 標籤“*”設定為物件標籤,以便對照該標籤檢查傳入的資料包。
管理¶
Smack 支援一些掛載選項
- smackfsdef=label
指定要賦予缺少 Smack 標籤擴充套件屬性的檔案的標籤。
- smackfsroot=label
指定在檔案系統缺少 Smack 擴充套件屬性時分配給檔案系統根目錄的標籤。
- smackfshat=label
指定一個標籤,該標籤必須具有對檔案系統上設定的所有標籤的讀取許可權。尚未強制執行。
- smackfsfloor=label
指定一個標籤,檔案系統上設定的所有標籤都必須具有對其的讀取許可權。尚未強制執行。
- smackfstransmute=label
其行為與 smackfsroot 完全相同,只是它還在掛載的根目錄上設定了 transmute 標誌
這些掛載選項適用於所有檔案系統型別。
Smack 審計¶
如果您想要對安全事件進行 Smack 審計,您需要在核心配置中設定 CONFIG_AUDIT。預設情況下,所有被拒絕的事件都將被審計。您可以透過將單個字元寫入 /sys/fs/smackfs/logging 檔案來更改此行為
0 : no logging
1 : log denied (default)
2 : log accepted
3 : log denied & accepted
事件以“key=value”對的形式記錄,對於每個事件,您至少將獲得 subject、object、請求的許可權、操作、觸發事件的核心函式,以及其他對,具體取決於審計的事件型別。
啟動模式¶
啟動模式提供了日誌記錄功能,可以使應用程式配置和系統啟動更加容易。使用 CONFIG_SECURITY_SMACK_BRINGUP 配置核心以啟用這些功能。啟用啟動模式後,由於標有“b”訪問模式的規則而成功的訪問將被記錄。當為程序引入新標籤時,可以積極新增標有“b”的規則。日誌記錄允許跟蹤哪些規則實際用於該標籤。
啟動模式的另一個功能是“unconfined”選項。將標籤寫入 /sys/fs/smackfs/unconfined 會使具有該標籤的主題能夠訪問任何物件,並使具有該標籤的物件可供所有主題訪問。由於標籤不受限制而授予的任何訪問許可權都會被記錄。此功能是危險的,因為可能會在如果正在強制執行策略的情況下無法建立檔案和目錄的地方建立檔案和目錄。