Argo CD 인증/인가
인증(Authn)
ConfigMap, Secret으로 계정 관리
SSO 설정이 부담스러운 매우 소규모 팀이나 개인 프로젝트에서는 ConfigMap, Secret으로 계정을 관리할 수 있습니다.
argo-cd-values.yaml
configs:
cm:
# `argocd-cm` ConfigMap
accounts.<user>: apiKey, login
accounts.<user>.enabled: "true"
apiKey
: API 사용을 위한 토큰 생성을 허용합니다.login
: UI 로그인을 허용합니다.
argo-cd-values.yaml
configs:
secret:
# `argocd-secret` Secret
extra:
# 암호는 bcrypt, cost 10으로 해싱된 값을 설정합니다.
accounts.<user>.password: $2a$10$...
htpasswd -bnBC 10 '' '<password>' | tr -d ':\n' | sed 's/^$2y/$2a/'
정보
암호는 argocd
커맨드로 생성하여 등록할 수도 있습니다.
argocd account update-password --account <user>
OIDC
경고
argocd
명령어로 sso login을 하려면 PKCE를 사용해야 합니다. http://localhost:8085/auth/callback
리다이렉트 URL이 사용됩니다.
argo-cd-values.yaml
global:
# argo-cd의 외부 접속 주소입니다.
domain: <argoCDDomain>
configs:
cm:
oidc.config: |
name: <IDP>
issuer: <IDPURL>
clientID: <clientID>
clientSecret: $argo-cd-client-secret:oidc.<IDP>.clientSecret
# Optional
requestedScopes: ["openid", "profile", "email", "groups"]
# Optional
# https://connect2id.com/products/server/docs/guides/requesting-openid-claims#claims-parameter
requestedIDTokenClaims:
email:
essential: true
groups:
essential: true
values:
- <group>
# Optional
logoutURL: <logoutURL>?id_token_hint={{token}}&post_logout_redirect_uri={{logoutRedirectURL}}
clientSecret: <clientSecret> or $[<clientSecretName>:]<key>
- 리다이렉트 URL로
<argoCDURL>/auth/callback
를 사용합니다.
- 리다이렉트 URL로
enablePKCEAuthentication: true
- PKCE Code Challenge Method로 S256을 사용합니다.
- 리다이렉트 URL로
<argoCDURL>/pkce/verify
를 사용합니다. - PKCE를 사용하면
clientSecret
가 필요하지 않습니다.
apiVersion: v1
kind: Secret
metadata:
name: argo-cd-client-secret
namespace: argo-cd
labels:
app.kubernetes.io/part-of: argocd # 이 label이 있어야 설정이 적용됩니다.
type: Opaque
stringData:
oidc.<IDP>.clientSecret: <clientSecret>
Keycloak
- Client Authentication
- PKCE
argo-cd-values.yaml
configs:
cm:
oidc.config: |
name: keycloak
issuer: <keycloakURL>/realms/<realm>
clientID: <clientID>
clientSecret: $argo-cd-client-secret:oidc.keycloak.clientSecret
argo-cd-values.yaml
configs:
cm:
oidc.config: |
name: keycloak
issuer: <keycloakURL>/realms/<realm>
clientID: <clientID>
enablePKCEAuthentication: true
Casdoor
argo-cd-values.yaml
configs:
cm:
oidc.config: |
name: casdoor
issuer: <casdoorURL>
clientID: <clientID>
clientSecret: $argo-cd-client-secret:oidc.casdoor.clientSecret
Dex
redirectURI
은 argocd-cm
의 <.data.url>/api/dex/callback
으로 자동 설정 되기 때문에 따로 설정하지 않아도 됩니다.
argo-cd-values.yaml
global:
# argo-cd의 외부 접속 주소입니다.
domain: <argoCDDomain>
configs:
cm:
dex.config: |
connectors:
- type: <type>
id: <id>
name: <name>
config:
<key>: <value>
GitHub
- (User or Organization)Settings - Developer settings - OAuth Apps - New Oauth App
- Homepage URL:
- Authorization callback URL:
https://<host>/api/dex/callback
argo-cd-values.yaml
configs:
cm:
dex.config: |
connectors:
- type: github
id: github
name: GitHub
config:
clientID: <clientID>
clientSecret: $argo-cd-client-secret:dex.github.clientSecret
# 팀 이름은 name과 slug가 있습니다.
# name은 github에서 설정한 이름 그대로 사용하고, slug는 소문자와 `-`만으로 변환된 이름입니다.
# e.g., lol-iot:R&D -> lol-iot:r-d
teamNameField: both
orgs:
- name: <org>
# teams를 선언하지 않으면 모든 팀에 대한 접근을 허용합니다.
# teams:
# - <team>
인가(Authz)
Argo CD는 casbin RBAC를 사용하여 권한을 제어합니다.
argo-cd-values.yaml
configs:
rbac:
# https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/rbac.md
policy.csv: ""
# role:readonly, role:admin
# https://github.com/argoproj/argo-cd/blob/master/assets/builtin-policy.csv
policy.default: "role:readonly"
# "sub" 외에 추가로 인식 할 수 있는 값을 추가합니다. 기본 값은 "[groups]"입니다.
scopes: "[groups, preferred_username, email]"
# glob or regex
policy.matchMode: "glob"
user
- JWT에서
sub
의 값입니다.
- JWT에서
group
- JWT에서
configs.rbac.scopes
에 설정된 key에 매칭되는 값입니다. g, <user|group>, <role>
- JWT에서
policy
p, <role|user|group>, <resource>, <action>, <object>, <alloy|deny>
<object>
<resource>
가 applications, applicationsets, logs, exec인 경우<appProject>/<application>
을 사용합니다.- 여러 namespace를 사용하는 경우
<appProject>/<applicationNamespace>/<applicationName>
을 사용합니다.
*
,*/*
,*/default/*
등을 허용합니다.
Resource\Action | get | create | update | delete | sync | action | override | invoke |
---|---|---|---|---|---|---|---|---|
applications | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
applicationsets | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
clusters | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
projects | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
repositories | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
accounts | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
certificates | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
gpgkeys | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
logs | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
exec | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
extensions | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |