7.6. seccomp 프로필 관리
seccomp 프로필을 생성 및 관리하고 이를 워크로드에 연결합니다.
Security Profiles Operator는 Red Hat Enterprise Linux CoreOS(RHCOS) 워커 노드만 지원합니다. Red Hat Enterprise Linux(RHEL) 노드는 지원되지 않습니다.
7.6.1. seccomp 프로필 생성 링크 복사링크가 클립보드에 복사되었습니다!
SeccompProfile 객체를 사용하여 프로필을 만듭니다.
SeccompProfile 객체는 컨테이너 내의 시스템 호출을 제한하여 애플리케이션의 액세스를 제한할 수 있습니다.
프로세스
다음 명령을 실행하여 프로젝트를 만듭니다.
oc new-project my-namespace
$ oc new-project my-namespaceCopy to Clipboard Copied! Toggle word wrap Toggle overflow SeccompProfile객체를 생성합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
seccomp 프로필은 /var/lib/kubelet/seccomp/operator/<namespace>/<name>.json 에 저장됩니다.
init 컨테이너는 루트 그룹이나 사용자 ID 권한 없이 Security Profiles Operator를 실행하기 위해 Security Profiles Operator의 루트 디렉토리를 생성합니다. 루트가 없는 프로필 저장소 /var/lib/openshift-security-profiles 에서 kubelet 루트 /var/lib/kubelet/seccomp/operator 내부의 기본 seccomp 루트 경로로 심볼릭 링크가 생성됩니다.
7.6.2. 포드에 seccomp 프로파일 적용 링크 복사링크가 클립보드에 복사되었습니다!
생성된 프로필 중 하나를 적용하기 위해 포드를 생성합니다.
프로세스
securityContext를정의하는 Pod 객체를 생성합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여
seccompProfile.localhostProfile속성의 프로필 경로를 확인하세요.oc get seccompprofile profile1 --output wide
$ oc get seccompprofile profile1 --output wideCopy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NAME STATUS AGE SECCOMPPROFILE.LOCALHOSTPROFILE profile1 Installed 14s operator/profile1.json
NAME STATUS AGE SECCOMPPROFILE.LOCALHOSTPROFILE profile1 Installed 14s operator/profile1.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 localhost 프로필 경로를 확인하세요.
oc get sp profile1 --output=jsonpath='{.status.localhostProfile}'$ oc get sp profile1 --output=jsonpath='{.status.localhostProfile}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
operator/profile1.json
operator/profile1.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow localhostProfile출력을 패치 파일에 적용합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여
배포개체와 같은 다른 워크로드에 프로필을 적용합니다.oc -n my-namespace patch deployment myapp --patch-file patch.yaml --type=merge
$ oc -n my-namespace patch deployment myapp --patch-file patch.yaml --type=mergeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
deployment.apps/myapp patched
deployment.apps/myapp patchedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
검증
다음 명령을 실행하여 프로필이 올바르게 적용되었는지 확인하세요.
oc -n my-namespace get deployment myapp --output=jsonpath='{.spec.template.spec.securityContext}' | jq .$ oc -n my-namespace get deployment myapp --output=jsonpath='{.spec.template.spec.securityContext}' | jq .Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.2.1. ProfileBindings를 사용하여 프로파일에 워크로드 바인딩 링크 복사링크가 클립보드에 복사되었습니다!
ProfileBinding 리소스를 사용하면 보안 프로필을 컨테이너의 SecurityContext 에 바인딩할 수 있습니다.
프로세스
quay.io/security-profiles-operator/test-nginx-unprivileged:1.21이미지를 사용하는 포드를 예제SeccompProfile프로필에 바인딩하려면 포드와SeccompProfile개체가 있는 동일한 네임스페이스에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=trueCopy 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.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 참고포드가 이미 존재하는 경우 바인딩이 제대로 작동하도록 포드를 다시 만들어야 합니다.
검증
다음 명령을 실행하여 Pod가
ProfileBinding을상속하는지 확인하세요.oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seccompProfile}'$ oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seccompProfile}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
{"localhostProfile":"operator/profile.json","type":"Localhost"}{"localhostProfile":"operator/profile.json","type":"Localhost"}Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.3. 워크로드에서 프로필 기록 링크 복사링크가 클립보드에 복사되었습니다!
보안 프로필 운영자는 ProfileRecording 객체를 사용하여 시스템 호출을 기록할 수 있으므로 애플리케이션에 대한 기준 프로필을 더 쉽게 만들 수 있습니다.
seccomp 프로필을 기록하기 위해 로그 강화기를 사용할 때 로그 강화기 기능이 활성화되어 있는지 확인하세요. 자세한 내용은 "추가 리소스"를 참조하십시오.
권한이 있는 컨테이너: 진정한 보안 컨텍스트 제한으로 인해 로그 기반 기록이 방지됩니다. 특권 컨테이너는 seccomp 정책의 적용을 받지 않으며, 로그 기반 기록은 특수한 seccomp 프로필을 사용하여 이벤트를 기록합니다.
프로세스
다음 명령을 실행하여 프로젝트를 만듭니다.
oc new-project my-namespace
$ oc new-project my-namespaceCopy 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=trueCopy 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 podsCopy 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 18sCopy 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-enricherCopy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
I0523 14:19:08.747313 430694 enricher.go:445] log-enricher "msg"="audit" "container"="redis" "executable"="/usr/local/bin/redis-server" "namespace"="my-namespace" "node"="xiyuan-23-5g2q9-worker-eastus2-6rpgf" "pid"=656802 "pod"="my-pod" "syscallID"=0 "syscallName"="read" "timestamp"="1684851548.745:207179" "type"="seccomp"
I0523 14:19:08.747313 430694 enricher.go:445] log-enricher "msg"="audit" "container"="redis" "executable"="/usr/local/bin/redis-server" "namespace"="my-namespace" "node"="xiyuan-23-5g2q9-worker-eastus2-6rpgf" "pid"=656802 "pod"="my-pod" "syscallID"=0 "syscallName"="read" "timestamp"="1684851548.745:207179" "type"="seccomp"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
검증
포드를 제거하세요:
oc -n my-namespace delete pod my-pod
$ oc -n my-namespace delete pod my-podCopy to Clipboard Copied! Toggle word wrap Toggle overflow 보안 프로필 운영자가 두 개의 seccomp 프로필을 조정하는지 확인하세요.
oc get seccompprofiles -lspo.x-k8s.io/recording-id=test-recording
$ oc get seccompprofiles -lspo.x-k8s.io/recording-id=test-recordingCopy to Clipboard Copied! Toggle word wrap Toggle overflow seccompprofile 출력 예
NAME STATUS AGE test-recording-nginx Installed 2m48s test-recording-redis Installed 2m48s
NAME STATUS AGE test-recording-nginx Installed 2m48s test-recording-redis Installed 2m48sCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.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=trueCopy 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-namespaceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 프로필을 병합하려면 다음 명령을 실행하여 프로필 기록을 삭제하세요.
oc delete profilerecording test-recording -n my-namespace
$ oc delete profilerecording test-recording -n my-namespaceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 병합 작업을 시작하고 결과 프로필을 생성하려면 다음 명령을 실행하세요.
oc get seccompprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
$ oc get seccompprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespaceCopy to Clipboard Copied! Toggle word wrap Toggle overflow seccompprofiles 출력 예
NAME STATUS AGE test-recording-nginx-record Installed 55s
NAME STATUS AGE test-recording-nginx-record Installed 55sCopy to Clipboard Copied! Toggle word wrap Toggle overflow 컨테이너에서 사용되는 권한을 보려면 다음 명령을 실행하세요.
oc get seccompprofiles test-recording-nginx-record -o yaml
$ oc get seccompprofiles test-recording-nginx-record -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow