在 tunable_policy 宏中使用可选时出现 SELinux 语法错误

问题描述 投票:0回答:2

TLDR:我尝试使用的界面包含一些“可选策略”宏。在 tunable_policy 宏中使用它(或任何形式的“可选”)会导致语法错误。完成此任务的正确方法是什么?请参阅下面的更新。

长版:我是 SELinux 的新手,目前正在开发一个模块来限制 Debian 上的用户应用程序。我想做的一件事是添加一个布尔值来切换网络访问。我使用类似于以下内容的内容创建了一个基本策略模块:

sepolicy generate --application -n mymodule /usr/share/foo/foo

我向生成的模块添加了一个新的可调参数。

gen_tunable(mymodule_use_network,false)

tunable_policy(`mymodule_use_network',`
   sysnet_dns_name_resolve(mymodule_t)
')

上面显示的接口调用是由 sepolicy 生成的,我只是将其移至 tunable_policy 宏中。一旦我让 DNS 正常工作,我就会将其余的网络权限移入。

我已经尝试直接使用Optional_policy宏和普通的可选语句。当使用生成的脚本构建和加载我的模块时,我在所有情况下都会得到以下输出:

Building and Loading Policy
+ make -f /usr/share/selinux/devel/Makefile mymodule.pp
Compiling default mymodule module
mymodule.te:65:ERROR 'syntax error' at token 'optional' on line 4858:
        optional {
#line 65
/usr/bin/checkmodule:  error(s) encountered while parsing configuration
make: *** [/usr/share/selinux/devel/include/Makefile:166: tmp/mymodule.mod] Error 1
+ exit

我注意到定义这些宏的文件有一个关于注释行和 m4 的辅助函数,但我不知道它在做什么。我的问题是这样吗?作为解决方法,我可以将界面的内容复制到我的宏中,但这达不到目的。我在这里缺少什么?这确实是预期的情况,并且参考策略中没有其他可调参数包含嵌套可选语句吗?

更新:我将其归结为以下 if/可选语句组合。根据 SELinux Notebook 可选语句在策略模块的 if 语句中有效,所以我真的很茫然。

if(`mymodule_use_network'){
    optional {
        require {
            type fonts_t;
        }

        allow mymodule_t fonts_t:dir getattr;
    }
}
linux security debian selinux
2个回答
1
投票

实际上,现在才开始明白,根据文档,条件语句中不允许使用“可选”语句。

解决方法是用“可选”来包装“tunable_policy”、“if”或“booleanif”构造。

本机模块策略,例如:

module myfoo 1.0;
bool foo true;
type bar;
require { class process signal; }
if (foo) {
  allow bar self:process signal;
} else {
  dontaudit bar self:process signal;
}
optional {
  if (foo) {
    require { type baz; class file read; }
    allow bar baz:file read;
  }
}

或 refpolicy,类似于:

policy_module(myfoo, 1.0)
gen_tunable(foo, true)
type bar;
tunable_policy(`foo',`
  allow bar self:process signal;
  ',`
  dontaudit bar self:process signal;
')
optional_policy(`
  tunable_policy(`foo',`
    gen_require(` type baz; ')
    allow bar baz:file read;
  ')
')

或母语通用中间语言:

(boolean foo true)
(type bar)
(booleanif foo
  (true
    (allow bar self (process (signal))))
  (false
    (dontaudit bar self (process (signal)))))
(optional foo_optional
  (booleanif foo
    (true
      (allow bar baz (file (read))))))

-1
投票

可能是语法错误?你的东西看起来不像记录的

编译器告诉你什么?

请注意,并非所有语句都可以在条件中使用。例如,不允许您在条件中声明/关联类型属性。确保您在条件中调用的任何接口都不会声明/关联类型属性(或任何其他不允许的内容)

The only statements and rules allowed within the if / else construct are:

allow, auditallow, auditdeny, dontaudit, type_member, type_transition (except file_name_transition), type_change and require.

顺便说一句:

sysnet_dns_name_resolve()
实际上并不是可选的。

这有点令人困惑,因为您本质上使用两种策略语言(引用策略抽象和本机模块策略)“”特定于引用策略(准确地说,引用策略使用 M4)这不是本机模块的东西政策用途。

© www.soinside.com 2019 - 2024. All rights reserved.