
eBPF 기반 Kubernetes 런타임 보안 에이전트로, 알 수 없는 프로세스와 파일 변경을 감지하고 사전 등록된 제약 조건을 적용하며, 랜섬웨어 및 기타 공격을 완화하기 위해 포드 삭제 또는 경고를 자동화합니다.

Kubernetes에서 실행되는 애플리케이션을 신뢰할 수 있는 프로세스와 신뢰할 수 있는 파일 서명을 미리 등록하여 악의적인 공격으로부터 보호하세요. Tarian은 알 수 없는 프로세스와 등록된 파일의 변경 사항을 감지하여 경고를 보내고 자동 조치를 취합니다. Kubernetes 환경을 랜섬웨어로부터 지키세요!
우리는 이 프로젝트를 오픈소스로 유지하여 사랑하는 Kubernetes 생태계에 대한 공격에 맞서 싸우고자 합니다. 지속적인 기여를 통해 커뮤니티가 함께 위협에 대응할 수 있습니다.
Tarian은 어떻게 작동하나요?
Tarian Cluster Agent는 Kubernetes 클러스터에서 실행되며 알 수 없는 프로세스와 알 수 없는 파일 변경 사항을 감지하여 Tarian Server에 보고하고, 선택적으로 위반된 파드를 삭제하는 조치를 취합니다. 새 프로세스를 감지하기 위해 eBPF를 사용합니다. 파일 변경 감지를 위해 Tarian Cluster Agent는 메인 애플리케이션 파드에 사이드카 컨테이너를 주입하여 설정된 경로에서 파일 체크섬을 확인하고 Tarian Server에 등록된 체크섬과 비교합니다. Tarian은 개발 환경부터 프로덕션 환경까지 애플리케이션 파드의 일부가 되어, 컨테이너에서 실행되어야 하는 프로세스와 감시할 파일 서명, 알림 및 감지된 변경 사항에 따른 조치(파드 자체 파괴)를 Tarian DB에 등록할 수 있습니다. 탐지 메커니즘을 시프트-레프트(shift-left)하세요!
만약 컨테이너 내에서 Tarian의 등록 DB에 없는 알 수 없는 변경이 발생하면 Tarian은 어떻게 반응하나요?
알 수 없는 변경이 발생하면 Tarian은 단순히 보안팀에 관찰된 분석 정보를 알릴 수 있습니다. 그러면 보안 엔지니어는 해당 변경 사항이 위협인지 아닌지 판단하여 Tarian DB에 등록할 수 있습니다. 또한 분석 결과에 따라 해당 변경이 다시 발생했을 때 취할 조치를 구성할 수 있습니다.
커뮤니티의 기여는 Tarian을 통해 위협에 대응하는 데 어떻게 도움이 되나요?
보안 전문가가 분석하여 위협으로 표시한 새로운 탐지 사항은, 원한다면 모든 로그, 찾아야 할 문자열, 관찰 결과, 투명성, 구성할 조치 등과 함께 오픈소스 Tarian 커뮤니티 DB에 공유할 수 있습니다. 전문가들이 경고하고 커뮤니티와 공유하고자 하는 모든 것을 공유할 수 있습니다. Tarian 사용자는 이 정보를 활용하여 자신의 환경에서 사용하는 Tarian 앱에 조치를 구성할 수 있습니다. 이는 위협 및 그 대처 방법에 대한 정보를 공유하는 메커니즘입니다. 이를 통해 Tarian을 사용하는 모든 사람이 각자의 Kubernetes 환경에서 지식과 경험을 공유하며 함께 조치를 취할 수 있습니다.
알려진 위협에 대해 Tarian은 어떤 조치를 취하나요?
Tarian은 단순히 해당 파드를 자체 파괴합니다. 만약 멀웨어/바이러스가 환경의 나머지 부분으로 확산된다면, 결과는 잘 알려져 있습니다. 따라서 Tarian은 기본적으로 파드를 파괴하여 위험을 최대한 줄이도록 설계되었습니다. 새로운 파드 프로비저닝은 Kubernetes 배포가 처리합니다. Tarian은 사용자가 지시할 때만 파드 파괴를 수행합니다. 어떤 조치도 원하지 않는다면 구성하거나 트리거할 필요 없이 Tarian에게 알림만 보내도록 할 수 있습니다. Tarian은 기본적으로 위험을 줄이기 위해 사용자가 원하는 대로 작동합니다.
이미 Falco, Kube-Hunter, Kube-Bench, Calico Enterprise Security 등 네트워크, 인프라, 애플리케이션 수준에서 위협을 탐지하고 방지할 수 있는 많은 보안 도구(오픈소스 및 상용)가 있는데, 왜 또 다른 새로운 보안 도구인가요? 왜 Tarian인가요?
Tarian이 탄생한 주된 이유는 커뮤니티와 함께 Kubernetes에서의 위협에 맞서 싸우기 위해서입니다. 또 다른 이유는, 여전히 보안의 모든 계층을 뚫을 수 있는 정교한 공격이 존재하여 런타임 애플리케이션(원격 코드 실행)과 스토리지 볼륨에 접근하고, 인프라와 데이터를 손상시키거나 잠글 수 있는 공격이 있다면 어떻게 할 것인가 하는 질문에서 출발했습니다. 특히 랜섬웨어로 변질될 수 있는 공격에 대해 무엇을 하고 싶습니까? Tarian은 그러한 위험을 조치를 취함으로써 줄이도록 설계되었습니다. Tarian이 궁극적인 해결책은 아니라는 점을 알고 있지만, 커뮤니티가 지속적으로 지식을 공유할 때 위험을 줄이는 데 도움이 될 수 있다고 확신합니다. 기술적 관점에서 Tarian은 감염된 리소스를 파괴하여 위험을 줄이는 데 도움이 될 수 있습니다.

kubectl create namespace tarian-system
tarian 서버에서 접근 가능한 모든 Dgraph 설치 옵션을 사용할 수 있습니다.
helm repo add tarian https://kube-tarian.github.io/helm-charts
helm repo update
helm upgrade -i tarian-server tarian/tarian-server --devel -n tarian-system --set server.dgraph.address=DGRAPH_ADDRESS:PORT
helm upgrade -i tarian-cluster-agent tarian/tarian-cluster-agent --devel -n tarian-system
kubectl wait --for=condition=ready pod --all -n tarian-system
kubectl exec -ti deploy/tarian-server -n tarian-system -- ./tarian-server dgraph apply-schema
GitHub 릴리스 페이지에서 tarianctl 바이너리를 다운로드하세요.
실행:
tarianctl install
설치를 사용자 정의하려면 다음 플래그를 사용할 수 있습니다.
Tarian을 Kubernetes에 설치합니다.
사용법:
tarianctl install [플래그]
플래그:
--agents-values strings Tarian Cluster Agent 및 Node Agent용 Helm values 파일 경로
--charts string tarian Helm 차트 디렉토리 경로
--dgraph-values strings DGraph용 Helm values 파일 경로
-h, --help install 명령어 도움말
-n, --namespace string Tarian을 설치할 네임스페이스 (기본값 "tarian-system")
--nats-values strings Nats용 Helm values 파일 경로
--server-values strings Tarian Server용 Helm values 파일 경로
전역 플래그:
-k, --kubeconfig string 사용할 kubeconfig 파일 경로
-e, --log-formatter string 유효한 로그 포맷터: json, text(기본값) (기본값 "text")
-l, --log-level string 유효한 로그 레벨: debug, info(기본값), warn/warning, error, fatal (기본값 "info")
-s, --server-address string 통신할 tarian 서버 주소 (기본값 "localhost:50051")
-c, --server-tls-ca-file string 서버가 TLS 연결에 사용하는 CA 파일
-t, --server-tls-enabled 활성화되면 TLS를 사용하여 서버와 통신
-i, --server-tls-insecure-skip-verify true로 설정하면 서버의 인증서 체인과 호스트 이름 검증을 건너뜀 (기본값 true)
Helm 차트 values 파일을 참조하세요.
프라이빗 GKE 클러스터는 기본적으로 마스터-노드 통신을 포트 443과 10250으로 제한하는 방화벽 규칙을 생성합니다. tarian-pod-agent 컨테이너를 주입하기 위해 tarian은 변경 승인 웹훅(mutating admission webhook)을 사용합니다. 웹훅 서버는 포트 9443에서 실행됩니다. 따라서 마스터 IP 주소 범위에서 노드의 TCP 포트 9443으로의 인그레스를 허용하는 새 방화벽 규칙을 만들어야 합니다.
자세한 내용은 GKE 문서를 참조하세요: https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters#add_firewall_rules.
kubectl port-forward svc/tarian-server -n tarian-system 41051:80
export TARIAN_SERVER_ADDRESS=localhost:41051
tarianctl get events
tarianctl add constraint --name nginx --namespace default \
--match-labels run=nginx \
--allowed-processes=pause,tarian-pod-agent,nginx
tarianctl get constraints
tarianctl add constraint --name nginx-files --namespace default \
--match-labels run=nginx \
--allowed-file-sha256sums=/usr/share/nginx/html/index.html=38ffd4972ae513a0c79a8be4573403edcd709f0f572105362b08ff50cf6de521
tarianctl get constraints
제약 조건이 생성된 후, 어노테이션을 추가하여 tarian-pod-agent를 파드에 주입합니다:
metadata:
annotations:
pod-agent.k8s.tarian.dev/threat-scan: "true"
이 어노테이션이 있는 파드에는 추가 컨테이너(tarian-pod-agent)가 주입됩니다. tarian-pod-agent 컨테이너는 등록된 제약 조건에 따라 런타임 환경을 지속적으로 검증합니다. 위반 사항이 보고되며, tarianctl get events로 확인할 수 있습니다.
kubectl apply -f https://raw.githubusercontent.com/kube-tarian/tarian/main/dev/config/monitored-pod/configmap.yaml
kubectl apply -f https://raw.githubusercontent.com/kube-tarian/tarian/main/dev/config/monitored-pod/pod.yaml
# 준비될 때까지 대기
kubectl wait --for=condition=ready pod nginx
# 알 수 없는 프로세스 실행 시뮬레이션
kubectl exec -ti nginx -c nginx -- sleep 15
# tarian에서 보고되는지 확인
tarianctl get events
Tarian은 기본적으로 Prometheus Alert Manager와 함께 제공됩니다. 다른 alert manager 인스턴스를 사용하려면:
helm install tarian-server tarian/tarian-server --devel \
--set server.alert.alertManagerAddress=http://alertmanager.monitoring.svc:9093 \
--set alertManager.install=false \
-n tarian-system
비활성화하려면 alertManagerAddress 값을 비워두면 됩니다.
docs/troubleshooting.md를 참조하세요.
tarian-pod-agent가 등록 모드로 실행되면, 알 수 없는 프로세스와 파일을 위반으로 보고하는 대신 자동으로 새 제약 조건으로 등록합니다. 이는 수동 등록 시간을 절약하는 데 유용합니다.
제약 조건 등록을 활성화하려면 cluster-agent를 구성해야 합니다.
helm install tarian-cluster-agent tarian/tarian-cluster-agent --devel -n tarian-system \
--set clusterAgent.enableAddConstraint=true
metadata:
annotations:
# 프로세스와 파일 체크섬 모두 등록
pod-agent.k8s.tarian.dev/register: "processes,files"
# 자동 등록에서 제외할 특정 경로
pod-agent.k8s.tarian.dev/register-file-ignore-paths: "/usr/share/nginx/**/*.txt"
자동 제약 조건 등록은 개발/스테이징 클러스터에서도 수행할 수 있어 프로덕션에서 변경 사항을 줄일 수 있습니다.
metadata:
annotations:
# tarian-pod-agent가 파일 체크섬을 확인하는 빈도 지정
pod-agent.k8s.tarian.dev/file-validation-interval: "1m"
TLS로 tarian-server를 보호하려면 TLS 인증서가 포함된 시크릿을 생성하세요. 수동으로 시크릿을 생성하거나 Cert Manager를 사용할 수 있습니다. 시크릿이 준비되면 Helm 차트 값에 이름을 전달합니다:
helm upgrade -i tarian-server tarian/tarian-server --devel -n tarian-system \
--set server.tlsSecretName=tarian-server-tls
docs/contributing.md를 참조하세요.
CODE_OF_CONDUCT.md를 참조하세요.
MAINTAINERS.md를 참조하세요.
| 환경 | 작동 여부 | 비고 |
|---|
| Kind v0.14.0 | ✔️ | |
| Minikube v1.26.0 | ✔️ | |
| Linode Kubernetes Engine (LKE) 1.22 | ✔️ | |
| Digital Ocean Kubernetes Engine (DOKS) 1.22 | ✔️ | |
| Google Kubernetes Engine (GKE) 1.22 | ✔️ | |
| Amazon Elastic Kubernetes Engine (EKS) | ➖ | 커널 < 5.8 |
| Azure Kubernetes Service (AKS) | ➖ | 커널 < 5.8 |