TLDR:我尝试使用的接口包含几个";optional_policy"宏。在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;
}
}
实际上,直到现在才开始意识到,根据文档";可选的";条件语句中不允许使用。
一种变通方法是将";tunable_policy"如果";或";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))))))
可能是语法错误?你的东西看起来不像记录的东西
编译器告诉你什么?
但请注意,并非所有语句都允许使用条件语句。例如,不允许在条件语句中声明/关联类型属性。确保您在条件语句中调用的任何接口都不声明/关联类型属性(或任何其他不允许的东西(
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()
实际上不是可选的。
这有点令人困惑,因为您本质上使用了两种策略语言(引用策略抽象和本机模块策略(。"是特定于引用策略的(准确地说是refpolicys对M4的使用(,而不是本机模块政策使用的。