seccomp과 AppArmor — 프로세스 샌드박싱 기법
컨테이너 격리는 namespace/cgroup만으로는 불완전합니다. 악의적인 프로세스가 위험한 시스템 콜을 호출하는 것을 막으려면 seccomp과 같은 추가적인 보안 레이어가 필요합니다.
프로세스 샌드박싱이 필요한 이유
namespace와 cgroup은 뷰와 자원을 격리 하지만, 프로세스가 호출할 수 있는 시스템 콜을 제한하지 않습니다. 커널 취약점을 이용한 컨테이너 탈출(container escape)을 방지하려면 추가 보안이 필요합니다.
보안 레이어:
1. Namespace: 뭘 볼 수 있는가
2. Cgroup: 얼마나 쓸 수 있는가
3. Seccomp: 어떤 시스템 콜을 쓸 수 있는가
4. AppArmor/SELinux: 어떤 파일/네트워크에 접근 가능한가
5. Capabilities: 어떤 특권 연산이 가능한가
Seccomp (Secure Computing)
프로세스가 호출할 수 있는 시스템 콜을 제한 합니다.
모드
| 모드 | 설명 |
|---|---|
| Strict | read, write, exit, sigreturn만 허용 |
| Filter (BPF) | BPF 프로그램으로 시스템 콜별 허용/거부 결정 |
Docker의 seccomp 프로필
Docker는 기본적으로 seccomp 프로필을 적용합니다.
{
"defaultAction": "SCMP_ACT_ERRNO",
"syscalls": [
{
"names": ["read", "write", "open", "close", "stat", "mmap", ...],
"action": "SCMP_ACT_ALLOW"
}
]
}
기본 프로필이 차단하는 위험한 시스템 콜:
reboot: 시스템 재부팅mount: 파일 시스템 마운트kexec_load: 새 커널 로드ptrace: 다른 프로세스 디버깅
# 커스텀 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_SERVICE | 1024 미만 포트 바인딩 |
| CAP_NET_RAW | Raw 소켓 사용 |
| CAP_SYS_ADMIN | 마운트, 네임스페이스 등 관리 작업 |
| CAP_CHOWN | 파일 소유자 변경 |
# Docker 컨테이너의 capability 제어
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx
# 모든 capability를 제거하고 포트 바인딩만 허용
AppArmor
파일 경로 기반 으로 프로세스의 접근을 제한합니다. Ubuntu에서 기본 사용됩니다.
# /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,
}
# 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에서 기본 사용됩니다.
# 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
| 항목 | AppArmor | SELinux |
|---|---|---|
| 접근 방식 | 파일 경로 기반 | 레이블 기반 |
| 복잡도 | 상대적으로 쉬움 | 복잡함 |
| 기본 배포판 | Ubuntu, SUSE | RHEL, 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로 파일 접근을 제어합니다.