Ssoon
Argo CD in Practice – 4) 접근 제어 : 단일 로그인 본문
🔐 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이 제공하는 핵심 기능
- SSO (Single Sign-On)
- 한 번 로그인하면, 여러 애플리케이션에서 다시 로그인할 필요 없음
- 인증(Authentication)
- 사용자가 누구인지 확인
- 로그인 화면, 패스워드, OTP, 소셜 로그인(Google, GitHub 등)
- 인가(Authorization)
- 사용자가 어떤 리소스에 접근할 수 있는지 결정
- 예: “Alice는 문서를 읽을 수 있지만, 편집은 불가”
- Identity Federation
- 기존 LDAP/Active Directory, 다른 IDP(Identity Provider)와 연결 가능
- 여러 사용자 소스를 통합 관리 가능
- Social Login
- Google, Facebook, GitHub 같은 계정으로 로그인 가능
- User Management
- 사용자 생성, 그룹 관리, 역할(Role) 부여
- 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 장점
- 오픈소스 무료
- 표준 프로토콜 지원 (OAuth2, OpenID Connect, SAML)
- SSO 지원
- 유연한 사용자/권한 관리
- 확장성 높음 (클러스터 구성 가능)
- 관리 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는 단순한 편의 기능이 아니라, 보안과 운영 효율성을 동시에 달성하는 핵심 인프라 구성 요소이다.”
'CICD Study [1기]' 카테고리의 다른 글
| Argo Rollouts - 개념들 (0) | 2025.10.19 |
|---|---|
| Argo Rollouts - Kubernetes 점진적 배포 컨트롤러 (0) | 2025.10.19 |
| Argo CD in Practice – 4) 접근 제어 : 서비스 계정 (0) | 2025.10.19 |
| Argo CD in Practice – 4) 접근 제어 : 선언적 사용자 (0) | 2025.10.19 |
| Argo CD in Practice – 3) Argo CD 운영 : 가시성 활성화 (0) | 2025.10.19 |
Comments