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 |