2.17. Linux 사용자 네임스페이스에서 Pod 실행
Linux 사용자 네임스페이스를 사용하면 관리자가 컨테이너 사용자 및 그룹 식별자(UID 및 GID)를 격리하여 컨테이너가 실행 중인 호스트 시스템과 비교하여 사용자 네임스페이스에 다른 권한 집합을 가질 수 있습니다. 이를 통해 컨테이너는 사용자 네임스페이스 내에서 전체 권한으로 프로세스를 실행할 수 있지만, 프로세스는 호스트 시스템의 작업에 대해 권한이 없을 수 있습니다.
기본적으로 컨테이너는 호스트 사용자 네임스페이스에서 실행됩니다. 호스트 사용자 네임스페이스에서 컨테이너를 실행하면 컨테이너에 호스트 네임스페이스에서만 사용할 수 있는 기능이 필요한 경우 유용할 수 있습니다. 그러나 호스트 네임스페이스에서 Pod를 실행하면 다른 컨테이너 내부의 프로세스가 호스트 또는 컨테이너의 파일에 액세스하거나 수정할 수 있는 호스트로 중단될 수 있는 컨테이너 중단 가능성과 같은 보안 문제가 발생합니다.
개별 사용자 네임스페이스에서 컨테이너를 실행하면 컨테이너가 다른 Pod 및 노드 자체에 발생할 수 있는 컨테이너 중단 및 기타 여러 취약점을 완화할 수 있습니다.
분리된 사용자 네임스페이스에서 Pod를 실행하는 경우 Pod 컨테이너 내부의 UID/GID가 더 이상 호스트의 UID/GID와 일치하지 않습니다. 파일 시스템 소유권이 올바르게 작동하려면 Linux 커널은 ID 매핑 마운트를 사용하여 컨테이너와 가상 파일 시스템(VFS) 계층에서 사용자 ID를 변환합니다.
현재 모든 파일 시스템이 NFS(Network File Systems) 및 기타 네트워크/분산 파일 시스템과 같은 ID 매핑 마운트를 지원하는 것은 아닙니다. ID 매핑 마운트를 지원하지 않는 공급업체의 NFS 지원 영구 볼륨을 사용하는 모든 Pod에는 사용자 네임스페이스에서 실행할 때 액세스 또는 권한 문제가 발생할 수 있습니다. 이 동작은 OpenShift Container Platform에만 국한되지 않습니다. Kubernetes v1.33 이후의 모든 Kubernetes 배포에 적용됩니다.
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 을 마스크 해제로 설정하고 컨테이너 런타임의 기본 마스킹 동작을 바이패스하고 hostUsers 를 false 로 설정하는 SCC에서만 사용해야 합니다.
프로세스
다음 명령을 실행하여 Pod가 배포된 OpenShift Container Platform 네임스페이스의 기본 사용자 ID(UID) 및 그룹 ID(GID) 범위를 편집합니다.
oc edit ns/<namespace_name>
$ oc edit ns/<namespace_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 네임스페이스 예
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 참고범위 1000/10000은 ID 1000으로 시작하는 10,000 값을 의미하므로 ID의 범위를 1000에서 10,999 사이로 지정합니다.
적절한 SCC와 함께 실행되도록 구성된 워크로드를 생성하고
hostUsers매개변수를false로 설정하여 Linux 사용자 네임스페이스를 사용할 수 있습니다.다음과 유사한 YAML 파일을 생성합니다.
Pod 사양의 예
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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를 지정합니다. 이는
네임스페이스오브젝트에서 설정한 범위에 속해야 합니다.
다음 명령을 실행하여 오브젝트를 생성합니다.
oc create -f <file_name>.yaml
$ oc create -f <file_name>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
검증
생성한 Pod의 컨테이너에서 사용 중인 사용자 및 그룹 ID를 확인합니다. Pod는 Linux 사용자 네임스페이스 내에 있습니다.
Pod에서 컨테이너로 쉘 세션을 시작합니다.
oc rsh -c <container_name> pod/<pod_name>
$ oc rsh -c <container_name> pod/<pod_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 명령 예
oc rsh -c userns-container_name pod/userns-pod
$ oc rsh -c userns-container_name pod/userns-podCopy to Clipboard Copied! Toggle word wrap Toggle overflow 컨테이너 내에서 사용 중인 사용자 및 그룹 ID를 표시합니다.
id
sh-5.1$ idCopy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
uid=1000(1000) gid=1000(1000) groups=1000(1000)
uid=1000(1000) gid=1000(1000) groups=1000(1000)1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 컨테이너의 UID 및 그룹은 Pod 사양에 설정한 것과 동일해야 합니다.
컨테이너 사용자 네임스페이스에서 사용 중인 사용자 ID를 표시합니다.
lsns -t user
sh-5.1$ lsns -t userCopy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
NS TYPE NPROCS PID USER COMMAND 4026532447 user 3 1 1000 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1000
NS TYPE NPROCS PID USER COMMAND 4026532447 user 3 1 1000 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 10001 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 프로세스의 UID는 Pod 사양에 설정한 것과 동일해야 합니다.
노드에서 사용 중인 UID를 확인합니다. 노드는 Linux 사용자 네임스페이스 외부에 있습니다. 이 사용자 ID는 컨테이너에서 사용되는 UID와 달라야 합니다.
해당 노드의 디버그 세션을 시작합니다.
oc debug node/ci-ln-z5vppzb-72292-8zp2b-worker-c-q8sh9
$ oc debug node/ci-ln-z5vppzb-72292-8zp2b-worker-c-q8sh9Copy to Clipboard Copied! Toggle word wrap Toggle overflow 명령 예
oc debug node/ci-ln-z5vppzb-72292-8zp2b-worker-c-q8sh9
$ oc debug node/ci-ln-z5vppzb-72292-8zp2b-worker-c-q8sh9Copy to Clipboard Copied! Toggle word wrap Toggle overflow 디버그 쉘 내에서
/host를 root 디렉터리로 설정합니다.chroot /host
sh-5.1# chroot /hostCopy to Clipboard Copied! Toggle word wrap Toggle overflow 노드에서 사용 중인 UID를 표시합니다.
lsns -t user
sh-5.1# lsns -t userCopy to Clipboard Copied! Toggle word wrap Toggle overflow 명령 예
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
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 10001 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- UID는 Pod 사양에 설정한 것과 달라야 합니다.
다음 명령을 사용하여 디버그 세션을 종료합니다.
exit
sh-5.1# exitCopy to Clipboard Copied! Toggle word wrap Toggle overflow exit
sh-5.1# exitCopy to Clipboard Copied! Toggle word wrap Toggle overflow
다음 명령의 출력에서 읽기/쓰기 권한(
rw)에 표시된 대로/proc파일 시스템이 마스킹되지 않은 상태로 컨테이너에 마운트되었는지 확인합니다.oc exec <pod_name> -- mount | grep /proc
$ oc exec <pod_name> -- mount | grep /procCopy to Clipboard Copied! Toggle word wrap Toggle overflow 출력 예
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)Copy to Clipboard Copied! Toggle word wrap Toggle overflow