- Authors

- Name
- Youngju Kim
- @fjvbn20031
- 1. ArgoCDセキュリティアーキテクチャ概要
- 2. 認証(Authentication)
- 3. 認可(Authorization)- RBAC
- 4. リポジトリ資格情報管理
- 5. クラスタ資格情報管理
- 6. シークレット管理統合
- 7. ネットワークセキュリティ
- 8. 監査ログ
- 9. セキュリティベストプラクティス
- 10. まとめ
1. ArgoCDセキュリティアーキテクチャ概要
ArgoCDはKubernetes環境でGitOpsを実現するツールであり、クラスタとGitリポジトリへの広範なアクセス権限を保持します。したがってセキュリティはArgoCD運用の核心です。
セキュリティレイヤー
Layer 1: 認証 (Authentication)
- 誰がアクセスしているか?
- Local Users、SSO(OIDC/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
| 機能 | 説明 |
|---|---|
| login | Web UIおよびCLIログイン可能 |
| apiKey | APIトークン生成可能(自動化用) |
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]'
リソースとアクション
| リソース | アクション | 説明 |
|---|---|---|
| applications | get, create, update, delete, sync, override, action/* | Application管理 |
| clusters | get, create, update, delete | クラスタ管理 |
| repositories | get, create, update, delete | リポジトリ管理 |
| projects | get, create, update, delete | プロジェクト管理 |
| logs | get | Podログ閲覧 |
| exec | create | Pod 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セキュリティモデルの核心要素:
- 認証:SSO(OIDC/SAML/LDAP via Dex) + ローカルユーザー
- 認可:Casbin RBAC + AppProjectスコーピング
- リポジトリ資格情報:HTTPS/SSH Secretで安全に管理
- クラスタ資格情報:ServiceAccount + 最小権限原則
- シークレット管理:Sealed Secrets / ESO / AVP / SOPS
- ネットワークセキュリティ:TLS + Network Policy
- 監査:API Serverログ + Prometheusメトリクス
これらのセキュリティレイヤーを適切に構成することで、安全なGitOps運用環境を構築できます。