최근 Kubernetes 환경에서 컨테이너 보안을 강화하기 위해 SECCOMP 프로필을 사용하는 방법에 대해 알아보겠습니다. 이 글에서는 Docker와 Kubernetes에서 SECCOMP 프로필을 활용하여 시스템 호출을 제어하고 보안을 강화하는 방법을 단계별로 살펴보겠습니다. Docker와 Kubernetes가 기본적으로 SECCOMP를 어떻게 사용하는지 비교하고, Kubernetes에서 커스텀 SECCOMP 프로필을 적용하는 방법을 소개합니다.
Docker는 기본적으로 약 64개의 시스템 호출을 차단하는 SECCOMP 프로필을 사용합니다. 이를 확인하기 위해 AMI Contained라는 오픈 소스 도구를 사용했습니다. 이 도구는 Docker 컨테이너 내에서 런타임 정보와 차단된 시스템 호출에 대한 정보를 제공합니다.
위 명령어를 통해 AMI Contained 컨테이너를 실행하면, 차단된 시스템 호출 수가 64개임을 확인할 수 있습니다. 이는 Docker가 기본 Seccomp 프로필을 사용하기 때문입니다. 또한 seccomp가 모드 2, 즉 필터링 모드로 실행되고 있음을 확인할 수 있습니다.
Kubernetes 1.20 버전 기준으로, 기본적으로 SECCOMP가 비활성화되어 있습니다. 동일한 이미지를 Kubernetes에서 Pod로 실행하여 비교해보면, 차단된 시스템 호출 수가 21개에 불과하며 SECCOMP 상태는 비활성화되어 있음을 확인할 수 있습니다.
amicontained Pod의 로그를 검사하면, 차단된 시스템 호출 수가 Docker와 크게 다름을 알 수 있습니다. 이는 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 프로필을 사용하려면, 타입을 localhost
로 설정하고 노드에 미리 구성된 프로필의 경로를 지정해야 합니다. 예를 들어, 모든 시스템 호출을 기록하는 감사(audit) 프로필을 생성해보겠습니다.
/var/lib/kubelet/seccomp/profiles
디렉토리에 audit.json 파일 생성:{
"defaultAction": "SCMP_ACT_LOG",
}
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 프로필을 만들어보겠습니다.
violation.json
파일 생성:{
"defaultAction": "SCMP_ACT_ERRNO",
"syscalls": []
}
# 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 클러스터의 보안을 한층 더 강화할 수 있습니다.