7.7. SELinux 프로필 관리
SELinux 프로필을 만들고 관리하며 이를 워크로드에 연결합니다.
Security Profiles Operator는 Red Hat Enterprise Linux CoreOS(RHCOS) 워커 노드만 지원합니다. Red Hat Enterprise Linux(RHEL) 노드는 지원되지 않습니다.
7.7.1. SELinux 프로필 생성 링크 복사링크가 클립보드에 복사되었습니다!
SelinuxProfile
객체를 사용하여 프로필을 만듭니다.
SelinuxProfile
객체에는 보안 강화와 가독성 향상을 위한 여러 가지 기능이 있습니다.
-
상속할 프로필을 현재 네임스페이스나 시스템 전체 프로필로 제한합니다. 일반적으로 시스템에 많은 프로필이 설치되어 있지만 클러스터 워크로드에서는 하위 집합만 사용해야 하므로 상속 가능한 시스템 프로필은
spec.selinuxOptions.allowedSystemProfiles
의spod
인스턴스에 나열됩니다. - 권한, 클래스, 레이블에 대한 기본적인 검증을 수행합니다.
-
정책을 사용하는 프로세스를 설명하는 새로운 키워드
@self를
추가합니다. 이를 통해 정책 사용이 이름과 네임스페이스를 기반으로 하므로 워크로드와 네임스페이스 간에 정책을 쉽게 재사용할 수 있습니다. - SELinux CIL 언어로 프로필을 직접 작성하는 것에 비해 보안을 강화하고 가독성을 높이는 기능을 추가합니다.
프로세스
다음 명령을 실행하여 프로젝트를 만듭니다.
oc new-project nginx-deploy
$ oc new-project nginx-deploy
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음
SelinuxProfile
객체를 만들어 권한이 없는 작업 부하와 함께 사용할 수 있는 정책을 만듭니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여
selinuxd가
정책을 설치할 때까지 기다리세요.oc wait --for=condition=ready -n nginx-deploy selinuxprofile nginx-secure
$ oc wait --for=condition=ready -n nginx-deploy selinuxprofile nginx-secure
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
selinuxprofile.security-profiles-operator.x-k8s.io/nginx-secure condition met
selinuxprofile.security-profiles-operator.x-k8s.io/nginx-secure condition met
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 정책은 Security Profiles Operator가 소유한 컨테이너의
emptyDir
에 배치됩니다. 정책은/etc/selinux.d/<name>_<namespace>.cil
에 CIL(Common Intermediate Language) 형식으로 저장됩니다.다음 명령을 실행하여 포드에 액세스하세요.
oc -n openshift-security-profiles rsh -c selinuxd ds/spod
$ oc -n openshift-security-profiles rsh -c selinuxd ds/spod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
검증
다음 명령을 실행하여
cat
으로 파일 내용을 확인하세요.cat /etc/selinux.d/nginx-secure_nginx-deploy.cil
$ cat /etc/selinux.d/nginx-secure_nginx-deploy.cil
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 정책이 설치되었는지 확인하세요.
semodule -l | grep nginx-secure
$ semodule -l | grep nginx-secure
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
nginx-secure_nginx-deploy
nginx-secure_nginx-deploy
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.7.2. 포드에 SELinux 프로필 적용 링크 복사링크가 클립보드에 복사되었습니다!
생성된 프로필 중 하나를 적용하기 위해 포드를 생성합니다.
SELinux 프로필의 경우, 권한 있는 작업을 허용하려면 네임스페이스에 레이블을 지정해야 합니다.
프로세스
다음 명령을 실행하여
nginx-deploy
네임스페이스에scc.podSecurityLabelSync=false
레이블을 적용합니다.oc label ns nginx-deploy security.openshift.io/scc.podSecurityLabelSync=false
$ oc label ns nginx-deploy security.openshift.io/scc.podSecurityLabelSync=false
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여
nginx-deploy
네임스페이스에권한
레이블을 적용합니다.oc label ns nginx-deploy --overwrite=true pod-security.kubernetes.io/enforce=privileged
$ oc label ns nginx-deploy --overwrite=true pod-security.kubernetes.io/enforce=privileged
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 SELinux 프로필 사용 문자열을 얻습니다.
oc get selinuxprofile.security-profiles-operator.x-k8s.io/nginx-secure -n nginx-deploy -ojsonpath='{.status.usage}'
$ oc get selinuxprofile.security-profiles-operator.x-k8s.io/nginx-secure -n nginx-deploy -ojsonpath='{.status.usage}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
nginx-secure_nginx-deploy.process
nginx-secure_nginx-deploy.process
Copy to Clipboard Copied! Toggle word wrap Toggle overflow .spec.containers[].securityContext.seLinuxOptions
특성의 작업 매니페스트에 출력 문자열을 적용합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 중요SELinux
유형은
워크로드를 생성하기 전에 존재해야 합니다.
7.7.2.1. SELinux 로그 정책 적용 링크 복사링크가 클립보드에 복사되었습니다!
정책 위반이나 AVC 거부를 기록하려면 SElinuxProfile
프로필을 permissive
로 설정합니다.
이 절차에서는 로깅 정책을 정의합니다. 이는 시행 정책을 설정하지 않습니다.
프로세스
SElinuxProfile
에permissive: true를
추가합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.7.2.2. ProfileBindings를 사용하여 프로파일에 워크로드 바인딩 링크 복사링크가 클립보드에 복사되었습니다!
ProfileBinding
리소스를 사용하면 보안 프로필을 컨테이너의 SecurityContext
에 바인딩할 수 있습니다.
프로세스
quay.io/security-profiles-operator/test-nginx-unprivileged:1.21
이미지를 사용하는 포드를 예제SelinuxProfile
프로필에 바인딩하려면 포드와SelinuxProfile
개체가 있는 동일한 네임스페이스에ProfileBinding
개체를 만듭니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 중요이미지 사용: "*"
와일드카드 속성은 지정된 네임스페이스의 기본 보안 프로필에 모든 새 포드를 바인딩합니다.다음 명령을 실행하여 네임스페이스에
enable-binding=true라는
레이블을 지정합니다.oc label ns my-namespace spo.x-k8s.io/enable-binding=true
$ oc label ns my-namespace spo.x-k8s.io/enable-binding=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow test-pod.yaml
이라는 이름의 Pod를 정의합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pod를 생성합니다.
oc create -f test-pod.yaml
$ oc create -f test-pod.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 참고포드가 이미 존재하는 경우 바인딩이 제대로 작동하도록 포드를 다시 만들어야 합니다.
검증
다음 명령을 실행하여 Pod가
ProfileBinding을
상속하는지 확인하세요.oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seLinuxOptions.type}'
$ oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seLinuxOptions.type}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
profile_nginx-binding.process
profile_nginx-binding.process
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.7.2.3. 컨트롤러 및 SecurityContextConstraints 복제 링크 복사링크가 클립보드에 복사되었습니다!
배포나 데몬 세트와 같은 컨트롤러 복제를 위한 SELinux 정책을 배포하는 경우, 컨트롤러에서 생성된 Pod
객체가 워크로드를 생성한 사용자의 ID로 실행되지 않는다는 점에 유의하세요. ServiceAccount를
선택하지 않으면 포드는 사용자 지정 보안 정책을 사용할 수 없는 제한된 SecurityContextConstraints
(SCC)를 다시 사용하게 될 수 있습니다.
프로세스
다음 명령을 실행하여 프로젝트를 만듭니다.
oc new-project nginx-secure
$ oc new-project nginx-secure
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux 정책을
nginx-secure
네임스페이스에서 사용할 수 있도록 다음RoleBinding
객체를 만듭니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 역할
객체를 생성합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServiceAccount
객체를 생성합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 배포
객체를 생성합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 배포가 생성되기 전에
.seLinuxOptions.type
이 존재해야 합니다.
참고SELinux 유형은 작업 부하에 지정되지 않으며 SCC에서 처리합니다. 배포와
ReplicaSet을
통해 포드가 생성되면 포드는 적절한 프로필로 실행됩니다.
SCC가 올바른 서비스 계정에서만 사용 가능한지 확인하세요. 자세한 내용은 추가 자료 를 참조하세요.
7.7.3. 워크로드에서 프로필 기록 링크 복사링크가 클립보드에 복사되었습니다!
보안 프로필 운영자는 ProfileRecording
객체를 사용하여 시스템 호출을 기록할 수 있으므로 애플리케이션에 대한 기준 프로필을 더 쉽게 만들 수 있습니다.
SELinux 프로필을 기록하기 위해 로그 인리치더를 사용할 때 로그 인리치더 기능이 활성화되어 있는지 확인하세요. 자세한 내용은 추가 자료를 참조하세요.
권한이 있는 컨테이너: 진정한
보안 컨텍스트 제한으로 인해 로그 기반 기록이 방지됩니다. 특권 컨테이너는 SELinux 정책의 적용을 받지 않으며, 로그 기반 기록은 특별한 SELinux 프로필을 사용하여 이벤트를 기록합니다.
프로세스
다음 명령을 실행하여 프로젝트를 만듭니다.
oc new-project my-namespace
$ oc new-project my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 네임스페이스에
enable-recording=true라는
레이블을 지정합니다.oc label ns my-namespace spo.x-k8s.io/enable-recording=true
$ oc label ns my-namespace spo.x-k8s.io/enable-recording=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 레코더: 로그
변수를 포함하는ProfileRecording
객체를 생성합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 기록할 작업 부하를 생성합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 입력하여 Pod가
실행
상태인지 확인하세요.oc -n my-namespace get pods
$ oc -n my-namespace get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NAME READY STATUS RESTARTS AGE my-pod 2/2 Running 0 18s
NAME READY STATUS RESTARTS AGE my-pod 2/2 Running 0 18s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 강화자가 해당 컨테이너에 대한 감사 로그를 수신한다는 것을 나타내는지 확인하세요.
oc -n openshift-security-profiles logs --since=1m --selector name=spod -c log-enricher
$ oc -n openshift-security-profiles logs --since=1m --selector name=spod -c log-enricher
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
I0517 13:55:36.383187 348295 enricher.go:376] log-enricher "msg"="audit" "container"="redis" "namespace"="my-namespace" "node"="ip-10-0-189-53.us-east-2.compute.internal" "perm"="name_bind" "pod"="my-pod" "profile"="test-recording_redis_6kmrb_1684331729" "scontext"="system_u:system_r:selinuxrecording.process:s0:c4,c27" "tclass"="tcp_socket" "tcontext"="system_u:object_r:redis_port_t:s0" "timestamp"="1684331735.105:273965" "type"="selinux"
I0517 13:55:36.383187 348295 enricher.go:376] log-enricher "msg"="audit" "container"="redis" "namespace"="my-namespace" "node"="ip-10-0-189-53.us-east-2.compute.internal" "perm"="name_bind" "pod"="my-pod" "profile"="test-recording_redis_6kmrb_1684331729" "scontext"="system_u:system_r:selinuxrecording.process:s0:c4,c27" "tclass"="tcp_socket" "tcontext"="system_u:object_r:redis_port_t:s0" "timestamp"="1684331735.105:273965" "type"="selinux"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
검증
포드를 제거하세요:
oc -n my-namepace delete pod my-pod
$ oc -n my-namepace delete pod my-pod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 보안 프로필 운영자가 두 개의 SELinux 프로필을 조정하는지 확인하세요.
oc get selinuxprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
$ oc get selinuxprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow selinuxprofile의 출력 예
NAME USAGE STATE test-recording-nginx test-recording-nginx_my-namespace.process Installed test-recording-redis test-recording-redis_my-namespace.process Installed
NAME USAGE STATE test-recording-nginx test-recording-nginx_my-namespace.process Installed test-recording-redis test-recording-redis_my-namespace.process Installed
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.7.3.1. 컨테이너별 프로필 인스턴스 병합 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 각 컨테이너 인스턴스는 별도의 프로필에 기록됩니다. 보안 프로필 운영자는 컨테이너별 프로필을 단일 프로필로 병합할 수 있습니다. ReplicaSet
또는 배포
객체를 사용하여 애플리케이션을 배포할 때 프로필을 병합하는 것이 유용합니다.
프로세스
ProfileRecording
객체를 편집하여mergeStrategy:containers
변수를 포함합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 네임스페이스에 레이블을 지정합니다.
oc label ns my-namespace security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite=true
$ oc label ns my-namespace security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 YAML을 사용하여 워크로드를 생성합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 개별 프로필을 기록하려면 다음 명령을 실행하여 배포를 삭제합니다.
oc delete deployment nginx-deploy -n my-namespace
$ oc delete deployment nginx-deploy -n my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 프로필을 병합하려면 다음 명령을 실행하여 프로필 레코딩을 삭제합니다.
oc delete profilerecording test-recording -n my-namespace
$ oc delete profilerecording test-recording -n my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 병합 작업을 시작하고 결과 프로필을 생성하려면 다음 명령을 실행합니다.
oc get selinuxprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
$ oc get selinuxprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow selinuxprofiles의 출력 예
NAME USAGE STATE test-recording-nginx-record test-recording-nginx-record_my-namespace.process Installed
NAME USAGE STATE test-recording-nginx-record test-recording-nginx-record_my-namespace.process Installed
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 컨테이너에서 사용하는 권한을 보려면 다음 명령을 실행합니다.
oc get selinuxprofiles test-recording-nginx-record -o yaml
$ oc get selinuxprofiles test-recording-nginx-record -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.7.3.2. About seLinuxContext: RunAsAny 링크 복사링크가 클립보드에 복사되었습니다!
SELinux 정책 기록은 기록 중인 포드에 특수 SELinux 유형을 삽입하는 Webhook를 사용하여 구현됩니다. SELinux 유형은 pod를 허용
모드로 실행하고 모든 AVC 거부를 audit.log
에 기록합니다. 기본적으로 워크로드는 사용자 지정 SELinux 정책으로 실행할 수 없지만 자동 생성 유형을 사용합니다.
워크로드를 기록하려면 Webhook에서 허용 SELinux 유형을 삽입할 수 있는 SCC를 사용할 수 있는 권한이 있는 서비스 계정을 사용해야 합니다. 권한 있는
SCC에는 seLinuxContext: RunAsAny
가 포함되어 있습니다.
또한 privileged
Pod 보안 표준 에서만 사용자 정의 SELinux 정책을 사용할 수 있으므로 클러스터가 Pod Security Admission 을 활성화하는 경우 pod-security.kubernetes.io/enforce: privileged
로 네임스페이스에 라벨을 지정해야 합니다.