如何创建自定义 SELinux 标签

fmp*_*ard 15 linux security fedora selinux

我写了一个服务/单个二进制应用程序,我试图在 Fedora 24 上运行它,它使用 systemd 运行,二进制文件被部署到 /srv/bot

我写的这个服务/应用程序需要在这个目录中创建/打开/读取和重命名文件。

我首先开始创建基于SELinux的新策略:允许进程在某个目录中创建任何文件

但是当我的应用程序需要重命名时,输出有一个警告:

#!!!! WARNING: 'var_t' is a base type.
allow init_t var_t:file rename;
Run Code Online (Sandbox Code Playgroud)

我搜索了一下,发现我应该使用比基本类型更具体的 SELinux 标签,但所有在线示例都向您展示了来自 httpd/nginx/etc 的现有标签。

有没有一种方法可以为我自己的应用程序创建自定义标签?

我的想法是创建类似 myapp_var_t 的东西,使用

semanage fcontext -a -t my_app_var_t '/srv/bot(/.*)?'
restorecon -R -v /srv/bot
Run Code Online (Sandbox Code Playgroud)

以及.pp将使用此自定义类型的自定义文件

如果有更好的方法来解决它,那也行。

谢谢

更新

经过更多搜索后,我认为我想要做的正确术语是创建新的types,这使我进入 https://docs.fedoraproject.org/en-US/Fedora/13/html/SELinux_FAQ/index.html#id3036916

基本上说,运行

sepolgen /path/to/binary
Run Code Online (Sandbox Code Playgroud)

我能够得到一个模板,然后我可以将其编译成一个 pp 文件并加载,但仍然会出现一些错误,但看起来我更接近我想要做的事情。

如果我让它工作,我会更新这篇文章

fmp*_*ard 13

带着奔跑的起点

sepolgen /path/to/binary
Run Code Online (Sandbox Code Playgroud)

这给了你:

app.fc
app.sh
app.if
app.spec
app.te
Run Code Online (Sandbox Code Playgroud)

要创建一个新SELinux file context的应用到包含您的程序/守护程序将修改的文件的父目录,您可以编辑 app.te 文件并添加:

type app_var_t;
files_type(app_var_t)
Run Code Online (Sandbox Code Playgroud)

第一行声明了新类型,第二行调用了一个宏,该宏执行了一些魔术并使其成为文件类型(结果您不能在文件或目录上使用进程上下文行 app_exec_t),请参阅“重新访问SELinux 类型”了解更多不同类型的信息

一旦你声明了类型,你需要告诉 SELinux 你的应用程序被允许使用它,在我的例子中我添加了

allow app_t app_var_t:dir { add_name remove_name write search};
allow app_t app_var_t:file { unlink create open rename write read };
Run Code Online (Sandbox Code Playgroud)

这两行基本上是说,允许作为我的应用程序域的 app_t 类型,使用上下文写入/搜索/etc 目录,app_var_t并允许它使用上下文 app_var_t 创建/打开/删除/etc 文件

谜题的最后一部分是以某种方式告诉 SELinux 哪个文件夹和文件应该获得每种类型,您可以通过编辑app.fc文件(fc => 文件上下文)来完成此操作

在我的例子中,这个文件只有两行:

/srv/bot/app        --  gen_context(system_u:object_r:app_exec_t,s0)
/srv/bot(/.*)?          gen_context(system_u:object_r:app_var_t,s0)
Run Code Online (Sandbox Code Playgroud)

第一行直接指向部署在我的服务器上的二进制文件,因此这一行获取 app_exec_t 上下文。

第二行的意思是:

将 app_var_t 应用到目录 /srv/bot 以及目录 /srv/bot 中的所有文件

请注意第一行如何在--路径和调用之间gen_context--意味着,仅将其应用于文件。在第二种情况下,我们没有任何东西(只有空格),这意味着适用于所有匹配的目录和文件,这正是我想要的,另一种选择是只需要-d应用目录。

我现在有一个有效的策略,我可以使用自定义策略部署我的应用程序并且一切正常。(我的政策在.te文件中有更多条目,但不在此问题的范围内。)

帮助我获得此解决方案的额外阅读材料:

使用 sepolgen 让事情变得更轻松

盲目之前请三思 audit2allow -M mydomain

面向红帽开发人员的 SELinux(长 PDF)

一个SElinux模块(一):类型和规则

示例策略(特别是 postgresql)

了解文件上下文文件