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 문제 해결 프로세스:
- 문제가 재현될 수 있습니까? 그렇다면 2로 이동하세요.
- 허용 모드에서 작동할 수 있나요? 그렇다면 3으로 이동하세요.
- SELinux는 이벤트를 기록합니까?
ausearch -m avc,user_avc,selinux_err -i
. 그렇다면 이에 대해 설명하고/또는 audit2why가 귀하를 위해 설명하도록 하십시오. 그렇지 않은 경우 4로 이동합니다. - 실행하여
semodule -DB
SELinux를 장황하게 만든 다음 문제를 재현하고 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 예외가 허용될 수 있기 때문입니다.
- SELinux가 모드에서 실행되고 있는지 확인하십시오
Permissive
. - 거부가 /var/log/audit.log에 기록되었는지 확인하세요. 아무것도 없으면
semodule -DB
문제가 있는 프로그램을 다시 실행하고 실행하면 로그가 생성됩니다. 완료되면 실행하여semodule -B
자세한 로깅을 비활성화합니다. - 실행
audit2allow -w -a
- 사람이 읽을 수 있는 형식으로 무엇이 차단되고 있는지 보여줍니다. audit2allow -a
거부된 액세스를 허용하는 유형 적용 규칙을 보려면 실행하세요 .- 위 출력에 동의하면 실행하여
audit2allow -a -M newrules
사용자 지정 모듈을 만듭니다. 이 옵션은 다음과 같이 지정된 이름을 사용하여 현재 작업 디렉터리에-M
유형 강제 파일(.te)을 생성합니다.-M
- 모듈을 설치하려면 다음을 실행하십시오.
semodule -i newrules.pp
- SELinux를
Enforcing
테스트 기능으로 설정합니다.
only
애플리케이션이 필요하지 않은 경우 SELinux를 우회하도록 허용할 수 있으므로 구축 중인 새 서버에서 이를 실행하는 것이 좋습니다 . 이는 프로덕션 서버에서는 위험할 수 있습니다. 여러 번 언급한 경우 audit2allow
Red 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 액세스를 허용합니다.