7.6. seccomp 프로필 관리


seccomp 프로필을 생성 및 관리하고 이를 워크로드에 연결합니다.

중요

Security Profiles Operator는 Red Hat Enterprise Linux CoreOS(RHCOS) 워커 노드만 지원합니다. Red Hat Enterprise Linux(RHEL) 노드는 지원되지 않습니다.

7.6.1. seccomp 프로필 생성

SeccompProfile 객체를 사용하여 프로필을 만듭니다.

SeccompProfile 객체는 컨테이너 내의 시스템 호출을 제한하여 애플리케이션의 액세스를 제한할 수 있습니다.

프로세스

  1. 다음 명령을 실행하여 프로젝트를 만듭니다.

    $ oc new-project my-namespace
    Copy to Clipboard Toggle word wrap
  2. SeccompProfile 객체를 생성합니다.

    apiVersion: security-profiles-operator.x-k8s.io/v1beta1
    kind: SeccompProfile
    metadata:
      namespace: my-namespace
      name: profile1
    spec:
      defaultAction: SCMP_ACT_LOG
    Copy to Clipboard Toggle word wrap

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 프로파일 적용

생성된 프로필 중 하나를 적용하기 위해 포드를 생성합니다.

프로세스

  1. securityContext를 정의하는 Pod 객체를 생성합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: Localhost
          localhostProfile: operator/my-namespace/profile1.json
      containers:
        - name: test-container
          image: quay.io/security-profiles-operator/test-nginx-unprivileged:1.21
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: [ALL]
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 seccompProfile.localhostProfile 속성의 프로필 경로를 확인하세요.

    $ oc -n my-namespace get seccompprofile profile1 --output wide
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME       STATUS     AGE   SECCOMPPROFILE.LOCALHOSTPROFILE
    profile1   Installed  14s   operator/my-namespace/profile1.json
    Copy to Clipboard Toggle word wrap

  3. 다음 명령을 실행하여 localhost 프로필 경로를 확인하세요.

    $ oc get sp profile1 --output=jsonpath='{.status.localhostProfile}'
    Copy to Clipboard Toggle word wrap

    출력 예

    operator/my-namespace/profile1.json
    Copy to Clipboard Toggle word wrap

  4. localhostProfile 출력을 패치 파일에 적용합니다.

    spec:
      template:
        spec:
          securityContext:
            seccompProfile:
              type: Localhost
              localhostProfile: operator/my-namespace/profile1.json
    Copy to Clipboard Toggle word wrap
  5. 다음 명령을 실행하여 배포 개체와 같은 다른 워크로드에 프로필을 적용합니다.

    $ oc -n my-namespace patch deployment myapp --patch-file patch.yaml --type=merge
    Copy to Clipboard Toggle word wrap

    출력 예

    deployment.apps/myapp patched
    Copy to Clipboard Toggle word wrap

검증

  • 다음 명령을 실행하여 프로필이 올바르게 적용되었는지 확인하세요.

    $ oc -n my-namespace get deployment myapp --output=jsonpath='{.spec.template.spec.securityContext}' | jq .
    Copy to Clipboard Toggle word wrap

    출력 예

    {
      "seccompProfile": {
        "localhostProfile": "operator/my-namespace/profile1.json",
        "type": "localhost"
      }
    }
    Copy to Clipboard Toggle word wrap

7.6.2.1. ProfileBindings를 사용하여 프로파일에 워크로드 바인딩

ProfileBinding 리소스를 사용하면 보안 프로필을 컨테이너의 SecurityContext 에 바인딩할 수 있습니다.

프로세스

  1. quay.io/security-profiles-operator/test-nginx-unprivileged:1.21 이미지를 사용하는 포드를 예제 SeccompProfile 프로필에 바인딩하려면 포드와 SeccompProfile 개체가 있는 동일한 네임스페이스에 ProfileBinding 개체를 만듭니다.

    apiVersion: security-profiles-operator.x-k8s.io/v1alpha1
    kind: ProfileBinding
    metadata:
      namespace: my-namespace
      name: nginx-binding
    spec:
      profileRef:
        kind: SeccompProfile 
    1
    
        name: profile 
    2
    
      image: quay.io/security-profiles-operator/test-nginx-unprivileged:1.21 
    3
    Copy to Clipboard Toggle word wrap
    1
    종류: 변수는 프로필의 종류를 나타냅니다.
    2
    name: 변수는 프로필의 이름을 참조합니다.
    3
    이미지 속성에 와일드카드를 사용하여 기본 보안 프로필을 활성화할 수 있습니다: image: "*"
    중요

    이미지 사용: "*" 와일드카드 속성은 지정된 네임스페이스의 기본 보안 프로필에 모든 새 포드를 바인딩합니다.

  2. 다음 명령을 실행하여 네임스페이스에 enable-binding=true라는 레이블을 지정합니다.

    $ oc label ns my-namespace spo.x-k8s.io/enable-binding=true
    Copy to Clipboard Toggle word wrap
  3. test-pod.yaml 이라는 이름의 Pod를 정의합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-container
        image: quay.io/security-profiles-operator/test-nginx-unprivileged:1.21
    Copy to Clipboard Toggle word wrap
  4. Pod를 생성합니다.

    $ oc create -f test-pod.yaml
    Copy to Clipboard Toggle word wrap
    참고

    포드가 이미 존재하는 경우 바인딩이 제대로 작동하도록 포드를 다시 만들어야 합니다.

검증

  • 다음 명령을 실행하여 Pod가 ProfileBinding을 상속하는지 확인하세요.

    $ oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seccompProfile}'
    Copy to Clipboard Toggle word wrap

    출력 예

    {"localhostProfile":"operator/my-namespace/profile.json","type":"Localhost"}
    Copy to Clipboard Toggle word wrap

7.6.3. 워크로드에서 프로필 기록

보안 프로필 운영자는 ProfileRecording 객체를 사용하여 시스템 호출을 기록할 수 있으므로 애플리케이션에 대한 기준 프로필을 더 쉽게 만들 수 있습니다.

seccomp 프로필을 기록하기 위해 로그 강화기를 사용할 때 로그 강화기 기능이 활성화되어 있는지 확인하세요. 자세한 내용은 추가 자료를 참조하세요.

참고

권한이 있는 컨테이너: 진정한 보안 컨텍스트 제한으로 인해 로그 기반 기록이 방지됩니다. 특권 컨테이너는 seccomp 정책의 적용을 받지 않으며, 로그 기반 기록은 특수한 seccomp 프로필을 사용하여 이벤트를 기록합니다.

프로세스

  1. 다음 명령을 실행하여 프로젝트를 만듭니다.

    $ oc new-project my-namespace
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 네임스페이스에 enable-recording=true라는 레이블을 지정합니다.

    $ oc label ns my-namespace spo.x-k8s.io/enable-recording=true
    Copy to Clipboard Toggle word wrap
  3. 레코더: 로그 변수를 포함하는 ProfileRecording 객체를 생성합니다.

    apiVersion: security-profiles-operator.x-k8s.io/v1alpha1
    kind: ProfileRecording
    metadata:
      namespace: my-namespace
      name: test-recording
    spec:
      kind: SeccompProfile
      recorder: logs
      podSelector:
        matchLabels:
          app: my-app
    Copy to Clipboard Toggle word wrap
  4. 기록할 작업 부하를 생성합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      namespace: my-namespace
      name: my-pod
      labels:
        app: my-app
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      containers:
        - name: nginx
          image: quay.io/security-profiles-operator/test-nginx-unprivileged:1.21
          ports:
            - containerPort: 8080
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: [ALL]
        - name: redis
          image: quay.io/security-profiles-operator/redis:6.2.1
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: [ALL]
    Copy to Clipboard Toggle word wrap
  5. 다음 명령을 입력하여 Pod가 실행 상태인지 확인하세요.

    $ oc -n my-namespace get pods
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME     READY   STATUS    RESTARTS   AGE
    my-pod   2/2     Running   0          18s
    Copy to Clipboard Toggle word wrap

  6. 강화자가 해당 컨테이너에 대한 감사 로그를 수신한다는 것을 나타내는지 확인하세요.

    $ oc -n openshift-security-profiles logs --since=1m --selector name=spod -c log-enricher
    Copy to Clipboard Toggle word wrap

    출력 예

    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 Toggle word wrap

검증

  1. 포드를 제거하세요:

    $ oc -n my-namepace delete pod my-pod
    Copy to Clipboard Toggle word wrap
  2. 보안 프로필 운영자가 두 개의 seccomp 프로필을 조정하는지 확인하세요.

    $ oc get seccompprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
    Copy to Clipboard Toggle word wrap

    seccompprofile 출력 예

    NAME                   STATUS      AGE
    test-recording-nginx   Installed   2m48s
    test-recording-redis   Installed   2m48s
    Copy to Clipboard Toggle word wrap

7.6.3.1. 컨테이너별 프로필 인스턴스 병합

기본적으로 각 컨테이너 인스턴스는 별도의 프로필에 기록됩니다. 보안 프로필 운영자는 컨테이너별 프로필을 단일 프로필로 병합할 수 있습니다. ReplicaSet 또는 배포 객체를 사용하여 애플리케이션을 배포할 때 프로필을 병합하는 것이 유용합니다.

프로세스

  1. ProfileRecording 객체를 편집하여 mergeStrategy:containers 변수를 포함합니다.

    apiVersion: security-profiles-operator.x-k8s.io/v1alpha1
    kind: ProfileRecording
    metadata:
      # The name of the Recording is the same as the resulting SeccompProfile CRD
      # after reconciliation.
      name: test-recording
      namespace: my-namespace
    spec:
      kind: SeccompProfile
      recorder: logs
      mergeStrategy: containers
      podSelector:
        matchLabels:
          app: sp-record
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 네임스페이스에 레이블을 지정합니다.

    $ 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 Toggle word wrap
  3. 다음 YAML을 사용하여 워크로드를 생성합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deploy
      namespace: my-namespace
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: sp-record
      template:
        metadata:
          labels:
            app: sp-record
        spec:
          serviceAccountName: spo-record-sa
          containers:
          - name: nginx-record
            image: quay.io/security-profiles-operator/test-nginx-unprivileged:1.21
            ports:
            - containerPort: 8080
    Copy to Clipboard Toggle word wrap
  4. 개별 프로필을 기록하려면 다음 명령을 실행하여 배포를 삭제하세요.

    $ oc delete deployment nginx-deploy -n my-namespace
    Copy to Clipboard Toggle word wrap
  5. 프로필을 병합하려면 다음 명령을 실행하여 프로필 기록을 삭제하세요.

    $ oc delete profilerecording test-recording -n my-namespace
    Copy to Clipboard Toggle word wrap
  6. 병합 작업을 시작하고 결과 프로필을 생성하려면 다음 명령을 실행하세요.

    $ oc get seccompprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
    Copy to Clipboard Toggle word wrap

    seccompprofiles 출력 예

    NAME                          STATUS       AGE
    test-recording-nginx-record   Installed    55s
    Copy to Clipboard Toggle word wrap

  7. 컨테이너에서 사용되는 권한을 보려면 다음 명령을 실행하세요.

    $ oc get seccompprofiles test-recording-nginx-record -o yaml
    Copy to Clipboard Toggle word wrap

추가 리소스

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat