i-am-logger/nix-license

GitHub: i-am-logger/nix-license

一个 NixOS 模块,根据用户声明的用途在构建时自动检查每个软件包的许可证合规性,替代粗粒度的 allowUnfree 开关。

Stars: 1 | Forks: 0

[![NixOS](https://img.shields.io/badge/NixOS-5277C3?logo=nixos&logoColor=white)](https://nixos.org) [![CI 和 Release](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/7391d4bb77112231.svg)](https://github.com/i-am-logger/nix-license/actions/workflows/ci-and-release.yml) [![Release](https://img.shields.io/github/v/release/i-am-logger/nix-license)](https://github.com/i-am-logger/nix-license/releases) [![SALT](https://img.shields.io/badge/SALT-2649%20licenses-blue)](https://github.com/i-am-logger/salt) [![许可证: CC BY-NC-SA 4.0](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/) # nix-license 一个 NixOS 模块,用于在构建时根据您声明的用途检查每个软件包的许可证。替代 `allowUnfree`。 ## 功能 | 功能 | 免费版 | 商业版 | |---------|:----:|:----------:| | 许可证强制执行(限制、允许用途、义务) | ✔ | ✔ | | 2649 个已分类许可证([SALT](https://github.com/i-am-logger/salt)) | ✔ | ✔ | | 完整的 nixpkgs 覆盖(映射 289 个许可证) | ✔ | ✔ | | 承诺(声明您可以履行哪些义务) | ✔ | ✔ | | 保证(要求专利授权、源代码可用性、担保) | ✔ | ✔ | | 内容策略(基于 [OARS 1.1](https://github.com/hughsie/oars) 的每用户授权) | ✔ | ✔ | | 200,000+ 项检查(每个许可证、每种上下文、每种组合) | ✔ | ✔ | | 加密许可证验证(GPG/YubiKey + openssl) | | ✔ | | 合规报告(JSON + HTML — [示例](https://i-am-logger.github.io/nix-license/)) | | ✔ | | GitHub Action(在 Step Summary 中生成完整报告的 CI/CD) | | ✔ | | [SBOM 生成](https://github.com/i-am-logger/nix-license/issues/7) | | 计划中 | | [OpenChain ISO/IEC 5230](https://github.com/i-am-logger/nix-license/issues/6) | | 计划中 | | [审计追踪](https://github.com/i-am-logger/nix-license/issues/36) | | 计划中 | | [许可证变更检测](https://github.com/i-am-logger/nix-license/issues/37) | | 计划中 | | [Token 过期警报](https://github.com/i-am-logger/nix-license/issues/39) | | 计划中 | ### 个人用户 — 仅限 FOSS 且包含 NVIDIA 例外 ``` nix-license = { enable = true; usage = { type = "personal"; commercial-use = false; distribution = false; modifications = true; saas = false; }; # FOSS only — block closed-source packages assurances.source-available = { required = true; exceptions = [ "nvidia-x11" ]; # accept NVIDIA's proprietary driver }; }; ``` 不再需要 `allowUnfree = true`。闭源软件包会被阻止。NVIDIA 被明确列入白名单。CC-BY-NC、Elastic、SSPL — 因为它们有源代码所以被允许。 ### 开源开发者 ``` nix-license = { enable = true; usage = { type = "personal"; commercial-use = false; distribution = true; # publishes packages, releases, ISOs modifications = true; saas = false; }; # FOSS only — with firmware exceptions assurances.source-available = { required = true; exceptions = [ "linux-firmware" "nvidia-x11" ]; }; }; ``` Copyleft 义务(GPL、AGPL)在分发时触发 — 但所有承诺默认为 `fulfilled = true`,因此它们会被放行。开发者可以履行源代码披露、相同许可证和署名要求。 ### SaaS 公司 — Docker 容器 ``` nix-license = { enable = true; enforcement = "enforce"; usage = { type = "commercial"; commercial-use = true; distribution = true; # shipping containers to customers modifications = true; saas = true; # hosting services }; # Can't open-source our stack commitments.same-license.fulfilled = false; commitments.disclose-source.fulfilled = false; commitments.network-use-disclose.fulfilled = false; # blocks AGPL # Commercial licenses licenses."nix-license" = { licenseFile = sops.secrets.nix-license.path; }; licenses."datadog" = { licenseFile = sops.secrets.datadog-license.path; }; }; ``` AGPL、SSPL、Elastic 和 GPL 都会被阻止 — 因为公司无法披露源代码或使用相同的许可证。MongoDB (SSPL) 和 Elasticsearch (Elastic) 由于 SaaS 限制而失败。Datadog 通过其商业许可证被允许。宽松许可证可以放行。 更多示例请见 [examples/](examples/) — [商业专有公司](examples/proprietary.nix)、[教育机构](examples/educational.nix)、[非营利组织](examples/nonprofit.nix)。 **告别 `allowUnfree`。** nixpkgs 在一个布尔值中将“闭源”与“有限制”混为一谈。nix-license 用实际的问题取代了它:您的用途是什么,您能承诺什么,您需要哪些保证。 ## 工作原理 每个 nixpkgs 许可证都映射到 [SALT](https://github.com/i-am-logger/salt)(2649 个已分类许可证)。当 nixpkgs 评估一个软件包时,`allowUnfreePredicate` 会运行四项检查: | 许可证包含 | 用户声明 | 何时阻止 | |-------------|---------------|-------------| | 限制 | 用途(活动) | 活动受限 | | 允许用途 | 用途(类型) | 类型不在允许列表中 | | 义务 | 承诺 | 义务触发且用户无法履行 | | 免责声明 | 保证 | 许可证免除了用户要求的保证 | `enforcement = "warn"` 会通过 `builtins.trace` 记录冲突并允许该软件包。`enforcement = "enforce"` 会阻止构建。 ## 用法 **您的身份**(`usage.type`):`personal`、`commercial`、`educational`、`research`、`government`、`nonprofit` **您的行为**(根据许可证限制进行检查): | 标志 | 何时设置为 true | |------|-----------------| | `commercial-use` | 任何营利性活动 | | `distribution` | 向他人分发二进制文件、容器、ISO | | `modifications` | 打补丁、分支、应用 overlays | | `saas` | 将软件作为托管服务运行 | **承诺** — 您可以履行哪些义务(默认:全部 `fulfilled = true`): | 键 | 含义 | 设置 `fulfilled = false` 以阻止 | |-----|--------------|--------------------------------| | `same-license` | 在相同许可证下分发 | GPL、AGPL、copyleft | | `disclose-source` | 提供源代码 | 分发时的 GPL | | `network-use-disclose` | 共享网络使用时的源代码 | SaaS 时的 AGPL | | `include-copyright` | 包含版权声明 | 分发时的大多数许可证 | | `document-changes` | 记录修改 | 分发时的 GPL、Apache | 每个承诺都支持 `exceptions` — 豁免该承诺的软件包名称。 **保证** — 要求许可证提供的保证(默认:全部 `required = false`): | 键 | 设置 `required = true` 以阻止包含以下免责声明的许可证 | |-----|------------------------------------------------------| | `source-available` | 源代码(阻止闭源二进制文件) | | `patent-grant` | 专利权 | | `liability-coverage` | 责任 | | `warranty` | 担保 | 每个保证都支持 `exceptions` — 豁免该要求的软件包名称列表。 所有用途字段均为必填。没有默认值 — 您必须显式声明您的上下文。 ## 内容策略 基于 [OARS 1.1](https://github.com/hughsie/oars) 的每用户内容授权。解析后的策略将写入 `/etc/nix-license/content-policy/` 作为不可变的 Nix store 符号链接,供应用程序在 runtime 查询。参见 [USAGE.md](docs/USAGE.md)。 ## 商业许可 在 enforce 模式下进行商业使用需要 `licenses."nix-license".licenseFile`。供应商软件包使用相同的模式 — `licenses."package-name".licenseFile` 会覆盖许可证冲突。供应商公钥嵌入在 `keys/vendors/` 中(GPG 或 PEM)。在 enforce 模式下,每个许可证都会经过加密验证 — 没有供应商密钥 = 被阻止。参见 [USAGE.md](docs/USAGE.md#per-package-vendor-licenses)。 ## 文档 - [USAGE.md](docs/USAGE.md) — 安装、配置、示例 - [ARCHITECTURE.md](docs/ARCHITECTURE.md) — 领域模型、库 API、模块结构 - [COMPLIANCE.md](docs/COMPLIANCE.md) — 标准(SALT、OARS) - [CONTENT-POLICY.md](docs/CONTENT-POLICY.md) — 内容策略(OARS 1.1,年龄验证替代方案) - [OPENCHAIN.md](docs/OPENCHAIN.md) — OpenChain ISO/IEC 5230 规范映射 - [DEVELOPMENT.md](docs/DEVELOPMENT.md) — 测试、领域不变量、pre-commit hooks ## CI/CD 在您的 GitHub Actions 工作流中生成许可证合规报告: ``` - uses: i-am-logger/nix-license/action@master with: system: myhost ``` 生成 JSON + HTML 报告,在 Step Summary 中打印完整详情,作为 artifact 上传,并在任何软件包被阻止时使构建失败。 **演示报告:** [个人版](https://i-am-logger.github.io/nix-license/personal/) · [SaaS](https://i-am-logger.github.io/nix-license/saas/) · [商业专有版](https://i-am-logger.github.io/nix-license/proprietary/) 本地构建: ``` nix build .#nixosConfigurations.myhost.config.nix-license.report xdg-open result/index.html # HTML dashboard cat result/report.json # JSON ``` ## 测试 每次 `nix flake check` 包含超过 200,000 项检查 — 每个许可证 (2649)、每种用途上下文、每种组合。有关领域不变量和完整测试套件,请参见 [DEVELOPMENT.md](docs/DEVELOPMENT.md)。 ``` nix flake check # Run all checks nix develop # Dev shell nix fmt # Format ```
标签:LNA, NixOS, SBOM, 安全测试工具, 开源许可合规, 硬件无关, 许可证检查, 软件供应链