仓库认证与权限管理
为什么需要认证和权限
私有镜像仓库中的镜像是企业的重要资产。认证和权限管理确保只有授权用户才能访问特定镜像,防止数据泄露和未经授权的修改。
认证方式
1. 基本认证(htpasswd)
Docker Registry 内置支持 htpasswd 基本认证:
# 创建用户
docker run --rm httpd:alpine htpasswd -bBn admin mypassword > auth/htpasswd
docker run --rm httpd:alpine htpasswd -bBn developer devpass >> auth/htpasswd
# 启动带认证的 Registry
docker run -d -p 5000:5000 \
-v $(pwd)/auth:/auth \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
registry:2
2. Token 认证
# Registry 配置 Token 认证
REGISTRY_AUTH=token
REGISTRY_AUTH_TOKEN_REALM=https://auth.example.com/token
REGISTRY_AUTH_TOKEN_SERVICE=Docker Registry
REGISTRY_AUTH_TOKEN_ISSUER=Acme Auth Service
REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE=/certs/auth.crt
3. OAuth2 / OIDC
# Harbor 支持 OAuth2
# 配置 Harbor 使用 LDAP/OIDC
# /etc/harbor/harbor.yml
auth_mode: oidc_auth
oidc:
name: Keycloak
endpoint: https://keycloak.example.com/auth/realms/master
client_id: harbor
client_secret: abc123
scope: openid,email,profile
权限模型
Docker Registry 内置权限
Registry 内置权限只有粗粒度控制:
# htpasswd 用户的权限:
# - 所有用户都可以拉取公开仓库
# - 认证用户才可以推送
# 没有更细粒度的权限控制
Harbor 的权限模型
Harbor 提供了完整 RBAC(基于角色的访问控制):
角色等级
| 角色 | 权限 |
|---|---|
| 访客 (Guest) | 拉取公开项目镜像 |
| 开发者 (Developer) | 拉取 + 推送 |
| 维护者 (Maintainer) | 拉取 + 推送 + 扫描 + 标签管理 |
| 项目管理员 (Project Admin) | 全部权限 |
按项目隔离
# Harbor 项目结构
harbor.example.com/
├── project-a/ # 项目 A
│ ├── service-1:1.0
│ └── service-2:1.0
└── project-b/ # 项目 B(developer 看不到)
└── service-3:1.0
# 用户 user_a 是 project-a 的 developer
# 可以推送/拉取 project-a 的镜像
# 不能访问 project-b
Docker 客户端认证管理
多仓库认证配置
// ~/.docker/config.json
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "base64_credentials"
},
"myregistry.example.com:5000": {
"auth": "base64_credentials"
},
"harbor.example.com": {
"auth": "base64_credentials"
}
}
}
使用 Credential Helpers
# 安装 docker-credential-pass
sudo apt install pass docker-credential-pass
# 配置
echo '{"credsStore": "pass"}' > ~/.docker/config.json
# 登录后凭据保存在 pass 中
docker login
# 不显示密码明文
cat ~/.docker/config.json
# {"credsStore":"pass"}
仓库级访问控制
Docker Hub
# 仓库设置为私有
docker push myusername/private-app:latest
# 团队成员访问
# Docker Hub → 仓库 Settings → Collaborators
# 或创建组织,在组织下管理团队
Harbor
# 命令行管理用户
# 通过 Harbor API 或 Web UI
# 创建项目
curl -u admin:admin123 -X POST \
-H "Content-Type: application/json" \
-d '{"project_name": "myapp", "public": false}' \
https://harbor.example.com/api/v2.0/projects
# 添加成员
curl -u admin:admin123 -X POST \
-H "Content-Type: application/json" \
-d '{"role_id": 2, "member_user": {"username": "developer1"}}' \
https://harbor.example.com/api/v2.0/projects/myapp/members
CI/CD 中的认证
使用机器人账户
# Harbor 机器人账户
# 创建只读机器人账户用于拉取
services:
app:
image: harbor.example.com/myapp/service:latest
# 通过 K8s Secret 或 docker login 认证
CI 变量管理
# GitHub Actions
- name: Login to Private Registry
uses: docker/login-action@v2
with:
registry: harbor.example.com
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
TLS 证书认证
客户端证书认证
# Registry 配置
REGISTRY_HTTP_TLS_CLIENTCA_CERTS: /certs/ca.crt
# Docker 客户端配置证书
mkdir -p ~/.docker/tls/myregistry.example.com:443/
cp client-cert.pem ~/.docker/tls/myregistry.example.com:443/client-cert.pem
cp client-key.pem ~/.docker/tls/myregistry.example.com:443/client-key.pem
审计日志
# Registry 日志
docker logs registry | grep -E "push|pull|delete"
# 查看谁拉取了什么镜像
# Harbor 审计日志
# UI → Administration → Logs
# 记录所有操作:拉取、推送、删除、用户管理
权限管理最佳实践
- 最小权限原则:只给用户需要的权限
- 使用机器人账户:CI/CD 使用专用 token
- 定期审查权限:清理不活跃用户
- 启用审计日志:记录所有访问
- TLS 双向认证:增加安全层
- 集成统一认证:使用 LDAP/OIDC
- 项目级隔离:不同团队不同项目
- 自动清理旧镜像:通过 retention policy
# 权限配置检查清单
# ✅ 为每个用户/服务分配最小权限
# ✅ 公开项目只公开必要的镜像
# ✅ CI/CD 使用短期 token
# ✅ 开启访问审计
# ✅ 配置 TLS 加密传输
完善的认证和权限管理是生产环境镜像仓库的基础保障。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容