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-namespace
Copy 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 -n my-namespace get seccompprofile profile1 --output wide
$ oc -n my-namespace get seccompprofile profile1 --output wide
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NAME STATUS AGE SECCOMPPROFILE.LOCALHOSTPROFILE profile1 Installed 14s operator/my-namespace/profile1.json
NAME STATUS AGE SECCOMPPROFILE.LOCALHOSTPROFILE profile1 Installed 14s operator/my-namespace/profile1.json
Copy 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/my-namespace/profile1.json
operator/my-namespace/profile1.json
Copy 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=merge
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
deployment.apps/myapp patched
deployment.apps/myapp patched
Copy 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=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.seccompProfile}'
$ oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seccompProfile}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
{"localhostProfile":"operator/my-namespace/profile.json","type":"Localhost"}
{"localhostProfile":"operator/my-namespace/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-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 출력 예
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-namepace delete pod my-pod
$ oc -n my-namepace delete pod my-pod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 보안 프로필 운영자가 두 개의 seccomp 프로필을 조정하는지 확인하세요.
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-namespace
Copy 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 2m48s
Copy 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=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 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-namespace
Copy 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 55s
Copy 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 yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow