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)
[](https://github.com/semx/ansible-secops-linter/actions/workflows/codeql.yml)
[](https://github.com/semx/ansible-secops-linter/actions/workflows/gitleaks.yml)
[](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, 上游代理, 安全合规, 恶意代码分类, 网络代理, 自动化运维, 逆向工具, 错误基检测, 静态代码分析