Kubernetes/Kubernetes Advanced

📌 [DaemonSet 심화편 #18] DaemonSet과 SecurityContext: 노드 접근 권한 제한 설정

ygtoken 2025. 3. 22. 20:55
728x90

1️⃣ 개요

DaemonSet은 모든 노드에서 실행되기 때문에, Pod 내부에서 호스트 시스템의 민감한 영역에 접근해야 할 경우가 있습니다.
하지만 이러한 접근은 보안적으로 위험할 수 있으므로, 필요한 최소한의 권한만 부여하는 것이 중요합니다.

Kubernetes는 securityContext를 통해 컨테이너 수준의 권한 제한, 사용자 설정, 파일 시스템 보호 등을 구성할 수 있게 해줍니다.
이번 글에서는 DaemonSet에서 securityContext를 활용하여 권한을 제어하는 방법을 정리합니다.


2️⃣ PodSecurityContext vs Container SecurityContext

항목 PodSecurityContext Container SecurityContext
적용 범위 Pod 전체 개별 컨테이너
위치 spec.securityContext containers[].securityContext
주요 설정 runAsUser, fsGroup, runAsGroup privileged, readOnlyRootFilesystem, capabilities 등

✅ 일반적으로 DaemonSet에서는 Container SecurityContext 중심으로 세부 설정을 조절하게 됩니다.


3️⃣ 권한 제한 설정 예시 (보안 강화 목적)

securityContext:
  runAsNonRoot: true                      # 루트 권한 사용 불가
  readOnlyRootFilesystem: true           # 루트 파일시스템을 읽기 전용으로 제한
  allowPrivilegeEscalation: false        # SUID 등 권한 상승 금지
  capabilities:
    drop:                                # 기본 Capabilities 중 불필요한 것 제거
      - ALL

📌 설명

  • 컨테이너가 루트가 아닌 사용자로 실행되도록 강제합니다.
  • 시스템 변경이 불가능하도록 파일시스템을 읽기 전용으로 설정합니다.
  • capabilities.drop을 통해 기본 Linux Capabilities도 제거합니다.

4️⃣ DaemonSet 전체 예제 (보안 컨텍스트 포함)

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: secure-agent
spec:
  selector:
    matchLabels:
      app: secure-agent
  template:
    metadata:
      labels:
        app: secure-agent
    spec:
      containers:
        - name: secure-agent
          image: busybox
          command: ["sh", "-c", "echo Secure agent running; sleep 3600"]
          securityContext:
            runAsNonRoot: true
            readOnlyRootFilesystem: true
            allowPrivilegeEscalation: false
            capabilities:
              drop:
                - ALL

📌 설명 요약

  • 이 DaemonSet은 busybox를 모든 노드에 배포하되, 컨테이너가 루트 권한 없이 실행되며 시스템 변경이 불가능하도록 제한됩니다.

5️⃣ privileged 모드가 필요한 경우

어떤 DaemonSet은 /dev, /proc, 커널 인터페이스 등에 접근해야 할 수 있습니다.
이럴 경우에는 다음과 같이 privileged 모드를 설정합니다.

securityContext:
  privileged: true     # 모든 권한 부여

📌 주의

  • privileged 모드는 컨테이너가 호스트와 거의 동일한 권한을 갖게 되므로,
    반드시 필요한 경우에만 설정해야 하며, 이미지 검증 및 격리 강화가 요구됩니다.

6️⃣ AppArmor / SELinux / Pod Security Standards 연동

보안 기능 설명
AppArmor/SELinux 컨테이너의 시스템 콜, 파일 접근 등을 제한하는 리눅스 커널 보안 프로필
Pod Security Standards (PSP 대체) Restricted / Baseline / Privileged 등 보안 수준을 설정하는 Pod-level 정책

✅ DaemonSet이 높은 권한을 요구할 경우, 클러스터 보안 정책에 따라 배포가 차단될 수 있으므로 미리 정책과의 충돌 여부를 확인해야 합니다.


🔥 7️⃣ 결론

DaemonSet은 노드에 대한 접근 범위가 넓기 때문에, SecurityContext를 통해 최소 권한 원칙을 적용하는 것이 중요합니다.
권한 상승, 루트 실행, 파일 쓰기 등을 제한하여 잠재적인 보안 위험을 줄일 수 있습니다.
필요한 경우에만 privileged 모드를 사용하며, 항상 운영 정책과 보안 프로파일(AppArmor, SELinux 등)을 함께 고려해야 합니다.

 

728x90