K8S를 구축하고 운영하면서 CNCF 환경에 대해 관심이 높아졌고, 보안팀이 없는 상태에 팀 내부에서 컨테이너 환경에서의 보안을 어떻게 하면 좀더 편하게 구축하고 사용해 볼 수 있을까를 고민해봤다.
그래서 결정한것이 Cilium
Cilium은 Linux 컨테이너 관리 플랫폼을(Docker, Kubernetes) 사용하여 배포된 애플리케이션 서비스 간 네트워크 연결을 보호하는 오픈 소스 소프트웨어.Cilium의 기반에는 eBPF라는 Linux 커널 기술이 사용됨. 이를 통해 Linux 자체에 강력한 보안 가시성(Security visibility)과 제어 로직을 동적으로 입력.eBPF는 Linux 커널 내에서 실행되기 때문에 애플리케이션 코드나 컨테이너 구성을 변경하지 않고도 Cilium 보안 정책을 적용하고 업데이트할 수 있다.
AKS에 Cilium을 설치해서 테스트 해봤다.
cluster_network = {
network_plugin = "none"
}
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_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}
https://github.com/cilium/hubble
Hubble은 클라우드 네이티브 워크로드를 위한 완전히 분산된 네트워킹 및 보안 관찰 플랫폼입니다. Cilium 및 eBPF를 기반으로 구축되어 완전히 투명한 방식으로 네트워킹 인프라는 물론 서비스의 통신 및 동작에 대한 깊은 가시성을 제공합니다.
cilium hubble enable
cilium hubble enable --ui
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}
cilium hubble ui
클러스터 네트워크 테스트
cilium connetivity test
https://github.com/cilium/tetragon
Tetragon은 강력한 실시간 eBPF 기반 보안 관찰 및 런타임 적용을 지원.
다음과 같은 보안에 중요한 이벤트를 감지하고 대응.
- 프로세스 실행 이벤트
- 시스템 호출 활동
- 네트워크 및 파일 액세스를 포함한 I/O 활동
https://isovalent.com/blog/post/2022-05-16-tetragon/
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
kubectl exec -ti -n kube-system ds/tetragon -c tetragon -- tetra getevents -o compact --pods xwing
xwing pod에서 curl 명령어를 실행
모니터링 결과를 확인.
compact 옵션을 주지 않을때
kubectl apply -f https://raw.githubusercontent.com/cilium/tetragon/main/examples/quickstart/file_monitoring.yaml
/etc/shadow를 cat명령어로 호출
echo, >>를 이용해 파일 쓰기
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 -
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}
kubectl exec -ti xwing -- bash -c 'curl https://ebpf.io/applications/#tetragon'
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 -
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
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
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