컨테이너 격리는 namespace/cgroup만으로는 불완전합니다. 악의적인 프로세스가 위험한 시스템 콜을 호출하는 것을 막으려면 seccomp과 같은 추가적인 보안 레이어가 필요합니다.


프로세스 샌드박싱이 필요한 이유

namespace와 cgroup은 뷰와 자원을 격리 하지만, 프로세스가 호출할 수 있는 시스템 콜을 제한하지 않습니다. 커널 취약점을 이용한 컨테이너 탈출(container escape)을 방지하려면 추가 보안이 필요합니다.

PLAINTEXT
보안 레이어:
1. Namespace: 뭘 볼 수 있는가
2. Cgroup: 얼마나 쓸 수 있는가
3. Seccomp: 어떤 시스템 콜을 쓸 수 있는가
4. AppArmor/SELinux: 어떤 파일/네트워크에 접근 가능한가
5. Capabilities: 어떤 특권 연산이 가능한가

Seccomp (Secure Computing)

프로세스가 호출할 수 있는 시스템 콜을 제한 합니다.

모드

모드설명
Strictread, write, exit, sigreturn만 허용
Filter (BPF)BPF 프로그램으로 시스템 콜별 허용/거부 결정

Docker의 seccomp 프로필

Docker는 기본적으로 seccomp 프로필을 적용합니다.

JSON
{
  "defaultAction": "SCMP_ACT_ERRNO",
  "syscalls": [
    {
      "names": ["read", "write", "open", "close", "stat", "mmap", ...],
      "action": "SCMP_ACT_ALLOW"
    }
  ]
}

기본 프로필이 차단하는 위험한 시스템 콜:

  • reboot: 시스템 재부팅
  • mount: 파일 시스템 마운트
  • kexec_load: 새 커널 로드
  • ptrace: 다른 프로세스 디버깅
BASH
# 커스텀 seccomp 프로필 적용
docker run --security-opt seccomp=custom.json nginx

# seccomp 비활성화 (위험 — 개발 환경에서만)
docker run --security-opt seccomp=unconfined nginx

Linux Capabilities

전통적으로 리눅스 프로세스는 root(모든 권한) 또는 일반 사용자(제한된 권한) 두 가지뿐이었습니다. Capabilities는 root 권한을 세분화합니다.

Capability설명
CAP_NET_BIND_SERVICE1024 미만 포트 바인딩
CAP_NET_RAWRaw 소켓 사용
CAP_SYS_ADMIN마운트, 네임스페이스 등 관리 작업
CAP_CHOWN파일 소유자 변경
BASH
# Docker 컨테이너의 capability 제어
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx
# 모든 capability를 제거하고 포트 바인딩만 허용

AppArmor

파일 경로 기반 으로 프로세스의 접근을 제한합니다. Ubuntu에서 기본 사용됩니다.

PLAINTEXT
# /etc/apparmor.d/usr.sbin.nginx
profile nginx {
  # 읽기 허용
  /etc/nginx/** r,
  /var/www/** r,

  # 쓰기 허용
  /var/log/nginx/** w,

  # 네트워크 허용
  network inet stream,

  # 나머지는 거부
  deny /etc/shadow r,
}
BASH
# AppArmor 상태 확인
sudo aa-status

# 프로필 모드
# enforce: 규칙 위반 시 차단
# complain: 규칙 위반 시 로그만 기록 (학습용)
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx

SELinux

레이블 기반 으로 모든 자원(파일, 프로세스, 포트)의 접근을 제어합니다. Red Hat/CentOS에서 기본 사용됩니다.

BASH
# SELinux 상태 확인
getenforce     # Enforcing / Permissive / Disabled

# 파일의 SELinux 레이블 확인
ls -Z /var/www/html/
# system_u:object_r:httpd_sys_content_t:s0

# 프로세스의 SELinux 컨텍스트 확인
ps auxZ | grep nginx
# system_u:system_r:httpd_t:s0

AppArmor vs SELinux

항목AppArmorSELinux
접근 방식파일 경로 기반레이블 기반
복잡도상대적으로 쉬움복잡함
기본 배포판Ubuntu, SUSERHEL, CentOS, Fedora
보안 강도좋음매우 강함

핵심 포인트

  • seccomp의 역할: 불필요한 시스템 콜을 차단하여 커널 공격 표면 축소
  • Capabilities vs root: root를 세분화하여 최소 권한 원칙 적용
  • AppArmor vs SELinux: 경로 기반 vs 레이블 기반 — 배포판에 따라 선택
  • Docker 보안 레이어: namespace + cgroup + seccomp + capabilities + AppArmor/SELinux

정리

프로세스 샌드박싱은 다층 방어(Defense in Depth)의 핵심입니다. 컨테이너 환경에서는 seccomp으로 시스템 콜을 제한하고, Capabilities로 root 권한을 최소화하며, AppArmor/SELinux로 파일 접근을 제어합니다.

댓글 로딩 중...