Selinux

文件上下文策略更新與使用競爭條件

  • September 13, 2020

我有一個 Ansible 劇本,其中一個任務添加了 SELinux 文件上下文,並且以下任務應該使用該新上下文 - 即在必要時修復目錄的文件上下文。

當我執行劇本時,看起來第二個任務仍然使用舊的文件上下文策略。這意味著它不會按預期修復目錄的上下文。只有在我第二次執行播放後,上下文才被修復。

第一次執行的範例輸出:

TASK [web : add file contexts] ****
# Addition to semanage file context mappings
+/srv/fubar(/.*)?      a      system_u:object_r:httpd_sys_content_t:s0
changed: [example.org]

TASK [create webroot] **********
--- before
+++ after
@@ -1,7 +1,7 @@
{
    "path": "/srv/fubar",
    "secontext": [
-        "unconfined_u",
+        "system_u",
        "object_r",
        "var_t",
        "s0"

changed: [example.org]

而立即重新執行劇本會產生:

TASK [web : add file contexts] ****
ok: [example.org]

TASK [create webroot] *******
--- before
+++ after
@@ -3,7 +3,7 @@
    "secontext": [
        "system_u",
        "object_r",
-        "var_t",
+        "httpd_sys_content_t",
        "s0"
    ]
}

changed: [example.org]

正如預期的那樣,進一步的執行不會產生任何變化。

Ansible 任務如下所示:

- name: add file contexts
 sefcontext:
     target: '/srv/fubar(/.*)?'
     setype: httpd_sys_content_t
     state: present

- name: create webroot
 file:
     state: directory
     dest: /srv/fubar
     owner: juser
     group: juser
     mode: '0755'
     setype: _default
     seuser: _default

我在這裡想念什麼?

一般來說,像這樣更新 SELinux 文件上下文時是否存在一些競爭條件?

在查看日誌文件時,有一些 SELinux 消息說策略已重新載入——不過,就在下一個任務執行之前。這也與預設情況下啟用 SELinux 策略重新載入的sefcontext 模組文件相匹配。

這實際上取決於如何呼叫 Ansible。

即使使用 SSH 多路復用(預設啟用)和 SSH 管道(通常推薦),Ansible(從 2.9.11 開始)重新登錄並在新的 Python 程序中執行每個任務。

在該環境中,添加的文件上下文在文件任務中立即可見。

但是,當您在啟用Mitogen 連接外掛的情況下執行 playbook 時,連續的任務將在同一個 Python 程序中執行。然後文件上下文更改實際上是在程序級別記憶體的。

它被記憶體是因為 Ansible 呼叫selinux.matchpathcon()(in selinux_default_context(), module_utils/basic.py) 來獲取預設文件上下文。事實證明,它matchpathcon()已被棄用,並在第一次呼叫時在內部記憶體所有文件上下文。一個可能的解決方法是sefcontext模組selinux.matchpathcon_fini()在呼叫策略重新載入後呼叫。

Mitogen連接外掛會發生這種情況,因為它非常擅長重用 ssh 連接和 python 程序。這是一件好事,因為這大大加快了劇本的執行速度。

也可以看看

Puppet 中的類似問題- 因為 Puppet 作為代理執行 - 所有任務總是在同一個程序中執行 -matchpathcon()當系統的 SELinux 策略中的文件上下文發生更改時,Puppet 也使用 API 而不刷新其記憶體。

引用自:https://unix.stackexchange.com/questions/609106