본문으로 건너뛰기

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를 사용합니다.
  • 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

argo-cd-values.yaml
configs:
cm:
oidc.config: |
name: keycloak
issuer: <keycloakURL>/realms/<realm>
clientID: <clientID>
clientSecret: $argo-cd-client-secret:oidc.keycloak.clientSecret

Casdoor

argo-cd-values.yaml
configs:
cm:
oidc.config: |
name: casdoor
issuer: <casdoorURL>
clientID: <clientID>
clientSecret: $argo-cd-client-secret:oidc.casdoor.clientSecret

Dex

Example connectors

redirectURIargocd-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의 값입니다.
  • group
    • JWT에서 configs.rbac.scopes에 설정된 key에 매칭되는 값입니다.
    • g, <user|group>, <role>
  • policy
    • p, <role|user|group>, <resource>, <action>, <object>, <alloy|deny>
    • <object>
      • <resource>가 applications, applicationsets, logs, exec인 경우
        • <appProject>/<application>을 사용합니다.
        • 여러 namespace를 사용하는 경우 <appProject>/<applicationNamespace>/<applicationName>을 사용합니다.
      • *, */*, */default/* 등을 허용합니다.
Resource\Actiongetcreateupdatedeletesyncactionoverrideinvoke
applications
applicationsets
clusters
projects
repositories
accounts
certificates
gpgkeys
logs
exec
extensions