NexusFang-tech/portcullis

GitHub: NexusFang-tech/portcullis

这是一款基于正则表达式和熵值分析的密钥扫描器,能够检测本地文件树及Git历史记录中的硬编码敏感凭据。

Stars: 0 | Forks: 0

# Portcullis 一个用于 git 仓库和本地文件树的密钥与凭据扫描器。 Portcullis 可以检测源代码中的硬编码密钥、API 密钥、私钥以及其他敏感凭据——无论是在工作树中还是埋藏在 git 历史记录中。 ## 安装 ``` # 以开发模式克隆并安装 git clone https://github.com/yourorg/portcullis.git cd portcullis pip install -e ".[dev]" ``` 需要 Python 3.10 或更高版本。 ## 快速开始 ``` # 扫描当前目录 portcullis scan # 扫描特定路径并输出 JSON portcullis scan --path ./my-project --format json # 审计所有提交中的 git 历史记录以查找 secrets portcullis audit --path ./my-repo # 按严重程度过滤 portcullis scan --severity critical --format csv ``` ## 用法 ### `scan` — 扫描文件中的密钥 ``` portcullis scan [OPTIONS] ``` | 选项 | 描述 | |---|---| | `--path PATH` | 要扫描的目录(默认:`.`) | | `--depth N` | 最大目录深度 | | `--exclude PATTERN [...]` | 要排除的 Glob 模式 | | `--severity LEVEL` | 最低严重级别:`critical`、`high`、`medium`、`low` | | `--format FORMAT` | 输出格式:`table`(默认)、`json`、`csv` | 示例: ``` # 排除 vendor 目录和压缩文件 portcullis scan --exclude vendor "*.min.js" # 浅层扫描,仅限 critical portcullis scan --depth 2 --severity critical # 用于 CI 集成的 JSON 输出 portcullis scan --format json > results.json ``` ### `audit` — 扫描 git 提交历史 ``` portcullis audit [OPTIONS] ``` | 选项 | 描述 | |---|---| | `--path PATH` | git 仓库的路径(默认:`.`) | | `--max-commits N` | 限制要扫描的提交数量 | | `--severity LEVEL` | 报告的最低严重级别 | | `--format FORMAT` | 输出格式:`table`、`json`、`csv` | audit 命令会遍历仓库中的每一个提交,并扫描每一个文件 blob。它会对发现结果进行去重,因此对于在多个提交中未更改的文件里的相同密钥,只会报告一次。 ``` # 完整历史审计 portcullis audit # 仅扫描最近 100 次提交 portcullis audit --max-commits 100 --format json ``` ## 配置 在你的项目根目录下创建一个 `.portcullis.yml` 文件: ``` # 从扫描中排除的路径 exclude: - vendor - "*.min.js" - test/fixtures # 报告的最低严重程度 severity: medium # 最大目录深度 max_depth: 10 # 额外的规则文件 custom_rules: - rules/company-rules.yml ``` CLI 参数会覆盖配置文件中的值。 ## 检测引擎 Portcullis 使用多层检测方法: 1. **正则表达式模式匹配** — 每条规则定义了一个针对已知凭据格式的正则表达式 2. **Shannon 熵分析** — 对匹配的字符串进行随机性评估;低熵匹配(如占位符值)会被过滤掉 3. **误报过滤器** — 针对每条规则的正则过滤器会消除已知的示例/占位符值 ### 内置规则 | 规则 ID | 目标 | 严重级别 | |---|---|---| | `aws-access-key` | AWS Access Key IDs (AKIA...) | Critical | | `aws-secret-key` | AWS Secret Access Keys | Critical | | `github-pat` | GitHub Personal Access Tokens | Critical | | `private-key-pem` | PEM-encoded private keys | Critical | | `stripe-secret-key` | Stripe API secret keys | Critical | | `slack-bot-token` | Slack bot tokens | Critical | | `jwt-token` | JSON Web Tokens | High | | `slack-webhook` | Slack webhook URLs | High | | `database-url` | Database connection strings | High | | `password-in-config` | 配置文件中的密码 | High | | `google-api-key` | Google Cloud API keys | High | | `generic-api-key` | 通用 API 密钥模式 | Medium | | `generic-secret` | 通用密钥赋值 | Medium | | ...以及更多 | | | ## 规则编写指南 规则在 YAML 文件中定义。每条规则包含: ``` rules: - id: my-company-token # Unique identifier name: My Company API Token # Human-readable name severity: high # critical, high, medium, low description: > # Optional description Detects My Company API tokens which start with "mc_". pattern: 'mc_[A-Za-z0-9]{32}' # Regex pattern entropy_threshold: 3.5 # Optional: minimum Shannon entropy false_positive_filters: # Optional: regexes that indicate false positives - 'mc_example_token' - 'mc_0{32}' ``` ### 字段 | 字段 | 必填 | 描述 | |---|---|---| | `id` | 是 | 唯一规则标识符 | | `name` | 是 | 显示名称 | | `severity` | 是 | `critical`、`high`、`medium` 或 `low` | | `pattern` | 是 | Python 正则表达式。使用捕获组 `()` 包裹密钥值,以便进行熵分析和脱敏 | | `description` | 否 | 解释该规则检测的内容 | | `entropy_threshold` | 否 | 如果设置,低于此熵值的匹配字符串将被过滤。十六进制使用 ~3.0,base64 使用 ~4.0,混合字母数字使用 ~4.5 | | `false_positive_filters` | 否 | 正则表达式列表;如果任何一个匹配捕获的文本,该发现将被抑制 | ### 提示 - **使用捕获组** — 用 `()` 包裹实际的密钥,以便熵分析针对凭据本身,而不是周围的语法 - **为通用模式设置熵阈值**,以避免标记 `password = "changeme"` - **添加误报过滤器**,用于文档中已知的示例值 - 将自定义规则文件放置在任何位置,并在 `.portcullis.yml` 中引用它们 ## 输出格式 ### 表格(默认) 丰富的终端输出,包含颜色编码的严重级别、文件路径、行号、规则名称和脱敏预览。永远不会打印完整的密钥。 ### JSON ``` { "findings": [ { "rule_id": "aws-access-key", "rule_name": "AWS Access Key ID", "severity": "critical", "file_path": "config/prod.env", "line_number": 3, "redacted_preview": "AKI*****************QA" } ], "total": 1 } ``` ### CSV 标准 CSV,包含表头:`rule_id`、`rule_name`、`severity`、`file_path`、`line_number`、`redacted_preview`、`commit_sha`、`commit_message`、`commit_author`。 ## CI 集成 退出代码 `0` 表示未发现密钥;`1` 表示检测到发现结果。在 CI 流水线中使用: ``` # GitHub Actions - name: Scan for secrets run: portcullis scan --format json --severity high ``` 请参阅 `.github/workflows/ci.yml` 了解项目自身的 CI 配置,该配置使用 ruff linting 在 Python 3.10、3.11 和 3.12 上运行测试。 ## 开发 ``` pip install -e ".[dev]" pytest -v ruff check src/ tests/ ``` ## 许可证 [MIT](LICENSE)
标签:API 密钥, CI/CD 集成, DevSecOps, Git 安全, Java RMI, Linux安全, Python 工具, Redis利用, 上游代理, 仓库审计, 凭据管理, 安全扫描, 对抗攻击, 指令劫持, 敏感信息检测, 数据泄露防护, 时序注入, 版本控制安全, 硬编码密钥, 私有密钥检测, 网络探测, 逆向工具, 防御框架