2.14. Linux 사용자 네임스페이스에서 포드 실행
Linux 사용자 네임스페이스를 사용하면 관리자가 컨테이너 사용자 및 그룹 식별자(UID 및 GID)를 분리하여 컨테이너가 실행 중인 호스트 시스템과는 다른 사용자 네임스페이스에서 다른 권한 집합을 가질 수 있습니다. 이를 통해 컨테이너는 사용자 네임스페이스 내에서 모든 권한을 가지고 프로세스를 실행할 수 있지만, 해당 프로세스는 호스트 머신의 작업에 대해서는 권한이 없을 수 있습니다.
기본적으로 컨테이너는 호스트 시스템의 루트 사용자 네임스페이스에서 실행됩니다. 호스트 사용자 네임스페이스에서 컨테이너를 실행하는 것은 해당 사용자 네임스페이스에서만 사용할 수 있는 기능이 컨테이너에 필요한 경우 유용할 수 있습니다. 그러나 이 방법을 사용하면 컨테이너 탈주가 발생할 가능성 등 보안 문제가 발생할 수 있습니다. 컨테이너 탈주란 컨테이너 내부의 프로세스가 호스트로 탈주하여 해당 프로세스가 호스트나 다른 컨테이너의 파일에 액세스하거나 수정할 수 있는 상황을 말합니다.
개별 사용자 네임스페이스에서 컨테이너를 실행하면 컨테이너 분리 및 손상된 컨테이너가 다른 포드와 노드 자체에 가할 수 있는 여러 가지 취약점을 완화할 수 있습니다.
다음 절차에 표시된 대로 Pod 사양에서 hostUsers
매개변수를 false
로 설정하여 Linux 사용자 네임스페이스 사용을 구성할 수 있습니다.
Linux 사용자 네임스페이스에 대한 지원은 Technology Preview 기능에 불과합니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
2.14.1. Linux 사용자 네임스페이스 지원 구성 링크 복사링크가 클립보드에 복사되었습니다!
사전 요구 사항
클러스터에 필요한 기술 미리 보기 기능을 활성화하려면
FeatureGate
CR인cluster를
편집해야 합니다.oc edit featuregate cluster
$ oc edit featuregate cluster
Copy to Clipboard Copied! Toggle word wrap Toggle overflow FeatureGate
CR 예시Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 필수
UserNamespacesSupport
및ProcMountType
기능을 활성화합니다.
주의클러스터에서
TechPreviewNoUpgrade
기능 세트를 활성화하면 실행 취소할 수 없으며 사소한 버전 업데이트가 방지됩니다. 이 기능 세트를 사용하면 테스트 클러스터에서 이러한 기술 미리 보기 기능을 활성화하여 전체적으로 테스트할 수 있습니다. 프로덕션 클러스터에서 이 기능 세트를 활성화하지 마십시오.변경 사항을 저장하면 새로운 머신 구성이 생성되고, 머신 구성 풀이 업데이트되며, 변경 사항이 적용되는 동안 각 노드의 스케줄링이 비활성화됩니다.
crun 컨테이너 런타임은 워커 노드에 있습니다. crun은 현재 사용자 네임스페이스를 지원하는 OpenShift Container Platform과 함께 패키지된 유일한 OCI 런타임입니다. crun은 기본적으로 활성화되어 있습니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
프로세스
다음 명령을 실행하여 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개의 값을 의미하므로 1000에서 10,999까지의 ID 범위를 지정합니다.
제한된
프로필로 실행되도록 구성된 Pod를 만들고hostUsers
매개변수를false
로 설정하여 Linux 사용자 네임스페이스를 사용할 수 있도록 합니다.다음과 유사한 YAML 파일을 생성합니다.
포드 사양 예시
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 포드가 권한 상승을 요청할 수 없도록 지정합니다. 이는
제한된 v2
보안 컨텍스트 제약 조건(SCC)에 필요합니다. - 2
- 컨테이너가 0이 아닌 다른 UID를 가진 사용자로 실행되도록 지정합니다.
- 3
- 컨테이너가 실행되는 UID를 지정합니다.
- 4
- 컨테이너가 실행되는 기본 GID를 지정합니다.
- 5
- Pod가 사용자 네임스페이스에서 실행되도록 요청합니다.
true인
경우 Pod는 호스트 사용자 네임스페이스에서 실행됩니다.false인
경우, Pod는 해당 Pod에 대해 생성된 새 사용자 네임스페이스에서 실행됩니다. 기본값은true
입니다.
다음 명령을 실행하여 Pod를 생성합니다.
oc create -f <file_name>.yaml
$ oc create -f <file_name>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
검증
생성한 Pod 컨테이너에서 사용 중인 Pod 사용자 및 그룹 ID를 확인하세요. 포드는 Linux 사용자 네임스페이스 내부에 있습니다.
포드의 컨테이너로 셸 세션을 시작합니다.
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)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 컨테이너 사용자 네임스페이스에서 사용되는 사용자 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는
1000
이며, 이는 Pod 사양에서 설정한 것과 동일합니다.
Pod가 생성된 노드에서 사용 중인 Pod 사용자 ID를 확인하세요. 노드가 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 노드 사용자 네임스페이스에서 사용되는 사용자 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 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는
2908816384
로, Pod 사양에서 설정한 것과 다릅니다.