kube-tarian/tarian
GitHub: kube-tarian/tarian
Tarian 是一款 Kubernetes 运行时安全防护工具,通过预注册可信进程和文件签名来检测异常变更,并支持自动销毁受感染 Pod 以阻断威胁扩散。
Stars: 58 | Forks: 15

# 塔里安
通过预注册受信任的进程和受信任的文件签名,保护您在 Kubernetes 上运行的应用程序免受恶意攻击。Tarian 将检测未知进程和已注册文件的变更,然后发送警报并采取自动化行动。将您的 K8s 环境从勒索软件手中拯救出来!
我们希望将其作为一个开源项目来维护,以对抗针对我们喜爱的 Kubernetes 生态系统的攻击。通过持续的贡献,我们可以作为一个社区共同对抗威胁。
[](https://github.com/kube-tarian/tarian/actions)
[](https://goreportcard.com/report/github.com/kube-tarian/tarian)
[](https://codecov.io/gh/kube-tarian/tarian)
**Tarian 是如何工作的?**
Tarian 集群代理 运行在 Kubernetes 集群中,检测未知进程和未知的文件变更,将其报告给 Tarian 服务器,并可选择采取行动:删除违规的 Pod。它使用 eBPF 来检测新进程。对于文件变更检测,Tarian 集群代理会在您主应用程序的 Pod 中注入一个边车 容器,该容器将检查配置路径中的文件校验和,并将它们与 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 可以通过销毁受感染的资源来帮助降低风险。
## 架构图

## 需求
- 支持的 Kubernetes 版本(目前为 1.22+)
- 内核版本 >= 5.8
- 内核需包含 [BTF](https://www.kernel.org/doc/html/latest/bpf/btf.html) 信息以支持 eBPF CO-RE。
一些主要的 Linux 发行版随附的内核已内置 BTF。如果您的内核未内置 BTF,
您需要构建自定义内核。请参阅 [BPF CO-RE](https://github.com/libbpf/libbpf#bpf-co-re-compile-once--run-everywhere)。
### 在流行的 Kubernetes 环境/服务上测试:
| 环境 | 工作状态 | 备注 |
|----------------------------------------------|--------------------|--------------------------------------------------------------------|
| Kind v0.14.0 | :heavy_check_mark: | |
| Minikube v1.26.0 | :heavy_check_mark: | |
| Linode Kubernetes Engine (LKE) 1.22 | :heavy_check_mark: | |
| Digital Ocean Kubernetes Engine (DOKS) 1.22 | :heavy_check_mark: | |
| Google Kubernetes Engine (GKE) 1.22 | :heavy_check_mark: | |
| Amazon Elastic Kubernetes Engine (EKS) | :heavy_minus_sign: | [内核 < 5.8](https://github.com/awslabs/amazon-eks-ami/pull/862) |
| Azure Kubernetes Service (AKS) | :heavy_minus_sign: | [内核 < 5.8](https://github.com/Azure/AKS/issues/2883) |
### 准备命名空间
```
kubectl create namespace tarian-system
```
### 设置 Dgraph 数据库
您可以使用任何 [Dgraph 安装](https://dgraph.io/docs/deploy/kubernetes/) 选项,只要可以从 tarian 服务器访问即可。
### 安装 tarian
1. 使用 Helm 安装 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
```
2. 等待所有 Pod 就绪
```
kubectl wait --for=condition=ready pod --all -n tarian-system
```
3. 应用 Dgraph schema
```
kubectl exec -ti deploy/tarian-server -n tarian-system -- ./tarian-server dgraph apply-schema
```
### 使用 tarianctl cli 安装 tarian
从 github 发布页面下载 tarianctl 二进制文件。
运行:
```
tarianctl install
```
您可以使用以下标志自定义您的安装。
```
Install Tarian on Kubernetes.
Usage:
tarianctl install [flags]
Flags:
--agents-values strings Path to the helm values file for Tarian Cluster Agent and Node agent .
--charts string Path to the tarian helm charts directory.
--dgraph-values strings Path to the helm values file for DGraph.
-h, --help help for install
-n, --namespace string Namespace to install Tarian. (default "tarian-system")
--nats-values strings Path to the helm values file for Nats.
--server-values strings Path to the helm values file for Tarian Server.
Global Flags:
-k, --kubeconfig string path to the kubeconfig file to use
-e, --log-formatter string valid log formatters: json, text(default) (default "text")
-l, --log-level string valid log levels: debug, info(default), warn/warning, error, fatal (default "info")
-s, --server-address string tarian server address to communicate with (default "localhost:50051")
-c, --server-tls-ca-file string ca file that server uses for TLS connection
-t, --server-tls-enabled if enabled, it will communicate with the server using TLS
-i, --server-tls-insecure-skip-verify if set to true, it will skip server's certificate chain and hostname verification (default true)
```
## 配置
请参阅 helm chart 值以了解
- [tarian-server](https://github.com/kube-tarian/tarian/blob/main/charts/tarian-server/values.yaml)
- [tarian-cluster-agent](https://github.com/kube-tarian/tarian/blob/main/charts/tarian-cluster-agent/values.yaml)
## 云 / 供应商特定配置
### 私有 GKE 集群
私有 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](https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters#add_firewall_rules)。
## 用法
### 使用 tarianctl 控制 tarian-server
1. 从 Github [发布页面](https://github.com/kube-tarian/tarian/releases)下载
2. 解压文件并将 tarianctl 复制到您的 PATH 目录
3. 通过 Ingress 或 port-forward 将 tarian-server 暴露给您的机器。在此示例中,我们将使用 port-forward:
```
kubectl port-forward svc/tarian-server -n tarian-system 41051:80
```
4. 使用环境变量配置服务器地址
```
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
```
### 在 Pod 中运行 tarian agent
创建约束后,我们通过添加注解 将 tarian-pod-agent 注入到 Pod 中:
```
metadata:
annotations:
pod-agent.k8s.tarian.dev/threat-scan: "true"
```
带有此注解的 Pod 将注入一个额外的容器。tarian-pod-agent 容器将
根据注册的约束持续验证运行时环境。任何违规行为都会被报告,并且可以通过
`tarianctl get events` 访问。
### 演示:尝试一个违反约束的 Pod
```
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
# 您应该能在塔里安中看到它被报告
tarianctl get events
```
## 告警管理器集成
Tarian 默认随附 Prometheus 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](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:
# register both processes and file checksums
pod-agent.k8s.tarian.dev/register: "processes,files"
# ignore specific paths from automatic registration
pod-agent.k8s.tarian.dev/register-file-ignore-paths: "/usr/share/nginx/**/*.txt"
```
自动约束注册也可以在开发/暂存集群中完成,这样生产环境中的变更就会更少。
## 其他支持的注解
```
metadata:
annotations:
# specify how often tarian-pod-agent should verify file checksum
pod-agent.k8s.tarian.dev/file-validation-interval: "1m"
```
## 使用 TLS 保护 tarian-server
要使用 TLS 保护 tarian-server,请创建一个包含 TLS 证书的密钥。您可以手动创建密钥,
或使用 [Cert Manager](https://cert-manager.io/)。一旦您拥有了密钥,您可以将其名称传递给 helm chart 值:
```
helm upgrade -i tarian-server tarian/tarian-server --devel -n tarian-system \
--set server.tlsSecretName=tarian-server-tls
```
## 贡献
请参阅 [docs/contributing.md](docs/contributing.md)
## 行为准则
请参阅 [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)
## CodeOwners 与维护者名单
请参阅 [MAINTAINERS.md](MAINTAINERS.md)
## 加入我们的 Slack 频道 " tarian "
[Kube-Tarian-Slack](https://join.slack.com/t/kube-tarian/shared_invite/zt-118iqu4g6-wopEIyjqD_uy5uXRDChaLA)
标签:AMSI绕过, Burp项目解析, Docker镜像, EVTX分析, EVTX分析, Go 语言, Kubernetes 安全, Python工具, Shift-Left 安全, Sidecar 模式, Web截图, 勒索软件防护, 威胁检测, 子域名突变, 容器安全, 开源安全工具, 异常检测, 日志审计, 模型鲁棒性, 私有化部署, 自动化响应, 自定义请求头, 逆向工程平台, 防御规避, 集群代理