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)
- 创建 Blob Store:Administration → Blob Stores → 分别创建
npm-private、npm-proxy、npm-group。 - 创建 hosted 仓库:Repositories → Create repository → npm (hosted),填写 Name:
npm-private,Blob Store:npm-private,Version Policy:Release。 - 创建 proxy 仓库:npm (proxy),Name:
npm-proxy,Remote Storage:https://registry.npmjs.org,Blob Store:npm-proxy。 - 创建 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 认证流程
4.2.2 配置 Docker Bearer Realm
在 Nexus 中启用 Docker Bearer 认证:
- 进入 Administration → Security → Realms。
- 将 Docker Bearer Realm 从 Available 移到 Active。
- 保存后,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)从仓库中提取制品清单,形成可验证的供应链证据。