在 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
将被批准。
[更新]
我找到了这个用于创建策略文件的 Gentoo 文档,其中有一些有用的解释和示例。
我发现我遇到的问题是因为我没有正确编译模块。结果,宏可能没有“接受”,并且
checkmodule
策略编译器错误消息并没有真正帮助理解这一点。要使所有这些宏正确扩展,需要使用 SELinux 提供的 Makefile 编译策略 - 使用名为 myservice_spool.te 的 TE 文件,应该执行:
这将创建一个扩展了所有宏的临时 TE 文件,然后调用相关编译器创建
myservice_spool.pp
.OP 中链接的 Gentoo 文档有更多信息,尽管文件路径对于 CentOS 系统不正确。
如果您查看
tmp
目录中生成的 TE 模板(SELinux makefile 有助于保留该模板),您会发现“属性”确实是处理将类型指定为文件的正确方法,但我们必须使用require
它们才能使它们工作- SELinux TE 文件似乎工作的方式是您不会将任何符号神奇地导入配置文件 - 您必须require
使用您使用的任何东西。所以设置新文件类型的正确非宏化方法是这样的(从 TE 生成的模板复制):
您需要将其声明为 files 属性的成员,以便它具有重新标记权限。
尝试
或者在你的情况下更好..
鉴于您实际上正在制作一个假脱机文件。如果其他宏在其策略中具有“管理假脱机”权限,则这使其他宏能够使用该假脱机。
这是一个完整的策略模块示例。
这会起作用,但只声明类型,仅此而已。你需要一些允许规则来让它做一些有价值的事情。
https://selinuxproject.org/page/TypeStatements有正确答案:
但是,是的,你的问题提出了一个有趣的观点。
SELinux 原生知道三种语言,并且有一种第三方抽象语言称为“引用策略”。
上述每种母语都有自己的特定属性,可能会造成混淆。
参考策略基本上是围绕“模块策略语言”的包装器,其目标是使策略维护更容易。