Search
🔐

Argo CD Dex를 활용한 GitHub SSO 연동하기

들어가며

현재 회사에서 AWS Lambda 및 EC2 기반의 대규모 서비스를 EKS로 마이그레이션하는 프로젝트에서 쿠버네티스 운영/관리와 Argo CD를 담당하고 있습니다. 그래서 요근래 Argo CD를 닳고 닳도록 다루고 있습니다. (…)
기존에는 제가 담당하는 서비스만을 위해서 Argo CD를 구축하고 사용했었습니다. 따라서 사용자 인증이나, RBAC 등은 설정할 필요가 딱히 없었습니다. 저만 주로 사용하니까요. 오히려 손이 많이가기만 했습니다.
지금 프로젝트에서는 상황이 많이 달라져서, 제가 구축한 Argo CD에서 팀 내의 많은 서비스들이 배포 관리가 이루어지고 그만큼 사용자 인증/RBAC이 필수적인 요소가 되었습니다.
이 문서에서는 Argo CD Helm Chart에 포함되어있는 Dex라는 인증 서버를 Github와 연결해서 사용자 정보를 연동하는 내용에 대해서 살펴보려고 합니다.
실제 구성에서는 사내 LDAP(Lightweight Directory Access Protocol)을 연동하도록 했지만, 튜토리얼 개념으로 Github를 연동하는 방법을 먼저 살펴보겠습니다.

Dex?

dex
dexidp
Dex는 오픈 소스 기반의 인증 서버입니다. OAuth 2.0, OpenID Connect 및 LDAP 같은 여러가지 인증 프로토콜을 지원하며, 다양한 인증 제공 업체(Identity Provider)와 연동하여 사용가능합니다.
쿠버네티스 클러스터에 Argo CD Helm Chart를 설치하면 기본적으로 argocd-dex-server 이름의 Deployment로 Dex가 함께 배포 됩니다.
NAME READY STATUS RESTARTS AGE argocd-application-controller-0 1/1 Running 0 11d argocd-applicationset-controller-5b7f86f84f-jz45x 1/1 Running 0 24d argocd-dex-server-5b7dff469-lp58w 1/1 Running 0 24d argocd-notifications-controller-89b8988c-9bf9h 1/1 Running 0 24d argocd-redis-6d6d66cdf6-b8l9d 1/1 Running 0 24d argocd-repo-server-56fc78d467-grw5k 1/1 Running 0 11d argocd-server-5b68c7849c-vnp77 1/1 Running 0 24d
Bash
복사
Dex는 배포되지만 설정을 하지 않았기 때문에 사용하지 않는 것과 같으며, 자체 계정을 생성하고 사용하게 됩니다. (Argo CD Docs - useraccounts)
이제, Dex에 대해서 어렴풋이는 알게 되었으니, Github로 SSO 구성하는 방법을 알아보겠습니다.

Github로 Argo CD SSO 구성하기

가장 간단하기도하고, Argo CD Docs에서도 잘 설명하고 있는 Github를 통한 연동을 먼저 진행해보겠습니다.

Github에서 OAuth Application 등록

Github에 접속하여 Settings / Developer settings / OAuth apps 에서 OAuth app을 등록합니다.
Application Name: 사용하고 싶은 OAuth app 이름
Homepage URL: Argo CD 홈페이지 주소
Authorization callback URL: 상단에 작성한 Argo CD 홈페이지 주소에 /api/dex/callback 를 붙인 주소를 사용합니다.
OAuth app 등록을 완료했다면, Client ID를 확인할 수 있고, 그 아래에 Generate a new client secret 버튼을 눌러서 Client Secret을 생성합니다. 아래 캡쳐에서는 이미 생성되어 있는 화면입니다.

Organizations 생성

먼저 RBAC을 위해 Organization을 생성해줍니다. 기존에 사용하는 Organization이 있다면 그대로 사용하셔도 됩니다. 또한 Organization을 생성한 뒤에 Team을 생성하면 추후 좀 더 디테일한 RBAC 설정이 가능합니다.

Argo CD Dex Configuration 수정

Argo CD의 Dex Config 값들은 argocd-cm 라는 이름의 ConfigMap 에서 관리됩니다.
이미 Argo CD를 설치했다면, argocd-cm 을 아래와 같이 수정하고, 새로 설치하는 경우는 Argo CD Helm Chart의 values.yaml 을 수정하여 설치합니다
Argo CD가 이미 설치된 경우 - argocd-cm ConfigMap 수정
data: dex.config: | connectors: # -- GitHub example - type: github id: github # -- 원하는 ID name: GitHub # -- 여러개의 SSO 사용시 화면에 출력되는 이름 config: clientID: f486bf9571bbbe44a9d3 clientSecret: <generated_client_secret> orgs: - name: thinq-anywhere-dev # -- Organization 이름
YAML
복사
Argo CD Helm Chart로 설치하는 경우 - values.yaml 설정
configs: cm: dex.config: | connectors: # -- GitHub example - type: github id: github # -- 원하는 ID name: GitHub # -- 여러개의 SSO 사용시 화면에 출력되는 이름 config: clientID: f486bf9571bbbe44a9d3 clientSecret: <generated_client_secret> orgs: - name: thinq-anywhere-dev # -- Organization 이름
YAML
복사
이제 Argo CD Web UI로 접속하면 기존의 로그인 화면 위에 LOG IN VIA GITHUB 라는 버튼이 추가된 것을 볼 수 있으며, 이를 통해서 Github에 로그인하면 Argo CD에 로그인되는 것을 확인할 수 있습니다.
Github를 통해 로그인 후, 좌측 메뉴에서 User Info 를 눌러보면 다음과 같은 정보를 볼 수 있습니다.
Username에는 Github에 가입되어 있는 이메일 정보가 있으며, Groups항목에는 앞서 생성했던 Github Organization:Team 이 표시되는 것을 볼 수 있습니다.
하지만, Github를 통한 로그인만 가능할 뿐, 아무런 권한을 설정하지 않았기 때문에 read 외에는 별다르게 가능한 작업이 없습니다.
이제 Groups 정보를 활용하여 Argo CD의 RBAC 구성하는 방법을 살펴보겠습니다.

Argo CD RBAC 설정

Argo CD 공식 문서에서의 RBAC 설명을 참고하면 크게 2가지 부분으로 나누어 집니다.
권한 설정
Resources: clustersprojectsapplicationsapplicationsetsrepositoriescertificatesaccountsgpgkeyslogsexec
Actions: getcreateupdatedeletesyncoverride,action/<group/kind/action-name>
All resources except application-specific permissions (see next bullet): p, <role/user/group>, <resource>, <action>, <object>
Applications, applicationsets, logs, and exec (which belong to an AppProject):
p, <role/user/group>, <resource>, <action>, <appproject>/<object>
예시
github-role이라는 이름의 권한
모든 application 리소스에 대해 모든 권한 허용
모든 cluster 리소스에 대해 get 을 허용
모든 repository 에 대해 get 을 허용
p, role:github-role, applications, *, */*, allow p, role:github-role, clusters, get, *, allow p, role:github-role, repositories, get, *, allow
YAML
복사
권한 연결
g, github-org:team, role:github-role
github-role 역할을 github-org:team 그룹에게 연결
Argo CD의 RBAC은 argocd-rbac-cm configMap으로 설정하게 됩니다. RBAC configMap은 Argo CD를 재시작하지 않아도 실시간으로 바로 반영되기 때문에, 이제 다른 작업이 가능한지 살펴보면 됩니다.
data: policy.csv: | p, role:github-role, applications, *, */*, allow p, role:github-role, clusters, get, *, allow p, role:github-role, repositories, get, *, allow g, thinq-anywhere-dev:thinq-anywhere-developer, role:github-role policy.default: role:readonly
YAML
복사

마치며

이 글에서는 Argo CD에 Github로 SSO를 구성하는 방법을 알아보고 RBAC을 설정하는 방법에 대해서 살펴봤습니다. 실제 회사 내에서는 Github 정보를 통해 유저 관리하는 것은 대부분 불가능하리라 생각합니다. (일단 제가 있는 곳은 보안상의 이유로 그렇습니다.)
따라서 다음 문서에서는 최종적으로 구성된 형태인 LDAP 연동에 대해서 정리하겠습니다.
현재 프로젝트에서 한참 전에 구축된 내용들이긴한데 그때그때 정리하는게 쉽지 않다는 것을 다시 느낍니다. 꾸준함의 중요성을 다시 깨달으며, 얼른 LDAP 연동에 대해 정리하도록 하겠습니다.
추가로, Argo CD의 공식 문서를 살펴보다보면 잘 되있는 것 싶다가도 문서화가 빈약한 부분이 상당히 많이 존재합니다. 특히 RBAC부분은 그 중 하나입니다.
지금도 계속 발전 중인 툴이니 그러려니 하는게 정신 건강에 이롭습니다.
제가 추천 드리는 방법은 실제로 권한 내용을 바꿔가면서 변경되는 부분이 있는지 직접 확인하는 것입니다. 이렇게 하는 것이 훨씬 빠르게 Argo CD RBAC에 대한 이해도를 끌어올릴 수 있다고 확신합니다.

참고