
通过预先注册受信任的进程和受信任的文件签名,保护运行在 Kubernetes 上的应用程序免受恶意攻击。Tarian 会检测未知进程和对已注册文件的更改,然后发送告警并采取自动化操作。保护您的 K8s 环境免受勒索软件侵害!
我们希望将此项目作为开源项目维护,以对抗针对我们最喜爱的 Kubernetes 生态系统的攻击。通过持续贡献,我们可以作为社区共同应对威胁。
Tarian 是如何工作的?
Tarian 集群代理运行在 Kubernetes 集群中,检测未知进程和对文件的未知更改,将其报告给 Tarian 服务器,并可选择采取操作:删除违规的 Pod。它使用 eBPF 检测新进程。对于文件更改检测,Tarian 集群代理会在主应用程序的 Pod 中注入一个 sidecar 容器,该容器会检查配置路径中的文件校验和,并与 Tarian 服务器中注册的校验和进行比较。Tarian 将从开发环境到生产环境都成为应用程序 Pod 的一部分,因此您可以向 Tarian 数据库注册哪些进程应该在容器中运行、哪些文件签名需要监控、哪些行为需要通知,以及根据检测到的变化采取何种操作(自动销毁 Pod)。左移您的检测机制!
如果容器内发生未知变化且该变化不在 Tarian 的注册数据库中,Tarian 会如何应对?
如果发生未知变化,Tarian 可以简单地将观察到的分析结果通知您的安全团队。然后您的安全工程师可以决定是否将该变化注册到 Tarian 数据库,无论它是否被视为威胁。此外,根据他们的分析,他们可以配置当该变化再次发生时采取何种操作。
社区的贡献如何通过 Tarian 帮助对抗威胁?
任何由您的安全专家分析并标记为威胁的新检测结果,如果他们选择,可以与开源 Tarian 社区数据库共享,包括所有日志、要查找的字符串、观察结果、透明度、要配置的操作……基本上是专家想要警告并与社区分享的任何内容。作为 Tarian 用户,您可以使用这些信息,并在您的环境中使用的 Tarian 应用中配置操作。这本质上是一种共享威胁信息及应对措施的机制。通过分享知识和经验,这有助于所有使用 Tarian 的人在各自的 K8s 环境中共同采取行动。
Tarian 会根据已知威胁采取何种行动?
Tarian 会简单地自我销毁其运行的 Pod。如果恶意软件/病毒扩散到环境的其余部分,您知道会发生什么。因此,Tarian 的设计目标是通过销毁 Pod 来尽可能降低风险。新 Pod 的供应将由 K8s 部署处理。Tarian 仅在您指示的情况下才会销毁 Pod。如果您不希望执行任何操作,则无需配置或触发任何操作;您只需告诉 Tarian 仅通知您。Tarian 基本上按照您希望的方式降低风险。
为什么在已有许多工具可用的情况下(如 Falco、Kube-Hunter、Kube-Bench、Calico Enterprise Security 以及许多其他可以在网络、基础设施和应用层面检测和预防威胁的开源和商业安全工具)还要推出另一个新的安全工具?为什么是 Tarian?
Tarian 诞生的主要原因是为了作为社区共同对抗 Kubernetes 中的威胁。另一个原因是,如果仍然存在某种能够穿透每一层安全防线、能够到达运行时应用(远程代码执行)和存储卷、并能够扩散以破坏或锁定您的基础设施和数据的复杂攻击,您打算如何应对这类攻击,尤其是那些演变成勒索软件的攻击?Tarian 旨在通过采取行动来降低此类风险。我们知道 Tarian 并非终极解决方案,但我们相信,随着社区持续分享知识,它能够帮助降低风险。从技术角度来看,Tarian 可以通过销毁受感染的资源来帮助降低风险。

kubectl create namespace tarian-system
您可以使用任何 Dgraph 安装选项,只要能够从 tarian 服务器访问即可。
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
您可以使用以下标志自定义安装。
在 Kubernetes 上安装 Tarian。
用法:
tarianctl install [flags]
标志:
--agents-values strings 指定 Tarian 集群代理和节点代理的 Helm values 文件路径。
--charts string 指定 Tarian Helm chart 目录路径。
--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 服务器的 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 chart values:
私有 GKE 集群默认会创建防火墙规则,限制主节点到节点的通信仅限于端口 443 和 10250。为了注入 tarian-pod-agent 容器,tarian 使用一个变更准入 webhook。该 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 注入到 Pod 中:
metadata:
annotations:
pod-agent.k8s.tarian.dev/threat-scan: "true"
带有此注解的 Pod 将注入一个额外的容器(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 值设置为空。
当 tarian-pod-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 证书的 Secret。您可以手动创建 Secret,或使用 Cert Manager。一旦拥有 Secret,您可以将其名称传递给 Helm chart value:
helm upgrade -i tarian-server tarian/tarian-server --devel -n tarian-system \
--set server.tlsSecretName=tarian-server-tls
请参阅 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 |