Linux에서 실행되는 모든 프로그램은 파일을 읽거나 쓰고, 네트워크에 접속하며, 프로세스를 생성하는 등 다양한 작업을 수행합니다. 하지만 이러한 작업은 직접 하드웨어를 제어하는 것이 아니라 System Call(시스템 콜) 을 통해 Linux Kernel에 요청하는 방식으로 이루어집니다.
만약 악성 프로그램이나 공격자가 위험한 시스템 콜을 자유롭게 사용할 수 있다면 시스템 전체가 위험해질 수 있습니다.
이러한 위험을 줄이기 위해 Linux Kernel은 Seccomp(Secure Computing Mode) 라는 보안 기능을 제공합니다.
Seccomp는 프로그램이 사용할 수 있는 시스템 콜을 제한하여 공격 범위를 줄이는 보안 메커니즘입니다. Docker와 Kubernetes에서도 컨테이너를 보호하기 위해 기본적으로 Seccomp를 활용합니다.
이번 글에서는 Seccomp의 개념과 동작 원리, 모드, Docker에서의 활용 방법, 그리고 실무 적용 사례를 자세히 알아보겠습니다.
Linux Seccomp란?
Seccomp는 프로세스가 호출할 수 있는 시스템 콜을 제한하는 Linux Kernel 보안 기능입니다.
동작 구조는 다음과 같습니다.
Application
↓
System Call
↓
Seccomp Filter
↓
허용
↓
Kernel
또는
↓
차단
Kernel에 전달되기 전에 시스템 콜을 검사하여 허용 여부를 결정합니다.
System Call이란?
System Call은 사용자 프로그램이 Kernel 기능을 사용하는 공식적인 인터페이스입니다.
대표적인 시스템 콜은 다음과 같습니다.
| 시스템 콜 | 기능 |
|---|---|
| open | 파일 열기 |
| read | 파일 읽기 |
| write | 파일 쓰기 |
| fork | 프로세스 생성 |
| execve | 프로그램 실행 |
| socket | 소켓 생성 |
| mount | 파일 시스템 마운트 |
| reboot | 시스템 재부팅 |
Seccomp는 이러한 시스템 콜을 선택적으로 제한합니다.
Seccomp가 필요한 이유
예를 들어 웹 서버는 다음과 같은 작업만 수행하면 됩니다.
- 파일 읽기
- 네트워크 통신
- 로그 기록
반면 다음 기능은 대부분 필요하지 않습니다.
- reboot
- mount
- ptrace
- kexec_load
Seccomp는 불필요한 시스템 콜을 차단하여 공격 가능성을 줄입니다.
Seccomp의 동작 방식
프로그램이 시스템 콜을 호출하면 다음과 같은 과정이 진행됩니다.
Application
↓
System Call 발생
↓
Seccomp Filter 검사
↓
허용
↓
Kernel 실행
또는
↓
거부
↓
EPERM 또는 프로세스 종료
필터 규칙에 따라 시스템 콜이 허용되거나 차단됩니다.
Seccomp 모드
Seccomp에는 두 가지 주요 모드가 있습니다.
| 모드 | 설명 |
|---|---|
| Strict Mode | 매우 제한된 시스템 콜만 허용 |
| Filter Mode | 원하는 시스템 콜만 선택적으로 허용 |
현재 대부분의 환경에서는 Filter Mode를 사용합니다.
BPF(Berkeley Packet Filter)와 Seccomp
Seccomp Filter는 BPF(Berkeley Packet Filter) 를 이용해 시스템 콜을 검사합니다.
동작 과정은 다음과 같습니다.
System Call
↓
BPF Filter
↓
허용 여부 판단
↓
Kernel
BPF를 사용하면 매우 세밀한 조건으로 시스템 콜을 제어할 수 있습니다.
현재 Seccomp 지원 확인
Kernel에서 Seccomp를 지원하는지 확인하려면 다음 명령을 사용합니다.
grep SECCOMP /boot/config-$(uname -r)
예시
CONFIG_SECCOMP=y
CONFIG_SECCOMP_FILTER=y
y로 표시되면 기능이 활성화되어 있습니다.
Docker와 Seccomp
Docker는 기본적으로 Default Seccomp Profile을 사용합니다.
확인
docker info | grep -i seccomp
기본적으로 약 300개 이상의 시스템 콜 중 위험한 일부를 차단합니다.
예를 들어 다음 시스템 콜은 기본적으로 제한됩니다.
- kexec_load
- reboot
- ptrace
- swapon
- swapoff
이를 통해 컨테이너 탈출(Container Escape) 위험을 줄일 수 있습니다.
Seccomp 비활성화
테스트를 위해 Seccomp를 비활성화할 수도 있습니다.
docker run \
--security-opt seccomp=unconfined \
ubuntu
하지만 운영 환경에서는 권장되지 않습니다.
Kubernetes와 Seccomp
Kubernetes에서도 Seccomp Profile을 사용할 수 있습니다.
예시
securityContext:
seccompProfile:
type: RuntimeDefault
또는
securityContext:
seccompProfile:
type: Localhost
Pod별로 서로 다른 보안 정책을 적용할 수 있습니다.
실무에서 자주 사용하는 명령어
Kernel 설정 확인
grep SECCOMP /boot/config-$(uname -r)
Docker 확인
docker info | grep -i seccomp
현재 Kernel 버전
uname -r
컨테이너 정보 확인
docker inspect 컨테이너명
시스템 콜 추적
strace ls
사용 가능한 보안 옵션 확인
docker info
실무 사례
예를 들어 금융 서비스에서 운영하는 API 서버를 컨테이너로 실행한다고 가정해 보겠습니다.
API 서버는 파일 읽기와 네트워크 통신만 필요합니다.
관리자는 다음과 같은 절차를 적용합니다.
- Docker 기본 Seccomp Profile 적용
- 필요하지 않은 시스템 콜 차단
strace를 이용하여 실제 사용하는 시스템 콜 분석- 사용자 정의 Seccomp Profile 생성
- Kubernetes Pod에 적용
이렇게 하면 공격자가 애플리케이션 취약점을 악용하더라도 위험한 시스템 콜을 실행하기 어려워집니다.
자주 묻는 질문
Seccomp와 Capabilities는 같은 기능인가요?
아닙니다. Capabilities는 권한을 세분화하는 기능이고, Seccomp는 사용 가능한 시스템 콜 자체를 제한하는 기능입니다. 두 기능은 서로 보완적으로 사용됩니다.
Seccomp를 사용하면 성능이 저하되나요?
영향은 매우 적습니다. 시스템 콜을 검사하는 과정이 추가되지만 대부분의 서버 환경에서는 체감하기 어려운 수준입니다.
Docker에서 Root 권한으로 실행해도 Seccomp가 적용되나요?
네. 컨테이너 내부에서 Root 사용자로 실행하더라도 기본 Seccomp Profile이 활성화되어 있으면 제한된 시스템 콜만 사용할 수 있습니다.
마무리
Linux Seccomp는 시스템 콜을 필터링하여 프로세스가 사용할 수 있는 Kernel 기능을 제한하는 강력한 보안 기술입니다. Docker와 Kubernetes는 Seccomp를 기본적으로 활용하여 컨테이너의 공격 범위를 줄이고 시스템을 보호합니다. Capabilities, cgroups, Namespace와 함께 사용하면 보다 안전한 Linux 환경을 구축할 수 있으며, 특히 운영 서버와 클라우드 환경에서 필수적으로 이해해야 할 Kernel 보안 기능입니다.