참고:
- 이 사용지침서에서는 Oracle Cloud에 접근해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure Free Tier 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 자격 증명, 테넌시 및 구획에 대한 예제 값을 사용합니다. 실습을 마치면 해당 값을 클라우드 환경과 관련된 값으로 대체합니다.
Tetragon을 설치하고 Oracle Container Engine for Kubernetes에서 TracingPolicies 구성
소개
eBPF 기반 툴이 클라우드 전용 애플리케이션에 더 많이 사용됨에 따라 이 사용지침서에서는 OCI(Oracle Cloud Infrastructure)에서 보안 관찰성 및 적용을 위한 eBPF 기반 툴인 Tetragon을 실행하는 방법에 대해 설명합니다.
eBPF는 무엇이며 왜 인기가 있습니까?
운영 체제 커널은 일반적으로 기능을 수행하는 도구와 관찰하고 영향력을 발휘하려는 작업 사이에 장애물이 거의 없으므로 시스템을 관찰하고 영향을 미치는 가장 좋은 장소입니다. 커널 공간 내에서 실행하면 프로그램에서 오버헤드가 매우 낮지만 보안 및 유지 관리 비용이 발생하는 경우가 많습니다.
eBPF는 커널 소스 코드를 변경하거나 커널 모듈을 로드하지 않고도 샌드박스 및 권한 있는 컨텍스트에서 실행할 수 있는 새로운 기능을 도입하는 방법을 제공합니다. 가상 머신 기반 프로그래밍 언어와 유사한 패러다임을 생성하면 기본적으로 작동합니다. 최신 Java 프로그램이 바이트 코드로 컴파일되는 방식과 유사한 방식으로 JVM(Java Virtual Machine)이 고유 성능을 얻기 위해 JIT 컴파일러를 사용하여 고유 코드로 컴파일되는 방식에서 eBPF 프로그램은 바이트 코드 표현을 가집니다. BPF는 Linux 커널에 깊이 연결되어 있으며 커널 내 JIT 컴파일러는 eBPF 바이트 코드를 커널 공간에서 실행할 수 있는 고유 코드로 컴파일합니다.
eBPF는 이벤트 기반 모델을 사용하여 프로그램을 로드하며 eBPF 프로그램은 "후크"에 네트워크 이벤트, 시스템 호출 등으로 기록됩니다. eBPF 프로그램이 호출된 이벤트가 발생하면 확인 및 JIT 컴파일 후 eBPF 프로그램이 커널에 로드됩니다. 확인 단계는 프로그램을 안전하게 실행하고, 올바른 권한을 가지며, 완료 시까지 실행할 수 있도록 하는 반면, JIT 컴파일은 기본 성능을 보장합니다. 대부분의 경우 eBPF 프로그램은 상위 레벨 언어로 작성되어 바이트 코드 표현으로 컴파일됩니다. 그런 다음 프로그램이 연결되는 이벤트를 기반으로 JIT 컴파일 후 실행 중인 커널에 로드됩니다.
Tetragon - eBPF 기반의 보안 관찰 및 시행
Tetragon은 보안 관찰 및 시행을 수행하는 클라우드 네이티브 eBPF 기반 도구입니다. Cilium 프로젝트의 구성요소입니다. eBPF를 사용하여 Tetragon은 커널 외부에서 실행되는 에이전트에 이벤트를 전송하지 않고 이벤트를 필터링 및 관찰하고 실시간으로 정책을 적용할 수 있습니다. Tetragon은 네트워크 연결을 열고 파일에 액세스하거나 컨테이너 내부에서 프로세스를 시작하는 워크로드와 같은 이벤트를 필터링하여 수많은 보안 및 관찰 사용 사례를 해결할 수 있습니다. 예를 들어, 응용 프로그램 컨테이너 내에서 시작되는 셸 프로세스는 보안 이벤트로 간주될 수 있습니다. 문제를 해결하려는 사람이거나 어떤 방식으로든 시스템에 대한 공격을 배제하기 위해 보안 검사를 트리거해야 하는 악의적인 작업이 될 수 있습니다. 열려 있는 네트워크 연결이나 파일을 읽을 때도 마찬가지입니다. Tetragon은 이러한 활동을 추적 및 필터링하면서 오버헤드가 거의 또는 전혀 발생하지 않으며 일반적으로 이러한 이벤트를 소프트웨어에서 감지할 수 있는 가장 빠른 단계에 도입할 수 있습니다.
Tetragon은 Kubernetes 워크로드에 적합하며 클러스터의 각 노드에서 daemonset로 실행됩니다. 그런 다음 Tetragon은 Kubernetes API 서버에서 메타데이터를 가져와 각 노드의 커널에서 관찰된 이벤트와 메타데이터를 상관시킬 수 있습니다. Tetragon을 사용하면 TracingPolicies을 사용하여 이러한 활동에 대한 실시간 필터를 손쉽게 설정할 수 있습니다. TracingPolicy는 Tetragon에서 만든 사용자 정의 리소스로, 관리자 및 DevSecOps가 커널 이벤트에 대한 필터를 Kubernetes 리소스로 만들고 배포할 수 있습니다. TracingPolicy는 시스템 호출, 프로세스 속성 및 인수를 일치시키고 일치에 대한 작업을 트리거할 수 있습니다.
목표
- OCI의 OKE 클러스터에서 Tetragon을 설정하는 방법을 알아보십시오.
- TracingPolicies를 사용하여 이벤트를 관찰하고 처리하는 방법을 알아봅니다.
필요 조건
- Oracle Cloud 계정에 등록 또는 로그인
-
OKE 클러스터 만들기
참고: Tetragon은 Tetragon 프로젝트에 의해 게시된 헬름 차트를 사용하여 OKE(Oracle Container Engine for Kubernetes)와 같은 Kubernetes 클러스터에 배포할 수 있습니다. 설치된 후에는 TracingPolicy CRD가 만들어지고 Tetragon이 클러스터 노드에서
daemonset로 실행됩니다.
Oracle Linux 필요 조건
OKE는 Oracle Linux를 사용하고 Tetragon은 커널에서 BTF(BPF Type Format) 지원을 사용합니다. 최근 Oracle Linux 커널에는 이러한 미리 정의된 커널이 포함되어 있으므로 사용자는 5.4.17-2136.305.3.el7uek 이상의 커널을 사용해야 합니다. 또한 Tetragon은 Arm(linux/arm64) 아키텍처를 지원하지 않으며 작성 시 x86(linux/amd64)만 지원합니다. OKE 클러스터에 암 노드가 있는 경우 데몬 세트가 Init:CrashLoopBackOff 상태로 유지됩니다.
주: OKE 노드 이미지의 최근 버전은 BTF 지원을 포함하는 커널을 기반으로 합니다. BTF 지원을 위한 이 주의 사항은 노드 OS가 잠시 업데이트되지 않았으며 새로 생성된 클러스터가 아닌 클러스터에만 적용됩니다. 확실하지 않은 경우 BTF 지원이 있는지 확인하는 가장 좋은 방법은 노드에 SSH로 접속하여
ls /sys/kernel/btf를 실행하는 것입니다. 여기에 나열된 모듈과 커널(vmlinux)이 표시되어야 합니다. 일반적으로 이 배치에서는 Oracle Linux 8 기반 노드가 선호됩니다.
노드가 실행 중인 커널의 버전을 확인하려면 노드에서 uname -a를 실행합니다. 이전 버전의 커널을 실행 중인 경우 노드 풀 구성에서 버전을 업그레이드할 수 있습니다. 그러나 새로 만든 노드에만 영향을 미치며 기존 노드가 자동으로 업그레이드되지 않아 실행 중일 수 있는 작업 부하의 연속성을 보장합니다. 노드 풀 업그레이드 프로세스에 따라 기존 노드를 최신 커널 버전으로 가져올 수 있습니다.
-
노드의 최신 버전의 커널에서 실행 중인지 확인한 후에는 Tetragon helm 차트를 사용하여 Tetragon 설치를 시작할 수 있습니다. Tetragon의 github 페이지의 지침을 따를 수도 있습니다.
helm repo add cilium https://helm.cilium.io helm repo update helm install tetragon cilium/tetragon -n kube-system kubectl rollout status -n kube-system ds/tetragon -w -
데몬 세트가 준비되고 테트라곤 포드가 실행 중 상태이면 노드에서 이벤트 수신을 시작할 수 있습니다. 즉시 사용 가능한 프로세스 실행을 모니터링할 수 있습니다. Tetragon은 일치하는 이벤트를 JSON 형식으로 내보내며 다음 명령을 통해 로그를 관찰할 수 있습니다(
jq가 설치되어 있다고 가정).kubectl logs -n kube-system -l app.kubernetes.io/name=tetragon -c export-stdout -f | jq -
클러스터에서 발생하는 작업에 따라 이러한 이벤트를 나타내는 JSON 객체 스트림이 표시됩니다. 다음 코드 조각은 Git 저장소를 복제한 ArgoCD를 실행 중인 클러스터의 샘플 출력입니다.
{ "process_exec": { "process": { "exec_id": "MTAuMC4xMC4yMTg6OTE0MTQ2NjAzODU0MDcwOjEwNDA4Ng==", "pid": 104086, "uid": 999, "cwd": "/tmp/_argocd-repo/83c509d8-f9ba-48c3-a217-a9278134963e/", "binary": "/usr/bin/git", "arguments": "rev-parse HEAD", "flags": "execve clone", "start_time": "2022-06-07T17:03:42.519Z", "auid": 4294967295, "pod": { "namespace": "argocd", "name": "argocd-repo-server-7db4cc4b45-cpvlt", "container": { "id": "cri-o://1c361244fcb1d89c02ef297e69a13bd80fd4d575ae965a92979deec740711e17", "name": "argocd-repo-server", "image": { "id": "quay.io/argoproj/argocd@sha256:85d55980e70f8f7073e4ce529a7bbcf6d55e51f8a7fc4b45d698f0a7ffef0fea", "name": "quay.io/argoproj/argocd:v2.3.4" }, "start_time": "2022-05-31T16:57:53Z", "pid": 319 } }, "docker": "1c361244fcb1d89c02ef297e69a13bd", "parent_exec_id": "MTAuMC4xMC4yMTg6MzA4OTk3NTAyODQyMTEzOjExMjQ3", "refcnt": 1 } }, "node_name": "10.0.10.218", "time": "2022-06-07T17:03:42.519Z" }
JSON 출력으로서의 이벤트 스트림은 상세하고 이해하기 어렵지만 정보 밀도가 높습니다. 이 JSON 데이터를 수집하고 분석 정보를 가져오는 방법에는 여러 가지가 있습니다. 명백한 방법은 tetragon CLI 도구를 사용하는 것입니다. Cilium과 Tetragon의 뒤에있는 Isovalent는 또한이 데이터를 분석하고 시각화하여 더 실행 가능하고 쉽게 동화 할 수있는 완전한 기능을 갖춘 상업용 제품을 제공합니다.
작업 1: tetra CLI 설치
-
Tetragon cli tol
tetra은 pod, host, namespace 또는 process별로 이벤트를 필터링하는 데 유용합니다. CLI는 github release page에서 다운로드할 수 있습니다. 운영 체제 및 CPU 구조를 기반으로 도구를 다운로드하고untar를 표준 위치(예:/usr/local/bin)에 다운로드하거나 셸의PATH변수에 이진 경로를 추가할 수 있습니다. -
또는 클리를 실행할 워크스테이션에
go가 설치되어 있는 경우 다음 명령을 사용하여 다운로드하여 설치할 수 있습니다.GOOS=$(go env GOOS) GOARCH=$(go env GOARCH) curl -L --remote-name-all https://github.com/cilium/tetragon/releases/latest/download/tetra-${GOOS}-${GOARCH}.tar.gz{,.sha256sum} sha256sum --check tetra-${GOOS}-${GOARCH}.tar.gz.sha256sum sudo tar -C /usr/local/bin -xzvf tetra-${GOOS}-${GOARCH}.tar.gz rm tetra-${GOOS}-${GOARCH}.tar.gz{,.sha256sum} -
CLI가 설치된 후 JSON 출력을
tetra getevents에 전달하여 이벤트를 인쇄할 수 있습니다.kubectl logs -n kube-system ds/tetragon -c export-stdout -f | tetra getevents -o compact-o compact옵션은 JSON 대신 압축 출력을 표시합니다. 또한 이 도구를 사용하면 출력 표시를 특정 네임스페이스, 프로세스 등으로 제한할 수 있습니다. 전체 플래그 목록은 다음과 같습니다.Usage: tetra getevents [flags] Flags: --color string Colorize compact output. auto, always, or never (default "auto") -h, --help help for getevents --host Get host events -n, --namespace strings Get events by Kubernetes namespaces -o, --output string Output format. json or compact (default "json") --pod strings Get events by pod name regex --process strings Get events by process name regex --timestamps Include timestamps in compact output Global Flags: -d, --debug Enable debug messages --server-address string gRPC server address (default "localhost:54321")
작업 2: FileAccess 및 네트워크 관찰성을 위해 TracingPolicies 구성
TracingPolicies는 커널 이벤트에 대한 실시간 필터를 쉽게 설정할 수 있는 사용자 정의 리소스입니다. TracingPolicy는 관찰 가능성에 대한 시스템 호출을 일치시키고 필터링하며 이러한 일치에 대한 작업을 트리거합니다. Tetragon은 이 기능을 소개하는 몇 가지 예를 제공하며 TracingPolicies를 구성하는 시작점으로 사용할 수 있습니다.
-
FileAccess 및 관찰성에 대한 예제 추적 정책 적용
kubectl apply -f https://raw.githubusercontent.com/cilium/tetragon/main/crds/examples/sys_write_follow_fd_prefix.yaml kubectl apply -f https://raw.githubusercontent.com/cilium/tetragon/main/crds/examples/tcp-connect.yaml -
이러한 추가 TracingPolicies를 사용으로 설정하면 Tetragon이 파일 액세스 및 네트워크 작업 추적을 시작합니다. 아래 출력은
curl명령이 호출될 때 커널에서 표시되는 작업을 보여줍니다.etc/hosts및/etc/resolv.conf와 같은 파일에 액세스하고 TCP 연결을 열고 데이터를 전송하는curl프로그램을 보여줍니다.$ kubectl logs -n kube-system ds/tetragon -c export-stdout -f | tetra getevents -o compact ...[output truncated] 🚀 process default/xwing /usr/bin/curl -Lv https://cloud.oracle.com 📬 open default/xwing /usr/bin/curl /etc/ssl/openssl.cnf 📪 close default/xwing /usr/bin/curl 📬 open default/xwing /usr/bin/curl /etc/hosts 📪 close default/xwing /usr/bin/curl 📬 open default/xwing /usr/bin/curl /etc/resolv.conf 📪 close default/xwing /usr/bin/curl 🔌 connect default/xwing /usr/bin/curl tcp 10.244.1.152:65175 -> 23.212.250.69:443 📬 open default/xwing /usr/bin/curl /etc/ssl/certs/ca-certificates.crt 📪 close default/xwing /usr/bin/curl 📤 sendmsg default/xwing /usr/bin/curl tcp 10.244.1.152:65175 -> 23.212.250.69:443 bytes 517 📤 sendmsg default/xwing /usr/bin/curl tcp 10.244.1.152:65175 -> 23.212.250.69:443 bytes 126 📤 sendmsg default/xwing /usr/bin/curl tcp 10.244.1.152:65175 -> 23.212.250.69:443 bytes 109 📤 sendmsg default/xwing /usr/bin/curl tcp 10.244.1.152:65175 -> 23.212.250.69:443 bytes 31 🧹 close default/xwing /usr/bin/curl tcp 10.244.1.152:65175 -> 23.212.250.69:443 💥 exit default/xwing /usr/bin/curl -Lv https://cloud.oracle.com 0 💥 exit default/xwing /bin/bash 0 ...[output truncated]
이러한 이벤트는 커널 내에서 직접 모니터링되므로 이러한 호출 추적 작업에 약간의 오버헤드가 추가되며 악의적인 배우가 거의 난독 처리하거나 마스킹할 수 없습니다.
이 접근 방식의 주된 단점은 파일을 읽는 프로세스를 죽일 수 있는 조치가 반동적이라는 것입니다. 즉, 이벤트가 일어나고 있고 이전이 아니라는 사실을 알고 있습니다. 여전히 커널 레벨에서 이벤트를 필터링하고 일치시키는 데 필요한 오버헤드가 적고 이를 관찰하고 이에 대한 조치를 취할 수 있는 정책을 만들 수 있는 것은 매우 강력합니다.
문제 해결
오류: Tetragon pods가 CrashLoopBackOff 상태인 것으로 확인되면 두 가지 이유가 발생할 수 있습니다.
가능한 원인: 클러스터에 있을 경우 Arm 기반 노드에서 이 문제가 발생하기 때문입니다. 테트라곤은 아직 팔에서 뛰지 않는다.
문제 해결:
-
확인하려면 다음을 사용하십시오.
kubectl describe pod -
이름이
tetragon-operator인 init 컨테이너를 확인합니다. 종료 코드가1인 상태로 인해 실패할 수 있습니다. 다음을 사용할 수 있습니다.kubectl logs <pod_name> -c tetragon-operator -n kube-system -
init 컨테이너 로그를 보려면 init 컨테이너가
standard_init_linux.go:228: exec user process caused: exec format error로 종료되는 이유를 확인할 수 있습니다. 이는 이진이 Arm CPU 아키텍처에서 사용되지 않음을 나타냅니다.
두번째 이유는 노드에 이전 커널이 있고 BTF 지원이 포함되지 않았기 때문일 수 있습니다. 이것이 실제로 문제인지 확인하려면 위에 설명된 대로 Pod에서 실패한 컨테이너에 대한 컨테이너 로그를 가져옵니다. 커널에서 BTF 지원이 부족한 경우 다음과 유사한 오류 메시지가 표시될 수 있습니다.
aborting. kernel autodiscovery failed: Kernel version BTF search failed kernel is not included in supported list.
Use --btf option to specify BTF path and/or '--kernel' to specify kernel version
이는 OS가 최근에 업데이트되거나 이전 버전의 OS가 업데이트되지 않은 노드에서 발생합니다. 이를 해결하려면 작업자 노드에 대한 최신 Oracle Linux 8 기반 OKE 또는 플랫폼 이미지로 전환할 수 있습니다. 노드 풀 구성을 이 선택 항목으로 업데이트하고 표준 노드 풀 업그레이드 프로세스에 따라 노드를 업그레이드해야 합니다.
관련 링크
승인
- 작성자 - Jeevan Joseph(Senior Principal Product Manager)
추가 학습 자원
docs.oracle.com/learn에서 다른 실습을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하십시오. 또한 Oracle Learning Explorer가 되려면 education.oracle.com/learning-explorer을 방문하십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Install Tetragon and configure TracingPolicies on Oracle Container Engine for Kubernetes
F74876-01
December 2022
Copyright © 2022, Oracle and/or its affiliates.