Chapter 08

RBAC 与企业安全

构建企业级 ArgoCD 安全体系:RBAC 精细权限控制、AppProject 多租户隔离、SSO 集成企业身份系统、Image Updater 自动化 CD,以及 External Secrets Operator 安全管理敏感配置。

ArgoCD RBAC 模型

ArgoCD 使用 Casbin 实现 RBAC 权限控制。权限策略存储在 argocd-rbac-cm ConfigMap 中,基于 p(policy,权限规则)g(grouping,角色分配)两种规则。

role:readonly
内置只读角色。可以查看所有 Application、集群、仓库的状态信息,但不能执行任何写操作(同步、修改、删除等)。适合监控人员或普通开发者查看部署状态。
role:admin
内置管理员角色。拥有所有资源的全部权限,包括管理集群、仓库、用户等系统级操作。生产环境应严格限制此角色的分配人数。
policy.csv
自定义权限策略文件,使用 Casbin 的 p/g 语法。p 规则格式为:p, subject, resource, action, object, allow/deny
# argocd-rbac-cm ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-rbac-cm
  namespace: argocd
data:
  policy.default: role:readonly    # 未匹配用户的默认角色
  policy.csv: |
    # 定义开发者角色(只能同步 dev 项目的应用)
    p, role:dev, applications, get,    dev/*,  allow
    p, role:dev, applications, sync,   dev/*,  allow
    p, role:dev, applications, action, dev/*,  allow

    # 定义 SRE 角色(可以管理所有应用,但不能删除)
    p, role:sre, applications, get,    */*, allow
    p, role:sre, applications, sync,   */*, allow
    p, role:sre, applications, update, */*, allow
    p, role:sre, clusters,     get,    *,   allow

    # 将 GitHub 团队映射到角色
    g, my-org:developers, role:dev
    g, my-org:sre-team,   role:sre
    g, alice@example.com, role:admin

AppProject:多租户隔离

AppProject 是 ArgoCD 的多租户机制,通过白名单限制 Application 能访问的资源范围:

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-payments
  namespace: argocd
spec:
  description: 支付团队的应用项目

  # 允许从哪些 Git 仓库拉取配置
  sourceRepos:
  - https://github.com/my-org/payments-config
  - https://charts.bitnami.com/bitnami

  # 允许部署到哪些集群和命名空间
  destinations:
  - server: https://prod-cluster.example.com:6443
    namespace: payments            # 只允许部署到 payments 命名空间
  - server: https://dev-cluster.example.com:6443
    namespace: payments-*         # 通配符匹配

  # 允许部署的 K8s 资源类型白名单
  clusterResourceWhitelist:
  - group: ''
    kind: Namespace

  namespaceResourceWhitelist:
  - group: apps
    kind: Deployment
  - group: ''
    kind: Service
  - group: ''
    kind: ConfigMap

  # 禁止 Prune(防止意外删除生产资源)
  syncWindows:                     # 同步窗口(限制同步时间)
  - kind: allow
    schedule: '10 2 * * *'         # 只允许每天凌晨 2:10 自动同步
    duration: 1h
    applications: ['*']

SSO 集成:GitHub OAuth

# argocd-cm ConfigMap 配置 Dex GitHub connector
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
  namespace: argocd
data:
  url: https://argocd.example.com
  dex.config: |
    connectors:
    - type: github
      id: github
      name: GitHub
      config:
        clientID: $dex.github.clientID       # 引用 Secret
        clientSecret: $dex.github.clientSecret
        redirectURI: https://argocd.example.com/api/dex/callback
        orgs:
        - name: my-org                      # 只允许此 GitHub 组织成员登录
          teams:
          - developers
          - sre-team

ArgoCD Image Updater

argocd-image-updater 是 ArgoCD 的子项目,它监控容器镜像仓库,当检测到符合策略的新镜像 tag 时,自动更新 Application 的镜像版本(通过修改 Git 仓库或直接更新 Application 参数)。

# Application 上添加 image-updater 注解
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  annotations:
    argocd-image-updater.argoproj.io/image-list: myapp=ghcr.io/my-org/my-app
    argocd-image-updater.argoproj.io/myapp.update-strategy: semver
    argocd-image-updater.argoproj.io/myapp.allow-tags: regexp:^v[0-9]+\.[0-9]+\.[0-9]+$
    argocd-image-updater.argoproj.io/write-back-method: git     # 写回 Git(GitOps)
    argocd-image-updater.argoproj.io/git-branch: main

External Secrets Operator(ESO)

ESO 是另一种主流的 Secrets 管理方案,将 Vault/AWS SSM/Azure KeyVault 中的密钥同步为 K8s Secret,无需修改应用代码:

# SecretStore:定义 Secret 来源(Vault)
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: vault-backend
spec:
  provider:
    vault:
      server: http://vault:8200
      path: secret
      auth:
        kubernetes:
          mountPath: kubernetes
          role: argocd-role
---
# ExternalSecret:声明要同步的 Secret
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: app-secrets
spec:
  refreshInterval: 5m              # 每 5 分钟同步一次
  secretStoreRef:
    name: vault-backend
    kind: SecretStore
  target:
    name: app-secrets               # 生成的 K8s Secret 名称
  data:
  - secretKey: database-url
    remoteRef:
      key: my-app/production
      property: database-url
本章小结

企业级 ArgoCD 安全体系需要四层防护:RBAC 精细控制操作权限、AppProject 限制部署范围和资源类型、SSO 对接企业身份系统(GitHub/LDAP)、ESO/AVP 安全管理 Secrets。Image Updater 完成自动镜像 CD 的最后一环。syncWindows 提供时间窗口控制,防止在业务高峰期意外触发部署。