본문 바로가기
DevOps/Kubernetes

[Kubernetes] Kubernetes Pod 및 Docker Container 최소 권한 관리

by Yoon_estar 2025. 2. 5.
728x90

소개

다양한 팀으로 구성된 조직에서는 컨테이너 권한 관리가 매우 중요합니다. 컨테이너에 최소한의 권한만 설정하면 보안 위험을 줄이고, 운영 효율성을 높일 수 있습니다. 이번 블로그는 아래 주제들을 차례로 다룰 예정입니다. 

  1. 최소 권한으로 Kubernetes Pod 및 Docker 컨테이너 생성 방법
  2. 운영 중 권한 수정 방법
  3. Kubernetes Ingress 및 Egress 보안 설정

 

1. Kubernetes Pod 최소 권한 설정

최소 권한 YAML 설정 예제

  • Kubernetes Pod를 생성할 때, 반드시 필요한 권한만 설정하는 것이 중요합니다. 
apiVersion: v1
kind: Pod
metadata:
  name: minimal-permissions-pod
  labels:
    app: example-app
spec:
  containers:
  - name: minimal-container
    image: nginx:latest
    securityContext:
      runAsUser: 1000        # 비루트(non-root) 사용자
      runAsGroup: 3000       # 비루트 그룹
      allowPrivilegeEscalation: false
      capabilities:
        drop:
        - ALL
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
      requests:
        memory: "64Mi"
        cpu: "250m"

 

주요 설정

  • runAsUser 및 runAsGroup : 비루트 사용자와 그룹을 설정
  • allowPrivilegeEscalation : 권한 상승 방지
  • capabilities.drop : 불필요한 Linux 권한 제거
  • 리소스 제한 : 메모리, cpu 사용량 제한으로 자원 남용 방지

2. Docker 컨테이너 최소 권한 설정

Docker 명령어 예제

Docker 컨테이너 실행 시, 다음 플래그를 사용하여 권한을 제한할 수 있습니다

# docker run \
  --name minimal-container \
  --user 1000:3000 \
  --cap-drop=ALL \
  --memory="128m" \
  --cpus="0.5" \
  nginx:latest

 

설명

  • --user : 특정 비루트 사용자로 컨테이너 실행
  • --cap-drop=ALL : 모든 불필요한 권한 제거
  • --memory 및 --cpus : 메모리와 CPU 사용량 제한

3. 운영 중 권한 수정 방법

Kubernetes Pod

  • 실행 중인 Pod의 권한을 수정하려면 다음과 같이 진행할 수 있습니다.
    •  Pod 패치
    • Deployment YAML 수정 후 적용
# kubectl patch pod minimal-permissions-pod -p '{"spec":{"securityContext":{"runAsUser":2000}}}'
# kubectl edit deployment minimal-deployment

 

Docker 컨테이너

  • Docker는 실행 중인 컨테이너의 사용자나 권한을 직접 수정할 수 없습니다. 대신 컨테이너를 중지 후 권한 수정 후 재실행하면 가능합니다. 
# docker stop minimal-container
# docker run \
  --name minimal-container \
  --user 2000:3000 \
  --cap-drop=ALL \
  nginx:latest

 

4. Kubernetes Ingress 및 Egress 보안

Ingress 설정

  • Ingress는 HTTP/HTTPS 트래픽을 관리합니다. 보안을 강화하려면 다음과 같이 설정합니다
    • SSL/TLS : tls 섹션을 설정해 HTTPS를 강제합니다.
    • 주석(Annotatnions) : 모든 HTTP 트래픽을 HTTPS로 리다이렉트
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: secure-ingress
  annotations:
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: backend-service
            port:
              number: 80
  tls:
  - hosts:
    - example.com
    secretName: tls-secret

 

Egress 설정

  • Egress 정책은 아웃바운드 트래픽을 제한합니다.
    • policyTypes : 아웃바운드 트래픽을 제어하려면 Egress를 지정
    • ipBlock :특정 CIDR 범위에만 접근 허용
    • ports : 특정 프로토콜과 포트로 제한
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-specific-egress
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 192.168.1.0/24
    ports:
    - protocol: TCP
      port: 443