Security/Projects/Bandit
项目已迁移
请注意,Bandit 已经不再由 OpenStack 维护,并已迁移到 Python 代码质量管理局
https://github.com/PyCQA/bandit
所有补丁和问题都应在 PyCQA github 仓库中提出。
概述
Bandit 是一个用于 Python 源代码的安全代码检查工具,利用 Python 标准库中的 ast 模块。
ast 模块用于将源代码转换为 Python 语法节点的解析树。Bandit 允许用户定义针对这些节点执行的自定义测试。在测试完成后,会生成一份报告,其中列出了在目标源代码中发现的安全问题。
目前 Bandit 是一个独立的工具,用户可以下载并针对任意源代码运行。随着其成熟并证明其有用性,我们认为它有可能被添加到 OpenStack CI 门控测试中,具有非投票和最终投票能力。
可以通过克隆位于 https://git.openstack.org/openstack/bandit.git 的仓库来获取 Bandit。 README.rst 文件包含有关安装、使用和配置的文档。
有一个 Bandit 在 2015 年温哥华 OpenStack Summit 上展示的视频。
使用 Bandit 进行门控测试
当 Bandit 用作门控测试时,它可以帮助维护 OpenStack 项目的安全性。例如 Keystone 等项目创建了一个门控测试,该测试运行 Bandit 以确保在修改代码时不会引入常见安全代码错误。 新增:现在你有两种设置 Bandit 门控的方法,我们将在下面介绍这两种方法的步骤。
完整运行 Bandit 门控
此选项适用于已经具有干净 Bandit 运行的项目。要为 OpenStack 项目设置完整运行 Bandit 门控,请按照以下步骤操作
- 将 bandit(pypi 上的软件包名称)添加到 test-requirements.txt 文件中。请参阅 global-requirements.txt 并复制 bandit 行。虽然运行 Bandit 实际上只需要 bandit 软件包,但现在将其与其余的测试要求一起保留是最简单的。此文件列出了创建 Bandit 运行的虚拟环境的要求,并且在大多数项目中由 OpenStack 提案机器人自动更新。
- 我们需要在 2 个 tox 环境中拥有 bandit:一个 bandit 环境,由 bandit 团队用于集成测试,以及 pep8 环境。请参阅 Keystone 的示例。
以下是一个很好的起点
# B105-B107: hardcoded password checks - likely to generate false positives in a gate environment
# B401: import subprocess - not necessarily a security issue; this plugin is mainly used for penetration testing workflow
# B603,B606: process without shell - not necessarily a security issue; this plugin is mainly used for penetration testing workflow
# B607: start process with a partial path - this should be a project level decision
bandit -r project -x tests -s B105,B106,B107,B404,B603,B606,B607
通过运行 tox -e pep8 来测试。最初,可能会有其他几个测试失败。排除这些并在单独的提交中修复它们。
如果您有任何问题或意见,请在 Freenode IRC 上的 #openstack-security 中联系 tmcpeak 或 tkelsey。
Bandit 基线门控
这是最适合可能存在一些遗留 Bandit 发现的项目。 即使项目有一些预先存在安全问题,Bandit 仍然可以帮助防止新的问题!要为 OpenStack 项目设置 Bandit 基线门控,请按照以下步骤操作
- 确定要运行的适当测试,并非 bandit 支持的每个测试都适合每个项目。bandit 命令行参数 -s 和 -t 可用于过滤要运行的测试集。
- (可选)为您的项目添加 Bandit 配置文件。如果您需要配置特定的测试参数,除了批量启用或禁用测试之外,则可能需要一个 bandit 配置文件。Bandit 附带了一个工具 'bandit-config-generator',如果需要,可以帮助生成配置文件。此配置是完全可选的,仅在特定测试的默认值不足时才需要。
- 将“bandit”(pypi 上的软件包名称)添加到 test-requirements.txt 文件中。虽然运行 Bandit 实际上只需要 bandit 软件包,但现在将其与其余的测试要求一起保留是最简单的。此文件列出了创建 Bandit 运行的虚拟环境的要求,并且在大多数项目中由 OpenStack 提案机器人自动更新。
- 添加一个 tox 环境来运行 Bandit 基线。为此,我们将添加两个目标
- 一个独立的 "codesec" 目标 codesec tox 目标,这对于开发人员检查他们的更改非常有用
- 一个 "linters" 目标:linters tox 目标。通过添加一个 linters 目标,我们正在扩展我们的 linters 以运行 Bandit,除了正常的 flake8 测试之外。
- 在两种情况下,'bandit-baseline' 的参数应与您想要传递给 Bandit 的参数相同。例如,如果您创建了上面的配置文件,则需要使用 '-c myconfig.yaml' 指定它。在上面的示例中,我们运行:'bandit-baseline -r bandit -ll -ii',这告诉 Bandit(和 bandit-baseline)递归扫描 'bandit' 目录并过滤中等及以上严重程度和置信度的问题。
- 更改您的 OpenStack 基础设施 zuul/layout.yaml 文件,以使用 'python-jobs-linters' 代替 'python-jobs',就像我们为 Bandit 项目本身所做的那样:zuul 布局更改示例。这将使您的项目能够使用 python-jobs gate 中的 'linters' 目标,而不仅仅是 flake8。 注意:如果您这样做,您将拥有一个投票的 Bandit 门控。在更改此设置之前,您应该确保您对 Bandit 及其工作方式感到满意。
每个任务的配置
默认情况下,Bandit 运行其在 plugins 目录中找到的所有插件。虽然这对于进行彻底的手动审查可能很有用,但对于自动化和门控测试等用例,这可能有些过头。当需要为特定任务创建特定的测试集时,您应该为每个任务创建一个配置文件。该文件可以控制应运行的测试列表,以及调整与这些测试相关的任何参数。创建自定义配置后,您可以使用命令行选项 "-c" 指向配置文件来运行它。控制运行的测试的另一种方法是使用命令行选项 -t 和 -s 选择一组测试,通常在不需要细化测试参数时,这比使用完整的配置更方便。
使用 bandit 的项目
| 项目名称 | 状态 |
|---|---|
| airship-armada airship-deckhand |
voting |
| anchor |
experimental |
| cinder |
non-voting |
| designate |
non-voting |
| keystone keystoneauth |
voting |
| octavia |
voting |
| patrole |
voting |
| swauth |
voting |