23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
이번 글에서는 이전에 구성한 샘플 애플리케이션에 Single Sign Out을 구성해보고, 사전에 구축한 Keycloak을 활용하여 ArgoCD와 연동하는 방법을 안내드리겠습니다.
[연재순서]
eksctl로 손쉽게 시작하는 Kubernetes 클러스터 및 노드그룹 생성 방법
완벽한 HTTPS 보안: Ingress 컨트롤러와 Let's Encrypt으로 무료 인증서 설정하기
Keycloak 설치부터 설정까지: SSO를 위한 첫걸음
SSO 연동 샘플 애플리케이션 구성하기: 실전 가이드
SSO 연동 테스트: Keycloak과 애플리케이션의 완벽한 통합
ArgoCD는 Kubernetes 환경에서 애플리케이션을 지속적으로 배포(CD, Continuous Delivery)하기 위한 GitOps 기반의 오픈 소스 도구입니다.
Git 리포지토리를 단일 소스로 삼아 Kubernetes 클러스터의 상태를 선언적 방식으로 관리하며, 안정적이고 일관된 배포 환경을 제공합니다.
이번 가이드에서는 ArgoCD를 설치하고 Keycloak과 연동하여 SSO(Single Sign-On) 테스트를 수행해보겠습니다.
이를 통해 안전하고 효율적인 접근 관리 및 인증 환경을 구축할 수 있습니다.
kubectl create namespace devops-argocd
kubectl apply -n devops-argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yamlingress.yaml 파일을 하나 생성합니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd-ingress
namespace: devops-argocd
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prd
ingress.kubernetes.io/force-ssl-redirect: "true"
kubernetes.io/tls-acme: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
ingressClassName: nginx
rules:
- host: argocd.<<< YOUR_DOMAIN >>>
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
number: 443
tls:
- hosts:
- argocd.<<< YOUR_DOMAIN >>>
secretName: argocd-acme-crtIngress를 클러스터에 배포합니다.
kubectl apply -f ingress.yaml
kubectl get ing -n devops-argocd
NAME CLASS HOSTS ADDRESS PORTS AGE
argocd-ingress nginx argocd.<<< YOUR_DOMAIN >>> 80, 443 11s
cm-acme-http-solver-x879f <none> argocd.<<< YOUR_DOMAIN >>> 80 8s브라우저로 접속되는지 확인합니다. 인증서가 Stage용으로 배포되었기 때문에 경고 메시지를 확인할 수 있습니다.
일단 접속이 되면 인증서를 Production용으로 변경합니다.
yq 유틸리티가 설치되어 있지 않다면, ingress.yaml 파일에서 cert-manager.io/cluster-issuer 부분을 letsencrypt-prd로 직접 변경하시면 됩니다.
yq e '.metadata.annotations."cert-manager.io/cluster-issuer"="letsencrypt-prd"' ingress.yaml --inplace
kubectl apply -f ingress.yaml
kubectl get ing -n devops-argocd
NAME CLASS HOSTS ADDRESS PORTS AGE
argocd-ingress nginx argocd.<<< YOUR_DOMAIN >>> a9af0f1f2a24d48979b3a6f9a3cdd8e8-1458433199.ap-northeast-2.elb.amazonaws.com 80, 443 3m39sArgoCD의 배포와 접속이 성공적으로 완료되었다면, 이제 Keycloak에서 ArgoCD와의 원활한 인증 및 권한 관리를 위해 클라이언트를 생성하고 세부 설정을 진행해야 합니다.
이 단계에서는 Keycloak이 ArgoCD의 인증 서버 역할을 수행할 수 있도록 클라이언트 ID, 인증 방식, 리디렉션 URI 등의 필수 설정을 꼼꼼하게 구성해야 합니다.
이를 통해 사용자 접근 제어 및 보안 정책이 체계적으로 적용될 수 있습니다.
Client Secret을 복사하여 ArgoCD 설정시에 사용합니다.groups로 입력합니다.Group Membership을 선택합니다.groups로 지정합니다.Clients > argocd > Client scopes > Add client scope > groups 추가
이상으로 Keycloak에서 설정하는 부분은 모두 완료하였습니다.
Keycloak에서 설정한 클라이언트 정보를 ArgoCD에서 설정하는 작업을 진행합니다. 먼저 argocd Client Secret 값을 base64로 인코딩해야 합니다.
인코딩한 값을 oidc.keycloak.clientSecret 키로 추가합니다.
echo -n 'pRVYem4wAJFnVd4PAyTwAEr7ph3IYtjl' | base64
cFJWWWVtNHdBSkZuVmQ0UEF5VHdBRXI3cGgzSVl0amw=
kubectl edit secret argocd-secret -n devops-argocd
apiVersion: v1
data:
admin.password: JDJhJDEwJG5VNC2uYjZUZ1hwc9ByempzMXRKZHV2VHBNVHpBeUY4OFdUMHNnL2o0b4QxYkF1MVZJa4VP
admin.passwordMtime: MjAyYC0xMi0yKFQwMjowTKo0TFo=
oidc.keycloak.clientSecret: <<< CLIENT_SECRET (base64) >>>
server.secretkey: cTVpU2k2b0lJSHNyNlc1Qzl2SUgzV5BQZXNSOEU9b1NncFhoa3NNa0RSST0=
....이제 config 맵을 구성하고 OIDC 구성을 추가하여 Keycloak 인증을 활성화 할 수 있습니다.
kubectl edit configmap argocd-cm -n devops-argocd
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
data:
url: https://argocd.<<< YOUR_DOMAIN >>>
oidc.config: |
name: Keycloak
issuer: https://keycloak.<<< YOUR_DOMAIN >>>/realms/quickstart
clientID: argocd
clientSecret: $oidc.keycloak.clientSecret
requestedScopes: ["openid", "profile", "email", "groups"]issuer Keycloak 서버 및 realm 정보를 입력합니다. Keycloak 버전이 17보다 이전인 경우 Keycloak 릴리스의 발급자 URL에는 /auth가 포함되어야 합니다. (본 가이드에서는 /realms/quickstart)
clientID Keycloak에서 구성한 클라이언트 ID로 설정됩니다.
clientSecret argocd 클라이언트의 시크릿 키입니다.
requestedScopes 기본 범위에 추가하지 않은 경우 그룹 클레임이 포함됩니다.
ArgoCDAdmins 그룹으로 로그인 한 사용자는 Admin 권한을 부여합니다.
kubectl edit configmap argocd-rbac-cm -n devops-argocd
apiVersion: v1
kind: ConfigMap
data:
policy.csv: |
g, ArgoCDAdmins, role:admin
...혹시, 정상적으로 설정했는데 계속 401 오류가 발생하나요? 로그인 인증은 되었으나 지속적으로 오류가 발생하면 Pod를 재시작합니다.
kubectl rollout restart deployment argocd-server -n devops-argocdArgoCD 로그인 페이지 오른쪽 상단에 LOG IN VIA KEYCLOAK 버튼이 생성되었습니다.
해당 버튼을 클릭하고 Keycloak 인증을 받으면 정상적으로 로그인 할 수 있습니다.
#4 SSO 연동 샘플 애플리케이션 구성하기: 실전 가이드 에서 추가적으로 Single Sigh Out을 설정하고 테스트해보겠습니다.
Keyclaok 관리페이지에서 이전 가이드에서 생성한 nodejs-app Client에 logout 관련된 부분을 업데이트 합니다.
로그 아웃을 처리하는 부분을 아래와 같이 추가합니다.
....
app.get('/logout', (req, res) => {
const keycloakLogoutUrl = `${keycloakConfig['auth-server-url']}/realms/${keycloakConfig.realm}/protocol/openid-connect/logout`;
req.logout();
req.redirect(keycloakLogoutUrl = `?rediret_uri=${encodeURIComponent('http://<<< SERVER_HOST >>>:<<< SERVER_PORT >>>')}`);
});
....다시 접속을 시도해보면 세션이 만료되어 로그인 창이 출력 되는 것을 확인할 수 있습니다.
http://<<< SERVER_HOST >>>:<<< SERVER_PORT >>>/secured
처음 연재를 시작할 때는 이전에 사용했던 샘플 애플리케이션을 활용하려고 했지만, 개발 환경과 버전 이슈로 재사용하지 못한 점이 조금 아쉽습니다.
현재 진행 중인 프로젝트에서도 Keycloak은 매우 유용하게 활용되고 있으며, 향후 신규로 개발하는 서비스에서도 연동할 예정입니다.
앞으로는 Keycloak과 다양한 오픈소스 간의 연동을 위한 설정과 최적화 방안을 다루어 볼 예정입니다.
다음 연재에서 더 유익한 내용으로 다시 만나 뵙겠습니다. 감사합니다!
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.