SELinux:如何創建新的文件類型
在 RHEL/CentOS 7 上,我正在嘗試為文件創建新的 SELinux 安全上下文,以支持我正在編寫的新服務。
我為我的新服務創建了一個類型強製文件,但我無法創建一個系統將辨識為文件類型的新類型。
我正在根據這個CentOS 5“建構本地策略模組”文件工作,該文件指示我創建一個 TE 文件,然後使用
checkmodule
並semodule_package
編譯它。如果我只是寫在我的 TE 文件中:
type myservice_spool_t;
然後 TE 編譯得很好,但是當我嘗試時,
semanage fcontext
我得到了這個:$ sudo semanage fcontext -a -t myservice_spool_t "/var/spool/myservice(/.*)?" ValueError: Type myservice_spool_t is invalid, must be a file or device type
我已經閱讀了各種教程,但沒有找到一個有效的例子——我看到的一切都是:
- 過時的 - 例如這個RHEL 4 SELinux 文件頁面說應該使用
type myservice_spool_t, file_type;
但checkmodule
說:ERROR 'attribute file_type is not declared'
- 不完整 - 例如這個答案會讓我使用宏
file_type()
,但checkmodule
說:ERROR 'This block has no require section.' at token 'files_type'
- 或完全缺失 - 例如,針對 RHEL 7 的新 SELinux 指南沒有任何關於如何創建新策略的資訊,除了使用
audit2allow
.SELinux 項目網站完全沒用,因為我找不到一個工作範例
我會很感激一個簡單的簡潔範例,說明如何編寫一個 TE 文件,該文件引入了一種新的類型,
semanage fcontext
將被批准。$$ Update $$
我找到了這個用於創建策略文件的 Gentoo 文件,其中有一些有用的解釋和範例。
我發現我遇到的問題是因為我沒有正確編譯模組。結果,宏可能沒有“接受”,並且
checkmodule
策略編譯器錯誤消息並沒有真正幫助理解這一點。要使所有這些宏正確擴展,需要使用 SELinux 提供的 Makefile 編譯策略 - 使用名為 myservice_spool.te 的 TE 文件,應該執行:
make -f /usr/share/selinux/devel/Makefile myservice_spool.pp
這將創建一個擴展了所有宏的臨時 TE 文件,然後呼叫相關編譯器創建
myservice_spool.pp
.OP 中連結的 Gentoo 文件有更多資訊,儘管文件路徑對於 CentOS 系統不正確。
如果您查看
tmp
目錄中生成的 TE 模板(SELinux makefile 有助於保留該模板),您會發現“屬性”確實是處理將類型指定為文件的正確方法,但我們必須使用require
它們才能使它們工作- SELinux TE 文件似乎工作的方式是您不會將任何符號神奇地導入配置文件 - 您必須require
使用您使用的任何東西。所以設置新文件類型的正確非宏化方法是這樣的(從 TE 生成的模板複製):
type myservice_spool_t; require { attribute spoolfile; attribute file_type, non_security_file_type, non_auth_file_type; } # end require typeattribute myservice_spool_t file_type, non_security_file_type, non_auth_file_type, spoolfile;