仓库认证与权限管理

仓库认证与权限管理

为什么需要认证和权限

私有镜像仓库中的镜像是企业的重要资产。认证和权限管理确保只有授权用户才能访问特定镜像,防止数据泄露和未经授权的修改。

认证方式

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
# 记录所有操作:拉取、推送、删除、用户管理

权限管理最佳实践

  1. 最小权限原则:只给用户需要的权限
  2. 使用机器人账户:CI/CD 使用专用 token
  3. 定期审查权限:清理不活跃用户
  4. 启用审计日志:记录所有访问
  5. TLS 双向认证:增加安全层
  6. 集成统一认证:使用 LDAP/OIDC
  7. 项目级隔离:不同团队不同项目
  8. 自动清理旧镜像:通过 retention policy
# 权限配置检查清单
# ✅ 为每个用户/服务分配最小权限
# ✅ 公开项目只公开必要的镜像
# ✅ CI/CD 使用短期 token
# ✅ 开启访问审计
# ✅ 配置 TLS 加密传输

完善的认证和权限管理是生产环境镜像仓库的基础保障。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容