i-am-logger/nix-license
GitHub: i-am-logger/nix-license
一个 NixOS 模块,根据用户声明的用途在构建时自动检查每个软件包的许可证合规性,替代粗粒度的 allowUnfree 开关。
Stars: 1 | Forks: 0
[](https://nixos.org)
[](https://github.com/i-am-logger/nix-license/actions/workflows/ci-and-release.yml)
[](https://github.com/i-am-logger/nix-license/releases)
[](https://github.com/i-am-logger/salt)
[](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, 安全测试工具, 开源许可合规, 硬件无关, 许可证检查, 软件供应链