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/optional 陳述句組合。根據SELinux Notebook的可選陳述句在策略模塊中的 if 陳述句中是有效的,所以我真的很茫然。
if(`mymodule_use_network'){
optional {
require {
type fonts_t;
}
allow mymodule_t fonts_t:dir getattr;
}
}
uj5u.com熱心網友回復:
實際上,直到現在才開始陷入困境,根據檔案,條件句中不允許使用“可選”陳述句。
一種解決方法是用“可選”代替“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;
}
}
或參考政策,類似于:
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))))))
uj5u.com熱心網友回復:
可能是語法錯誤?你的東西看起來不像記錄的那樣
編譯器告訴你什么?
請注意,并非所有陳述句都允許在條件句中使用。例如,您不允許在條件句中宣告/關聯型別屬性。確保您在條件中呼叫的任何介面都沒有宣告/關聯型別屬性(或任何其他不允許的東西)
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 的使用)這不是本機模塊策略用途。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/448421.html
上一篇:Flutter保密存盤
