Aqua Security에서 개발한 오픈 소스 도구인 Tracee에 대해 알아보겠습니다. Tracee는 컨테이너에서 시스템 호출을 추적할 수 있는 도구로, eBPF(Extended Berkeley Packet Filter) 기술을 활용하여 런타임에 시스템을 모니터링합니다.
Tracee는 Aqua Security에서 만든 오픈 소스 도구로, eBPF를 사용하여 커널 소스 코드에 간섭하거나 커널 모듈을 로드하지 않고도 커널 공간에서 프로그램을 실행할 수 있습니다. eBPF는 OS를 모니터링하고 의심스러운 행동을 감지하는 데 매우 유용하며, Tracee는 이를 활용하여 실시간으로 시스템 호출을 추적합니다.
Tracee는 서버에 직접 설치하여 실행할 수 있지만, 종속성을 설치하고 서버에 맞는 바이너리를 찾는 과정이 번거로울 수 있습니다. 따라서 Tracee를 도커 컨테이너로 실행하는 것이 더 쉬운 대안입니다.
Tracee를 도커 컨테이너로 실행하기 전에 몇 가지 전제 조건을 이해해야 합니다.
eBPF 프로그램 빌드 및 저장: Tracee는 eBPF 프로그램을 빌드하고 기본적으로 /tmp/tracee
디렉터리에 저장합니다. 이를 위해 호스트의 /tmp/tracee
디렉터리를 컨테이너에 바인드 마운트해야 합니다.
커널 헤더 접근: eBPF 프로그램을 컴파일하기 위해 Tracee는 커널 헤더에 접근해야 하며, 이는 우분투의 /lib/modules
와 /usr/src
에 위치해 있습니다. 이 디렉터리들도 읽기 전용 모드로 컨테이너에 바인드 마운트해야 합니다.
추가 권한 필요: 시스템 호출을 추적하기 위해 Tracee는 호스트에서 추가적인 권한이 필요합니다. 도커에서 --privileged
플래그를 사용하는 거이 가장 쉬운 방법입니다.
이제 Tracee 도커 컨테이너를 실행하는 방법을 살펴보겠습니다.
단일 명령어 (예: ls
)에 의해 생성된 시스템 호출을 추적하려면 다음과 같이 컨테이너를 실행합니다:
$ docker run --rm -it --privileged \
-v /tmp/tracee:/tmp/tracee \
-v /lib/modules:/lib/modules:ro \
-v /usr/src:/usr/src:ro \
aquasec/tracee --trace command=ls
위 명령어는 ls
명령어에 의해 호출된 모든 시스템 호출을 출력합니다.
호스트의 모든 새로운 프로세스에 의해 생성된 시스템 호출을 추적하려면 다음과 같이 컨테이너를 실행합니다:
docker run --rm -it --privileged \
-v /tmp/tracee:/tmp/tracee \
-v /lib/modules:/lib/modules:ro \
-v /usr/src:/usr/src:ro \
aquasec/tracee --trace pid=new
이 방법은 호스트의 모든 새로운 프로세스에 의해 생성된 시스템 호출을 실시간으로 추적합니다.
새로운 컨테이너에 의해 생성된 시스템 호출을 추적하려면 다음과 같이 컨테이너를 실행합니다:
docker run --rm -it --privileged \
-v /tmp/tracee:/tmp/tracee \
-v /lib/modules:/lib/modules:ro \
-v /usr/src:/usr/src:ro \
aquasec/tracee --trace container=new
Aqua Security의 Tracee 도구와 eBPF 기술을 이용한 시스템 호출 추적 방법에 대해 살펴보았습니다. Tracee는 보안 모니터링 및 문제 해결에 매우 유용한 도구로, 도커 컨테이너를 통해 쉽게 설치하고 실행할 수 있습니다.