Skip to content
Published on

[ArgoCD] セキュリティモデル:認証、認可、シークレット管理

Authors

1. ArgoCDセキュリティアーキテクチャ概要

ArgoCDはKubernetes環境でGitOpsを実現するツールであり、クラスタとGitリポジトリへの広範なアクセス権限を保持します。したがってセキュリティはArgoCD運用の核心です。

セキュリティレイヤー

Layer 1: 認証 (Authentication)
  - 誰がアクセスしているか?
  - Local Users、SSOOIDC/SAML/LDAP via Dex)

Layer 2: 認可 (Authorization)
  - 何ができるか?
  - RBACポリシー、AppProjectスコーピング

Layer 3: 資格情報管理 (Credential Management)
  - Gitリポジトリ、クラスタアクセスの資格情報
  - Kubernetes Secretsで安全に保存

Layer 4: シークレット管理 (Secret Management)
  - アプリケーションシークレットの安全な処理
  - Sealed Secrets、External Secrets、Vault

Layer 5: ネットワークセキュリティ (Network Security)
  - TLS、Network Policy、アクセス制限

2. 認証(Authentication)

ローカルユーザー

ArgoCDは内蔵ユーザーアカウントを提供します:

# argocd-cm ConfigMap
data:
  accounts.alice: apiKey, login
  accounts.bob: login
  accounts.ci-bot: apiKey
機能説明
loginWeb UIおよびCLIログイン可能
apiKeyAPIトークン生成可能(自動化用)

SSO via Dex

DexはArgoCDに内蔵されたOIDC Identity Providerです:

data:
  url: https://argocd.example.com
  dex.config: |
    connectors:
      - type: github
        id: github
        name: GitHub
        config:
          clientID: YOUR_CLIENT_ID
          clientSecret: $dex.github.clientSecret
          orgs:
            - name: my-org
              teams:
                - platform-team
                - dev-team

OIDC直接連携(Dexなし)

Okta、Auth0、Keycloakなどと直接OIDC連携も可能です:

data:
  oidc.config: |
    name: Okta
    issuer: https://my-org.okta.com/oauth2/default
    clientID: YOUR_CLIENT_ID
    clientSecret: $oidc.okta.clientSecret
    requestedScopes:
      - openid
      - profile
      - email
      - groups

LDAP連携

data:
  dex.config: |
    connectors:
      - type: ldap
        id: ldap
        name: LDAP
        config:
          host: ldap.example.com:636
          insecureNoSSL: false
          bindDN: cn=admin,dc=example,dc=com
          bindPW: $dex.ldap.bindPW
          userSearch:
            baseDN: ou=users,dc=example,dc=com
            filter: "(objectClass=person)"
            username: uid
            idAttr: uid
            emailAttr: mail
            nameAttr: cn
          groupSearch:
            baseDN: ou=groups,dc=example,dc=com
            filter: "(objectClass=groupOfNames)"
            userMatchers:
              - userAttr: DN
                groupAttr: member
            nameAttr: cn

認証フロー

SSOログイン:
  1. ユーザーがArgoCD UIにアクセス
  2. 「Log in via SSO」をクリック
  3. API Server -> Dex authorization endpointにリダイレクト
  4. Dex -> 外部IdP(GitHub/Okta/LDAP)にリダイレクト
  5. ユーザーが外部IdPで認証
  6. IdP -> Dex callback URLにリダイレクト(認証コード)
  7. Dexが認証コードでトークン交換
  8. DexがID Tokenを生成(ユーザー情報 + グループ)
  9. API ServerがID Tokenを検証
  10. ArgoCD JWTを発行(グループ情報を含む)
  11. JWTをブラウザCookieに保存

3. 認可(Authorization)- RBAC

RBACポリシー構造

ArgoCDはCasbinライブラリベースのRBACを使用します:

# argocd-rbac-cm ConfigMap
data:
  policy.default: role:readonly
  policy.csv: |
    # 管理者役割
    p, role:admin, applications, *, */*, allow
    p, role:admin, clusters, *, *, allow
    p, role:admin, repositories, *, *, allow
    p, role:admin, projects, *, *, allow

    # 開発チーム役割
    p, role:developer, applications, get, */*, allow
    p, role:developer, applications, sync, */*, allow
    p, role:developer, applications, action/*, */*, allow
    p, role:developer, logs, get, */*, allow

    # 読み取り専用役割
    p, role:readonly, applications, get, */*, allow
    p, role:readonly, projects, get, *, allow

    # CI/CDボット役割
    p, role:ci-bot, applications, sync, ci-project/*, allow
    p, role:ci-bot, applications, get, ci-project/*, allow

    # グループマッピング(SSOグループ -> ArgoCD役割)
    g, platform-team, role:admin
    g, dev-team, role:developer
    g, viewers, role:readonly
    g, ci-bot, role:ci-bot

  scopes: '[groups, email]'

リソースとアクション

リソースアクション説明
applicationsget, create, update, delete, sync, override, action/*Application管理
clustersget, create, update, deleteクラスタ管理
repositoriesget, create, update, deleteリポジトリ管理
projectsget, create, update, deleteプロジェクト管理
logsgetPodログ閲覧
execcreatePod exec実行

AppProject RBAC

AppProject内でより細かいRBACを適用できます:

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-alpha
spec:
  roles:
    - name: deployer
      description: 'デプロイ権限'
      policies:
        - p, proj:team-alpha:deployer, applications, sync, team-alpha/*, allow
        - p, proj:team-alpha:deployer, applications, get, team-alpha/*, allow
      groups:
        - team-alpha-deployers
    - name: viewer
      description: '閲覧権限'
      policies:
        - p, proj:team-alpha:viewer, applications, get, team-alpha/*, allow
      groups:
        - team-alpha-viewers

4. リポジトリ資格情報管理

HTTPS資格情報

apiVersion: v1
kind: Secret
metadata:
  name: repo-creds
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
type: Opaque
stringData:
  type: git
  url: https://github.com/my-org/my-repo.git
  username: git
  password: ghp_XXXXXXXXXXXX

SSH資格情報

apiVersion: v1
kind: Secret
metadata:
  name: repo-creds-ssh
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repository
type: Opaque
stringData:
  type: git
  url: git@github.com:my-org/my-repo.git
  sshPrivateKey: |
    -----BEGIN OPENSSH PRIVATE KEY-----
    ...
    -----END OPENSSH PRIVATE KEY-----

資格情報テンプレート

同じパターンの複数リポジトリに共通資格情報を適用:

apiVersion: v1
kind: Secret
metadata:
  name: repo-creds-template
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: repo-creds
type: Opaque
stringData:
  type: git
  url: https://github.com/my-org
  username: git
  password: ghp_XXXXXXXXXXXX

5. クラスタ資格情報管理

最小権限原則の適用

本番環境ではcluster-adminの代わりに最小権限を適用します:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: argocd-manager-minimal
rules:
  - apiGroups: ['*']
    resources: ['*']
    verbs: ['get', 'list', 'watch']
  - apiGroups: ['apps']
    resources: ['deployments', 'statefulsets', 'daemonsets', 'replicasets']
    verbs: ['get', 'list', 'watch', 'create', 'update', 'patch', 'delete']
  - apiGroups: ['']
    resources: ['services', 'configmaps', 'secrets', 'serviceaccounts', 'namespaces', 'pods']
    verbs: ['get', 'list', 'watch', 'create', 'update', 'patch', 'delete']
  - apiGroups: ['networking.k8s.io']
    resources: ['ingresses', 'networkpolicies']
    verbs: ['get', 'list', 'watch', 'create', 'update', 'patch', 'delete']

6. シークレット管理統合

Sealed Secrets

暗号化されたシークレットをGitに安全に保存:

apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  name: my-secret
  namespace: default
spec:
  encryptedData:
    password: AgBy3i4OJSWK+...
  template:
    metadata:
      name: my-secret
      namespace: default

External Secrets Operator(ESO)

外部シークレット管理システムとの連携:

apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: vault-backend
spec:
  provider:
    vault:
      server: 'https://vault.example.com'
      path: 'secret'
      auth:
        kubernetes:
          mountPath: 'kubernetes'
          role: 'argocd'
---
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: my-app-secrets
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: vault-backend
    kind: SecretStore
  target:
    name: my-app-secrets
    creationPolicy: Owner
  data:
    - secretKey: database-password
      remoteRef:
        key: my-app/database
        property: password

7. ネットワークセキュリティ

TLS設定

data:
  server.insecure: 'false'
  reposerver.tls.minversion: '1.2'

Network Policy

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: argocd-server-policy
  namespace: argocd
spec:
  podSelector:
    matchLabels:
      app.kubernetes.io/name: argocd-server
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              name: ingress-nginx
      ports:
        - port: 8080
          protocol: TCP
  egress:
    - to: []

8. 監査ログ

ArgoCD API Serverはすべてのユーザー操作をログに記録します。Prometheusメトリクスも公開されます:

argocd_app_sync_total: 総同期回数
argocd_app_info: アプリケーション状態情報
argocd_cluster_api_server_requests_total: クラスタAPIリクエスト数

9. セキュリティベストプラクティス

認証

  • 本番環境ではSSOを必須に
  • ローカルadminアカウントの無効化またはパスワード定期変更
  • APIトークンに有効期限を設定
  • MFA(多要素認証)を有効化

認可

  • デフォルトポリシーをrole:readonlyに設定
  • 最小権限原則の適用
  • AppProjectでチーム別分離
  • 本番ネームスペースのsync権限を制限

資格情報

  • HTTPSトークンよりSSHキーを推奨
  • トークンに最小スコープを適用
  • 定期的な資格情報のローテーション
  • クラスタアクセスに最小権限RBACを適用

シークレット

  • 平文シークレットをGitに絶対に保存しない
  • Sealed SecretsまたはExternal Secrets Operatorを使用
  • シークレット変更時の自動ローテーションメカニズムを実装

ネットワーク

  • すべての通信にTLSを適用
  • Network PolicyでArgoCDコンポーネントへのアクセスを制限
  • ArgoCD UIへのアクセスをVPNまたはIPホワイトリストで制限

10. まとめ

ArgoCDセキュリティモデルの核心要素:

  1. 認証:SSO(OIDC/SAML/LDAP via Dex) + ローカルユーザー
  2. 認可:Casbin RBAC + AppProjectスコーピング
  3. リポジトリ資格情報:HTTPS/SSH Secretで安全に管理
  4. クラスタ資格情報:ServiceAccount + 最小権限原則
  5. シークレット管理:Sealed Secrets / ESO / AVP / SOPS
  6. ネットワークセキュリティ:TLS + Network Policy
  7. 監査:API Serverログ + Prometheusメトリクス

これらのセキュリティレイヤーを適切に構成することで、安全なGitOps運用環境を構築できます。