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截图, 凭据搜索, 安全脚本, 安全运维, 容器取证, 容器安全, 库, 应急响应, 应用安全, 数字取证, 数字取证, 数据处理, 日志收集, 网络安全审计, 自动化脚本, 自动化脚本, 证据打包