2.17. Linux 사용자 네임스페이스에서 Pod 실행


Linux 사용자 네임스페이스를 사용하면 관리자가 컨테이너 사용자 및 그룹 식별자(UID 및 GID)를 격리하여 컨테이너가 실행 중인 호스트 시스템과 비교하여 사용자 네임스페이스에 다른 권한 집합을 가질 수 있습니다. 이를 통해 컨테이너는 사용자 네임스페이스 내에서 전체 권한으로 프로세스를 실행할 수 있지만, 프로세스는 호스트 시스템의 작업에 대해 권한이 없을 수 있습니다.

기본적으로 컨테이너는 호스트 사용자 네임스페이스에서 실행됩니다. 호스트 사용자 네임스페이스에서 컨테이너를 실행하면 컨테이너에 호스트 네임스페이스에서만 사용할 수 있는 기능이 필요한 경우 유용할 수 있습니다. 그러나 호스트 네임스페이스에서 Pod를 실행하면 다른 컨테이너 내부의 프로세스가 호스트 또는 컨테이너의 파일에 액세스하거나 수정할 수 있는 호스트로 중단될 수 있는 컨테이너 중단 가능성과 같은 보안 문제가 발생합니다.

개별 사용자 네임스페이스에서 컨테이너를 실행하면 컨테이너가 다른 Pod 및 노드 자체에 발생할 수 있는 컨테이너 중단 및 기타 여러 취약점을 완화할 수 있습니다.

2.17.1. Linux 사용자 네임스페이스 지원 구성

다음 절차에 표시된 대로 pod 사양에서 hostUsers 매개변수를 false 로 설정하고 기타 몇 가지 구성을 설정하여 Linux 사용자 네임스페이스를 구성할 수 있습니다.

사용자 네임스페이스에서 워크로드를 실행하면 컨테이너 외부의 UID 또는 GID가 표시되는 내부와 다르므로 fsGroup, runAsGroup ,runAsGroup,runAsUser, supplementalGroups 와 같은 RunAsAny for SCC(보안 컨텍스트 제약 조건) 필드를 구성하는 것이 안전합니다.

보안을 강화하기 위해 Linux 사용자 네임스페이스의 워크로드에 맞게 특별히 설계된 restricted-v3 또는 nested-container SCC를 사용할 수 있습니다. SCC의 userNamespaceLevel: RequirePodLevel 필드에는 워크로드를 사용자 네임스페이스에서 실행해야 합니다. SCC에 대한 자세한 내용은 "보안 컨텍스트 제약 조건 관리"를 참조하십시오.

워크로드에 대한 특정 SCC를 사용하려면 oc adm policy add-scc-to-user 또는 oc adm policy add-scc-to-group 명령을 사용하여 특정 사용자 또는 그룹에 SCC를 추가할 수 있습니다. 자세한 내용은 "OpenShift CLI 관리자 명령 참조"를 참조하십시오.

또한 선택적으로 Pod 사양에서 procMount 매개변수를 사용하여 Pod의 /proc 파일 시스템을 마스킹되지 않은 것으로 구성할 수 있습니다. 일반적으로 안전한 것으로 간주되는 /proc마스크 해제로 설정하고 컨테이너 런타임의 기본 마스킹 동작을 바이패스하고 hostUsersfalse 로 설정하는 SCC에서만 사용해야 합니다.

프로세스

  1. 다음 명령을 실행하여 Pod가 배포된 OpenShift Container Platform 네임스페이스의 기본 사용자 ID(UID) 및 그룹 ID(GID) 범위를 편집합니다.

    $ oc edit ns/<namespace_name>
    Copy to Clipboard Toggle word wrap

    네임스페이스 예

    apiVersion: v1
    kind: Namespace
    metadata:
      annotations:
        openshift.io/description: ""
        openshift.io/display-name: ""
        openshift.io/requester: system:admin
        openshift.io/sa.scc.mcs: s0:c27,c24
        openshift.io/sa.scc.supplemental-groups: 1000/10000 
    1
    
        openshift.io/sa.scc.uid-range: 1000/10000 
    2
    
    # ...
      name: userns
    # ...
    Copy to Clipboard Toggle word wrap

    1
    Pod 사양에 필요한 기본 GID를 지정합니다. Linux 사용자 네임스페이스의 범위는 65535 이상이어야 합니다. 기본값은 1000000000/10000 입니다.
    2
    Pod 사양에 필요한 기본 UID를 지정합니다. Linux 사용자 네임스페이스의 범위는 65535 이상이어야 합니다. 기본값은 1000000000/10000 입니다.
    참고

    범위 1000/10000은 ID 1000으로 시작하는 10,000 값을 의미하므로 ID의 범위를 1000에서 10,999 사이로 지정합니다.

  2. 적절한 SCC와 함께 실행되도록 구성된 워크로드를 생성하고 hostUsers 매개변수를 false 로 설정하여 Linux 사용자 네임스페이스를 사용할 수 있습니다.

    1. 다음과 유사한 YAML 파일을 생성합니다.

      Pod 사양의 예

      apiVersion: v1
      kind: Pod
      metadata:
        namespace: userns
        name: userns-pod
      # ...
      spec:
      #...
        template:
          metadata:
            labels:
              app: name
            annotations:
              openshift.io/required-scc: "restricted-v3" 
      1
      
          spec:
            hostUsers: false 
      2
      
            containers:
            - name: userns-container
              image: registry.access.redhat.com/ubi9
              command: ["sleep", "1000"]
              securityContext:
                capabilities: 
      3
      
                  drop: ["ALL"]
                allowPrivilegeEscalation: false
                runAsNonRoot: true 
      4
      
                procMount: Unmasked 
      5
      
                runAsUser: 1000 
      6
      
                runAsGroup: 1000 
      7
      
      # ...
      Copy to Clipboard Toggle word wrap

      1
      이 워크로드에 사용할 SCC를 지정합니다.
      2
      사용자 네임스페이스에서 Pod를 실행할지 여부를 지정합니다. false 인 경우 Pod는 Pod에 대해 생성된 새 사용자 네임스페이스에서 실행됩니다. true 인 경우 Pod는 호스트 사용자 네임스페이스에서 실행됩니다. 기본값은 true입니다.
      3
      기능을 사용하면 전체 root 액세스 권한을 부여하지 않고 권한 있는 작업을 수행할 수 있습니다. 기술적으로 사용자 네임스페이스 내에서 기능을 설정하는 것은 기능 범위가 사용자 네임스페이스 내부에 있으면 제한되므로 외부 설정보다 안전하며 일반적으로 안전한 것으로 간주될 수 있습니다. 그러나 신뢰할 수 없는 워크로드에 CAP_SYS_ADMIN 과 같은 Pod 기능을 제공하면 컨테이너화된 프로세스가 액세스할 수 있고 악용 정보를 찾을 수 있는 잠재적인 커널 표면 영역이 증가할 수 있습니다. 따라서 사용자 네임스페이스 내부의 기능은 Pod 보안 승인의 기준 수준에서 허용됩니다.
      4
      컨테이너 내부의 프로세스가 0이 아닌 UID가 있는 사용자로 실행되도록 지정합니다.
      5
      선택 사항: 컨테이너에 사용할 proc 마운트 유형을 지정합니다. 마스킹되지 않은 값은 컨테이너의 /proc 파일 시스템이 컨테이너 프로세스에서 읽기/쓰기로 마운트되도록 합니다. 기본값은 Default 입니다.
      6
      컨테이너 내에서 실행되는 프로세스의 사용자 ID를 지정합니다. 이는 네임스페이스 오브젝트에서 설정한 범위에 속해야 합니다.
      7
      컨테이너 내부에서 실행되는 프로세스의 그룹 ID를 지정합니다. 이는 네임스페이스 오브젝트에서 설정한 범위에 속해야 합니다.
    2. 다음 명령을 실행하여 오브젝트를 생성합니다.

      $ oc create -f <file_name>.yaml
      Copy to Clipboard Toggle word wrap

검증

  1. 생성한 Pod의 컨테이너에서 사용 중인 사용자 및 그룹 ID를 확인합니다. Pod는 Linux 사용자 네임스페이스 내에 있습니다.

    1. Pod에서 컨테이너로 쉘 세션을 시작합니다.

      $ oc rsh -c <container_name> pod/<pod_name>
      Copy to Clipboard Toggle word wrap

      명령 예

      $ oc rsh -c userns-container_name pod/userns-pod
      Copy to Clipboard Toggle word wrap

    2. 컨테이너 내에서 사용 중인 사용자 및 그룹 ID를 표시합니다.

      sh-5.1$ id
      Copy to Clipboard Toggle word wrap

      출력 예

      uid=1000(1000) gid=1000(1000) groups=1000(1000) 
      1
      Copy to Clipboard Toggle word wrap

      1
      컨테이너의 UID 및 그룹은 Pod 사양에 설정한 것과 동일해야 합니다.
    3. 컨테이너 사용자 네임스페이스에서 사용 중인 사용자 ID를 표시합니다.

      sh-5.1$ lsns -t user
      Copy to Clipboard Toggle word wrap

      출력 예

              NS TYPE  NPROCS PID USER COMMAND
      4026532447 user       3   1 1000 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1000 
      1
      Copy to Clipboard Toggle word wrap

      1
      프로세스의 UID는 Pod 사양에 설정한 것과 동일해야 합니다.
  2. 노드에서 사용 중인 UID를 확인합니다. 노드는 Linux 사용자 네임스페이스 외부에 있습니다. 이 사용자 ID는 컨테이너에서 사용되는 UID와 달라야 합니다.

    1. 해당 노드의 디버그 세션을 시작합니다.

      $ oc debug node/ci-ln-z5vppzb-72292-8zp2b-worker-c-q8sh9
      Copy to Clipboard Toggle word wrap

      명령 예

      $ oc debug node/ci-ln-z5vppzb-72292-8zp2b-worker-c-q8sh9
      Copy to Clipboard Toggle word wrap

    2. 디버그 쉘 내에서 /host를 root 디렉터리로 설정합니다.

      sh-5.1# chroot /host
      Copy to Clipboard Toggle word wrap
    3. 노드에서 사용 중인 UID를 표시합니다.

      sh-5.1#  lsns -t user
      Copy to Clipboard Toggle word wrap

      명령 예

              NS TYPE  NPROCS   PID USER       COMMAND
      4026531837 user     233     1 root       /usr/lib/systemd/systemd --switched-root --system --deserialize 28
      4026532447 user       1  4767 2908816384 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1000 
      1
      Copy to Clipboard Toggle word wrap

      1
      UID는 Pod 사양에 설정한 것과 달라야 합니다.
    4. 다음 명령을 사용하여 디버그 세션을 종료합니다.

      sh-5.1#  exit
      Copy to Clipboard Toggle word wrap
      sh-5.1#  exit
      Copy to Clipboard Toggle word wrap
  3. 다음 명령의 출력에서 읽기/쓰기 권한(rw)에 표시된 대로 /proc 파일 시스템이 마스킹되지 않은 상태로 컨테이너에 마운트되었는지 확인합니다.

    $ oc exec <pod_name> -- mount | grep /proc
    Copy to Clipboard Toggle word wrap

    출력 예

    proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
    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