Kubernetes 加固

Tip

学习并练习 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

用于分析集群的工具

Steampipe - Kubernetes Compliance

它将对 Kubernetes 集群执行 多项合规性检查。它支持 CIS、美国国家安全局 (NSA) 以及美国网络安全与基础设施安全局 (CISA) 发布的关于 Kubernetes 加固的网络安全技术报告。

# Install Steampipe
brew install turbot/tap/powerpipe
brew install turbot/tap/steampipe
steampipe plugin install kubernetes

# Start the service
steampipe service start

# Install the module
mkdir dashboards
cd dashboards
powerpipe mod init
powerpipe mod install github.com/turbot/steampipe-mod-kubernetes-compliance

# Run the module
powerpipe server

Kubescape

Kubescape 是一个 K8s 开源工具,为多云环境提供 K8s 单一控制面板,包括风险分析、安全合规、RBAC 可视化和镜像漏洞扫描。Kubescape 会扫描 K8s 集群、YAML 文件和 HELM charts,依据多种框架(例如 NSA-CISA , [MITRE ATT&CK®](https://www.microsoft.com/security/blog/2021/03/23/secure-containerized-environments-with-updated-threat-matrix-for-kubernetes/))检测错误配置、软件漏洞以及 CI/CD 管道早期的 RBAC (role-based-access-control) 违规,实时计算风险得分并展示随时间的风险趋势。

curl -s https://raw.githubusercontent.com/kubescape/kubescape/master/install.sh | /bin/bash
kubescape scan --verbose

Popeye

Popeye 是一个对运行中的 Kubernetes 集群进行扫描的实用工具,能报告已部署资源和配置的潜在问题。它基于实际部署的内容(而不是磁盘上的文件)对集群进行清理。通过扫描集群,它能检测错误配置并帮助你确保最佳实践得到落实,从而避免未来的问题。其目标是减少在实际运行 Kubernetes 集群时所面临的认知过载。除此之外,如果你的集群使用 metric-server,它会报告资源分配过度/不足的潜在问题,并在集群可能耗尽容量时尝试发出警告。

Kube-bench

工具 kube-bench 是一个根据 CIS Kubernetes Benchmark 中记录的检查来验证 Kubernetes 是否安全部署的工具。
你可以选择:

  • 在容器内运行 kube-bench(与主机共享 PID namespace)
  • 运行一个在主机上安装 kube-bench 的容器,然后直接在主机上运行 kube-bench
  • Releases page 安装最新二进制文件,
  • 从源代码编译。

Kubeaudit

[已弃用] 该工具 kubeaudit 是一个命令行工具和 Go 包,用于审计 Kubernetes 集群以应对各种不同的安全问题。

Kubeaudit 可以检测自身是否在集群内的容器中运行。如果是,它会尝试审计该集群中的所有 Kubernetes 资源:

kubeaudit all

该工具还有参数 autofix自动修复检测到的问题。

Kube-hunter

[已弃用] 工具 kube-hunter 在 Kubernetes 集群中搜索安全弱点。该工具的开发旨在提高对 Kubernetes 环境中安全问题的认知与可见性。

kube-hunter --remote some.node.com

Trivy

Trivy 有用于查找安全问题的扫描器,可检测以下目标:

  • 容器镜像 (Container Image)
  • 文件系统 (Filesystem)
  • Git 仓库(远程)(Git Repository (remote))
  • 虚拟机镜像 (Virtual Machine Image)
  • Kubernetes

Kubei

[看起来不再维护]

Kubei 是一个漏洞扫描和 CIS Docker 基准工具,允许用户对其 Kubernetes 集群进行准确且即时的风险评估。Kubei 会扫描在 Kubernetes 集群中使用的所有镜像,包括应用 pods 和系统 pods 的镜像。

KubiScan

KubiScan 是一个用于扫描 Kubernetes 集群中基于角色访问控制 (RBAC) 授权模型中高风险权限的工具。

Managed Kubernetes Auditing Toolkit

Mkat 是一个用来执行与其他工具相比更高风险检查的工具。主要有 3 种模式:

  • find-role-relationships: 用于查找哪些 AWS 角色在哪些 pods 中运行
  • find-secrets: 尝试在 K8s 资源(例如 Pods、ConfigMaps 和 Secrets)中识别 secrets
  • test-imds-access: 会尝试运行 pod 并尝试访问 metadata v1 和 v2。警告:该操作会在集群中运行一个 pod,请非常谨慎,可能不是你想要的操作!

Audit IaC Code

KICS

KICS 用于在以下 Infrastructure as Code 解决方案 中发现 安全漏洞、合规问题和基础设施错误配置:Terraform, Kubernetes, Docker, AWS CloudFormation, Ansible, Helm, Microsoft ARM, 和 OpenAPI 3.0 规范

Checkov

Checkov 是一个针对基础设施即代码的静态代码分析工具。

它会扫描使用 Terraform、Terraform plan、CloudformationAWS SAMKubernetesDockerfileServerlessARM Templates 提供的云基础设施,并使用基于图的扫描检测安全和合规错误配置。

Kube-score

kube-score 是一个对你的 Kubernetes 对象定义进行静态代码分析的工具。

To install:

平台命令 / 链接
适用于 macOS、Linux 和 Windows 的预构建二进制文件GitHub releases
Dockerdocker pull zegl/kube-score (Docker Hub)
Homebrew (macOS and Linux)brew install kube-score
Krew (macOS and Linux)kubectl krew install score

Tools to analyze YAML files & Helm Charts

Kube-linter

# Install Kube-linter
brew install kube-linter

# Run Kube-linter
## lint ./path/to/yaml/or/chart

Checkov

# Install Checkov
pip install checkov

# Run Checkov
checkov -d ./path/to/yaml/or/chart

kube‑score

# Install kube-score
brew install kube-score

# Run kube-score
kube-score score ./path/to/yaml
# or
helm template chart /path/to/chart | kube-score score -
# or if the chart needs some values
helm template chart /path/to/chart \
--set 'config.urls[0]=https://dummy.backend.internal' \
| kube-score score -

Kubesec

# Install Kubesec
## Download from https://github.com/controlplaneio/kubesec/releases

# Run Kubesec in a yaml
kubesec scan ./path/to/yaml
# or
helm template chart /path/to/chart | kubesec scan -
# or if the chart needs some values
helm template chart /path/to/chart \
--set 'config.urls[0]=https://dummy.backend.internal' \
| kubesec scan -

扫描依赖问题

扫描镜像

#!/bin/bash
export images=$(kubectl get pods --all-namespaces -o jsonpath="{range .items[]}{.spec.containers[].image}{'\n'}{end}" | sort | uniq)
echo "All images found: $images"
echo ""
echo ""
for image in $images; do
# Run trivy scan and save JSON output
trivy image --format json --output /tmp/result.json --severity HIGH,CRITICAL "$image" >/dev/null 2>&1
# Extract binary targets that have vulnerabilities
binaries=$(jq -r '.Results[] | select(.Vulnerabilities != null) | .Target' /tmp/result.json)
if [ -n "$binaries" ]; then
echo "- **Image:** $image"
while IFS= read -r binary; do
echo "  - **Binary:** $binary"
jq -r --arg target "$binary" '
.Results[] | select(.Target == $target) | .Vulnerabilities[] |
"    - **\(.Title)** (\(.Severity)): Affecting `\(.PkgName)` fixed in version `\(.FixedVersion)` (current version is `\(.InstalledVersion)`)."
' /tmp/result.json
done <<< "$binaries"
echo ""
echo ""
echo ""
fi
done

扫描 Helm charts

#!/bin/bash
# scan-helm-charts.sh
# This script lists all Helm releases, renders their manifests,
# and then scans each manifest with Trivy for configuration issues.

# Check that jq is installed
if ! command -v jq &>/dev/null; then
echo "jq is required but not installed. Please install jq and rerun."
exit 1
fi

# List all helm releases and extract namespace and release name
echo "Listing Helm releases..."
helm list --all-namespaces -o json | jq -r '.[] | "\(.namespace) \(.name)"' > helm_releases.txt

# Check if any releases were found
if [ ! -s helm_releases.txt ]; then
echo "No Helm releases found."
exit 0
fi

# Loop through each Helm release and scan its rendered manifest
while IFS=" " read -r namespace release; do
echo "---------------------------------------------"
echo "Scanning Helm release '$release' in namespace '$namespace'..."
# Render the Helm chart manifest
manifest_file="${release}-manifest.yaml"
helm get manifest "$release" -n "$namespace" > "$manifest_file"
if [ $? -ne 0 ]; then
echo "Failed to get manifest for $release in $namespace. Skipping."
continue
fi
# Scan the manifest with Trivy (configuration scan)
echo "Running Trivy config scan on $manifest_file..."
trivy config --severity MEDIUM,HIGH,CRITICAL "$manifest_file"
echo "Completed scan for $release."
done < helm_releases.txt

echo "---------------------------------------------"
echo "Helm chart scanning complete."

提示

Kubernetes PodSecurityContext 和 SecurityContext

你可以为 Pod 配置 security context(使用 PodSecurityContext),并为将要运行的 containers 配置 SecurityContext。更多信息请阅读:

Kubernetes SecurityContext(s)

Kubernetes API 加固

非常重要的一点是要保护对 Kubernetes Api Server 的访问,因为具有足够权限的恶意行为者可能会滥用它并以多种方式破坏环境。
重要的是要同时保护 访问(将允许访问 API Server 的来源列入白名单并拒绝任何其他连接)和 authentication(遵循最小权限原则)。并且绝对不要允许匿名请求。

常见请求流程:
User or K8s ServiceAccount –> Authentication –> Authorization –> Admission Control。

提示

  • 关闭端口。
  • 避免匿名访问。
  • NodeRestriction:阻止特定节点访问 API。
  • https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#noderestriction
  • 基本上阻止 kubelets 添加/删除/更新以 node-restriction.kubernetes.io/ 为前缀的 labels。该标签前缀保留给管理员用于为其 Node 对象打标签以实现工作负载隔离,kubelets 将不被允许修改具有该前缀的标签。
  • 同时,允许 kubelets 添加/删除/更新这些标签及标签前缀。
  • 通过标签确保工作负载隔离的安全性。
  • 阻止特定 Pod 访问 API。
  • 避免 ApiServer 暴露到互联网。
  • 避免未经授权的访问(RBAC)。
  • 对 ApiServer 端口使用防火墙和 IP 白名单。

SecurityContext 加固

默认情况下,如果未指定其他用户,Pod 启动时会使用 root 用户。你可以使用类似下面的模板,在更安全的上下文中运行你的应用程序:

apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
volumes:
- name: sec-ctx-vol
emptyDir: {}
containers:
- name: sec-ctx-demo
image: busybox
command: [ "sh", "-c", "sleep 1h" ]
securityContext:
runAsNonRoot: true
volumeMounts:
- name: sec-ctx-vol
mountPath: /data/demo
securityContext:
allowPrivilegeEscalation: true

常规硬化

应根据需要定期更新你的 Kubernetes 环境,以确保:

  • 依赖保持最新。
  • 错误和安全补丁已应用。

Release cycles: 每 3 个月会有一个新的次要版本发布 —— 1.20.3 = 1(Major).20(Minor).3(patch)

更新 Kubernetes Cluster 的最佳方法是(来自 here):

  • 按以下顺序升级 Master Node 组件:
  • etcd(所有实例)。
  • kube-apiserver(所有控制平面主机)。
  • kube-controller-manager。
  • kube-scheduler。
  • cloud controller manager(如果在使用的话)。
  • 升级 Worker Node 组件,例如 kube-proxy、kubelet。

Kubernetes 监控与安全:

  • Kyverno Policy Engine
  • Cilium Tetragon - 基于 eBPF 的安全可观测性与运行时强制执行
  • 网络安全策略
  • Falco - 运行时安全监控与检测

Tip

学习并练习 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks