openshift/tls-scanner

GitHub: openshift/tls-scanner

一个面向 OpenShift/Kubernetes 集群的 TLS 合规性扫描器,基于 testssl.sh 自动枚举集群 Pod 的 TLS 版本与密码配置,并支持后量子就绪性检查。

Stars: 2 | Forks: 16

# tls-scanner 一个用于 OpenShift/Kubernetes 集群的 TLS 合规性扫描器。使用 [testssl.sh](https://testssl.sh/) 来枚举集群 Pod 的 TLS 版本、密码套件和密钥交换组,并提供后量子 (ML-KEM) 就绪性检查。 ## 前置条件 - **Go 环境** - 用于构建扫描器二进制文件。 - **容器工具** - Docker 或 Podman,用于构建和推送扫描器镜像。 - **OpenShift/Kubernetes 集群访问权限** - 已配置好指向目标集群的 `oc` 或 `kubectl`。 - **足够的权限** - 拥有创建 Job 的权限,并能将 `cluster-reader` 和 `privileged` SCC 授予 ServiceAccount。 ## 安装与使用 该扫描器设计为在其扫描的集群内部运行。这是确保能够访问所有 Pod 网络的最可靠方式。包含的 `deploy.sh` 脚本可自动化构建和部署过程。 ### CI/CD 工作流(推荐) 这是在临时测试环境中进行自动化扫描的推荐方法。 #### 1. 配置环境 在您的 CI 作业中设置以下环境变量: - `SCANNER_IMAGE`:要构建和推送的镜像完整标签(例如,`quay.io/my-org/tls-scanner:latest`)。 - `NAMESPACE`:将部署扫描器 Job 的 OpenShift/Kubernetes 命名空间(例如,`scanner-project`)。**注意:** 这不会限制要扫描的内容——它仅决定扫描器的运行位置。 - `NAMESPACE_FILTER`:(可选)要扫描的命名空间的逗号分隔列表。如果未设置,扫描器将扫描整个集群中的所有 Pod。示例:`production,staging` 仅扫描这些命名空间。 - `KUBECONFIG`:临时测试集群的 kubeconfig 文件路径。 - `JOB_TEMPLATE_FILE`:(可选)`deploy.sh deploy` 使用的 Job 清单模板路径(默认值:`scanner-job.yaml.template`)。对于基于主机的扫描,请使用配置了主机网络访问权限的模板(例如 `scanner-job-microshift.yaml.template`)。 - `SCAN_MODE`:(可选)`pod`(默认)或 `host`。**Pod 模式** 发现集群中的 Pod 并扫描其 TLS 端口。**主机模式** 适用于核心组件(API server、etcd、kubelet)运行在主机而非 Pod 中的环境——例如单节点或边缘部署(如 MicroShift)。使用设置了 `hostNetwork: true` 的 Job 模板并设置 `SCAN_MODE=host`,以便扫描器在主机上运行并能够访问这些服务。 #### 2. 构建并推送镜像 您的 CI 流水线需要通过容器镜像仓库的身份验证。 ``` # 构建 binary 和容器镜像 ./deploy.sh build # 将镜像推送到你的 registry ./deploy.sh push ``` #### 3. 部署扫描 Job 此步骤将创建必要的 RBAC 权限,并将一个 Kubernetes Job 部署到临时集群中。 ``` ./deploy.sh deploy ``` #### 4. 等待完成并收集结果 CI 作业必须等待 Kubernetes Job 完成,然后复制出构建产物。 ``` # 等待 job 完成(根据需要调整 timeout) kubectl wait --for=condition=complete job/tls-scanner-job -n "$NAMESPACE" --timeout=15m # 获取由 job 创建的 pod 的名称 POD_NAME=$(kubectl get pods -n "$NAMESPACE" -l job-name=tls-scanner-job -o jsonpath='{.items[0].metadata.name}') # 为 artifacts 创建本地目录 mkdir -p ./artifacts # 从 pod 复制所有结果文件 kubectl cp "${NAMESPACE}/${POD_NAME}:/artifacts/." "./artifacts/" ``` 您的 `./artifacts` 目录现在将包含 `results.json`、`results.csv` 和 `scan.log`。 ### 基于主机的扫描 在某些环境中,核心集群组件(API server、etcd、kubelet)运行在主机上而不是作为 Pod 运行。例如单节点和边缘部署(如 MicroShift)。对于这些设置,请使用**主机**扫描模式,以便扫描器在拥有主机网络访问权限的情况下运行,并能发现和扫描绑定到主机的 TLS 服务: ``` JOB_TEMPLATE_FILE=scanner-job-microshift.yaml.template SCAN_MODE=host ./deploy.sh deploy ``` 使用 `JOB_TEMPLATE_FILE` 指向设置了 `spec.hostNetwork: true`(以及任何所需的安全上下文)的 Job 模板。默认的 `scanner-job.yaml.template` 仅用于基于 Pod 的扫描。 ## 了解扫描结果 ### CSV 输出列 扫描器会生成一个 CSV 文件,其中包含有关每个扫描端口的详细信息。关键列包括: | 列名 | 描述 | | ------------------ | ----------------------------------------------------------- | | IP | 被扫描的 Pod IP 地址 | | Port | TCP 端口号 | | Protocol | 协议(通常为 "tcp") | | Service | 检测到的服务(例如,"https"、"http") | | Pod Name | Kubernetes Pod 名称 | | Namespace | Kubernetes 命名空间 | | Component Name | 从镜像中提取的 OpenShift 组件名称 | | Process | 在该端口上监听的进程名称(来自 lsof) | | TLS Ciphers | 检测到的 TLS 密码套件 | | TLS Version | 检测到的 TLS 版本(例如,TLSv1.2、TLSv1.3) | | **Status** | 分类后的扫描结果(见下文) | | **Reason** | 状态的详细解释 | | **Listen Address** | 端口绑定的地址(例如,127.0.0.1、\*、0.0.0.0) | ### 状态分类 `Status` 列对端口无法扫描或其 TLS 配置的情况进行了分类: | 状态 | 描述 | | ---------------- | -------------------------------------------------------------- | | `OK` | TLS 扫描成功 - 密码和版本信息可用 | | `NO_TLS` | 端口开放但未使用 TLS(纯 HTTP/TCP 服务) | | `LOCALHOST_ONLY` | 端口绑定到 127.0.0.1,无法通过 Pod IP 访问 | | `FILTERED` | 端口被网络策略或防火墙阻止 | | `CLOSED` | 端口未在扫描的 IP 地址上监听 | | `MTLS_REQUIRED` | TLS 握手失败 - 可能需要客户端证书 | | `TIMEOUT` | 连接超时 | | `NO_PORTS` | Pod 在其规约中未声明 TCP 端口 | | `ERROR` | 发生扫描错误(详见 Reason) | ### 输出示例 ``` IP,Port,Protocol,Service,Pod Name,Namespace,...,Status,Reason,Listen Address 10.128.0.15,8443,tcp,https,kube-apiserver-pod,openshift-kube-apiserver,...,OK,TLS scan successful,* 10.0.53.147,9257,tcp,N/A,controller-manager-pod,openshift-cloud-controller,...,LOCALHOST_ONLY,Bound to 127.0.0.1 not accessible from pod IP,127.0.0.1 10.0.87.193,10258,tcp,N/A,aws-ccm-pod,openshift-cloud-controller,...,FILTERED,Network policy or firewall blocking access,N/A 10.128.0.20,8080,tcp,http,metrics-pod,openshift-monitoring,...,NO_TLS,Port open but no TLS detected (plain HTTP/TCP),* ``` ### 结果解读 1. **LOCALHOST_ONLY 端口**:这些是绑定到 127.0.0.1 的内部端口。它们只能从 Pod 自身内部访问,不存在外部 TLS 合规性问题。这常见于通过 Sidecar 容器抓取的 Metrics 端点。 2. **FILTERED 端口**:由于网络策略、防火墙规则或服务未在 Pod IP 上监听,扫描器无法访问这些端口。如果您需要扫描这些端口,请检查网络策略。 3. **NO_TLS 端口**:这些端口开放但不使用 TLS。这可能是预期的行为(例如,健康检查端点、明文 Metrics),或者根据传输的数据表明存在安全隐患。 4. **MTLS_REQUIRED 端口**:常见于 etcd(端口 2379/2380)以及其他需要双向 TLS 的服务。如果没有客户端证书,扫描器无法完成握手。 #### 5. 清理 从集群中移除扫描器 Job 及相关联的 RBAC 权限。 ``` ./deploy.sh cleanup ``` ### 手动使用 您也可以手动执行这些步骤。 1. **构建镜像:** `export SCANNER_IMAGE="your-registry/image:tag"` 并运行 `./deploy.sh build`。 2. **推送镜像:** `./deploy.sh push`。 3. **部署 Job:** `export NAMESPACE="scanner-project" NAMESPACE_FILTER="production"` 并运行 `./deploy.sh deploy` 4. **监控并获取结果**,如 CI 工作流所示。 5. **清理**,运行 `./deploy.sh cleanup`。 ### `deploy.sh` 脚本操作 - `build`:构建 `tls-scanner` 二进制文件和容器镜像。 - `push`:将容器镜像推送到由 `$SCANNER_IMAGE` 指定的镜像仓库。 - `deploy`:将扫描器 Kubernetes Job 部署到由 `$KUBECONFIG` 和 `$NAMESPACE` 指定的集群。 - `cleanup`:移除扫描器 Job 和 RBAC 资源。 - `full-deploy`(或不加操作参数):运行 `build`、`push` 和 `deploy`。 ### 命令行选项 扫描器二进制文件接受以下命令行选项。这些选项在 `scanner-job.yaml.template` 文件中配置。 ``` ./tls-scanner [OPTIONS] ``` **选项:** - `-host ` - 要扫描的目标主机/IP(默认:127.0.0.1) - `-port ` - 要扫描的目标端口(默认:443) - `-targets ` - 以逗号分隔的 host:port 目标扫描列表 - `-all-pods` - 扫描集群中的所有 Pod(需要集群访问权限) - `-component-filter ` - 按组件名称过滤 Pod(以逗号分隔,与 -all-pods 一起使用) - `-namespace-filter ` - 按命名空间过滤 Pod(以逗号分隔,与 -all-pods 一起使用) - `-limit-ips ` - 限制要扫描的 IP 数量,用于测试(0 = 无限制) - `-pqc-check` - 检查 TLS 1.3 + ML-KEM(后量子)支持;失败时以非零状态退出 - `-j ` - 并发扫描的数量;0 = runtime.NumCPU()(默认:0) - `-artifact-dir ` - 输出文件的目录(默认:/tmp) - `-json-file ` - 将结果以 JSON 格式输出到指定文件 - `-csv-file ` - 将结果以 CSV 格式输出到指定文件 - `-junit-file ` - 将结果以 JUnit XML 格式输出到指定文件 - `-log-file ` - 将所有日志输出重定向到指定文件 - `-timing-file ` - 将计时报告写入 artifact-dir 中的指定文件 - `-version` - 打印版本并退出
标签:DevSecOps, Docker, EVTX分析, Go语言, K8s Job, ML-KEM, OpenShift, Podman, testssl.sh, TLS扫描器, Web截图, 上游代理, 云存储安全, 后量子密码学, 子域名突变, 安全防御评估, 容器安全, 密码套件, 密钥交换, 插件系统, 日志审计, 程序破解, 端点枚举, 网络扫描, 聊天机器人, 请求拦截