Kubernetes 환경에서 포드를 실행할 때 기본 설정으로는 컨테이너 내에서 날짜를 변경할 수 없습니다. 이 문제는 Linux 기능(capabilities)과 관련이 있습니다. 이번 글에서는 Linux 기능의 기본 사항과 Kubernetes 포드에서 이러한 기능을 관리하는 방법에 대해 알아보겠습니다.
Linux 커널 2.2 이전에는 프로세스가 권한 있는 프로세스와 권한 없는 프로세스로 구분되었습니다. 권한 있는 프로세스는 UID가 0인 루트 사용자가 실행한 프로세스였고, 거의 모든 작업을 수행할 수 있었습니다. 반면에 권한 없는 프로세스는 많은 제한을 받았습니다.
그러나 Linux 커널 2.2부터는 슈퍼 유저의 권한이 개별 단위의 기능으로 나누어졌습니다. 이제 루트 사용자가 생성한 모든 프로세스에 모든 권한을 부여하는 대신, 특정 기능만 할당할 수 있습니다. 예를 들어:
이와 같은 기능들은 각각의 작업을 수행하는 데 필요한 최소 권한을 세밀하게 조정할 수 있도록 합니다.
Kubernetes에서 포드를 실행할 때 기본적으로 SECCOMP(보안 컴퓨팅 모드)를 사용하지 않습니다. 이는 컨테이너가 UID가 0인 루트 사용자로 실행되더라도 특정 작업, 예를 들어 날짜 변경과 같은 작업을 수행할 수 없음을 의미합니다. 이는 Docker 런타임에서 기본적으로 14개의 기능만 할당되며, sys_time 기능이 포함되지 않기 때문입니다.
Kubernetes에서는 컨테이너 매니페스트의 securityContext 섹션에서 capabilities 필드를 지정하여 컨테이너에 기능을 추가하거나 제거할 수 있습니다.
위의 예시에서는 SYS_TIME 기능을 추가하여 컨테이너 내에서 날짜를 변경할 수 있게 설정했습니다. 포드를 생성한 후에는 다음과 같이 날짜를 변경할 수 있습니다.
반대로 기능을 제거하고자 한다면 drop
필드를 사용합니다.
이 설정으로 포드를 생성한 후에는 컨테이너 내에서 chown
명령어를 사용할 수 없게 됩니다.
이번 글에서는 Linux 기능의 기본 사항과 Kubernetes 포드에서 이러한 기능을 관리하는 방법에 대해 살펴보았습니다. 기능을 세밀하게 관리함으로써 보안과 운영 효율성을 높일 수 있습니다.