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
을 마스크
해제로 설정하고 컨테이너 런타임의 기본 마스킹 동작을 바이패스하고 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>.yaml
Copy 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-pod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 컨테이너 내에서 사용 중인 사용자 및 그룹 ID를 표시합니다.
id
sh-5.1$ id
Copy 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 user
Copy 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 1000
1 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-q8sh9
Copy 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-q8sh9
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 디버그 쉘 내에서
/host
를 root 디렉터리로 설정합니다.chroot /host
sh-5.1# chroot /host
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 노드에서 사용 중인 UID를 표시합니다.
lsns -t user
sh-5.1# lsns -t user
Copy 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 1000
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- UID는 Pod 사양에 설정한 것과 달라야 합니다.
다음 명령을 사용하여 디버그 세션을 종료합니다.
exit
sh-5.1# exit
Copy to Clipboard Copied! Toggle word wrap Toggle overflow exit
sh-5.1# exit
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
다음 명령의 출력에서 읽기/쓰기 권한(
rw
)에 표시된 대로/proc
파일 시스템이 마스킹되지 않은 상태로 컨테이너에 마운트되었는지 확인합니다.oc exec <pod_name> -- mount | grep /proc
$ oc exec <pod_name> -- mount | grep /proc
Copy 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