Ssoon

Argo CD in Practice – 4) 접근 제어 : 단일 로그인 본문

CICD Study [1기]

Argo CD in Practice – 4) 접근 제어 : 단일 로그인

구구달스 2025. 10. 19. 19:18

🔐 Single Sign-On(SSO)과 Argo CD 연동


🧩 Single Sign-On(SSO) 이란?

  •  Single Sign-On(SSO) 는 하나의 계정으로 여러 독립적인 애플리케이션에 로그인할 수 있게 해주는 인증 방식입니다.
    즉, 한 번 로그인하면 다양한 시스템에 다시 로그인할 필요 없이 접근할 수 있습니다.
  • 예를 들어 argocd.mycompany.com에 접근할 때,이 시스템은 직접 사용자 인증을 수행하지 않고 외부 인증 제공자(OIDC Provider) 를 신뢰하여 사용자의 신원을 확인합니다.이때 사용자가 속한 그룹이나 계정에 설정된 속성(Attribute)에 따라 접근 권한이 결정됩니다.

“SSO는 하나의 인증 체계로 여러 시스템에 접근할 수 있게 하여 보안성과 관리 효율성을 모두 향상시킨다.”


🛡️ SSO의 필요성과 장점

  • 많은 기업들은 보안상의 이유로 SSO 지원을 필수 조건으로 요구합니다. SSO를 통해 얻을 수 있는 주요 이점은 다음과 같습니다:
    • 각 애플리케이션마다 비밀번호를 따로 관리할 필요가 없음
    • 계정의 온보딩(Onboarding)/오프보딩(Offboarding) 이 중앙에서 통제 가능
    • 전체 보안 정책을 일원화하여 관리

“SSO는 보안성과 관리 효율성을 모두 만족시키는 필수 기능이다.”


⚙️ Argo CD에서의 SSO 구성 방식

  • Argo CD는 SSO 기능을 두 가지 방식으로 제공합니다:
    • Dex OIDC Provider 사용 (기본 설치됨)
    • Argo CD에서 직접 외부 OIDC Provider 연동 (Dex 미사용)
  • Argo CD는 UI와 CLI 모두에서 SSO 로그인을 지원합니다.

🔸 UI 로그인 변화

  • SSO가 활성화되고 local admin 계정이 비활성화되면, 기존의 사용자 이름/비밀번호 입력 창은 제거되고 “Log in via SSO” 버튼만 표시됩니다.

🔸 CLI 로그인 명령어

argocd login --sso argocd.mycompany.com

“SSO를 통해 단일 자격 증명만으로 여러 애플리케이션에 접근할 수 있으며, 공격 표면이 크게 줄어든다.”


  • admin 계정 다시 활성화
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~$ KUBE_EDITOR="vi" kubectl edit cm -n argocd argocd-cm
configmap/argocd-cm edited

apiVersion: v1
data:
  accounts.alice: apiKey,login
  accounts.gitops-ci: apiKey
  admin.enabled: "true"
  
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~$ argocd login argocd.example.com --username admin --password qwe12345 --insecure
'admin:login' logged in successfully
Context 'argocd.example.com' updated
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~$ argocd app list
NAME                  CLUSTER                         NAMESPACE  PROJECT      STATUS  HEALTH   SYNCPOLICY  CONDITIONS  REPO                                             PATH            TARGET
argocd/guestbook      https://kubernetes.default.svc  guestbook  default      Synced  Healthy  Auto-Prune  <none>      https://github.com/argoproj/argocd-example-apps  helm-guestbook  HEAD
argocd/pre-post-sync  https://kubernetes.default.svc  test       sample-apps  Synced  Healthy  Manual      <none>      https://github.com/argoproj/argocd-example-apps  pre-post-sync   master


🔑 1️⃣ Keycloak이란?

  • Keycloak은 오픈소스 ID 및 액세스 관리(Identity and Access Management, IAM) 솔루션입니다.

“사용자의 로그인, 인증, 권한을 안전하게 관리하고, 여러 애플리케이션에서 공통으로 쓸 수 있게 해주는 도구”


🧩 Keycloak이 제공하는 핵심 기능

  1. SSO (Single Sign-On)
    • 한 번 로그인하면, 여러 애플리케이션에서 다시 로그인할 필요 없음
  2. 인증(Authentication)
    • 사용자가 누구인지 확인
    • 로그인 화면, 패스워드, OTP, 소셜 로그인(Google, GitHub 등)
  3. 인가(Authorization)
    • 사용자가 어떤 리소스에 접근할 수 있는지 결정
    • 예: “Alice는 문서를 읽을 수 있지만, 편집은 불가”
  4. Identity Federation
    • 기존 LDAP/Active Directory, 다른 IDP(Identity Provider)와 연결 가능
    • 여러 사용자 소스를 통합 관리 가능
  5. Social Login
    • Google, Facebook, GitHub 같은 계정으로 로그인 가능
  6. User Management
    • 사용자 생성, 그룹 관리, 역할(Role) 부여
  7. OAuth 2.0 / OpenID Connect / SAML 지원
    • 표준 프로토콜 지원
    • Keycloak을 이용해 다양한 애플리케이션과 안전하게 연동 가능

🔹 2️⃣ Keycloak 구성 요소

1. Realm

  • Keycloak의 최상위 컨테이너
  • 하나의 Realm은 사용자, 애플리케이션, 역할, 정책을 그룹으로 관리
  • 예: 회사 전체를 하나의 Realm으로 운영, 프로젝트마다 별도 Realm 생성 가능

2. Client

  • Keycloak에 연결되는 애플리케이션/서비스
  • 웹앱, 모바일앱, API 서버 모두 Client가 될 수 있음
  • Client는 Keycloak에서 인증 토큰을 발급받아 사용자 로그인 처리

3. User

  • 실제 사용자 계정
  • username, email, password, OTP 등 다양한 속성을 관리

4. Role

  • 권한 단위
  • User에게 Role을 부여하면 Client 또는 Realm에서 특정 행동 가능
  • 예: admin, viewer, editor

5. Group

  • Role을 묶어서 관리 가능
  • User를 Group에 넣으면, Group에 부여된 Role이 자동으로 적용

6. Identity Provider (IdP)

  • 외부 인증 소스
  • 예: LDAP, Google OAuth2, GitHub OAuth2 등

🔹 3️⃣ Keycloak 사용 시나리오

예시 1: 회사 내부 SSO

  • Alice가 회사 포털 로그인 → Keycloak 인증
  • 이후 Jira, Confluence, Slack 접근 시 자동 로그인

예시 2: SaaS 앱 OAuth

  • SaaS 앱에 Google 로그인 버튼 클릭
  • Keycloak이 Google OAuth를 통해 인증 → 토큰 발급 → 앱 로그인 완료

예시 3: API 보호

  • API 서버를 Client로 등록
  • Keycloak에서 발급한 JWT 토큰으로 접근 제어
  • 유효한 토큰 없으면 접근 불가

🔹 4️⃣ Keycloak 장점

  1. 오픈소스 무료
  2. 표준 프로토콜 지원 (OAuth2, OpenID Connect, SAML)
  3. SSO 지원
  4. 유연한 사용자/권한 관리
  5. 확장성 높음 (클러스터 구성 가능)
  6. 관리 UI 제공 (웹 콘솔로 사용자, 역할, Client 관리)

🔹 5️⃣ Keycloak 동작 흐름 예시

OAuth 2.0 기반 로그인 흐름

[사용자] → 로그인 요청 → [Keycloak]
        ← 인증 후 토큰 발급 ←
        → [웹앱/서비스] 사용 가능
  • 브라우저 → Keycloak 로그인 페이지 → 인증
  • 인증 완료 → JWT 토큰 발급
  • 애플리케이션이 토큰 검증 후 사용자 서비스 제공

💡 정리

  • Keycloak은 “회사/서비스에서 사용자 인증과 권한을 안전하게 관리하고, 여러 애플리케이션에서 SSO를 가능하게 하는 도구”
  • Realm, Client, User, Role, Group 구조로 유연하게 구성 가능
  • OAuth2, OpenID Connect, SAML 같은 표준 프로토콜 지원

🛡️ keycloak 배포 및 기본 설정

  • 도커에서 컨테이너로 Keycloak 실행 
  • 기본 관리자 계정이 제공되지 않아, 환경 변수로 초기 관리자 계정 생성
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~$ docker run -d -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin --net host --name dev-keycloak quay.io/keycloak/keycloak:22.0.0 start-dev
Unable to find image 'quay.io/keycloak/keycloak:22.0.0' locally
22.0.0: Pulling from keycloak/keycloak
da5b6ed7dedb: Pull complete
235cc15c2bca: Pull complete
33a5d0f592f8: Pull complete
881ee45db5ad: Pull complete
Digest: sha256:1882e5b5b881ec9370a5b2048b4c9e8b877d98eabad5d7a82af12efc697c59da
Status: Downloaded newer image for quay.io/keycloak/keycloak:22.0.0
239f7ab05a056b2167867c1a336e630da821d4571e3cbf756796d93b3beb3114

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~$ docker ps
CONTAINER ID   IMAGE                              COMMAND                  CREATED          STATUS          PORTS                                                                                                       NAMES
239f7ab05a05   quay.io/keycloak/keycloak:22.0.0   "/opt/keycloak/bin/k…"   20 seconds ago   Up 19 seconds                                                                                                               dev-keycloak
c1fe0020c1b7   kindest/node:v1.32.8               "/usr/local/bin/entr…"   3 hours ago      Up 3 hours      0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:30000-30003->30000-30003/tcp, 127.0.0.1:34633->6443/tcp   myk8s-control-plane
  • http://localhost:8080/admin ( 관리자 웹 로그인 : admin / admin )

  • bob 유저 생성

  • 암호 bob123


🧩 keycloak 에 argo cd 를 위한 client 생성

Client type

(클라이언트 유형)
OpenID Connect 클라이언트가 사용할 프로토콜을 선택합니다. **OpenID Connect(OIDC)**가 현대적인 웹/앱 인증에 가장 표준적으로 사용됩니다. (다른 옵션으로 SAML 등이 있습니다.)
Client ID *

(클라이언트 ID)
argocd 이 클라이언트를 식별하는 고유한 ID입니다. 필수 항목(*)이며, 여기서는 'argocd'로 설정되었습니다. 이 ID는 로그인 프로토콜에서 사용됩니다.
Name

(이름)
argocd client Keycloak 관리자 콘솔 등 UI에 표시될, 사람이 읽기 쉬운 이름입니다.

  • 기능 설정 (Capability config)
Client authentication

(클라이언트 인증)
On (활성화) 클라이언트(애플리케이션)가 Keycloak에 토큰을 요청할 때, 자신의 ID와 비밀값(Client Secret 등)을 제시해야 함을 의미합니다. (주로 'Confidential' 클라이언트 타입에서 사용)
Authorization

(권한 부여)
Off (비활성화) Keycloak이 제공하는 고급 권한 부여 기능(예: 리소스 기반 접근 제어, UMA 2.0)을 사용하지 않도록 설정되었습니다.
Authentication flow

(인증 흐름)
  클라이언트가 사용자를 인증하고 토큰을 얻기 위해 사용할 수 있는 OAuth 2.0 / OIDC 흐름을 선택하는 섹션입니다.
    ➡️ Standard flow (표준 흐름) ☑️ 선택됨 Authorization Code Flow를 사용하도록 허용합니다. 웹 애플리케이션에서 가장 표준적이고 안전한 방식입니다. (사용자가 로그인하면 '인증 코드'를 받고, 클라이언트가 그 코드로 '토큰'을 교환합니다.)
    ➡️ Direct access grants (직접 접근 허용) ◻️ 비선택 Resource Owner Password Credentials Flow입니다. 사용자가 클라이언트(앱)에 직접 아이디/비밀번호를 입력하여 토큰을 받는 방식입니다. (권장되지 않음)
    ➡️ Implicit flow (암시적 흐름) ◻️ 비선택 인증 코드를 거치지 않고 브라우저에 바로 토큰(Access Token)을 전달하는 방식입니다. (보안상 권장되지 않으며, 'Standard flow'의 PKCE 방식이 이를 대체합니다.)
    ➡️ Service accounts roles (서비스 계정 역할) ◻️ 비선택 사용자가 아닌, 클라이언트(서비스) 자체가 스스로 인증하여 토큰을 받는 흐름입니다. (주로 백엔드 간 통신에 사용)
    ➡️ OAuth 2.0 Device Authorization Grant ◻️ 비선택 스마트 TV, 콘솔 등 키보드 입력이 어려운 기기에서 사용하는 인증 흐름입니다.
    ➡️ OIDC CIBA Grant ◻️ 비선택 Client Initiated Backchannel Authentication의 약자로, 클라이언트가 사용자의 다른 기기(예: 스마트폰)로 인증을 요청하는 비동기 흐름입니다.

  • Keycloak에서 Argo CD를 OAuth/OpenID Connect Client로 등록
Root URL https://argocd.example.com/ Keycloak이 이 Client에 로그인 후 리디렉션할 기본 도메인 URL
Home URL /applications Client 내부의 홈 페이지 경로, 로그인 후 기본 이동 위치
Valid redirect URIs https://argocd.example.com/auth/callback OAuth/OpenID 인증 후 Keycloak이 리디렉션할 URI. 반드시 정확히 일치해야 함
Valid post logout redirect URIs https://argocd.example.com/applications 로그아웃 후 이동 가능한 URI. 안전하게 제한 가능
Web origins + 브라우저에서 허용할 CORS 출처(origin). +는 모든 출처 허용

  • 생성된 client 에서 → Credentials (FthU5Ar2qUE9j64sxuAbsNmzv3L1kKgV)


⚠️ Configuring ArgoCD OIDC

  • 클라이언트 시크릿 설정
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~$ kubectl -n argocd patch secret argocd-secret --patch='{"stringData": { "oidc.keycloak.clientSecret": "FthU5Ar2qUE9j64sxuAbsNmzv3L1kKgV" }}'
secret/argocd-secret patched

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~$ kubectl get secret -n argocd argocd-secret -o jsonpath='{.data}' | jq
{
...
  "oidc.keycloak.clientSecret": "RnRoVTVBcjJxVUU5ajY0c3h1QWJzTm16djNMMWtLZ1Y=",
...
}
  • 구성 맵을 설정하고 OIDC 구성을 추가하여 Keycloak 인증을 활성화
  • 자신의 로컬 IP로 keycloak 컨테이너와 myk8s-control-plane 컨테이너 및 argocd-server 파드 모두가 통신 가능해야 함!
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~$ ifconfig
...
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.234.111  netmask 255.255.240.0  broadcast 172.18.239.255
...
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~$ KUBE_EDITOR="vi" kubectl edit cm -n argocd argocd-cm
configmap/argocd-cm edited

url: https://argocd.example.com
  oidc.config: |
    name: Keycloak
    issuer: http://172.18.234.111:8080/realms/master
    clientID: argocd
    clientSecret: FthU5Ar2qUE9j64sxuAbsNmzv3L1kKgV
    requestedScopes: ["openid", "profile", "email"]
  • argocd 서버 재시작
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~$ kubectl rollout restart deploy argocd-server -n argocd
deployment.apps/argocd-server restarted

 

👥 keycloak 인증을 통한 로그인

  • 'argocd' 애플리케이션이 사용자를 Keycloak 로그인 페이지로 보낸 상황
매개변수 (Parameter) 값 (Value) 설명
client_id argocd (중요) 로그인을 요청한 클라이언트(애플리케이션)의 ID입니다. 'argocd' 클라이언트입니다.
redirect_uri https://argocd.example.com/auth/callback 로그인이 성공적으로 끝나면, Keycloak이 사용자를 이 주소로 다시 돌려보내라는 의미입니다. (argocd의 인증 콜백 주소)
response_type code 'Standard flow'(표준 흐름)를 사용하겠다는 뜻입니다. 즉, 로그인 성공 시 Keycloak이 '인증 코드(code)'를 발급해 줍니다.
scope openid profile email 'argocd' 클라이언트가 Keycloak에게 요청하는 사용자 정보의 범위입니다. 여기서는 OpenID 인증(openid), 기본 프로필(profile), 그리고 이메일 주소(email)를 요청하고 있습니다.
state VfmXqzKdyISyKymEPEQZHoIsh... 보안을 위한 일회성 문자열입니다. argocd가 만들어서 보냈다가 나중에 돌려받으면서, 중간에 요청이 탈취되지 않았는지 확인하는 데 사용됩니다.

  • bob 계정으로 로그인 > password 변경
분석 영역 매개변수 (Parameter) 값 (Value) 설명
Query String

(URL에 포함된 정보)
execution UPDATE_PASSWORD Keycloak이 사용자에게 **"비밀번호 업데이트"**라는 필수 작업을 수행하도록 지시했음을 의미합니다.
  client_id argocd 이 모든 과정이 우리가 만든 바로 그 'argocd' 클라이언트를 위한 것임을 다시 한번 확인시켜 줍니다.
Form Data (Payload)

(사용자가 제출한 정보)
username bob 이 작업을 수행하는 사용자는 'bob'입니다.
  password bob 'bob'이 입력한 기존 비밀번호입니다.
  password-new bob123 'bob'이 설정한  비밀번호입니다.
  password-confirm bob123 새 비밀번호 확인입니다.
  logout-sessions on "새 비밀번호로 바꿨으니, 혹시 다른 곳에 로그인되어 있다면 모두 로그아웃 시켜줘"라는 옵션입니다.


📌 핵심 요약

  • SSO는 중앙 인증 체계를 통해 여러 시스템에 접근할 수 있는 안전한 방식이다.
  • Argo CD는 Dex 또는 외부 OIDC Provider를 이용해 SSO를 지원한다.
  • RBAC는 SSO 그룹 정보를 기반으로 자동 매핑되며, 역할 기반 접근 제어가 가능하다.
  • 보안 강화를 위해 민감한 SSO Client Secret은 Secret 리소스로 분리해야 한다.

“SSO는 단순한 편의 기능이 아니라, 보안과 운영 효율성을 동시에 달성하는 핵심 인프라 구성 요소이다.”


Comments