IT/CKA

CKA 준비과정 - Security (8) / Security in Docker, Security Contexts

Primes 2023. 6. 27. 14:05
728x90

Security in Docker

쿠버네티스의 보안에 대해 알기 전, Docker의 보안에 대해 이해하고 넘어간다.

 

컨테이너는 호스트 OS와 격리되어 운영되는 구조가 아니다. 컨테이너는 OS에서 namespace를 이용해 격리된다. 컨테이너와 호스트는 같은 커널을 공유한다.

 

즉, 컨테이너에서 실행되는 프로세스는 호스트에서 실행되지만 고유의 namespace 공간에서 실행된다.

 

네임스페이스 내 리소스는 다른 네임스페이스에서는 볼 수 없다.

 

ps aux 명령어를 통해 도커 컨테이너 목록을 확인할 수 있다. 여기서 PID 도 확인이 가능한데,  네임스페이스 내에서는 다른 네임스페이스의 프로세스를 확인할 수 없어 PID가 1로 보인다.

 

하지만 호스트에서 ps aux 명령어를 사용하면 모든 namespace의 컨테이너를 확인할 수 있다. 따라서 PID가 다르게 표기됨을 알 수 있다.

Docker에서 호스트는 루트 유저 1명과 다수의 비 루트 유저를 포함하는 사용자 집합을 갖는다. 기본값으로는 루트 사용자로서 프로세스를 실행한다. 만일 컨테이너 내 프로세스가 루트 사용자로 실행되길 원하지 않는다면

docker run 명령어에서 --user 옵션을 활용해 사용자명을 명시하도록 한다.

 

사용자 보안을 시행하는 다른 방법으로는 Docker 이미지 자체에서 생성 시 정의하는 방법이 있다.

위와같이 Dockerfile에서 사용자를 지정한다.

 

루트 사용자는 호스트 루트 사용자와 컨테이너 루트 사용자로 나뉜다. 루트 사용자는 시스템 내 모든 권한을 가지고 명령을 실행할 수 있기 때문에, 사용자에 따라 권한 제어가 필요하다. docker는 컨테이너 내 루트 사용자에 대한 권한을 제어하는 보안 그룹 기능을 제공한다.

 

Docker는 linux의 기능을 활용하여 컨테이너 내 루트 사용자에 대해 권한을 제어한다.

리눅스 os의 루트 사용자는 위와같이 다양한 설정들을 모두 조절할 수 있다. 기본적으로 Docker는 OS의 기능이 제한되어 있는 컨테이너를 실행한다. 각 컨테이너는 다른 컨테이너에 간섭할 수 있는 권한이 없도록 기본적으로 제한되어 있다.

 

만일, 이러한 제한을 재정의하고 컨테이너에 추가 권한을 부여하고 싶다면 docker run 명령에 --cap-add 옵션을 추가하면 된다.

docker run --cap -add : 권한 추가

docker run --cap-drop : 권한 제거

docker run --previleged : 모든 권한 활성화 컨테이너 실행

 

 

Security Contexts

Docker 컨테이너 실행 시, 보안 그룹을 정의할 수 있음을 위에서 학습했다.

해당 옵션은 쿠버네티스에서도 적용이 가능하다. 쿠버네티스는 컨테이너를 파드 내에서 관리하기 때문에, 컨테이너 또는 파드 레벨에서 보안 설정이 가능하다.

파드 레벨로 설정할 경우 파드 내 모든 컨테이너에 설정값이 적용된다.

securityContext 필드를 파드 정의 파일에서 추가하여 설정할 수 있다.

runasUser 필드에서 사용자 ID를 지정한다.

 

컨테이너 레벨의 보안 설정을 원한다면 위 정의 파일 예시에서 containers 영역에 securityContext 필드를 추가하면 된다.

또한 추가로, 컨테이너 레벨에서 지정할 경우 capabilities 필드를 지정하여 추가할 기능을 명시할 수도 있다. 이는 파드 레벨에서는 지정이 불가하다.

반응형