Docker / / 2024. 12. 9. 16:46

Docker in Action Chapter 6

6장: Limiting risk with resource controls (자원 제어를 통한 위험 제한)

이전 장들에서 네임스페이스와 가상화된 리소스를 이용해 애플리케이션을 격리하는 방법을 배웠다면, 이번 장에서는 시스템 자원을 좀 더 구체적으로 제어하는 방법에 초점을 둡니다. 컨테이너에서 CPU, 메모리 등 자원 할당량을 조정하고, 사용자 권한(UID/GID)과 특수 권한(capabilities), SELinux/AppArmor 보안 정책 등을 통해 실행 환경을 강화할 수 있습니다. 이를 통해 실패나 공격 발생 시 영향을 최소화하고, 컨테이너가 호스트와 다른 컨테이너에 미치는 위험을 줄일 수 있습니다.

자원 할당량 설정 (Resource Controls)

  • 메모리 제한(-m 또는 --memory): 컨테이너가 사용할 수 있는 메모리 양을 제한합니다. 이를 통해 과도한 메모리 소비로 인한 시스템 불안정, 다른 컨테이너나 호스트 프로그램에 악영향을 주는 상황을 방지할 수 있습니다.
  • CPU 점유 비율(--cpu-shares): 컨테이너 간 CPU 사용량 비율을 조정합니다. CPU 공유값을 설정하면 여러 컨테이너가 경쟁할 때 상대적인 CPU 사용 우선순위를 결정할 수 있습니다.
  • CPU 코어 할당(--cpuset-cpus): 특정 CPU 코어(또는 범위)를 컨테이너에 할당하여 성능 향상이나 특정 워크로드 격리를 지원할 수 있습니다.
  • 장치 접근(--device): 기본적으로 컨테이너는 호스트의 대부분의 디바이스에 접근할 수 없습니다. --device 옵션을 통해 특정 호스트 디바이스(예: /dev/video0)를 컨테이너에 노출할 수 있습니다.

공유 메모리(IPC) 제어

컨테이너마다 IPC 네임스페이스가 독립적이므로, 기본적으로 다른 컨테이너와 공유 메모리를 통해 통신할 수 없습니다. 컨테이너 간에 IPC 자원을 공유하려면 --ipc container:<CONTAINER> 옵션을 사용해 IPC 네임스페이스를 공유할 수 있습니다.

사용자 및 권한 관리

  • 사용자 설정(--user): 컨테이너 실행 시 특정 사용자를 지정해 root 사용을 피하거나 제한할 수 있습니다. UID/GID를 직접 지정하거나 이미지 내 존재하는 사용자/그룹을 이용할 수 있습니다.
  • 파일 권한과 볼륨: 컨테이너 내 사용자의 UID/GID는 호스트와 동일한 ID 공간을 공유합니다. 이를 통해 볼륨에 마운트된 호스트 파일에 대한 접근 권한을 컨트롤할 수 있습니다.
  • User 네임스페이스(UID remapping): User 네임스페이스를 활용하면 컨테이너의 root를 호스트의 비특권 UID로 매핑하여 실질적으로 컨테이너 내 root 권한을 저권한으로 바꿀 수 있습니다. 이를 통해 보안을 한층 강화할 수 있습니다.

캡어빌리티(Capabilities) 조정

  • Linux capabilities를 추가(--cap-add)하거나 제거(--cap-drop)하여 컨테이너가 사용할 수 있는 커널 기능을 세밀하게 제어할 수 있습니다.
  • 예를 들어 --cap-drop net_raw로 raw 소켓 접근을 막거나, --cap-add sys_admin으로 시스템 관리 능력을 컨테이너에 부여할 수 있습니다.

Privileged 컨테이너

  • --privileged 옵션을 통해 컨테이너에게 거의 완전한 접근 권한을 줄 수 있습니다(모든 capabilities, 장치 접근 등).
  • 하지만 이는 보안 격리를 크게 약화시키므로 최소한으로 사용해야 합니다.

강화된 보안 도구 사용

  • Seccomp, SELinux, AppArmor 등과 같은 리눅스 보안 메커니즘을 Docker와 결합하여 컨테이너를 강화할 수 있습니다.
  • --security-opt를 사용해 seccomp 프로필을 지정하거나 SELinux/AppArmor 설정을 적용할 수 있습니다.
  • 이러한 도구들은 추가적인 학습과 설정이 필요하지만, 프로덕션 환경에서 강력한 보안 수준을 제공할 수 있습니다.

상황별 컨테이너 구성 전략

  • 애플리케이션용 컨테이너: 가능한 한 특권을 최소화하고 자원 제어와 사용자 관리로 위험 감소
  • 고수준 시스템 서비스용 컨테이너: 일부 제한적 권한 부여, 특정 capabilities 추가
  • 저수준 시스템 서비스용 컨테이너: 호스트 네트워크나 디바이스 관리가 필요한 경우, privileged 모드 사용이나 userns-remap, SELinux/AppArmor 등의 고급 기법 고려

정리:
이 장에서는 컨테이너 실행 환경에서 자원 제어, 사용자/그룹 권한 설정, capabilities 조정, 그리고 SELinux/AppArmor와 seccomp를 통한 강화 등 다양한 보안 및 안정성 강화 방법을 다루었습니다. 적절한 리소스 제한과 권한 관리로 애플리케이션 실패나 보안 공격 시 영향을 최소화하고, 환경에 맞춘 유연한 격리 정책을 설계할 수 있습니다.

'Docker' 카테고리의 다른 글

Docker in Action Chapter 8  (1) 2024.12.09
Docker in Action Chapter 7  (0) 2024.12.09
Docker in Action Chapter 5  (0) 2024.12.09
Docker in Action Chapter 4  (0) 2024.12.09
Docker in Action Chapter 3  (0) 2024.12.09
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유