sebrandon1/tls-config-lint
GitHub: sebrandon1/tls-config-lint
一个 GitHub Action,用于在 CI 中自动扫描多种语言代码库的 TLS 配置反模式和安全问题。
Stars: 0 | Forks: 0
# tls-config-lint
一个 GitHub Action,用于扫描代码库中 Go、Python、Node.js/TypeScript、C++、Java 和 Rust 项目的 TLS 配置反模式和安全问题。
## 主要功能
- **86 种 TLS 反模式** — 涵盖 6 种语言,并提供严重性分类(严重、高、中、信息)
- **PR 内联注解** — 扫描结果会直接显示在 Pull Request 中受影响的代码行上
- **SARIF 输出** — 可选的 GitHub 代码扫描集成
- **自动检测** — 通过文件标记(如 go.mod、package.json 等)自动发现项目使用的语言
- **可配置阈值** — 仅在扫描结果达到或高于您指定的严重性时才让 CI 失败
- **按模式屏蔽** — 可从结果中排除特定的模式 ID
- **作业摘要** — 在 GitHub Actions 摘要中生成 Markdown 格式的扫描结果表
- **复合 Action** — 无需 Docker 构建开销
## 快速开始
### 1. 添加工作流
在您的代码库中创建 `.github/workflows/tls-lint.yml`:
```
name: TLS Lint
on: [push, pull_request]
jobs:
tls-lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: sebrandon1/tls-config-lint@v1
```
大功告成 — 推送该文件,此 Action 就会自动检测您的项目语言并扫描 TLS 反模式。
### 2. 了解输出结果
当检测到扫描结果时,它们会出现在三个地方:
- **PR 注解** — 在您的 Pull Request 中受影响代码行上的内联评论
- **作业摘要** — 在 Actions 运行摘要中提供严重性表格和结果列表
- **退出代码** — 如果扫描结果达到或超过严重性阈值,该步骤将失败(退出码为 1)
每条扫描结果都包含一个指向其[修复文档](docs/patterns.md)的链接,其中提供了不安全/安全的代码示例。
### 3. 解释严重性级别
| 级别 | 含义 | 示例 |
|-------|---------|----------|
| **CRITICAL (严重)** | 验证被禁用、NULL 密码 | `InsecureSkipVerify: true`, `verify=False` |
| **HIGH (高)** | 弱 TLS 版本、损坏的密码 | TLS 1.0/1.1, RC4, 3DES |
| **MEDIUM (中)** | 阻碍 TLS 1.3 的采用 | `MaxVersion: TLS 1.2` |
| **INFO (信息)** | 后量子、已弃用的功能 | PQC/ML-KEM, `PreferServerCipherSuites` |
默认情况下,当级别为 HIGH 或更高时,此 Action 将失败。更改阈值:
```
- uses: sebrandon1/tls-config-lint@v1
with:
severity-threshold: critical # only fail on critical findings
```
### 4. 屏蔽误报
**内联屏蔽** — 在受影响的行上添加注释:
```
InsecureSkipVerify: true, // tls-lint:ignore
```
**按模式屏蔽** — 排除特定的模式 ID:
```
- uses: sebrandon1/tls-config-lint@v1
with:
exclude-patterns: insecure-skip-verify,hardcoded-tls-config
```
**按文件屏蔽** — 创建一个 `.tls-config-lint.yml` 配置文件:
```
exceptions:
- insecure-skip-verify:test_helpers.go
- min-version-tls10:internal/legacy/
```
有关所有选项(包括严重性覆盖、报告输出和调试模式),请参阅[配置](docs/configuration.md)。
### 5. 启用 GitHub 代码扫描(可选)
添加 SARIF 输出,以便在 Security(安全)选项卡中查看结果:
```
- uses: sebrandon1/tls-config-lint@v1
with:
sarif-output: tls-lint.sarif
fail-on-findings: false
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: tls-lint.sarif
if: always()
```
## 输入项
| 输入项 | 默认值 | 描述 |
|-------|---------|-------------|
| `severity-threshold` | `high` | 导致失败的最小严重性:`critical`, `high`, `medium`, `info` |
| `languages` | `auto` | 以逗号分隔:`go,python,nodejs,cpp,java,rust` 或使用 `auto` 自动检测 |
| `exclude-dirs` | _(空)_ | 需要排除的额外目录(以逗号分隔) |
| `exclude-patterns` | _(空)_ | 需要屏蔽的模式 ID(以逗号分隔) |
| `config-file` | `.tls-config-lint.yml` | 可选的代码库配置文件路径 |
| `scan-path` | `.` | 要扫描的目录 |
| `fail-on-findings` | `true` | 是否在扫描结果高于阈值时让 CI 失败 |
| `sarif-output` | _(空)_ | 写入 SARIF 文件的路径(留空 = 禁用) |
| `report-output` | _(空)_ | 写入 CSV 或 JSON 报告的路径(格式由扩展名推断) |
| `debug` | `false` | 显示每条扫描结果匹配到的 regex |
## 输出项
| 输出项 | 描述 |
|--------|-------------|
| `findings-count` | 扫描结果总数 |
| `critical-count` | 严重扫描结果数量 |
| `high-count` | 高严重性扫描结果数量 |
| `medium-count` | 中严重性扫描结果数量 |
| `info-count` | 信息级别扫描结果数量 |
| `sarif-file` | SARIF 文件路径(如果已生成) |
| `report-file` | 报告文件路径(如果已生成) |
| `scan-duration` | 扫描持续时间(例如 `3s`) |
## 指南
| 指南 | 描述 |
|-------|-------------|
| [检测到的模式](docs/patterns.md) | 涵盖 6 种语言的全部 86 种模式 |
| [配置](docs/configuration.md) | 配置文件、高级用法示例、退出代码 |
| [内置排除项](docs/exclusions.md) | 默认排除的目录和测试文件 |
## 开发
```
bash tests/run_tests.sh # Run all unit tests
shfmt -d -i 0 -ci . # Check formatting
shellcheck -S warning entrypoint.sh lib/*.sh patterns/*.sh tests/*.sh # Static analysis
```
## 贡献
欢迎您的贡献!请随时提交 issue 和 Pull Request。
## 许可证
Apache License 2.0 - 详情请参阅 [LICENSE](LICENSE)。
标签:DInvoke, GitHub Action, JS文件枚举, MITM代理, SARIF, TLS/SSL, 可视化界面, 应用安全, 日志审计, 逆向工具, 静态代码扫描