파드와 함께 사용자 네임스페이스 사용하기

파드와 함께 사용자 네임스페이스 사용하기 (Use a User Namespace With a Pod)

기능 상태: Kubernetes v1.36부터 Stable. 이것은 쿠버네티스의 안정적인 기능이며 v1.36부터 그랬어요. 처음에는 v1.28 릴리스에서 사용할 수 있었어요. 더 이상 이 기능이나 동작을 비활성화하거나 거부할 수 없어요(잠겨 있음). 관련 기능 게이트인 UserNamespacesSupport에 값을 명시적으로 설정하면 쿠버네티스는 이를 무시하지만 오류는 보고하지 않아요.

이 페이지는 파드에 사용자 네임스페이스를 구성하는 방법을 보여드려요. 이를 통해 컨테이너 안에서 실행되는 사용자를 호스트의 사용자로부터 격리할 수 있어요.

컨테이너에서 root로 실행되는 프로세스는 호스트에서 다른(비root) 사용자로 실행될 수 있어요. 다시 말해 그 프로세스는 사용자 네임스페이스 안의 연산에는 완전한 권한을 가지지만, 네임스페이스 밖의 연산에는 권한이 없어요.

이 기능을 사용하면 손상된 컨테이너가 호스트나 같은 노드의 다른 파드에 할 수 있는 피해를 줄일 수 있어요. 사용자 네임스페이스가 활성화되면 악용할 수 없었던 HIGH 또는 CRITICAL로 평가된 보안 취약점이 여러 개 있어요. 사용자 네임스페이스가 향후 일부 취약점도 완화할 것으로 기대돼요.

사용자 네임스페이스를 사용하지 않으면 root로 실행되는 컨테이너는 컨테이너 탈출의 경우 노드에서 root 권한을 가져요. 그리고 컨테이너에 일부 capability가 부여되면 그 capabilities도 호스트에서 유효해요. 사용자 네임스페이스를 사용하면 이러한 것 중 어느 것도 사실이 아니에요.

출처: 문서

본문

시작하기 전에 (Before you begin)

쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 구성돼 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 두 개 이상 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube로 만들거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있어요.

  • iximiuz Labs
  • Killercoda
  • KodeKloud

쿠버네티스 서버가 최소 v1.25 버전이어야 해요. 버전을 확인하려면 kubectl version을 입력하세요.

  • 노드 OS가 Linux여야 해요
  • 호스트에서 명령을 실행할 수 있어야 해요
  • 파드에 exec할 수 있어야 해요

사용하는 클러스터에는 파드와 함께 사용자 네임스페이스를 사용하기 위한 요구 사항을 충족하는 노드가 최소 하나 포함되어야 해요.

노드가 섞여 있고 일부 노드만 파드를 위한 사용자 네임스페이스 지원을 제공한다면, 사용자 네임스페이스 파드가 적합한 노드에 스케줄링되도록 해야 해요.

사용자 네임스페이스를 사용하는 Pod 실행하기 (Run a Pod that uses a user namespace)

파드의 사용자 네임스페이스는 .spechostUsers 필드를 false로 설정해 활성화돼요. 예를 들어:

apiVersion: v1
kind: Pod
metadata:
  name: userns
spec:
  hostUsers: false
  containers:
  - name: shell
    command: ["sleep", "infinity"]
    image: debian

pods/user-namespaces-stateless.yaml — 클러스터에 파드를 생성해요.

kubectl apply -f https://k8s.io/examples/pods/user-namespaces-stateless.yaml

파드에 exec하고 readlink /proc/self/ns/user를 실행해요.

kubectl exec -ti userns -- bash

이 명령을 실행해요.

readlink /proc/self/ns/user

출력은 다음과 비슷해요.

user:[4026531837]

또한 실행해요.

cat /proc/self/uid_map

출력은 다음과 비슷해요.

0  833617920      65536

그런 다음 호스트에서 셸을 열고 같은 명령을 실행해요. readlink 명령은 프로세스가 실행 중인 사용자 네임스페이스를 보여줘요. 호스트에서 실행할 때와 컨테이너 안에서 실행할 때 달라야 해요. 컨테이너 안의 uid_map 파일의 마지막 숫자는 65536이어야 하고, 호스트에서는 더 큰 숫자여야 해요.

kubelet을 사용자 네임스페이스 안에서 실행 중이라면, 파드에서 명령을 실행한 출력과 호스트에서 실행한 출력을 비교해야 해요.

readlink /proc/$pid/ns/user

$pid를 kubelet PID로 바꾸세요.

더 알아보기 (Learn more)