[System Hardening] Kubernetes에서 SECCOMP 구현

IMKUNYOUNG·2024년 6월 20일
0

CKS

목록 보기
39/70

최근 Kubernetes 환경에서 컨테이너 보안을 강화하기 위해 SECCOMP 프로필을 사용하는 방법에 대해 알아보겠습니다. 이 글에서는 Docker와 Kubernetes에서 SECCOMP 프로필을 활용하여 시스템 호출을 제어하고 보안을 강화하는 방법을 단계별로 살펴보겠습니다. Docker와 Kubernetes가 기본적으로 SECCOMP를 어떻게 사용하는지 비교하고, Kubernetes에서 커스텀 SECCOMP 프로필을 적용하는 방법을 소개합니다.

Docker의 기본 SECCOMP 프로필

Docker는 기본적으로 약 64개의 시스템 호출을 차단하는 SECCOMP 프로필을 사용합니다. 이를 확인하기 위해 AMI Contained라는 오픈 소스 도구를 사용했습니다. 이 도구는 Docker 컨테이너 내에서 런타임 정보와 차단된 시스템 호출에 대한 정보를 제공합니다.

위 명령어를 통해 AMI Contained 컨테이너를 실행하면, 차단된 시스템 호출 수가 64개임을 확인할 수 있습니다. 이는 Docker가 기본 Seccomp 프로필을 사용하기 때문입니다. 또한 seccomp가 모드 2, 즉 필터링 모드로 실행되고 있음을 확인할 수 있습니다.

Kubernetes에서 기본 SECCOMP 프로필 사용

Kubernetes 1.20 버전 기준으로, 기본적으로 SECCOMP가 비활성화되어 있습니다. 동일한 이미지를 Kubernetes에서 Pod로 실행하여 비교해보면, 차단된 시스템 호출 수가 21개에 불과하며 SECCOMP 상태는 비활성화되어 있음을 확인할 수 있습니다.

amicontained Pod의 로그를 검사하면, 차단된 시스템 호출 수가 Docker와 크게 다름을 알 수 있습니다. 이는 kubernetes가 기본적으로 SECCOMP를 활성화하지 않기 때문입니다.

Kubernetes에서 SECCOMP 프로필 적용

SECCOMP 프로필을 적용하려면 Pod 또는 컨테이너 매니페스트의 보안 컨텍스트 섹션에 SECCOMP 프로필 필드를 추가해야 합니다. 기본 프로필을 사용하려면 타입을 RuntimeDefault로 설정할 수 있습니다.

# pod-definition.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: amicontained
  name: amicontained
spec:
  securityContext:
    seccompProfile:
      type: RuntimeDefault
  containers:
  - args:
    - amicontained
    image: r.j3ss.co/amicontained
    name: amicontained
    securityContext:
      allowPrivilegeEscalation: false

Pod가 생성되면 예상대로 더 많은 시스템 호출이 차단됨을 확인할 수 있습니다.

커스텀 SECCOMP 프로필 사용

커스텀 SECCOMP 프로필을 사용하려면, 타입을 localhost로 설정하고 노드에 미리 구성된 프로필의 경로를 지정해야 합니다. 예를 들어, 모든 시스템 호출을 기록하는 감사(audit) 프로필을 생성해보겠습니다.

  1. /var/lib/kubelet/seccomp/profiles 디렉토리에 audit.json 파일 생성:
{
  "defaultAction": "SCMP_ACT_LOG",
}
  1. Pod 매니페스트 업데이트:
apiVersion: v1
kind: Pod
metadata:
  name: test-audit
spec:
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: "profiles/audit.json"
  containers:
  - name: ubuntu
    image: ubuntu
    command: ["sh", "-c", "echo Hello, Kubernetes! && sleep 100"]
	securityContext:
		allowPrivilegeEscalation: false

Pod가 생성되면 /var/log/syslog 파일에서 컨테이너의 시스템 호출 로그를 확인할 수 있습니다.

모든 시스템 호출을 차단하는 프로필

모든 시스템 호출을 차단하는 SECCOMP 프로필을 만들어보겠습니다.

  1. violation.json파일 생성:
{
  "defaultAction": "SCMP_ACT_ERRNO",
  "syscalls": []
}
  1. Pod 매니페스트 업데이트:
# test-violation.yaml
apiVersion: v1
kind: Pod
metadata:
  name: violation-pod
spec:
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: "profiles/violation.json"
  containers:
  - name: ubuntu
    image: ubuntu
    command: ["sh", "-c", "echo Hello, Kubernetes! && sleep 100"]

Pod가 생성되지 않고 "container cannot run" 상태로 남아있게 됩니다. 이는 모든 시스템 호출을 차단하는 프로필 때문입니다.

결론

SECCOMP 프로필을 활용하면 컨테이너의 보안을 크게 강화할 수 있습니다. Kubernetes에서는 기본적으로 SECCOMP가 비활성화되어 있으므로, Pod 매니페스트에 SECCOMP 프로필을 명시적으로 설정해야 합니다. 커스텀 프로필을 작성하여 애플리케이션에 필요한 시스템 호출만 허용하고 나머지는 차단하는 것이 중요합니다. 이를 통해 Kubernetes 클러스터의 보안을 한층 더 강화할 수 있습니다.

0개의 댓글