在 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 创建策略文件的文档,其中有一些有用的解释和例子。
答案1
我发现我遇到的问题是因为我没有正确编译模块。结果宏可能没有“生效”,而checkmodule
策略编译器错误消息并没有真正帮助我理解这一点。
为了使所有这些宏正确扩展,需要使用 SELinux 提供的 Makefile 来编译策略 - 使用名为 myservice_spool.te 的 TE 文件,应该执行:
make -f /usr/share/selinux/devel/Makefile myservice_spool.pp
这将创建一个包含所有扩展宏的临时 TE 文件,然后调用相关的编译器来创建myservice_spool.pp
。
虽然文件路径对于 CentOS 系统来说不正确,但 OP 中链接的 Gentoo 文档包含更多信息。
如果您查看目录中生成的 TE 模板tmp
(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;
答案2
您需要将其声明为文件属性的成员,以便它具有重新标记权限。
尝试
type myservice_spool_t;
files_type(myservice_spool_t)
或者就你的情况来说更好..
type myservice_spool_t;
files_spool_file(myservice_spool_t)
假设您实际上正在制作一个假脱机文件。如果其他宏在其策略中拥有“管理假脱机”权限,则它们将能够使用该假脱机。
这是一个完整的策略模块示例。
policy_module(`myservice', 1.0.0)
type myservice_spool_t;
files_spool_file(myservice_spool_t)
这会起作用,但只需声明类型即可。您需要一些允许规则才能使其做一些有价值的事情。
答案3
https://selinuxproject.org/page/TypeStatements有正确答案:
# Using the typeattribute statement to associate a type of
# setroubleshootd_exec_t to two attributes file_type and
# non_security_file_type.
# These are the previously declared attributes:
attribute file_type;
attribute non_security_file_type;
# The previously declared type:
type setroubleshootd_exec_t;
# These are the associations using the typeattribute statement:
typeattribute setroubleshootd_exec_t file_type, non_security_file_type;
但是,是的,你的问题提出了一个有趣的观点。
SELinux 本身支持三种语言,另外还有一种第三方抽象语言,称为“参考策略”。
- 单一策略语言(checkpolicy 用于编译 policy.conf - man checkpolicy)
- 模块策略语言(checkmodule 用于编译 $MODULE.{te.fc} -- man checkmodule)
- 通用中间语言(secilc 用于编译 $MODULE.cil -- man secilc)
上述每一种母语都有各自的特定属性,可能会令人困惑。
参考策略基本上是“模块策略语言”的包装,目的是使策略维护更容易。