SELinux:如何创建新的文件类型

SELinux:如何创建新的文件类型

在 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可获批准的新类型。

[更新]

我找到了这个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 本身支持三种语言,另外还有一种第三方抽象语言,称为“参考策略”。

  1. 单一策略语言(checkpolicy 用于编译 policy.conf - man checkpolicy)
  2. 模块策略语言(checkmodule 用于编译 $MODULE.{te.fc} -- man checkmodule)
  3. 通用中间语言(secilc 用于编译 $MODULE.cil -- man secilc)

上述每一种母语都有各自的特定属性,可能会令人困惑。

参考策略基本上是“模块策略语言”的包装,目的是使策略维护更容易。

相关内容