echennells/supply-chain-hardening

GitHub: echennells/supply-chain-hardening

通过 Ansible 角色为 14 种包管理器统一配置供应链安全默认策略,解决 AI 代理不可预测的依赖安装行为带来的投毒风险。

Stars: 0 | Forks: 0

# supply-chain-hardening 为 14 个包管理器设置安全默认值的 Ansible role。专为那些会以不可预测方式安装包的运行 AI 代理的服务器而设计。 部署加固的配置文件、系统级环境变量(`/etc/profile.d/`、`/etc/environment`)和安装时门控,使得简单的 `npm install` 或 `pip install` 会在调用者不知情的情况下,受到发布时间门控、脚本拦截和信誉检查的限制。 这提高了默认的安全态势——它并没有创建沙箱。环境变量和配置文件设定了包管理器正常运行时的行为。进程级隔离是一个独立的关注点。这两者是互补的——沙箱控制可以运行什么,而此项目控制包管理器在运行时的行为方式。 ## 它的功能 | 保护措施 | npm | pnpm | Yarn | Bun | Deno | pip/uv | Cargo | Go | Composer | Bundler | Maven | Gradle | NuGet | |---|---|---|---|---|---|---|---|---|---|---|---|---|---| | **48小时发布时间门控** | x | x | x | x | x | x | * | | | | | | | | **安装脚本拦截** | x | x | x | x | x | x | | | x | | | | x | | **安装前信誉检查** | x | x | x | | | | | | | | | | | | **Socket Firewall** | x | | | | | x | x | | | | | | | | **精确版本锁定** | x | | x | x | | | | | | | | | | | **哈希/完整性验证** | x | | | | | x | | x | | | x | | x | | **仅限 HTTPS / 源锁定** | | | | | | | x | x | x | | x | x | x | | **Lockfile 强制校验** | | | | | | | | x | | x | | | | `*` = 通过第三方 `cargo-cooldown` crate 实现 ## 快速开始 ``` # 如果你还没有安装 Ansible,请先安装 pip install ansible # Clone git clone git@github.com:echennells/supply-chain-hardening.git cd supply-chain-hardening # 针对 localhost 运行 ansible-playbook site.yml --limit localhost # 针对远程服务器运行 ansible-playbook site.yml --limit servers # 仅运行 npm + Python hardening ansible-playbook site.yml --tags npm,pip,uv ``` ## 工作原理 ### 系统级环境变量 部署到 `/etc/profile.d/supply-chain-hardening.sh` 和 `/etc/environment`。这些变量适用于所有用户、所有 shell(bash、zsh、sh),包括交互式和非交互式会话。运行 `bash -c "npm install foo"` 的 AI 代理将获得与在交互式终端中的人类相同的安全加固。 覆盖范围:npm(`NPM_CONFIG_IGNORE_SCRIPTS`、`NPM_CONFIG_AUDIT`、`NPM_CONFIG_SAVE_EXACT`、`NPM_CONFIG_MINIMUM_RELEASE_AGE`),Python(`PYTHONDONTWRITEBYTECODE`、`PIP_DISABLE_PIP_VERSION_CHECK`、`UV_LINK_MODE`),Go(`GOSUMDB`、`GOPROXY`、`GOFLAGS`、`GONOSUMCHECK`、`GONOSUMDB`、`GOTOOLCHAIN`),PHP(`COMPOSER_NO_SCRIPTS`)。 ### 无条件部署的配置文件 包管理器配置文件会在这些工具被安装之前,就被写入到它们预期的路径中。当代理在未来的任何时候安装 npm、pnpm、yarn、bun、uv、cargo、composer 或 bundler 时,加固的配置就已经准备就绪了。 部署的文件:`~/.npmrc`、`~/.config/pnpm/rc`、`~/.yarnrc.yml`、`~/.bunfig.toml`、`~/.config/uv/uv.toml`、`~/.config/pip/pip.conf`、`~/.cargo/config.toml`、`~/.config/composer/config.json`、`~/.bundle/config`。 ### pip 到 uv 重定向 位于 `/usr/local/bin/pip` 和 `/usr/local/bin/pip3`(归 root 所有)的封装脚本会将所有 pip 命令重定向到 uv。这意味着即使代理或脚本直接调用 `pip install`,uv 的加固措施(48 小时时间门控、仅限 wheels 强制执行、哈希验证)也会适用。 ### 安装前信誉检查 `/etc/profile.d/npq-aliases.sh` 中的 shell 别名会将 `npm`、`yarn` 和 `pnpm` 路由到 [npq](https://github.com/lirantal/npq),后者在每次安装前会运行 14 项检查:域名抢注检测、来源回归、休眠维护者标记、安装脚本警告等。自动继续功能已被禁用——代理必须确认警告。 ### 安装时恶意软件拦截 [Socket Firewall Free](https://github.com/SocketDev/sfw-free) 封装了 npm、pip 和 cargo,以实时拦截被 Socket 威胁情报标记的包。无需 API key。 ## 配置 所有时间门控都由 `roles/supply-chain-hardening/defaults/main.yml` 中的单一变量控制: ``` release_age_hours: 48 ``` 修改一次,所有包管理器都会更新。各项设置也可单独调整——请查看 `defaults/main.yml` 获取完整列表。 ## 清单 编辑 `inventories/hosts.yml` 以添加你的服务器: ``` all: hosts: localhost: ansible_connection: local my-server.example.com: ansible_user: ubuntu ansible_ssh_private_key_file: ~/.ssh/id_ed25519 ``` ## 标签 仅运行特定的生态系统: ``` ansible-playbook site.yml --tags npm # npm only ansible-playbook site.yml --tags pip,uv # Python only ansible-playbook site.yml --tags cargo # Rust only ansible-playbook site.yml --tags go # Go only ansible-playbook site.yml --tags java # Maven + Gradle ansible-playbook site.yml --tags github # zizmor + pinact ansible-playbook site.yml --tags shell # env vars only ``` ## 为什么会有这个项目 AI 代理安装包的行为是不可预测的。你无法控制代理会使用哪个包管理器、使用哪个 shell,或者它何时决定执行 `npm install`。此 playbook 在系统级别设置了安全的默认值,使得粗心的安装会自动触发时间门控、脚本拦截和信誉检查。 ## 局限性 - **不是沙箱。** 环境变量和配置文件可以被以同一用户身份运行的任何进程覆盖。这可以防止粗心的安装,但不能防止蓄意的绕过。 - **sudo 会清除环境。** `sudo npm install` 会绕过 `/etc/profile.d/` 的设置。但 `.npmrc` 配置文件仍然适用。 - **Docker 容器拥有自己的环境。** 加固宿主机并不会加固在其上运行的容器。请单独在容器内部应用此 role。 - **Ruby 和 Cargo 没有安装脚本拦截。** `extconf.rb` 和 `build.rs` 会无条件执行。没有任何配置可以阻止这种情况——这是生态系统层面的缺失。详情请参见 [TESTS.md](TESTS.md)。 - **Socket Firewall 需要 Node >= 20。** 在较旧的 Node 版本上,不会安装 sfw。 - **不涵盖容器镜像。** `docker pull` 会绕过这里的所有设置。容器镜像验证(cosign、sigstore)是一个独立的关注点。 ## 来源 有关研究、参考文献和致谢的完整列表,请参见 [SOURCES.md](SOURCES.md)。
标签:AI安全, Ansible Role, Bundler安全, Bun安全, Cargo安全, Chat Copilot, CISA项目, Composer安全, Cutter, Deno安全, DevSecOps, Go模块安全, Gradle安全, HTTPS强制, JSONLines, Linux运维, Maven安全, npm安全, NuGet安全, pip安全, pnpm安全, Socket Firewall, uv安全, Yarn安全, 上游代理, 包管理器, 发布年龄门槛, 后台面板检测, 安全基线, 安全防护, 安装前信誉检查, 安装脚本拦截, 完整性校验, 教学环境, 日志审计, 暗色界面, 版本锁定, 环境变量加固, 系统加固, 系统提示词, 统一API, 自动化运维, 软件硬化, 锁文件强制执行, 防火墙, 零信任