Linux

如何創建自定義 SELinux 標籤

  • September 12, 2016

我編寫了一個服務/單個二進制應用程序,我試圖在 Fedora 24 上執行,它使用 systemd 執行,二進製文件部署到/srv/bot

我寫的這個服務/應用程序需要在這個目錄中創建/打開/讀取和重命名文件。

我首先開始創建基於SELinux 的新策略:允許程序在某個目錄中創建任何文件

但是當我的應用程序需要重命名時,輸出有一個警告:

#!!!! WARNING: 'var_t' is a base type.
allow init_t var_t:file rename;

我四處搜尋,發現我應該使用比基本類型更具體的 SELinux 標籤,但所有線上範例都向您展示了來自 httpd/nginx/etc 的現有標籤。

有沒有辦法為我自己的應用程序創建自定義標籤?

我的想法是創建類似 myapp_var_t 的東西,使用

semanage fcontext -a -t my_app_var_t '/srv/bot(/.*)?'
restorecon -R -v /srv/bot

以及.pp將使用此自定義類型的自定義文件

如果有更好的方法來解決它,那也可以。

謝謝

更新

經過更多搜尋後,我認為我想做的正確術語是創建新的types,這導致我訪問 https://docs.fedoraproject.org/en-US/Fedora/13/html/SELinux_FAQ/index.html#id3036916

基本上說,執行

sepolgen /path/to/binary

我能夠獲得一個模板,然後我可以將其編譯成一個 pp 文件並載入,仍然會出現一些錯誤,但看起來我更接近我想要做的事情。

如果我讓它工作,我會更新這篇文章

帶著跑步的起點

sepolgen /path/to/binary

這給了你:

app.fc
app.sh
app.if
app.spec
app.te

要創建一個新SELinux file context的應用到包含您的程序/守護程序將修改的文件的父目錄,您編輯 app.te 文件並添加:

type app_var_t;
files_type(app_var_t)

第一行聲明了新類型,第二行呼叫了一個宏,該宏執行一些魔術並使其成為文件類型(事實證明,您不能在文件或目錄上使用程序上下文行 app_exec_t),請參閱“重新訪問 SELinux 類型”了解更多資訊不同類型的資訊

一旦你聲明了類型,你需要告訴 SELinux 你的應用程序被允許使用它,在我的例子中,我添加了

allow app_t app_var_t:dir { add_name remove_name write search};
allow app_t app_var_t:file { unlink create open rename write read };

這兩行基本上是說,允許作為我的應用程序域的 app_t 類型使用上下文寫入/搜尋/etc 目錄,app_var_t並允許它使用上下文 app_var_t 創建/打開/刪除/etc 文件

難題的最後一部分是以某種方式告訴 SELinux 哪些文件夾和文件應該獲取每種類型,您可以通過編輯app.fc文件來做到這一點(fc => 文件上下文)

在我的情況下,這個文件只有兩行:

/srv/bot/app        --  gen_context(system_u:object_r:app_exec_t,s0)
/srv/bot(/.*)?          gen_context(system_u:object_r:app_var_t,s0)

第一行直接指向部署在我的伺服器上的二進製文件,所以這個得到了 app_exec_t 上下文。

第二行的意思是:

將 app_var_t 應用於目錄 /srv/bot 以及目錄 /srv/bot 中的所有文件

請注意第一行在--路徑和對gen_context. --意味著,僅將其應用於文件。在第二種情況下,我們什麼都沒有(只有空格),這意味著,適用於所有匹配的目錄和文件,這是我想要的,另一種選擇是必須-d只應用目錄。

我現在有一個工作策略,我可以使用自定義策略部署我的應用程序,並且一切正常。(我的政策在文件中有更多條目,.te但它超出了這個問題的範圍。)

幫助我獲得此解決方案的額外閱讀材料:

使用 sepolgen 讓事情變得更簡單

在你盲目地 audit2allow -M mydomain 之前想想

面向紅帽開發人員的 SELinux(長 PDF)

一個 SElinux 模組(一):類型和規則

範例策略(特別是 postgresql)

了解文件上下文文件

引用自:https://unix.stackexchange.com/questions/309122