Cilium,Hubble,Tetragon

Glen·2023년 12월 30일
0
post-thumbnail

K8S를 구축하고 운영하면서 CNCF 환경에 대해 관심이 높아졌고, 보안팀이 없는 상태에 팀 내부에서 컨테이너 환경에서의 보안을 어떻게 하면 좀더 편하게 구축하고 사용해 볼 수 있을까를 고민해봤다.

  1. eBPF 기반
  2. 다양한 기능(Networking, Security, Observability, Tracing)
  3. CNCF project

그래서 결정한것이 Cilium

Cilium이란?

Cilium은 Linux 컨테이너 관리 플랫폼을(Docker, Kubernetes) 사용하여 배포된 애플리케이션 서비스 간 네트워크 연결을 보호하는 오픈 소스 소프트웨어.Cilium의 기반에는 eBPF라는 Linux 커널 기술이 사용됨. 이를 통해 Linux 자체에 강력한 보안 가시성(Security visibility)과 제어 로직을 동적으로 입력.eBPF는 Linux 커널 내에서 실행되기 때문에 애플리케이션 코드나 컨테이너 구성을 변경하지 않고도 Cilium 보안 정책을 적용하고 업데이트할 수 있다.

설치

AKS에 Cilium을 설치해서 테스트 해봤다.

AKS

  • terraform 으로 배포할때 network_plugin을 none으로 선언
cluster_network = {
    network_plugin = "none"
  }

Helm

  • helm 을 등록하고 옵션으로 AKS에 배포
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium --version 1.14.5 --namespace kube-system --set kubeProxyReplacement=true --set k8sServiceHost=${API_SERVER_IP} --set k8sServicePort=${API_SERVER_PORT} --set aksbyocni.enabled=true --set nodeinit.enabled=true

cilium-cli

  • cilium을 설치 및 관리
  • hubble, service mesh등 기능 제공
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
  • cilium status

Hubble


https://github.com/cilium/hubble

  • 사실 cilium을 사용하게된 가장 큰 이유
  • 사용하려면 cilium이 있어야 한다.

    Hubble은 클라우드 네이티브 워크로드를 위한 완전히 분산된 네트워킹 및 보안 관찰 플랫폼입니다. Cilium 및 eBPF를 기반으로 구축되어 완전히 투명한 방식으로 네트워킹 인프라는 물론 서비스의 통신 및 동작에 대한 깊은 가시성을 제공합니다.

활성화

  • cli로 enable 해주면 끗.
  • ui도 보려면 따로 활성화 해줘야 함.
cilium hubble enable
cilium hubble enable --ui

cli

  • hubble도 cli가 별도로 존재
HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt)
HUBBLE_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then HUBBLE_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}
sha256sum --check hubble-linux-${HUBBLE_ARCH}.tar.gz.sha256sum
sudo tar xzvfC hubble-linux-${HUBBLE_ARCH}.tar.gz /usr/local/bin
rm hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}
  • Hubble API에 액세스하려면 Hubble 서비스로 전달되는 포트를 만들어야함
  • 이후 status로 상태 확인
  • hubble observe로 흐름 확인 가능

UI

  • ui도 동일하게 cli로.
  • 실행 후 12000 포트로 접속 가능
cilium hubble ui
  • ui 확인

클러스터 네트워크 테스트

cilium connetivity test
  • cilium이 잘 동작하는지 ui로 볼 수 있다.
    - 원하는 application을 지정하는건 불가능한듯.

Tetragon

https://github.com/cilium/tetragon

  • Cilium 프로젝트 중 하나
  • falco는 감시 및 모니터링만 가능. tetragon은 감시, 모니터링 및 차단까지 가능.(ex sigkill)

Tetragon은 강력한 실시간 eBPF 기반 보안 관찰 및 런타임 적용을 지원.
다음과 같은 보안에 중요한 이벤트를 감지하고 대응.

설치

  • helm으로 간편하게 설치
helm repo add cilium https://helm.cilium.io
helm repo update
helm install tetragon ${EXTRA_HELM_FLAGS} cilium/tetragon -n kube-system
kubectl rollout status -n kube-system ds/tetragon -w
  • 정책 테스트를 위해 제공해주는 샘플앱을 배포한다
kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.11/examples/minikube/http-sw-app.yaml
  • 배포 결과

실행 모니터링

  • 배포된 pod 중 xwing을 모니터링
    • compact옵션을 주지 않으면 많은 정보가 json 형태로 출력됨
kubectl exec -ti -n kube-system ds/tetragon -c tetragon -- tetra getevents -o compact --pods xwing
  • xwing pod에서 curl 명령어를 실행

  • 모니터링 결과를 확인.

  • compact 옵션을 주지 않을때

파일 엑세스 모니터링

  • Tetragon은 기본 실행 추적기능을 확장하는 yaml을 구성하여 정책을 추가할수 있다.
  • 중요파일을 모니터링 하는 정책을 배포
kubectl apply -f https://raw.githubusercontent.com/cilium/tetragon/main/examples/quickstart/file_monitoring.yaml
  • /etc/shadow를 cat명령어로 호출

  • echo, >>를 이용해 파일 쓰기

네트워크 모니터링

  • 먼저 pod와 service의 cidr을 변수로 설정
export PODCIDR='<pod ip / cidr>'
export SERVICECIDR='<service ip / cidr>'
  • 네트워크 모니터링 정책 배포
wget https://raw.githubusercontent.com/cilium/tetragon/main/examples/quickstart/network_egress_cluster.yaml
envsubst < network_egress_cluster.yaml | kubectl apply -f -
  • network_egress_cluster.yaml를 살펴보면 변수로 설정한 ip cidr는 vaules 값에 적용됨
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
  name: "monitor-network-activity-outside-cluster-cidr-range"
spec:
  kprobes:
  - call: "tcp_connect"
    syscall: false
    args:
    - index: 0
      type: "sock"
    selectors:
    - matchArgs:
      - index: 0
        operator: "NotDAddr"
        values:
        - 127.0.0.1
        - ${PODCIDR}
        - ${SERVICECIDR}
  • xwing pod에서 curl 명령어로 외부 호출
kubectl exec -ti xwing -- bash -c 'curl https://ebpf.io/applications/#tetragon'
  • 출발지, 목적지 ip가 모니터링 됨

정책 적용

네트워크 제어

  • 외부 트래픽 연결을 차단하는 정책을 배포
wget https://raw.githubusercontent.com/cilium/tetragon/main/examples/quickstart/network_egress_cluster_enforce.yaml
envsubst < network_egress_cluster_enforce.yaml | kubectl apply -n default -f -
  • 앞선 네트워크 정책 코드에서 matchActions이 추가됨
apiVersion: cilium.io/v1alpha1
kind: TracingPolicyNamespaced
metadata:
  name: "monitor-network-activity-outside-cluster-cidr-range"
spec:
  kprobes:
  - call: "tcp_connect"
    syscall: false
    args:
    - index: 0
      type: "sock"
    selectors:
    - matchArgs:
      - index: 0
        operator: "NotDAddr"
        values:
        - 127.0.0.1
        - ${PODCIDR}
        - ${SERVICECIDR}
      matchActions:
      - action: Sigkill
  • 외부로 나가는 트래픽은 sigkill로 차단. 내부는 통과되는것을 확인

파일엑세스 제어

  • 기존 파일정책을 제거후 신규로 배포
kubectl delete -f https://raw.githubusercontent.com/cilium/tetragon/main/examples/quickstart/file_monitoring.yaml
kubectl apply -f https://raw.githubusercontent.com/cilium/tetragon/main/examples/quickstart/file_monitoring_enforce.yaml
  • 기존 코드에 matchActions이 추가됨.
    selectors:
    - matchArgs:      
      - index: 0
        operator: "Prefix"
        values:
        - "/boot"           # Reads to sensitive directories
        - "/root/.ssh"      # Reads to sensitive files we want to know about
        - "/etc/shadow"
        - "/etc/profile"
        - "/etc/sudoers"
        - "/etc/pam.conf"   # Reads global shell configs bash/csh supported
        - "/etc/bashrc"
        - "/etc/csh.cshrc"
        - "/etc/csh.login"  # Add additional sensitive files here
      - index: 1
        operator: "Equal"
        values:
        - "4" # MAY_READ
      matchActions:
      - action: Sigkill
  • etc/shadow 요청시 sigkill
  • ../로 경로 우회는 되나 해봤지만 실행되는 파일 이름이 정해져있기 때문에 우회 안됨.
  • 정책에 포함되지않은 텍스트 쓰기 및 읽기는 허용

느낀점

  • k8s 환경에서 모니터링, 보안을 강화하기 위한 목적으로 구축하기 쉬워보인다.
    - cli가 잘되어있어서 편했다.
  • 모니터링, 제어 정책을 잘 정해야 될거같다.
  • 정책은 k8s 명령어로 삭제되지 않도록 방법을 구상해야 될거같다.
    • ex) argocd로 배포 후 repo auto sync, self heal
profile
어제보다 나은 엔지니어가 되기 위해서 공부중

0개의 댓글