[kubernetes] Security Context

Security Context

SecurityContext는 Kubernetes에서 Pod 또는 컨테이너의 보안 설정을 정의하는 데 사용되는 구성 요소이다. 
이를 통해 컨테이너 실행 시 특정 보안 관련 옵션(권한, 사용자, 그룹 등)을 설정할 수 있다. 

SecurityContext를 사용하는 이유

  • 컨테이너가 실행될 때 최소 권한으로 동작하도록 제한하기 위해.
  • 시스템에서 위험한 작업을 할 수 있는 권한을 엄격히 관리하기 위해.
  • 실행 환경을 보안 규칙에 맞게 설정하기 위해.

Capabilities

Capabilities는 Linux 커널에서 제공하는 기능으로, 루트 권한을 세분화한 특정 작업 권한이다. 
보통 리눅스에서는 root 사용자에게 모든 권한이 부여되지만, Capabilities를 사용하면 필요한 권한만 추가로 부여할 수 있다. 

SYS_TIME Capability

SYS_TIME은 Linux Capabilities 중 하나로, 컨테이너가 시스템 시간(system time)을 변경할 수 있도록 허용하는 권한이다.

  • 기본적으로 컨테이너에는 이 권한이 없다. 
  • SYS_TIME 권한이 부여되면, 컨테이너 안에서 date 명령어를 사용해 시스템 시간을 조정할 수 있다. 

SecurityContext와 Capabilities의 관계

securityContext의 capabilities 필드는 컨테이너에 추가하거나 제거할 Linux Capabilities를 정의한다. 컨테이너는 보통 최소 권한으로 실행되며, 기본적으로 대부분의 Capabilities가 비활성화되어 있다 필요한 경우 아래처럼 특정 Capabilities를 추가로 활성화할 수 있다. 

securityContext:
  capabilities:
    add:
    - SYS_TIME  # 시스템 시간 조정 권한 추가

추가 가능한 주요 Capabilities

  • SYS_TIME :시스템 시간을 설정하거나 변경할 수 있음
  • NET_ADMIN :  네트워크 인터페이스를 구성하거나 변경할 수 있음
  • SYS_ADMIN : 시스템 관리자 권한 (매우 광범위, 위험함)
  • CHOWN 파일 : 소유권을 변경할 수 있음

실제 동작 예시

기본적으로 Capabilities가 없는 경우

kubectl exec super-user-pod -- date --set="2024-12-25"
date: cannot set date: Operation not permitted

컨테이너에서 date 명령어로 시간을 변경하려고 하면 권한 부족 오류가 발생한다. 

SYS_TIME Capabilities를 추가한 경우

위와 동일한 명령어를 실행하면 시간이 정상적으로 변경된다. 

kubectl exec super-user-pod -- date --set="2024-12-25"
Tue Dec 25 00:00:00 UTC 2024

Security Context 설정 위치

SecurityContext는 Pod 레벨 또는 컨테이너 레벨에 적용할 수 있다. 

Pod 레벨 설정

Pod의 모든 컨테이너에 동일한 보안 설정을 적용한다. 

spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000

컨테이너 레벨 설정

spec:
  containers:
  - name: example
    image: busybox
    securityContext:
      capabilities:
        add:
        - SYS_TIME