본문 바로가기
스터디 이야기/25' Cilium

Cilium Tetragon을 활용한 eBPF 정책 실습

by lakescript 2025. 9. 3.
728x90

 

Cilium Tetragon

 

Cilium Tetragon이란?

https://tetragon.io/docs/overview/

 

Cilium Tetragon은 실시간으로 동작하는 eBPF 기반 보안 관찰 및 런타임 제어 도구입니다. 시스템에서 발생하는 중요한 보안 이벤트를 감지하고, 필요하면 즉시 대응할 수 있습니다.

 

주요 기능

  • 프로세스 실행 감지: 어떤 프로그램이 실행되는지 추적
  • 시스템 호출 모니터링: 커널과 상호작용하는 시스템 콜 활동을 기록
  • 입출력 활동 감지: 네트워크 트래픽이나 파일 접근 같은 I/O 동작을 관찰

특징

eBPF 실시간

Tetragon은 커널의 eBPF에 정책과 필터링을 직접 적용하기 때문에 user space agent로 이벤트를 전송하는 대신, 커널에서 직접 이벤트를 필터링하고, 차단 및 대응합니다. 전송, 읽기 또는 쓰기 작업과 같이 빈도가 높은 이벤트의 경우, context switching 및 wake-ups을 방지함으로써 eBPF는 필요한 리소스를 절감합니다.

또한, Tetragon은 eBPF에서 파일, 소켓, 바이너리 이름, namespace/capabilities 등 다양한 필터를 제공하여 사용자가 특정 컨텍스트에서 중요하고 관련성 있는 이벤트를 지정하고 해당 이벤트만 user-space agent로 전달할 수 있도록 합니다.

 

eBPF 유연성

Linux 커널의 모든 함수에 연결하여 인수, 반환 값, 프로세스에 대해 수집하는 관련 메타데이터, 파일 및 기타 속성을 필터링할 수 있습니다.

이때, 추적 정책(tracing policies)을 작성함으로써 사용자는 다양한 보안 및 observability 문제를 해결할 수 있습니다.

이를 통해 user space applications이 데이터 구조를 조작할 수 없는 커널 깊숙이 hooking할 수 있으므로 시스템 호출 추적에서 발생하는 일반적인 문제를 피할 수 있다는 것이 큰 특징입니다.

 

eBPF 커널 인식

eBPF를 통해 Linux 커널 상태에 접근할 수 있기에, Kubernetes awareness 또는 user policy와 결합하여 커널에서 실시간으로 적용되는 규칙을 생성할 수 있습니다. 이를 통해 process namespace 및 capabilities, 소켓을 프로세스에, process file 설명자를 파일 이름에 추가하는 등의 주석을 달고 적용할 수 있습니다. (예를 들어 애플리케이션이 권한을 변경할 때, 해당 프로세스가 시스템 호출을 완료하고 추가적인 시스템 호출을 하기 전에 경고를 발생시키거나 프로세스를 종료하는 등의 정책을 설정할 수 있습니다.)

 

K8s 환경에서의 특징

  • namespace나 pod등과 같은 Kubernetes 리소스를 이해하고 처리할 수 있습니다.
  • 워크로드 단위로 보안 이벤트 탐지 규칙을 설정할 수 있습니다.
  • 특정 파드나 네임스페이스 수준에서 정책 기반 제어가 가능합니다.

즉, Tetragon은 클라우드 네이티브 환경에서 발생하는 보안 관련 활동을 실시간으로 관찰하고 제어할 수 있는 도구입니다.

 

 

실습

실습 환경 구성

Cilium Tetragon 설치

helm repo add cilium https://helm.cilium.io
helm repo update
helm install tetragon cilium/tetragon -n kube-system

 

 

설치 확인

k -n kube-system get deploy tetragon-operator -owide

 

k -n kube-system get cm tetragon-operator-config tetragon-config

 

k -n kube-system get ds tetragon -owide

 

tetragon은 daemonset으로 배포되기 때문에 kube-system namespace의 daemonset을 확인해보겠습니다.

 

kubectl get po -n kube-system

 

현재 node가 3대 이기 때문에 daemonset 형태로 배포되어 총 3개의 pod가 띄어져 있는 것을 확인할 수 있습니다.

 

 

테스트 애플리케이션 배포

배포

kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.18.1/examples/minikube/http-sw-app.yaml

 

확인

kubectl get pods

 

실행 모니터링 실습

Tetragon을 활용해 시스템에서 발생하는 모든 실행을 추적하는 실습을 진행해보겠습니다.

https://isovalent.com/blog/post/top-tetragon-use-cases/

 

위와 같이 세밀한 telemetry를 통해 실행 이벤트를 JSON 로그와 gRPC stream을 통해 확인할 수 있으며, 시스템의 모든 실행 과정을

파악할 수 있습니다.

 

Tetragon Pod 이름을 환경변수 지정하기

POD=$(kubectl -n kube-system get pods -l 'app.kubernetes.io/name=tetragon' -o name --field-selector spec.nodeName=$(kubectl get pod xwing -o jsonpath='{.spec.nodeName}'))
echo $POD

 

여러 노드가 있는 클러스터에서는 사용하는 Tetragon Pod가 xwing Pod와 동일한 노드에 있어야 실행 이벤트를 캡처할 수 있기에 위 명령어를 통해 xwing Pod와 동일한 Kubernetes 노드에 있는 Tetragon Pod의 이름을 환경 변수로 지정합니다.

 

[터미널1] Tetragon에서 캡처한 실행 이벤트 확인

kubectl exec -ti -n kube-system $POD -c tetragon -- tetra getevents -o compact --pods xwing

 

위에서 설정한 환경변수를 통해 일치하는 Pod를 식별한 후, 해당 Pod를 대상으로 지정하여 xwing 파드와 관련된 Tetragon 이벤트를 간략(compact) 형식으로 출력하는 명령어를 실행합니다.

 

[터미널2] 요청 보내보기

# 외부 호출
kubectl exec -ti xwing -- bash -c 'curl https://ebpf.io/applications/#tetragon'

# 파일 접근
kubectl exec -ti xwing -- bash -c 'cat /etc/passwd'

 

 

[터미널1] Tetragon에서 캡처한 실행 이벤트 확인 - 외부 호출

위와 같이 왼쪽에는 모니터링, 오른쪽에는 k8s 클러스터 외부 호출에 대한 응답이 보여집니다.

 

 

각 줄마다 상세한 이벤트를 tetragon이 캡쳐하고 추적한 것을 알 수 있습니다.

  • default 네임스페이스의 xwing 파드 안에서 usr/bin/bash -c 로 curl 명령이 실행됨을 감지
  • curl 프로세스가 실제로 실행된 것을 감지.
  • curl 프로세스가 종료된 이벤트. (0은 정상 종료를 의미)

 

[터미널1] Tetragon에서 캡처한 실행 이벤트 확인 - 파일 접근

# 파일 접근
kubectl exec -ti xwing -- bash -c 'cat /etc/passwd'

마찬가지로 왼쪽에는 모니터링, 오른쪽에는 pod 내부에 파일에 접근한 응답이 보여집니다.

  • default 네임스페이스의 xwing 파드에서 bash -c 를 통해 cat /etc/passwd 명령 실행
  • /usr/bin/cat 프로세스가 실행
  • cat 프로세스가 종료 (0은 정상 종료)

 

즉, 민감 파일 접근 이벤트를 Tetragon이 추적하고 해당 내용을 출력한 결과입니다.

 

 

Policy Enforcement 실습

Tetragon에서 사용하는 추적 정책(Tracing Policy)은 리눅스 커널 내부의 특정 함수(파일에 접근하는 함수, 네트워크 연결을 처리하는 함수등)를 모니터링합니다. 이렇게 커널 함수를 감시하면 단순히 어떤 일이 일어났는지를 보고(report)하는 것뿐만 아니라, 정책에 따라 해당 동작을 제한(enforce)할 수도 있습니다.

 

이 과정에서 중요한 점은 커널 내부에서 필터링을 적용한다는 것 입니다. 보통 커널에서 일어난 이벤트를 모두 User Space으로 전달하면 성능에 부담이 크게 되는데, Tetragon은 필요 없는 이벤트는 아예 커널 수준에서 걸러내기 때문에, User Space로 전달되는 이벤트 수를 크게 줄일 수 있고, 성능을 효율적으로 유지하면서도 중요한 이벤트만 다룰 수 있습니다.

 

또한, Tetragon은 단순히 이벤트를 보고하는 데서 그치지 않고, 정책 위반을 커널 수준에서 바로 막을 수 있는데, 예를 들어, 어떤 프로세스가 SIGKILL 정책 위반 상태에서 실행되면, 그 프로세스는 아예 시작조차 되지 않고 즉시 종료되게 됩니다. 또한, 정책이 시스템 호출(syscall)을 통해 트리거되는 경우에는 애플리케이션이 해당 시스템 호출의 결과를 받지 못하고, 호출 도중 종료됩니다. 

 

이 실습에서는 파일 액세스 제한 정책에 대한 실습을 진행해보겠습니다.

 

file_monitoring_enforce.yaml 적용

kubectl apply -f https://raw.githubusercontent.com/cilium/tetragon/main/examples/quickstart/file_monitoring_enforce.yaml

 

위 파일은 일반적으로 사용하는 정책 파일이며, 애플리케이션에 작업 블록을 추가 SIGKILL하고 작업 시 오류를 반환하는 정책입니다.

 

확인

kubectl get tracingpolicynamespaced

 

 

[터미널1] Tetragon에서 캡처한 실행 이벤트 확인

kubectl exec -ti -n kube-system $POD -c tetragon -- tetra getevents -o compact --pods xwing

 

 

[터미널2] 정책에 포함된 민감 파일 읽기

kubectl exec -ti xwing -- bash -c 'cat /etc/shadow'

 

정의된 정책에 포함된 파일 중 하나인 민감한 파일을 읽어보겠습니다.

 

xwing 파드에서 cat /etc/shadow 명령 실행을 Tetragon이 추적하고, 정책 위반으로 인해 강제 종료(SIGKILL)된 과정을 확인할 수 있습니다.

  • default 네임스페이스의 xwing 파드에서 bash -c 를 통해 catcat /etc/shadow 명령 실행
  • 실제 cat 프로세스 실행 시작
  • cat 프로세스가 /etc/shadow 파일을 읽으려는 동작 감지
  • 정책 위반으로 인해 Tetragon이 프로세스를 SIGKILL 시그널로 강제 종료

 

[터미널2] 정책에 포함되지 않은 파일 읽기

kubectl exec -ti xwing -- bash -c 'echo foo > /tmp/test.txt'

 

 

파일 정책에 포함되지 않은 파일을 읽거나 쓰려는 시도는 영향을 받지 않습니다.

 


참고

https://tetragon.io/

 

Tetragon - eBPF-based Security Observability and Runtime Enforcement

Tetragon is a sub-project under Cillium and a proud CNCF project eBPF-based Security Observability and Runtime Enforcement Tetragon is a flexible Kubernetes-aware security observability and runtime enforcement tool that applies policy and filtering directl

tetragon.io

https://tetragon.io/docs/installation/

 

https://tetragon.io/docs/getting-started/execution/

 

Execution Monitoring

Execution traces with Tetragon

tetragon.io

 

 

 

 

더보기

이 내용은 CloudNet@에서 진행하는 Cilium 스터디를 참여하면서 공부하는 내용을 기록하며, CloudNet@에서 제공해주는 자료들을 바탕으로 작성되었습니다.

728x90