我编写了一个服务/单个二进制应用程序,我试图在 Fedora 24 上运行,它使用 systemd 运行,二进制文件部署到/srv/bot
我编写的这个服务/应用程序需要创建/打开/读取并重命名该目录中的文件。
我首先开始根据以下内容制定新政策SELinux:允许进程在某个目录中创建任何文件
但是当我的应用程序需要重命名时,输出出现警告:
#!!!! WARNING: 'var_t' is a base type.
allow init_t var_t:file rename;
我用 google 搜索了一下,发现我应该使用比基本类型更具体的 SELinux 标签,但所有在线示例都向您展示了来自 httpd/nginx/etc 的现有标签。
有没有办法为我自己的应用程序创建自定义标签?
我的想法是创建类似 myapp_var_t 的东西,使用
semanage fcontext -a -t my_app_var_t '/srv/bot(/.*)?'
restorecon -R -v /srv/bot
以及.pp
将使用此自定义类型的自定义文件
如果有更好的方法来解决它,那也是可行的。
谢谢
更新
经过更多的搜索后,我认为我想做的事情的正确术语是创造新的,types
这让我
https://docs.fedoraproject.org/en-US/Fedora/13/html/SELinux_FAQ/index.html#id3036916
基本上就是说,运行
sepolgen /path/to/binary
我能够获得一个模板,然后可以将其编译成 pp 文件并加载,仍然会出现一些错误,但看起来我更接近我想要做的事情。
如果我让它工作,我会更新这篇文章
答案1
与跑步的起点
sepolgen /path/to/binary
这给你:
app.fc
app.sh
app.if
app.spec
app.te
要创建一个新的SELinux file context
应用到保存程序/守护程序将修改的文件的父目录,请编辑 app.te 文件并添加:
type app_var_t;
files_type(app_var_t)
第一行声明新类型,第二行调用一个宏,该宏执行一些魔法并使其成为文件类型(事实证明您不能在文件或目录上使用进程上下文行 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 };
这两行基本上是说,允许作为我的应用程序域的 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)
第一行直接指向部署在我的服务器上的二进制文件,因此这一行获取 app_exec_t 上下文。
第二行的意思是:
将 app_var_t 应用于目录 /srv/bot 以及 dir /srv/bot 内的所有文件
请注意第一行在--
路径和对 的调用之间的关系gen_context
。--
意思是,仅将其应用于文件。在第二种情况下,我们没有任何东西(只是空格),这意味着,适用于所有匹配的目录和文件,这就是我想要的,另一个选择是必须-d
仅应用目录。
我现在有了一个工作策略,我可以使用自定义策略部署我的应用程序,并且一切正常。 (我的政策在文件中有更多条目.te
,但它超出了这个问题的范围。)
帮助我找到这个解决方案的额外阅读材料:
盲目地三思而后行audit2allow -M mydomain
面向红帽开发人员的 SELinux(长PDF)