muhammadtalaat/k8s-ir-dfir
GitHub: muhammadtalaat/k8s-ir-dfir
一款用于 Kubernetes 集群事件响应与数字取证的交互式 Bash 脚本,能自动化完成从信息收集到证据打包的完整流程。
Stars: 0 | Forks: 0
# k8s-ir-dfir
**交互式 Kubernetes 事件响应与数字取证收集脚本**
一个用于 Kubernetes 事件响应和数字取证的完全交互式 bash 脚本。它将引导您完成 节点 → 命名空间 → Pod → 容器 的选择,跨 7 个模块运行证据收集,并将所有内容打包成一个经过 SHA256 校验的 `.tar.gz` 存档。
## 功能
- **交互式目标选择** — 通过 `kubectl` 自动发现节点、命名空间、Pod 和容器
- **7 个收集模块** — 选择任意组合或全部运行
- **Pod 状态感知** — 检测 `Unknown`/非 Running 状态的 Pod 并优雅地跳过 exec 命令
- **备用日志收集** — 当实时日志不可用时,尝试获取 `--previous` 容器日志
- **二进制安全的文件系统转储** — 通过 `kubectl exec tar` 直接流式传输(绕过 shell 重定向问题)
- **结构化输出** — 每个模块保存到其专属子目录中
- **证据存档** — 自动将输出打包为带有 SHA256 哈希值的 `_evidence.tar.gz`
- **完整审计追踪** — 每个命令均记录到 `collection.log` 中
## 模块
| # | 模块 | 收集内容 |
|---|--------|-----------------|
| 1 | 集群发现 | 节点、集群信息、上下文、命名空间、端点、服务、CronJob |
| 2 | Pod 枚举 | 所有 Pod (宽格式/JSON)、hostNetwork Pod、特权 Pod、事件、Pod describe |
| 3 | RBAC 与 Secrets 审计 | Service Account、角色/绑定、管理员绑定、auth can-i、Secrets 转储 |
| 4 | Pod 取证 | 日志、ps、netstat、lsof、env、文件系统转储、/app 副本 |
| 5 | 凭证搜寻 | kubeconfig、SA token、PKI、kubelet 配置、.env/.pem/key 文件搜索 |
| 6 | 审计日志分析 | 按用户过滤、写操作动词、exec 事件、Secret 访问 |
| 7 | 遏制 | 隔离节点 (Cordon)、为 Pod 打上已入侵标签、describe ClusterRoleBinding |
## 快速开始
```
git clone https://github.com/muhammadtalaat/k8s-ir-dfir.git
cd k8s-ir-dfir
chmod +x k8s_ir_dfir.sh
./k8s_ir_dfir.sh
```
### 环境要求
- `bash` 4.0+
- 已配置并具有适当权限的 `kubectl`
- 标准 Linux 工具:`tar`、`find`、`grep`、`du`、`sha256sum`
### 所需权限
该脚本使用您当前 `kubectl` 上下文所具有的任何权限。为了进行完整收集,建议具备以下权限:
```
get, list, watch on: nodes, pods, namespaces, endpoints, services, events
get, list, watch on: secrets, serviceaccounts, roles, rolebindings, clusterroles, clusterrolebindings
exec on pods (for Module 4)
auth can-i (for Module 3)
```
## 输出结构
```
incident_20260402_110027/
├── 01_discovery/
│ ├── nodes.txt
│ ├── nodes_wide.txt
│ ├── cluster_info.txt
│ ├── cluster_info_dump.txt
│ ├── contexts.txt
│ ├── namespaces.txt
│ ├── endpoints.txt
│ ├── services.txt
│ ├── cronjobs.txt
│ └── deployments.yaml
├── 02_pods/
│ ├── pods_wide.txt
│ ├── pods_all.json
│ ├── pods_hostnetwork.txt
│ ├── pods_privileged.txt
│ ├── events.txt
│ ├── pod_describe_.txt
│ └── containers_.txt
├── 03_rbac/
│ ├── serviceaccounts.txt
│ ├── all_roles.txt
│ ├── admin_clusterrolebindings.txt
│ ├── auth_can_i_self.txt
│ ├── auth_can_i_sa.txt
│ └── secrets_list.txt
├── 04_forensics_/
│ ├── pod_status.txt
│ ├── pod_logs.txt # or pod_logs_previous.txt / pod_logs_unavailable.txt
│ ├── ps_aux.txt
│ ├── netstat.txt
│ ├── lsof.txt
│ ├── env.txt
│ └── container_fs.tar.gz # full filesystem dump (if requested)
├── 05_credentials/
│ ├── kubeconfig_root.txt
│ ├── sa_token.txt
│ ├── pki_listing.txt
│ ├── kubelet_kubeconfig.txt
│ ├── admin_conf.txt
│ ├── env_all.txt
│ ├── find_env_files.txt
│ └── find_keys.txt
├── 06_audit/
│ ├── audit_user_.txt
│ ├── audit_write_verbs.txt
│ ├── audit_exec.txt
│ └── audit_secrets.txt
├── 07_containment/
│ ├── label_.txt
│ └── cordon_.txt
└── collection.log
```
收集完成后,脚本将自动创建:
```
incident_evidence.tar.gz ← everything above, compressed
SHA256: a858e2947f269589... ← printed to terminal for chain of custody
```
## 示例会话
```
██╗ ██╗ █████╗ ███████╗ ██╗██████╗
██║ ██╔╝██╔══██╗██╔════╝ ██║██╔══██╗
█████╔╝ ╚█████╔╝███████╗ ██║██████╔╝
██╔═██╗ ██╔══██╗╚════██║ ██║██╔══██╗
██║ ██╗╚█████╔╝███████║ ██║██║ ██║
╚═╝ ╚═╝ ╚════╝ ╚══════╝ ╚═╝╚═╝ ╚═╝
Kubernetes Incident Response / Digital Forensics
Output directory prefix [incident]: case-2026-04-02
── Step 1: Node Selection ──────────────────────────
1) worker-node-01
2) worker-node-02
3) control-plane-01
4) (skip / all nodes)
Enter number: 1
── Step 2: Namespace Selection ─────────────────────
1) default
2) kube-system
3) production
4) (all namespaces)
Enter number: 3
── Step 3: Pod Selection ───────────────────────────
1) batch-check-job-4t9jr
2) api-server-6d9f8b-xkz
3) (skip pod-specific steps)
Enter number: 1
[*] Pod phase: Unknown Ready reason: NodeLost
[!] Pod is NOT Running — exec/logs may fail
[!] The node hosting this pod may be offline or the container has already exited
[>] Pod logs (1h, all containers)
[!] Live logs empty — trying previous container logs...
[+] Previous container logs saved → ./case-2026-04-02_.../pod_logs_previous.txt
...
[+] Archive created : /home/admin1/case-2026-04-02_evidence.tar.gz (116K)
SHA256: a858e2947f2695891655b6a230a44e3a8a2bf0964dec6d74bb0ba9b9e558bbc8
```
## 已知限制
- **未知/已停止的 Pod** — `kubectl exec` 和文件系统转储要求 Pod 处于 `Running` 状态。如果节点离线,则无法进行基于 exec 的收集。
- **审计日志** — 只有在事件发生前集群启用了审计日志功能时才可用。脚本会提示输入日志路径。
- **特权收集** — 某些命令(例如,读取 `/etc/kubernetes/admin.conf`)需要主机上的 root 权限。当命令失败时,脚本会优雅地继续执行。
- **大型文件系统转储** — `container_fs.tar.gz` 可能会非常大,具体取决于容器镜像和数据量。
## 博客文章
有关 Kubernetes 取证方法论的完整演练,请参阅随附的 Medium 文章:
[**Kubernetes 取证与事件响应:实用实战指南**](https://medium.com/@muhammadtalaat979/kubernetes-forensics-a-practical-field-guide-️-8b35b86656dc)
## 参考文献
- [Kubernetes 安全文档](https://kubernetes.io/docs/concepts/security/)
- [MITRE ATT&CK 容器矩阵](https://attack.mitre.org/matrices/enterprise/containers/)
标签:HTTP工具, k8s, k8s取证, Pandas, PB级数据处理, RBAC审计, Shell脚本, Web截图, 凭据搜索, 安全脚本, 安全运维, 容器取证, 容器安全, 库, 应急响应, 应用安全, 数字取证, 数字取证, 数据处理, 日志收集, 网络安全审计, 自动化脚本, 自动化脚本, 证据打包