如何創建自定義 SELinux 標籤
我編寫了一個服務/單個二進制應用程序,我試圖在 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
但它超出了這個問題的範圍。)幫助我獲得此解決方案的額外閱讀材料:
在你盲目地 audit2allow -M mydomain 之前想想
面向紅帽開發人員的 SELinux(長 PDF)