我编写了一个服务/单个二进制应用程序,试图在Fedora 24上运行,它使用systemd运行,二进制文件已部署到 /srv/bot
我编写的此服务/应用程序需要在该目录中创建/打开/读取和重命名文件。
我首先开始基于SELinux创建新策略:允许进程在特定目录中创建任何文件
但是当我的应用需要重命名时,输出将显示警告:
#!!!! WARNING: 'var_t' is a base type.
allow init_t var_t:file rename;
我四处搜寻,发现我应该使用比基本类型更具体的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文件并加载,仍然会出现一些错误,但是看起来我已经接近要执行的操作了。
如果我可以使用,我会更新这篇文章
以跑步为起点
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以及目录/ srv / bot内的所有文件
请注意第一行在--
路径和调用之间的位置gen_context
。--
意味着,仅将其应用于文件。在第二种情况下,我们什么都没有(只有空格),这意味着我希望将其应用于所有匹配的目录和文件,另一种选择是-d
仅应用目录。
我现在有一个有效的策略,可以使用自定义策略部署我的应用程序,并且一切正常。(我的策略在.te
文件中有很多条目,但这不在此问题的范围内。)
帮助我获得此解决方案的额外阅读材料:
SELinux for RED HAT DEVELOPERS(Long PDF)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句