semx/ansible-secops-linter

GitHub: semx/ansible-secops-linter

一款针对 Ansible playbook 和 role 的安全静态分析工具,专门检测硬编码凭证、禁用 TLS 验证、缺失 no_log 等运维安全风险。

Stars: 0 | Forks: 0

# Ansible SecOps Linter [![测试](https://github.com/semx/ansible-secops-linter/actions/workflows/tests.yml/badge.svg)](https://github.com/semx/ansible-secops-linter/actions/workflows/tests.yml) [![codeql](https://static.pigsec.cn/wp-content/uploads/repos/cas/96/96c3f93be8faa44dde0863a2e4eb8e78c8cedb435b0715c444c5050f54915e5e.svg)](https://github.com/semx/ansible-secops-linter/actions/workflows/codeql.yml) [![gitleaks](https://static.pigsec.cn/wp-content/uploads/repos/cas/11/1113336b83e43b0f3efe00af6dff5a70a2270685232cf5c0fa788505d6980bd4.svg)](https://github.com/semx/ansible-secops-linter/actions/workflows/gitleaks.yml) [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/semx/ansible-secops-linter/badge)](https://scorecard.dev/viewer/?uri=github.com/semx/ansible-secops-linter) 针对 Ansible playbook 和 role 的安全静态分析。 如果说格式化 linter 关注的是代码风格,那么 `ansible-secops-linter` 关注的则是 **操作和安全风险**:例如将机密信息泄露到日志中的任务模式、 禁用 TLS 或主机密钥验证、以不必要的权限运行, 或者在生产主机上引入非幂等、易导致状态漂移的行为。 它依赖轻量(仅依赖 PyYAML),报告准确的行号,能够 兼容 Ansible YAML 扩展(例如 `!vault` 标签和 Jinja 表达式),并且可以 输出 SARIF 以供 GitHub code scanning 使用。 ## 检查项 | ID | 严重程度 | 检测内容 | | --- | --- | --- | | `SEC001` | error | 禁用了 TLS 证书验证 (`validate_certs: false`) | | `SEC002` | error | 禁用了 SSH 主机密钥验证 | | `SEC003` | error | 变量或任务参数中存在硬编码凭证 | | `SEC004` | error | 远程脚本直接通过管道传递给 shell (`curl … \| bash`) | | `SEC005` | warning | 全局可写文件权限 | | `SEC006` | warning | 禁用了包签名验证 | | `SEC007` | warning | 任务处理了机密信息但未设置 `no_log: true` | 引用变量、`!vault` 机密或 `lookup()` 的值将被视为 安全的,因此由 vault 管理的机密不会触发硬编码凭证规则。 诸如 `.github/` 的目录以及非 Ansible YAML 文件(GitHub Actions 工作流、 `docker-compose` 文件)会被跳过。 ## 安装 ``` pip install git+https://github.com/semx/ansible-secops-linter.git ``` ## 用法 ``` # 人类可读的输出 ansible-secops-linter lint path/to/playbooks # 用于代码扫描的 SARIF;发现问题时不要让运行失败 ansible-secops-linter lint . --format sarif --fail-on never > results.sarif ``` `--fail-on`(默认为 `error`)设置使命令以非零状态退出的最低严重程度:可选值为 `error`、`warning`、`note` 或 `never`。 在一个故意包含不安全配置的 playbook 上的示例: ``` site.yml:11: error [SEC004] Remote script piped straight into a shell (remote code execution risk). site.yml:17: error [SEC001] TLS certificate verification is disabled (validate_certs). site.yml:22: error [SEC003] Possible hardcoded credential; use a vault-encrypted variable instead. site.yml:33: warning [SEC005] World-writable file mode. ``` ## 作为 GitHub Action 使用 ``` - uses: semx/ansible-secops-linter@v0.1.0 with: paths: playbooks roles fail-on: error ``` 将扫描结果上传到 GitHub code scanning: ``` - uses: semx/ansible-secops-linter@v0.1.0 with: paths: . format: sarif fail-on: never output-file: ansible-secops.sarif - uses: github/codeql-action/upload-sarif@v4 with: sarif_file: ansible-secops.sarif ``` | 输入项 | 默认值 | 描述 | | --- | --- | --- | | `paths` | `.` | 以空格分隔的要扫描的文件或目录。 | | `format` | `text` | `text` 或 `sarif`。 | | `fail-on` | `error` | 导致 Action 失败的最低严重程度,或设为 `never`。 | | `output-file` | `""` | 可选路径,用于同时将输出写入文件。 | ## 安全与供应链 本项目在 CI 中运行 DevSecOps 基线: - **SAST** — CodeQL(`security-extended` 查询套件)。 - **机密扫描** — 对完整历史记录运行 Gitleaks,并辅以 GitHub 机密扫描。 - **供应链安全态势** — OpenSSF Scorecard,将 GitHub Actions 固定到特定的 commit SHA, 强化的运行器(`step-security/harden-runner`),最小权限的工作流 token。 - **依赖更新** — Dependabot。 有关如何报告漏洞,请参阅 [SECURITY.md](SECURITY.md)。 ## 许可证 [MIT](LICENSE) © Sergey Sannikov
标签:Ansible, DevSecOps, StruQ, 上游代理, 安全合规, 恶意代码分类, 网络代理, 自动化运维, 逆向工具, 错误基检测, 静态代码分析