Centos7

SELinux:如何創建新的文件類型

  • December 5, 2018

在 RHEL/CentOS 7 上,我正在嘗試為文件創建新的 SELinux 安全上下文,以支持我正在編寫的新服務。

我為我的新服務創建了一個類型強製文件,但我無法創建一個系統將辨識為文件類型的新類型。

我正在根據這個CentOS 5“建構本地策略模組”文件工作,該文件指示我創建一個 TE 文件,然後使用checkmodulesemodule_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;

引用自:https://serverfault.com/questions/806596