본문 바로가기
MLOps/Doker & Kubernetes

Udemy CKA 강의 정리 170: Pre-requisite - Security in Docker

by 공부하는 무니 2023. 1. 19.
반응형

해당 내용은 Udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests 강의를 공부한 내용입니다. 내용을 그대로 번역하기보다는, 제가 이해하기 쉬운 대로 수정한 부분들이 있습니다.

⚠️ 영어 독해가 많이 부족합니다. 틀린 내용이 있으면 알려주시면 감사하겠습니다.


이번 강의에서는 Kubernetes의 security context에 대해 이야기하겠습니다. 그러나 그것에 들어가기 전에 Docker의 보안에 대한 지식을 갖는 것이 중요합니다. Docker의 보안에 익숙하다면 이 강의를 건너뛰고 다음 강의로 이동하세요. 이번 강의에서는 도커의 보안과 관련된 다양한 개념에 대해 알아보겠습니다.

Docker가 설치된 호스트부터 시작하겠습니다. 이 호스트에는 여러 운영 체제 프로세스, Docker 데몬, SSH 서버 등과 같이 실행 중인 자체 프로세스 세트가 있습니다. 이제 한 시간 동안 대기하는 프로세스를 실행하는 Ubuntu Docker 컨테이너를 실행합니다. 우리는 가상 머신과 달리 컨테이너가 호스트에서 완전히 격리되지 않는다는 것을 배웠습니다. 컨테이너와 호스트는 동일한 커널을 공유합니다. 컨테이너는 Linux에서 네임스페이스를 사용하여 격리됩니다. 호스트에는 네임스페이스가 있고 컨테이너에는 자체 네임스페이스가 있습니다. 컨테이너에 의해 실행되는 모든 프로세스는 실제로 호스트 자체에서 실행되기도 하지만 자체 네임스페이스에서 실행된다고 볼 수도 있습니다.

Docker 컨테이너는 자체 네임스페이스에 있으며 자체 프로세스만 볼 수 있습니다. 외부 또는 다른 네임스페이스에서 아무것도 볼 수 없습니다. 

Docker 컨테이너에서 프로세스를 조회하면 process ID가 1인 sleep 프로세스가 표시됩니다.

Docker 호스트의 경우 자체 모든 프로세스와 자식 네임스페이스의 프로세스는 시스템의 또 다른 프로세스로 표시됩니다. 따라서 호스트의 프로세스를 나열하면 같은 sleep 커맨드인데 프로세스 ID가 다른 프로세스 목록이 표시됩니다.

이는 프로세스가 서로 다른 네임스페이스에서 서로 다른 프로세스 ID를 가질 수 있고 Docker가 시스템 내에서 컨테이너를 격리하는 방식 때문입니다. 이것이 프로세스 격리입니다.

Container Security

이제 보안의 맥락에서 사용자를 살펴보겠습니다. Docker 호스트에는 사용자 집합: 루트 사용자 및 루트가 아닌 여러 사용자가 있습니다. default로 Docker는 컨테이너 내에서 루트 사용자로 프로세스를 실행합니다. 컨테이너 내부와 컨테이너 외부(그러나 호스트 안) 모두에서 프로세스는 루트 사용자로 실행됩니다.

컨테이너 내의 프로세스를 루트 사용자로 실행하지 않으려면 Docker run 커맨드 내에서 사용자 옵션을 사용하여 새 사용자 ID를 지정할 수 있습니다. 프로세스가 이제 새 사용자 ID로 실행되는 것을 볼 수 있습니다. 

사용자 보안을 강화하는 또 다른 방법은 생성 시 Docker 이미지 자체에 이를 definition하는 것입니다. 예를 들어 default Ubuntu 이미지를 사용하고 사용자 ID를 1000으로 설정합니다. 그런 다음 사용자 지정 이미지를 빌드합니다. 이제 사용자 ID를 지정하지 않고 이 이미지를 실행할 수 있으며 프로세스는 사용자 ID 1000으로 실행됩니다.

한 걸음 뒤로 돌아가서, 컨테이너를 루트 사용자로 실행하면 어떻게 되나요? 컨테이너 내의 루트 사용자가 호스트의 루트 사용자와 동일할까요? 컨테이너 내부의 프로세스는 루트 사용자가 시스템에서 수행할 수 있는 모든 작업을 수행할 수 있나요? 그렇다면 위험하지 않을까요? Docker는 컨테이너 내에서 루트 사용자의 능력을 제한하는 일련의 보안 기능을 구현합니다. 따라서 컨테이너 내의 루트 사용자는 실제로 호스트의 루트 사용자와 다릅니다. Docker는 이를 구현하기 위해 Linux 기능을 사용합니다.

우리 모두 알다시피 루트 사용자는 시스템에서 가장 강력한 사용자입니다. 루트 사용자는 문자 그대로 무엇이든 할 수 있으며 루트 사용자가 실행하는 프로세스도 마찬가지입니다. 이 작업들은 모두 Linux 시스템의 다양한 capability이며 /usr/include/linux/capability.h에서 전체 목록을 볼 수 있습니다.

제 사용자가 사용할 수 있는 기능을 제어하고 제한할 수 있습니다. default로 Docker는 제한된 capability 세트로 컨테이너를 실행합니다. 따라서 컨테이너 내에서 실행 중인 프로세스에는 호스트를 재부팅하거나 호스트에서 실행 중인 다른 컨테이너를 방해할 수 있는 작업을 수행할 수 있는 권한이 없습니다. 이 동작을 재정의하고 추가 권한을 제공하려면 Docker run 커맨드에서 cap add 옵션을 사용하세요.

마찬가지로 cap drop 옵션을 사용하여 권한을 삭제할 수도 있습니다.

또는 모든 권한이 활성화된 상태로 컨테이너를 실행하려는 경우 --privileged 플래그를 사용하세요. 

반응형

댓글