4. npm 与 Docker 仓库配置

本章聚焦 Nexus 作为制品仓库的核心配置场景:npm 私有仓库的托管与代理、Docker 仓库的 Bearer 认证机制,以及 Docker Proxy 缓存策略。掌握这些配置,是构建可信软件供应链的基础,也是 SBOM 证据留存的前提。

4.1 npm 私有仓库搭建

npm 私有仓库用于存储内部开发的 npm 包,避免直接暴露到公共 npm registry,同时可代理公共包以加速构建并实现版本锁定。

4.1.1 仓库类型与角色

仓库类型 用途 Blob Store 建议
npm (hosted) 存储内部发布的私有包 npm-private
npm (proxy) 代理 https://registry.npmjs.org npm-proxy
npm (group) 合并 hosted + proxy,对外提供统一地址 npm-group

4.1.2 创建步骤(Web UI)

  1. 创建 Blob Store:Administration → Blob Stores → 分别创建 npm-private、npm-proxy、npm-group。
  2. 创建 hosted 仓库:Repositories → Create repository → npm (hosted),填写 Name: npm-private,Blob Store: npm-private,Version Policy: Release。
  3. 创建 proxy 仓库:npm (proxy),Name: npm-proxy,Remote Storage: https://registry.npmjs.org,Blob Store: npm-proxy。
  4. 创建 group 仓库:npm (group),Name: npm-group,Blob Store: npm-group,在 Members 中按顺序添加 npm-private 和 npm-proxy。

4.1.3 客户端配置

在项目根目录创建 .npmrc 文件,指向 Nexus group 仓库:

registry=http://your-nexus:8081/repository/npm-group/
always-auth=true
//your-nexus:8081/repository/npm-group/:_authToken=Nexus生成的用户
最佳实践: 使用 npm login --registry=http://your-nexus:8081/repository/npm-group/ 自动生成 authToken,避免明文密码。

4.1.4 发布私有包

npm publish --registry=http://your-nexus:8081/repository/npm-private/

发布后,可在 Nexus UI 的 npm-private 仓库中查看已发布的包及其版本。每次发布都会生成对应的 npm package-lock.json 快照,可作为 SBOM 的原始证据。

4.2 Docker Bearer 认证

Nexus 作为 Docker 仓库时,支持 Bearer 认证(基于 OAuth2 的 交换机制),这是生产环境推荐的安全认证方式。

4.2.1 认证流程

Docker Bearer 认证流程 Docker Client Nexus Docker 服务 ① docker login ② 验证凭证 ③ 返回 ④ 下发 Bearer ⑤ 返回 给 Client Docker Client Nexus Docker ⑥ docker pull/push + 默认有效期 1 小时,过期后 Client 自动使用 refresh_ 重新获取。 Nexus 支持 JWT 格式的 Bearer ,可携带用户角色和仓库权限。

4.2.2 配置 Docker Bearer Realm

在 Nexus 中启用 Docker Bearer 认证:

  1. 进入 Administration → Security → Realms。
  2. 将 Docker Bearer Realm 从 Available 移到 Active。
  3. 保存后,Nexus 会在 Docker 仓库的 /v2/ API 中自动启用 认证。

4.2.3 客户端登录示例

# 登录 Nexus Docker 仓库(使用 HTTPS)
docker login your-nexus:8082 -u admin -p your-password

# 登录成功后,~/.docker/config.json 会保存 Bearer 
# 格式如下:
{
  "auths": {
    "your-nexus:8082": {
      "auth": "base64-encoded-credentials",
      "identitytoken": "jwt-bearer-"
    }
  }
}
安全注意: 生产环境务必使用 HTTPS 并配置有效证书。Bearer 包含用户权限信息,不得在日志或版本控制中明文暴露。

4.3 Docker Proxy 缓存

Docker Proxy 仓库用于缓存来自 Docker Hub 或其他远程仓库的镜像,减少重复拉取、加速构建、降低对外部网络的依赖。

4.3.1 创建 Docker Proxy 仓库

配置项 推荐值 说明
Name docker-proxy 仓库名称
Remote Storage https://registry-1.docker.io Docker Hub 官方地址
Docker Index Use Docker Hub 自动处理 index.docker.io 解析
Blob Store docker-proxy-blob 独立 Blob Store 便于管理
Maximum Component Age 1440 分钟 缓存元数据有效期
Maximum Metadata Age 1440 分钟 缓存元数据有效期

4.3.2 缓存策略与清理

  • 按需缓存:镜像层(layer)在第一次拉取时缓存到本地 Blob Store,后续拉取直接命中。
  • TTL 控制:通过 Maximum Component Age 控制元数据缓存时间,过期后重新从远程拉取最新版本。
  • 手动清理:Administration → Cleanup Policies → 创建策略(如保留最近 30 天未使用的层)→ 关联到 docker-proxy 仓库。

4.3.3 客户端使用 Proxy 仓库

# 拉取镜像时指定 Nexus Proxy 地址
docker pull your-nexus:8082/library/nginx:latest

# 或在 Docker Daemon 配置中设置 mirror(/etc/docker/daemon.json)
{
  "registry-mirrors": ["https://your-nexus:8082"]
}
效果验证: 首次拉取后,在 Nexus UI 的 docker-proxy 仓库中可看到缓存的镜像标签和层列表。再次拉取时,网络流量为零(完全从本地缓存读取)。

4.4 仓库配置与 SBOM 证据留存

npm 和 Docker 仓库的每一次包发布、镜像推送、代理缓存,都会在 Nexus 中留下审计记录和制品快照。这些记录是 SBOM 证据链的重要组成部分:

  • npm 包:每次 npm publish 生成版本快照,包含 package.json 和依赖树。
  • Docker 镜像:每次 docker push 生成镜像清单(manifest)和层摘要(digest)。
  • 审计日志:Administration → Support → Audit 可导出所有仓库操作日志,用于追溯。
留存建议: 将 Nexus 的 Blob Store 目录(默认 ./sonatype-work/nexus3/blobs)纳入定期备份策略,并配合 SBOM 生成工具(如 Syft、Trivy)从仓库中提取制品清单,形成可验证的供应链证据。