ファイルコンテキストポリシーの更新と競合条件の使用

ファイルコンテキストポリシーの更新と競合条件の使用

タスクの1つがSELinuxファイルコンテキストを追加し、次のタスクがその新しいコンテキストを使用するAnsibleプレイブックがあります。つまり、必要に応じてディレクトリのファイルコンテキストを回復します。

PlayBookを実行すると、2番目のタスクはまだ古いファイルコンテキストポリシーを使用しているようです。これは、ディレクトリのコンテキストが期待どおりに変更されないことを意味します。 2番目に再生を実行した後にのみコンテキストが修正されました。

最初の実行の出力例:

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メッセージがあります。これも一致sefcontext モジュール文書SELinuxポリシーの再ロードがデフォルトで有効になっていることが示されています。

答え1

実際にAnsibleがどのように呼び出されるかによって異なります。

SSH多重化(デフォルトで有効)とSSHパイプ(通常は推奨)を使用している場合でも、Ansible(2.9.11に基づく)は再度ログインし、新しいPythonプロセスで各タスクを実行します。

この環境では、追加されたファイルコンテキストがファイル操作にすぐに表示されます。

しかし、次のようにプレイブックを実行すると、水戸接続プラグイン有効にすると、同じPythonプロセスで連続タスクが実行されます。その後、ファイルコンテキストの変更は実際にはプロセスレベルでキャッシュされます。

selinux.matchpathcon()Ansibleは(in 、)を呼び出すため、デフォルトのファイルコンテキストを取得するためにselinux_default_context()キャッシュされます。廃止され、最初の呼び出しですべてのファイルコンテキストが内部的にキャッシュされることmodule_utils/basic.pyがわかりました。matchpathcon()可能な修正方法はsefcontextモジュールを呼び出すことです。selinux.matchpathcon_fini()ポリシーの再ロードを呼び出した後。

このような場合が発生します。ミトゲン接続プラグインは、SSH接続とPythonプロセスを再利用するのに非常に効果的であるためです。これは、スクリプトの実行速度を大幅に向上させるので、良いことです。

また、見ることができます

Puppetの同様の質問- Puppetはエージェントとして実行されるため、すべてのジョブは常に同じプロセスで実行されます。 -matchpathcon()また、PuppetはキャッシュをフラッシュせずにシステムのSELinuxポリシーでファイルコンテキストが変更されたときにAPIを使用します。

関連情報