파일 컨텍스트 정책 업데이트 및 경쟁 조건 사용

파일 컨텍스트 정책 업데이트 및 경쟁 조건 사용

작업 중 하나가 SELinux 파일 컨텍스트를 추가하고 다음 작업이 해당 새 컨텍스트를 사용하는 Ansible 플레이북이 있습니다. 즉, 필요한 경우 디렉터리의 파일 컨텍스트를 복구합니다.

플레이북을 실행하면 두 번째 작업이 여전히 이전 파일 컨텍스트 정책을 사용하고 있는 것 같습니다. 이는 디렉터리의 컨텍스트가 예상대로 수정되지 않음을 의미합니다. 두 번째로 재생을 실행한 후에야 컨텍스트가 수정되었습니다.

첫 번째 실행의 출력 예:

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 프로세스에서 연속 작업이 실행됩니다. 그런 다음 파일 컨텍스트 변경 사항이 실제로 프로세스 수준에서 캐시됩니다.

기본 파일 컨텍스트를 가져오기 위해 Ansible이 selinux.matchpathcon()(in selinux_default_context(), ) 을 호출하기 때문에 캐시됩니다 . 더 이상 사용되지 않으며 첫 번째 호출에서 모든 파일 컨텍스트를 내부적으로 캐시하는 module_utils/basic.py것으로 나타났습니다 . matchpathcon()가능한 수정 방법은 sefcontext모듈을 호출 하는 것입니다.selinux.matchpathcon_fini()정책 재로드를 호출한 후.

이런 경우가 발생합니다.미토겐연결 플러그인은 SSH 연결과 Python 프로세스를 재사용하는 데 매우 효과적이기 때문입니다. 이는 스크립트 실행 속도를 엄청나게 높여주기 때문에 좋은 것입니다.

당신은 또한 볼 수 있습니다

Puppet의 비슷한 질문- Puppet은 에이전트로 실행되므로 모든 작업은 항상 동일한 프로세스에서 실행됩니다. - matchpathcon()또한 Puppet은 캐시를 플러시하지 않고 시스템의 SELinux 정책에서 파일 컨텍스트가 변경될 때 API를 사용합니다.

관련 정보