7.8. Advanced Security Profiles Operator 작업
고급 작업을 사용하여 메트릭을 활성화하거나 Webhook를 구성하거나 syscall을 제한합니다.
7.8.1. seccomp 프로필에서 허용되는 syscalls 제한
Security Profiles Operator는 기본적으로 seccomp
프로필 의 syscall
을 제한하지 않습니다. spod
구성에서 허용된 syscall
목록을 정의할 수 있습니다.
프로세스
allowedSyscalls
목록을 정의하려면 다음 명령을 실행하여spec
매개변수를 조정합니다.$ oc -n openshift-security-profiles patch spod spod --type merge \ -p '{"spec":{"allowedSyscalls": ["exit", "exit_group", "futex", "nanosleep"]}}'
Operator는 허용된 목록에 정의된 syscall의
하위 집합이 있는 seccomp
프로필만 설치합니다. 이 규칙 세트를 준수하지 않는 모든 프로필이 거부됩니다.
spod
구성에서 허용되는 syscall
목록이 수정되면 Operator는 준수하지 않는 이미 설치된 프로필을 확인하고 자동으로 제거합니다.
7.8.2. 컨테이너 런타임의 기본 syscall
baseProfileName
속성을 사용하여 지정된 런타임에서 컨테이너를 시작하는 데 필요한 최소 syscall
을 설정할 수 있습니다.
프로세스
SeccompProfile
kind 오브젝트를 편집하고baseProfileName: runc-v1.0.0
을spec
필드에 추가합니다.apiVersion: security-profiles-operator.x-k8s.io/v1beta1 kind: SeccompProfile metadata: namespace: my-namespace name: example-name spec: defaultAction: SCMP_ACT_ERRNO baseProfileName: runc-v1.0.0 syscalls: - action: SCMP_ACT_ALLOW names: - exit_group
7.8.3. spod 데몬에서 메모리 최적화 활성화
spod
데몬 프로세스 내에서 실행 중인 컨트롤러는 프로파일 레코딩이 활성화된 경우 클러스터에서 사용 가능한 모든 Pod를 감시합니다. 이로 인해 대규모 클러스터에서 메모리 사용량이 매우 높아져 spod
데몬이 메모리가 부족하거나 충돌할 수 있습니다.
충돌을 방지하기 위해 spod
데몬은 프로파일 레코딩용으로 레이블이 지정된 Pod만 캐시 메모리에 로드하도록 구성할 수 있습니다.
SPO 메모리 최적화는 기본적으로 활성화되어 있지 않습니다.
프로세스
다음 명령을 실행하여 메모리 최적화를 활성화합니다.
$ oc -n openshift-security-profiles patch spod spod --type=merge -p '{"spec":{"enableMemoryOptimization":true}}'
Pod의 보안 프로필을 기록하려면 Pod에
spo.x-k8s.io/enable-recording: "true"
로 레이블이 지정되어야 합니다.apiVersion: v1 kind: Pod metadata: name: my-recording-pod labels: spo.x-k8s.io/enable-recording: "true" # ...
7.8.4. 데몬 리소스 요구 사항 사용자 정의
데몬 컨테이너의 기본 리소스 요구 사항은 spod
구성의 daemonResourceRequirements
필드를 사용하여 조정할 수 있습니다.
프로세스
데몬 컨테이너의 메모리 및 cpu 요청 및 제한을 지정하려면 다음 명령을 실행합니다.
$ oc -n openshift-security-profiles patch spod spod --type merge -p \ '{"spec":{"daemonResourceRequirements": { \ "requests": {"memory": "256Mi", "cpu": "250m"}, \ "limits": {"memory": "512Mi", "cpu": "500m"}}}}'
7.8.5. spod 데몬 Pod의 사용자 정의 우선순위 클래스 이름 설정
spod
데몬 Pod의 기본 우선순위 클래스 이름은 system-node-critical
로 설정됩니다. priorityClassName
필드에 값을 설정하여 사용자 정의 우선순위 클래스 이름을 spod
구성에 구성할 수 있습니다.
프로세스
다음 명령을 실행하여 우선순위 클래스 이름을 구성합니다.
$ oc -n openshift-security-profiles patch spod spod --type=merge -p '{"spec":{"priorityClassName":"my-priority-class"}}'
출력 예
securityprofilesoperatordaemon.openshift-security-profiles.x-k8s.io/spod patched
7.8.6. 메트릭 사용
openshift-security-profiles
네임스페이스는 kube-rbac-proxy 컨테이너에서 보안되는 메트릭 끝점을 제공합니다. 모든 메트릭은 openshift-security-profiles
네임스페이스 내에서 메트릭
서비스에 의해 노출됩니다.
Security Profiles Operator에는 클러스터 역할 및 해당 바인딩 spo-metrics-client
가 포함되어 클러스터 내에서 지표를 검색합니다. 다음 두 가지 메트릭 경로를 사용할 수 있습니다.
-
metrics.openshift-security-profiles/metrics
: 컨트롤러 런타임 지표의 경우 -
metrics.openshift-security-profiles/metrics-spod
: Operator 데몬 지표의 경우
프로세스
메트릭 서비스의 상태를 보려면 다음 명령을 실행합니다.
$ oc get svc/metrics -n openshift-security-profiles
출력 예
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE metrics ClusterIP 10.0.0.228 <none> 443/TCP 43s
지표를 검색하려면 다음 명령을 실행하여
openshift-security-profiles
네임스페이스에서 기본ServiceAccount
토큰을 사용하여 서비스 끝점을 쿼리합니다.$ oc run --rm -i --restart=Never --image=registry.fedoraproject.org/fedora-minimal:latest \ -n openshift-security-profiles metrics-test -- bash -c \ 'curl -ks -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://metrics.openshift-security-profiles/metrics-spod'
출력 예
# HELP security_profiles_operator_seccomp_profile_total Counter about seccomp profile operations. # TYPE security_profiles_operator_seccomp_profile_total counter security_profiles_operator_seccomp_profile_total{operation="delete"} 1 security_profiles_operator_seccomp_profile_total{operation="update"} 2
다른 네임스페이스에서 지표를 검색하려면 다음 명령을 실행하여
ServiceAccount
를spo-metrics-client
ClusterRoleBinding
에 연결합니다.$ oc get clusterrolebinding spo-metrics-client -o wide
출력 예
NAME ROLE AGE USERS GROUPS SERVICEACCOUNTS spo-metrics-client ClusterRole/spo-metrics-client 35m openshift-security-profiles/default
7.8.6.1. controller-runtime 메트릭
controller-runtime 메트릭
및 DaemonSet 끝점 metrics-spod
는 기본 지표 세트를 제공합니다. 추가 메트릭은 데몬에서 제공하며 항상 security_profiles_operator_
접두사가 붙습니다.
메트릭 키 | 가능한 레이블 | 유형 | 목적 |
---|---|---|---|
|
| 카운터 | seccomp 프로필 작업의 양입니다. |
|
| 카운터 | seccomp 프로필 감사 작업의 양입니다. 로그를 더 강화해야 합니다. |
|
| 카운터 | seccomp 프로필 bpf 작업의 양입니다. bpf 레코더를 활성화해야 합니다. |
|
| 카운터 | seccomp 프로필 오류의 양입니다. |
|
| 카운터 | SELinux 프로필 작업의 양입니다. |
|
| 카운터 | SELinux 프로필 감사 작업의 양입니다. 로그를 더 강화해야 합니다. |
|
| 카운터 | SELinux 프로필 오류 수입니다. |
7.8.7. 로그 강화기 사용
Security Profiles Operator에는 기본적으로 비활성화되어 있는 로그 보강 기능이 포함되어 있습니다. 로그 강화 컨테이너는 로컬 노드에서 감사 로그를 읽을 수 있는
권한과 함께 실행됩니다. 로그 강화는 호스트 PID 네임스페이스 hostPID
내에서 실행됩니다.
로그 보강자는 호스트 프로세스를 읽을 수 있는 권한이 있어야 합니다.
프로세스
다음 명령을 실행하여
spod
구성을 패치하여 로그 강화를 활성화합니다.$ oc -n openshift-security-profiles patch spod spod \ --type=merge -p '{"spec":{"enableLogEnricher":true}}'
출력 예
securityprofilesoperatordaemon.security-profiles-operator.x-k8s.io/spod patched
참고Security Profiles Operator는
spod
데몬 세트를 자동으로 다시 배포합니다.다음 명령을 실행하여 감사 로그를 확인합니다.
$ oc -n openshift-security-profiles logs -f ds/spod log-enricher
출력 예
I0623 12:51:04.257814 1854764 deleg.go:130] setup "msg"="starting component: log-enricher" "buildDate"="1980-01-01T00:00:00Z" "compiler"="gc" "gitCommit"="unknown" "gitTreeState"="clean" "goVersion"="go1.16.2" "platform"="linux/amd64" "version"="0.4.0-dev" I0623 12:51:04.257890 1854764 enricher.go:44] log-enricher "msg"="Starting log-enricher on node: 127.0.0.1" I0623 12:51:04.257898 1854764 enricher.go:46] log-enricher "msg"="Connecting to local GRPC server" I0623 12:51:04.258061 1854764 enricher.go:69] log-enricher "msg"="Reading from file /var/log/audit/audit.log" 2021/06/23 12:51:04 Seeked /var/log/audit/audit.log - &{Offset:0 Whence:2}
7.8.7.1. 로그를 보강하여 애플리케이션 추적
Security Profiles Operator 로그를 사용하여 애플리케이션을 추적할 수 있습니다.
프로세스
애플리케이션을 추적하려면
SeccompProfile
로깅 프로필을 생성합니다.apiVersion: security-profiles-operator.x-k8s.io/v1beta1 kind: SeccompProfile metadata: name: log namespace: default spec: defaultAction: SCMP_ACT_LOG
프로필을 사용할 Pod 오브젝트를 생성합니다.
apiVersion: v1 kind: Pod metadata: name: log-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: Localhost localhostProfile: operator/default/log.json containers: - name: log-container image: quay.io/security-profiles-operator/test-nginx-unprivileged:1.21 securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL]
다음 명령을 실행하여 로그 강화 출력을 검사합니다.
$ oc -n openshift-security-profiles logs -f ds/spod log-enricher
예 7.1. 출력 예
… I0623 12:59:11.479869 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=3 "syscallName"="close" "timestamp"="1624453150.205:1061" "type"="seccomp" I0623 12:59:11.487323 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=157 "syscallName"="prctl" "timestamp"="1624453150.205:1062" "type"="seccomp" I0623 12:59:11.492157 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=157 "syscallName"="prctl" "timestamp"="1624453150.205:1063" "type"="seccomp" … I0623 12:59:20.258523 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=12 "syscallName"="brk" "timestamp"="1624453150.235:2873" "type"="seccomp" I0623 12:59:20.263349 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=21 "syscallName"="access" "timestamp"="1624453150.235:2874" "type"="seccomp" I0623 12:59:20.354091 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=257 "syscallName"="openat" "timestamp"="1624453150.235:2875" "type"="seccomp" I0623 12:59:20.358844 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=5 "syscallName"="fstat" "timestamp"="1624453150.235:2876" "type"="seccomp" I0623 12:59:20.363510 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=9 "syscallName"="mmap" "timestamp"="1624453150.235:2877" "type"="seccomp" I0623 12:59:20.454127 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=3 "syscallName"="close" "timestamp"="1624453150.235:2878" "type"="seccomp" I0623 12:59:20.458654 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=257 "syscallName"="openat" "timestamp"="1624453150.235:2879" "type"="seccomp" …
7.8.8. Webhook 구성
프로파일 바인딩 및 프로파일 레코딩 오브젝트는 Webhook를 사용할 수 있습니다. 프로필 바인딩 및 레코딩 오브젝트 구성은 MutatingWebhookConfiguration
CR이며 Security Profiles Operator에서 관리합니다.
Webhook 구성을 변경하기 위해 spod
CR은 failurePolicy
,namespaceSelector
및 objectSelector
변수를 수정할 수 있는 webhookOptions
필드를 노출합니다. 이를 통해 Webhook를 "soft-fail"로 설정하거나 Webhook가 실패하더라도 다른 네임스페이스 또는 리소스가 영향을 받지 않도록 네임스페이스의 하위 집합으로 제한할 수 있습니다.
프로세스
다음 패치 파일을 생성하여
spo-record=true
로 레이블이 지정된 Pod만 기록하도록recording.spo.io
웹 후크 구성을 설정합니다.spec: webhookOptions: - name: recording.spo.io objectSelector: matchExpressions: - key: spo-record operator: In values: - "true"
다음 명령을 실행하여
spod/spod
인스턴스를 패치합니다.$ oc -n openshift-security-profiles patch spod \ spod -p $(cat /tmp/spod-wh.patch) --type=merge
결과
MutatingWebhookConfiguration
오브젝트를 보려면 다음 명령을 실행합니다.$ oc get MutatingWebhookConfiguration \ spo-mutating-webhook-configuration -oyaml