SELinux는 qemu/libvirt가 ISO에 액세스하는 것을 방지합니다.

SELinux는 qemu/libvirt가 ISO에 액세스하는 것을 방지합니다.

libvirt가 기본 libvirt 디렉토리 외부의 이미지 및 ISO 파일에 액세스할 수 있도록 selinux를 얻을 수 없습니다. 더 실망스러운 점은 audit.log에 실패한 항목이 있음에도 불구하고 audit2allow 및 setroubleshooter에서 어떤 문제도 발견되지 않는다는 것입니다.

type=VIRT_CONTROL msg=audit(1576848063.439:6601): pid=1265 uid=0 auid=4294967295 ses=4294967295 \
subj=system_u:system_r:virtd_t:s0-s0:c0.c1023 msg='virt=kvm op=start reason=booted vm="Unifi" uuid=37eed7bf-a37f-4d49-86c2-b9a6bb8682c3 \
vm-pid=-1 exe="/usr/sbin/libvirtd" hostname=? addr=? terminal=? res=failed'UID="root" AUID="unset"

영상

-rw-------+ 1 root root system_u:object_r:svirt_image_t:s0            53695545344 Dec 20 08:31 unifi.qcow2

국제 표준화기구

-rw-rwxr--+  1 qemu    qemu system_u:object_r:virt_content_t:s0                   851443712 Sep 29  2018  ubuntu-18.04.1-live-server-amd64.iso

내 file_contexts.local 파일에는 다음 항목이 포함되어 있는데, 훈련받지 않은 사람의 눈에는 괜찮아 보입니다.

/data/libvirt(/.*)?    system_u:object_r:svirt_image_t:s0
/data/archive/ISO(/.*)?    system_u:object_r:svirt_image_t:s0

아이디어?

편집 2(AB가 요청한 업데이트):

디버깅된 SELinux 출력을 활성화합니다.

type=AVC msg=audit(1577807557.017:10195): avc:  denied  { search } for  pid=13605 comm="qemu-kvm" name="/" dev="dm-8" ino=2 scontext=system_u:system_r:svirt_t:s0:c682,c798 tcontext=system_u:object_r:container_file_t:s0:c132,c155 tclass=dir permissive=0
    Was caused by:

#Constraint rule:

#   mlsconstrain dir { ioctl read lock search } ((h1 dom h2 -Fail-)  or (t1 != mcs_constrained_type -Fail-) ); Constraint DENIED

#   Possible cause is the source level (s0:c682,c798) and target level (s0:c132,c155) are different.

Audit2allow -i /var/log/audit/audit.log -m qemu-kvm

module qemu-kvm 1.0;

require {
    type initrc_t;
    type container_file_t;
    type setroubleshootd_t;
    type NetworkManager_t;
    type svirt_t;
    type system_dbusd_t;
    class process { noatsecure rlimitinh siginh };
    class dir search;
    class capability net_admin;
}

#============= NetworkManager_t ==============
allow NetworkManager_t initrc_t:process { noatsecure rlimitinh siginh };

#============= svirt_t ==============

#!!!! This avc is a constraint violation.  You would need to modify the attributes of either the source or target types to allow this access.
#Constraint rule: 
#   mlsconstrain dir { ioctl read lock search } ((h1 dom h2 -Fail-)  or (t1 != mcs_constrained_type -Fail-) ); Constraint DENIED

#   Possible cause is the source level (s0:c682,c798) and target level (s0:c132,c155) are different.
allow svirt_t container_file_t:dir search;

#============= system_dbusd_t ==============
allow system_dbusd_t self:capability net_admin;
allow system_dbusd_t setroubleshootd_t:process { noatsecure rlimitinh siginh };

편집: 이것은 내가 받은 오류입니다. 레이블이 올바르게 보이고 qemu의 파일 권한이 rwx로 설정되어 있습니다.

Error starting domain: internal error: process exited while connecting to monitor: 2019-12-20T15:34:53.600905Z qemu-kvm: -drive file=/data/archive/ISO/ubuntu-18.04.1-live-server-amd64.iso,format=raw,if=none,id=drive-sata0-0-0,media=cdrom,readonly=on: Could not open '/data/archive/ISO/ubuntu-18.04.1-live-server-amd64.iso': Permission denied

Traceback (most recent call last):
  File "/usr/share/virt-manager/virtManager/asyncjob.py", line 75, in cb_wrapper
    callback(asyncjob, *args, **kwargs)
  File "/usr/share/virt-manager/virtManager/asyncjob.py", line 111, in tmpcb
    callback(*args, **kwargs)
  File "/usr/share/virt-manager/virtManager/object/libvirtobject.py", line 66, in newfn
    ret = fn(self, *args, **kwargs)
  File "/usr/share/virt-manager/virtManager/object/domain.py", line 1279, in startup
    self._backend.create()
  File "/usr/lib/python3/dist-packages/libvirt.py", line 1080, in create
    if ret == -1: raise libvirtError ('virDomainCreate() failed', dom=self)
libvirt.libvirtError: internal error: process exited while connecting to monitor: 2019-12-20T15:34:53.600905Z qemu-kvm: -drive file=/data/archive/ISO/ubuntu-18.04.1-live-server-amd64.iso,format=raw,if=none,id=drive-sata0-0-0,media=cdrom,readonly=on: Could not open '/data/archive/ISO/ubuntu-18.04.1-live-server-amd64.iso': Permission denied

파일 권한

getfacl /data/libvirt/images
getfacl: Removing leading '/' from absolute path names
# file: data/libvirt/images
# owner: qemu
# group: qemu
# flags: ss-
user::rwx
group::rwx
other::--x
default:user::rwx
default:user:qemu:rwx
default:group::rwx
default:group:qemu:rwx
default:mask::rwx
default:other::--x

답변1

표준 SELinux 문제 해결 프로세스:

  1. 문제가 재현될 수 있습니까? 그렇다면 2로 이동하세요.
  2. 허용 모드에서 작동할 수 있나요? 그렇다면 3으로 이동하세요.
  3. SELinux는 이벤트를 기록합니까? ausearch -m avc,user_avc,selinux_err -i. 그렇다면 이에 대해 설명하고/또는 audit2why가 귀하를 위해 설명하도록 하십시오. 그렇지 않은 경우 4로 이동합니다.
  4. 실행하여 semodule -DBSELinux를 장황하게 만든 다음 문제를 재현하고 3으로 돌아갑니다.

SELinux가 차단되면 SELinux가 기록됩니다. 솔루션을 구현하기 전에 문제를 설명할 수 있도록 사고 기록이 필요합니다.

SELinux 이벤트 로그를 제공하지 않았으므로 현재로서는 추측만 할 수 있습니다. 그것가능한사용자 정의 마운트 지점의 레이블과 관련됩니다 /data. libvirt가 순회할 수 없으면 /data이미지에 도달할 수 없습니다.

답변2

이 정보를 찾는 데 필요한 정보를 제공해준 dac.override와 AB에게 큰 감사를 드립니다.

최상위 디렉토리 "/data"를 검사하면 레이블이 표시됩니다.

system_u:object_r:container_file_t:s0:c132,c155

이는 "/data/libvirt" 디렉터리를 포함한 하위 디렉터리에도 나타납니다. 이는 "/data" 디렉터리를 백업하기 위해 매일 실행되는 컨테이너로 인해 발생합니다. 컨테이너는 다음 명령을 사용하여 이 디렉터리를 마운트합니다.

-v /data:/data:ro,Z

이는 생산 컨테이너 작업을 하면서 생긴 습관입니다. 로 변경

-v /data:/data:ro,z

libvirt를 차단하지 않고 백업이 실행되도록 허용합니다. 이제 우리는 다음과 같은 라벨을 얻습니다.

system_u:object_r:container_file_t:s0

이는 모범 사례가 아닐 가능성이 높습니다. 그래도 내 개인 서버에는 충분합니다. 다른 모든 컨테이너와 서비스는 별도의 가상 머신에서 실행되며 호스트는 호스트일 뿐입니다.

답변3

에 관련 오류가 있는 경우 audit.log새로 설치하는 경우 다음을 사용할 수 있습니다.audit2allow올바른 SELinux 구성이 자동으로 생성됩니다. 저는 개인적으로 새로 설치할 때만 이 프로그램을 실행합니다. 주의하지 않으면 승인되지 않은 소프트웨어 SELinux 예외가 허용될 수 있기 때문입니다.

  1. SELinux가 모드에서 실행되고 있는지 확인하십시오 Permissive.
  2. 거부가 /var/log/audit.log에 기록되었는지 확인하세요. 아무것도 없으면 semodule -DB문제가 있는 프로그램을 다시 실행하고 실행하면 로그가 생성됩니다. 완료되면 실행하여 semodule -B자세한 로깅을 비활성화합니다.
  3. 실행 audit2allow -w -a- 사람이 읽을 수 있는 형식으로 무엇이 차단되고 있는지 보여줍니다.
  4. audit2allow -a거부된 액세스를 허용하는 유형 적용 규칙을 보려면 실행하세요 .
  5. 위 출력에 동의하면 실행하여 audit2allow -a -M newrules사용자 지정 모듈을 만듭니다. 이 옵션은 다음과 같이 지정된 이름을 사용하여 현재 작업 디렉터리에 -M유형 강제 파일(.te)을 생성합니다.-M
  6. 모듈을 설치하려면 다음을 실행하십시오.semodule -i newrules.pp
  7. SELinux를 Enforcing테스트 기능으로 설정합니다.

only애플리케이션이 필요하지 않은 경우 SELinux를 우회하도록 허용할 수 있으므로 구축 중인 새 서버에서 이를 실행하는 것이 좋습니다 . 이는 프로덕션 서버에서는 위험할 수 있습니다. 여러 번 언급한 경우 audit2allowRed Hat 설명서에 언급된 대로 사용할 수 있습니다. grep공식 문서는 audit2allow 링크를 참조하세요.

답변4

가상 머신이 읽기/쓰기 콘텐츠를 공유할 수 있도록 하려면 이미지 폴더에 적절한 레이블을 제공해야 합니다. 태그에는 유형이 있어야 합니다.svirt_image_t:s0.

semanage fcontext -a -t svirt_image_t "/data/libvirt/images(/.*)?"
restorecon -vR /data/libvirt/images

설치한 경우,context옵션으로 추가:

mount ... /data/libvirt/images -o context="system_u:object_r:svirt_image_t:s0"
// keep default for user and role, but type is important:    ^--------------^ 

SELinux는 이제 VM/QEMU/virt-manager에서 ISO 액세스를 허용합니다.

관련 정보