![](https://yozm.wishket.com/media/news/2427/%EA%B7%B8%EB%A6%BC1-1.png)
ํคํด๋ฝ ๊ตฌ์ฑ์ ์ํ ๊ธฐ๋๊ธด ์ฌ์ ์์ ํ๋ฒ์ ๋ณด๊ธฐ
ํคํด๋ฝ ๊ตฌ์ฑ์ ์ํ ๊ธฐ๋๊ธด ์ฌ์ ์์ ํ๋ฒ์ ๋ณด๊ธฐ ๊ด๋ จ
KubeCon + Cloud Native North America 2023์์ ๋ฐํํ <Beyond Passwords: Keycloak's Contributions to IAM(Identity and Access Management) + Security>๋ฅผ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ๋ฐํ ๋ด์ฉ์ 3ํ๋ก ๋๋์ด ๋ฐํํฉ๋๋ค. 1๋ถ์์๋ ํคํด๋ฝ์ ๋ํ ๊ธฐ๋ฅ ์๊ฐ์ ์ด์ ์ ๋ํด ์ดํด๋ณด์์ต๋๋ค. ์ด๋ฒ 2๋ถ์์๋ ํคํด๋ฝ์ ๊ตฌ์ฑํ๊ธฐ ์ํด ์คํํด์ผ ํ ์ฌ์ ์์ ์ ์์๋ณด๊ณ , 3๋ถ์์๋ ํคํด๋ฝ์ ์ฌ์ฉํ์ฌ EKS, GKE์ ๊ฐ์ ๊ด๋ฆฌํ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ํตํฉ์ธ์ฆ ํ์ฌ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ดํด๋ด ๋๋ค. ๋ฐํ ์๋ฃ๋ KubeCon NA 2023 ํํ์ด์ง์์ ๋ค์ด๋ฐ์ผ์ค ์ ์์ต๋๋ค.
- 1๋ถ: ์ ์ํ์ธ, ํตํฉ์ธ์ฆ๊ด๋ฆฌ ์คํ์์ค โํคํด๋ฝโ์ ์์๋ณด์
- 2๋ถ: ํคํด๋ฝ ๊ตฌ์ฑ์ ์ํ ๊ธฐ๋๊ธด ์ฌ์ ์์ ํ๋ฒ์ ๋ณด๊ธฐ
- 3๋ถ: ํคํด๋ฝ์ ํ์ฉํ ํตํฉ ์ธ์ฆ ์ค์ตํ๊ธฐ
![](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ0.png)
์ด๋ฒ 2๋ถ์์ ์ดํด๋ณผ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ ์คํธ๋ฅผ ์ํ ์ฌ์ ์ค๋น ์์
- ์ฝ๋ ๋ฐ ์ฌ์ ํ์ ๊ตฌ์ฑ ํ์ธ
- Keycloak์ ์ ๊ทผ์ ์ํ HTTPS ์ธ์ฆ์์ ํผ๋ธ๋ฆญ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋ ๋๋ฉ์ธ์ ๊ตฌ์ฑ
- ํคํด๋ฝ์ด ๋ฐฐํฌ๋ GKE ํด๋ฌ์คํฐ ์์ฑ์ ์งํํ๊ณ ์ดํ์ ํคํด๋ฝ์ ์์ฑ๋ GKE์ ๋ฐฐํฌ
- HTTPS ์ธ์ฆ์๋ฅผ GKE ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ์์ ์ฌ์ฉํ ์ ์๋๋ก ์ฐ๊ฒฐ ์์ ์ ์งํ
- ํคํด๋ฝ์ ์ ๊ทผํด์ ๊ตฌ๊ธ OIDC์ ์ ๊ทผํด์ ์ธ์ฆ์ ์ฒ๋ฆฌํ ์ ์๋ ์ค์ ์ ์งํ
- ๊ตฌ๊ธ ํด๋ผ์ฐ๋์์ ํคํด๋ฝ์ ์ธ๋ถ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋๋ก ๊ตฌ์ฑ ์ถ๊ฐ
- ์ด๋ฉ์ผ 2์ฐจ ์ธ์ฆ ๊ตฌ์ฑ
๋ชจ๋๊ฐ ์ด๋ฌํ ์ค์ต ํ๊ฒฝ์ ๊พธ๋ฏธ๊ณ ํ ์คํธํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ์์ธํ๊ฒ ์ค์ตํ๋ ๋๋์ผ๋ก ์ค๋ช ํ์์ต๋๋ค. ์ด๋ฅผ ํตํด์ ๋ด์ฉ์ ๊ฐ๊ด์ ์ผ๋ก ์ดํดํ ์ ์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
![KS ํตํฉ ์ธ์ฆ ๋ค์ด์ด๊ทธ๋จ](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ1-1.png)
![GKE ํตํฉ ์ธ์ฆ ๋ค์ด์ด๊ทธ๋จ (์ฐจ์ด์ ์ด ์๋ต๋๋ค!!!)](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ1-2.png)
ํ ์คํธ๋ฅผ ์ํ ์ฌ์ ์ค๋น ์์
์ง๋ ๋ฒ ๊ฒ์๊ธ์ ํตํด์ ํคํด๋ฝ์ ๋ํด ์ด๋์ ๋ ์ดํดํ์ จ์ ๊ฒ์ผ๋ก ์๊ฐํฉ๋๋ค.
์ด์ ์ค์ ๋ก ๋ฉํฐ ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์ ์๋ ์ธ์ฆ๋ค์ ํคํด๋ฝ์ ํตํด์ ํตํฉ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด์, ์ค์ต์ ํตํด ๋ฐฐ์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ํตํฉ ์ธ์ฆ์ ๊ตฌ์ฑํ๊ธฐ ์ํด์ ์์ ๋ณด์ฌ๋๋ ธ๋ ๋ค์ด์ด๊ทธ๋จ๊ณผ ๊ฐ์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ๋ฐฐํฌํ๊ณ , ํคํด๋ฝ์ ๊ตฌ์ฑํ๊ธฐ ์ํด์ ๊ธด ์ฌ์ ์์ ์ด ํ์ํฉ๋๋ค.
1. ์ฝ๋ ๋ฐ ์ฌ์ ํ์ ๊ตฌ์ฑ ํ์ธ
์ค์ต์ ์งํํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ์คํฌ๋ฆฝํธ ํ์ผ์ Git clone์ ํตํด์ ๋ด๋ ค๋ฐ์ต๋๋ค.
git clone https://github.com/sysnet4admin/IaC.git
#
# Cloning into 'IaC'...
# remote: Enumerating objects: 2440, done.
# remote: Counting objects: 100% (688/688), done.
# remote: Compressing objects: 100% (282/282), done.
# remote: Total 2440 (delta 394), reused 673 (delta 379), pack-reused 1752
# Receiving objects: 100% (2440/2440), 17.93 MiB | 6.57 MiB/s, done.
# Resolving deltas: 100% (1337/1337), done.
Keycloak์ผ๋ก ์ด๋ํ ํ์ ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ด ๋๋ค.
cd IaC/Keycloak/
tree
#
# .
# โโโ oncloud-1.site
# โ โโโ Deploy-infra
# โ โ โโโ 1-1.deploy-gke-env-w-keycloak.sh
# โ โ โโโ 1-2.deploy-gke-ingress-4-https-keycloak.yaml
# โ โ โโโ 1-3.clientconfig-gke-keycloak-w-oidc.yaml
# โ โ โโโ 2-1.deploy-eks-env-only.sh
# โ โ โโโ eksctl-config
# โ โ โ โโโ keycloak-w-oidc.yaml
# โ โ โโโ planB-keycloak-by-helm.yaml
# โ โโโ EKS
# โ โ โโโ 1.clusterrolebinding-4-devops-group-as-admin.yaml
# โ โ โโโ 2-oncloud-1.swtich-ctx-hoon-to-soojin.sh
# โ โ โโโ 3.set-cred-4-oidc-user.sh
# โ โโโ GKE
# โ โ โโโ 1.clusterrolebinding-4-devops-group-as-admin-NOTWORK.yaml
# โ โ โโโ 2-hoon.clusterrolebinding-4-devops-user-as-admin.yaml
# โ โ โโโ 2-soojin.clusterrolebinding-4-devops-user-as-admin.yaml
# โ โโโ kubelogin-installer.sh
# โโโ oncloud-2.site
# โ โโโ Deploy-infra
# โ โ โโโ 1-1.deploy-gke-env-w-keycloak.sh
# โ โ โโโ 1-2.deploy-gke-ingress-4-https-keycloak.yaml
# โ โ โโโ 1-3.clientconfig-gke-keycloak-w-oidc.yaml
# โ โ โโโ 2-1.deploy-eks-env-only.sh
# โ โ โโโ eksctl-config
# โ โ โ โโโ keycloak-w-oidc.yaml
# โ โ โโโ planB-keycloak-by-helm.yaml
# โ โโโ EKS
# โ โ โโโ 1.clusterrolebinding-4-devops-group-as-admin.yaml
# โ โ โโโ 2-oncloud-2.swtich-ctx-hoon-to-soojin.sh
# โ โ โโโ 3.set-cred-4-oidc-user.sh
# โ โโโ GKE
# โ โ โโโ 1.clusterrolebinding-4-devops-group-as-admin-NOTWORK.yaml
# โ โ โโโ 2-hoon.clusterrolebinding-4-devops-user-as-admin.yaml
# โ โ โโโ 2-soojin.clusterrolebinding-4-devops-user-as-admin.yaml
# โ โโโ kubelogin-installer.sh
# โโโ prerequisite-install-tools.sh
# โโโ README.md
#
# 10 directories, 28 files
.Keycloak
๋๋ ํฐ๋ฆฌ์ ์๋ prerequisite-install-tools.sh
์
ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํฉ๋๋ค.
์ฐธ๊ณ
์ด ๋ถ๋ถ์ ์คํํ๋ค๊ณ ํด์ ๋ชจ๋ ํ์ ๊ตฌ์ฑ์ด ์๋ฃ๋์ง ์์ต๋๋ค. ํ๊ฒฝ์ ๋ฐ๋ผ ๋ ํ์ํ ๋ด์ฉ์ด ์์ ์ ์์ต๋๋ค.
cat prerequisite-install-tools.sh
.
prerequisite-install-tools.sh
#!/usr/bin/env bash
# krew
(
set -x; cd "$(mktemp -d)" &&
OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
KREW="krew-${OS}_${ARCH}" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
tar zxvf "${KREW}.tar.gz" &&
./"${KREW}" install krew
)
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
# eskctl
brew install eksctl
# kubelogin for GCP
gcloud components install kubectl-oidc
# kubelogin for AWS
kubectl krew install oidc-login
ํด๋น ์คํฌ๋ฆฝํธ๋ ์ค์ต์ ํ์ํ gcloud
, eksctl
, krew
๋ฅผ ์ค์น ๋๋ ๋ด๋ ค๋ฐ์ต๋๋ค. ๋ฌผ๋ก ์ด๊ฒ ์ด์ธ์๋ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ ๋ง์ ์ฌ์ ์ค๋น ์์
์ด ํ์ํ ์ ์์ต๋๋ค. ์ฌ์ ์ ํ์ํ ๋ด์ฉ๋ค์ด ์๋ค๋ ๊ฒ์ ๋ช
์์ ์ผ๋ก ์๋ฆฌ๊ธฐ ์ํด์ ์์ฑ๋ ์คํฌ๋ฆฝํธ๋ผ๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
2. Keycloak์ ์ ๊ทผ์ ์ํ HTTPS ์ธ์ฆ์์ ํผ๋ธ๋ฆญ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋ ๋๋ฉ์ธ์ ๊ตฌ์ฑ
์ด ์ค์ต์์ ํคํด๋ฝ ํตํฉ ์ธ์ฆ์ ํ์ ์ถฉ์กฑ ์กฐ๊ฑด์ธ HTTPS ํํ ํ ์ฝ๋ก ํคํด๋ฝ์ผ๋ก ์ ์ํ ์ ์๊ฒ ์กฐ์นํ๊ธฐ ์ํด์, ๊ตฌ๊ธ ํด๋ผ์ฐ๋์์ ๊ด๋ฆฌํ๋ ๊ด๋ฆฌํ ์ธ์ฆ์(MANAGE CERTIFICATE)๋ฅผ ํตํด ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๋๋ก ์ฒ๋ฆฌํ ๊ฒ์ ๋๋ค.
๊ตฌ๊ธ์์ ๊ด๋ฆฌํ๋ ๊ด๋ฆฌํ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ์ํ ๊ฒ์ด ํผ๋ธ๋ฆญ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋ ๋๋ฉ์ธ์ ๋๋ค.์ด์ ๊ฐ์ด ํผ๋ธ๋ฆญ ํด๋ผ์ฐ๋ ์๋น์ค๋ฅผ ์ด์ฉํ์ฌ ๋๋ฉ์ธ์ ํตํ HTTPS ์ธ์ฆ์ ๋ฐ๊ธ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ ๊ฒ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๋ ๋ฐฉ์์ DNS Authorization์ด๋ผ๊ณ ํฉ๋๋ค. AWS ์ด์ฉ์์๋ Route53์ ์ด์ฉํ๋ฉด ๋ฉ๋๋ค.
๋๋ฉ์ธ์ ํธ์คํ
์ผ์ด์, ๊ฐ๋น์, goDaddy ์ ๊ฐ์ ๋๋ฉ์ธ ์ด๋ฆ ๋ฑ๋ก๊ธฐ๊ด ์
์ฒด ํํ์ด์ง์์ ์ผ์ ๊ธฐ๊ฐ ๋์ '์๋(lease)'ํ ์ ์์ต๋๋ค. 2ํธ์์๋ oncloud-1.site
๋ผ๋ ๋๋ฉ์ธ์ ์ฌ์ฉํด์ ์งํํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋๋ฉ์ธ์ ๊ตฌ๋งคํ์๋ค๋ฉด ๊ตฌ๊ธ ํด๋ผ์ฐ๋์ Cloud DNS ์๋น์ค์ ์๋์ ๊ฐ์ด ํ์ฌ ๋๋ฉ์ธ์ ์ฐ๊ฒฐํด์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
![๊ธ ํด๋ผ์ฐ๋์ Cloud DNS ๋๋ฉ์ธ ๋ฑ๋ก ๊ทธ๋ฆฌ๊ณ ๊ฐ๋น์ ํ๋ฉด์ ๋๋ฉ์ธ ๋ค์ ์๋ฒ](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ2.png)
3. ํคํด๋ฝ์ด ๋ฐฐํฌ๋ GKE ํด๋ฌ์คํฐ ์์ฑ์ ์งํํ๊ณ ์ดํ์ ํคํด๋ฝ์ ์์ฑ๋ GKE์ ๋ฐฐํฌ
์ ๋จ๊ณ๋ฅผ ์ ๋ถ ์งํํ๋ค๋ฉด ์ด์ ํคํด๋ฝ์ ๋ฐฐํฌํ GKE ํด๋ฌ์คํฐ ๋ฐฐํฌ๋ฅผ ์ํด์ 1๋ฒ ๋จ๊ณ์์ ๋ด๋ ค๋ฐ์ ๋๋ ํฐ๋ฆฌ์์ ./oncloud-1.site/Deploy-infra
๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํฉ๋๋ค. ๋ํ๋ ๋๋ ํฐ๋ฆฌ์์ 1-1.deploy-gke-env-w-keycloak.sh
์
ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋๋ก ํ๊ฒ ์ต๋๋ค. ์ด ์
ธ ์คํฌ๋ฆฝํธ๋ ์
ธ ํ๊ฒฝ ๋ณ์๋ก ๊ตฌ๊ธ ํด๋ผ์ฐ๋ ํ๋ก์ ํธ, GKE๊ฐ ๋ฐฐํฌ๋๋ ์ง์ญ(Zone), GKE์ ํด๋ฌ์คํฐ ์ด๋ฆ๊ณผ ํด๋ฌ์คํฐ ๋ฒ์ ์ ์
๋ ฅ๋ฐ์์ ๊ตฌ๊ธ ํด๋ผ์ฐ๋๋ก ๊ณต์ธ IP๋ฅผ ์์ฑํ๊ณ , GKE ํด๋ฌ์คํฐ๋ฅผ ์
๋ ฅ ๊ฐ์ ๋ง๊ฒ ์ค์ ํ ๋ค์ helm์ ํตํ์ฌ ํคํด๋ฝ์ ๋ฐฐํฌํ๋๋ก ์ค์ ํ๊ณ ์์ต๋๋ค.์ฝ๋ ๋ด์ฉ ์ค ์ผ๋ถ๋ฅผ ํ์ธํด๋ณด๋ฉด์ GKE ํด๋ฌ์คํฐ ์์ฑ๋ถํฐ ํคํด๋ฝ์ด ๋ฐฐํฌ๋๋์ง ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
Note
์ฌ๊ธฐ์๋ถํฐ ์ค๋ช ๋๋ ์ฝ๋๋ ์ผ๋ถ๋ง ๋ฐ์ทํด์ ์ค๋ช ํ๋ ๋ฐฉ์์ผ๋ก ์งํ๋๊ธฐ ๋๋ฌธ์ ์ ๋ค์ ์ฝ๋๋ ์๋ต๋์ด ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋ฐ๋ผ์ ์ ์ฒด ์ฝ๋๋ฅผ ์ดํด๋ณด์๊ณ ํ๋ค๋ฉด, ํด๋น ํ์ผ์ ์ง์ ์ด์ด์ ๋ณด์๋ ๊ฒ์ ๊ถ์ฅ๋๋ฆฝ๋๋ค.
# static ingress IP. It will attach to Domain
gcloud compute addresses create hj-keycloak-oncloud-1-static-ip \
--global \
--ip-version IPV4
ํคํด๋ฝ์ด ์ฌ์ฉํ ๊ณต์ธ IP๋ฅผ ๋ฏธ๋ฆฌ ์์ฝํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ์์ฝ๋ ๊ณต์ธ IP๋ ์ถํ ํคํด๋ฝ์ด ๋ฐฐํฌ๊ฐ ์๋ฃ๋ ๋ค์์ GKE์ ๋ด์ฅ ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด์ HTTPS ์ ์์ด ๊ฐ๋ฅํ ๋๋ฉ์ธ๊ณผ IP ์ฃผ์ ๋งคํ์ด ์งํ๋ฉ๋๋ค.
# Deploy GKE cluster for keycloak
gcloud container clusters create $KUBE_CLUSTER \
--num-nodes=3 \
--zone=${GCP_ZONE} \
--no-enable-autorepair \
--no-enable-autoupgrade \
--location-policy=BALANCED \
--enable-identity-service \
--cluster-version="${CLUSTER_VERSION}" \
--release-channel=None \
--labels=keycloak=oncloud-1
GKE ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ๋ ๋ช
๋ น์
๋๋ค. ์ด๋ GKE์์ ํคํด๋ฝ ํตํฉ ์ธ์ฆ์ ๊ตฌ์ฑํ๊ธฐ ์ํด --enable-identity-service
์ต์
์ ์ฌ์ฉํด์ ์ธ๋ถ OIDC๋ฅผ ํตํ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์ธ์ฆ์ด ๊ฐ๋ฅํ๋๋ก ์ค์ ํฉ๋๋ค. ๋ํ GKE ํด๋ฌ์คํฐ์ ๊ฒฝ์ฐ ์๋์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค ๋ฒ์ ์ด ์
๊ทธ๋ ์ด๋๋๋ ๊ธฐ๋ฅ์ด ์กด์ฌํฉ๋๋ค. ์ด๋ ์ค์ต์ ๊ตฌ์ฑํ์ ๋ ๋ฒ์ ์ ๋ฐ๋ฅธ ์ฌ์ด๋ ์ดํํธ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฒ์ ์๋ ์
๊ทธ๋ ์ด๋๊ฐ ์งํ๋์ง ์๋๋ก --no-enable-autorepair
, --no-enable-autoupgrade
์ต์
์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
# Deploy keycloak
helm install keycloak oci://registry-1.docker.io/bitnamicharts/keycloak \
--set auth.adminUser=admin \
--set auth.adminPassword=admin \
--set production=true \
--set proxy=edge \
--version 17.1.1
GKE ํด๋ฌ์คํฐ๊ฐ ์์ฑ๋ ๋ค์ kubeconfig๋ฅผ gcloud ๋ช
๋ น์ผ๋ก ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ค์ OCI ์ฐจํธ ์ ์ฅ์๋ก๋ถํฐ ํคํด๋ฝ์ ์ค์นํฉ๋๋ค. ์ด๋ ๊ฒ ํคํด๋ฝ์ ์ค์นํ๊ฒ ๋๋ฉด ํคํด๋ฝ์ด ๋์ํ๋ ๋ฐ ํ์ํ ํฌ์คํธ๊ทธ๋ ์คํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํคํด๋ฝ์ด ๋ฐฐํฌ๊ฐ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๋ฐฐํฌ๋ ํคํด๋ฝ์ ์ด๊ธฐ ID์ ํจ์ค์๋๋ admin
์
๋๋ค.
4. HTTPS ์ธ์ฆ์๋ฅผ GKE ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ์์ ์ฌ์ฉํ ์ ์๋๋ก ์ฐ๊ฒฐ ์์ ์ ์งํ
ํ์ฌ ๋๋ ํฐ๋ฆฌ์ 1-2.deploy-gke-ingress-4-https-keycloak.yaml
์ kubectl create
์ ํตํด ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ๋ฅผ ๋ฐฐํฌํฉ๋๋ค. ์ด ๋ Ingress
์ ํจ๊ป ManagedCertificate
, FrontendConfig
์ ๊ฐ์ ๊ตฌ๊ธ ํด๋ผ์ฐ๋์ ์ปค์คํ
์ค๋ธ์ ํธ๊ฐ ๊ฐ์ด ๋ฐฐํฌ๋ฉ๋๋ค. ๋จผ์ ManagedCertificate
์ ๋ด์ฉ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
name: keycloak-managed-cert
spec:
domains:
- "oncloud-1.site"
oncloud-1.site
๋๋ฉ์ธ์ ๊ตฌ๊ธ์ด ๊ด๋ฆฌํ๋ ์ธ์ฆ์๋ฅผ ๋ง๋ค๋ผ๋ ๋ด์ฉ์ ๋ด๊ณ ์์ต๋๋ค. ์ด๋ spec.domains
์๋๋ก ์ ์ฉ์ด ๋์ด์ผ ํ๋ ๋๋ฉ์ธ์ ์
๋ ฅํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ oncloud-1.site
๋ฅผ ์ฌ์ฉํ๋๋ก ํ๊ฒ ์ต๋๋ค. ์ด๋ ๊ฒ ๊ตฌ์ฑํ๊ฒ ๋๋ฉด ์ธ๋ถ์์ ํคํด๋ฝ ์ ์ ์ oncloud-1.site
๋ผ๋ ๋๋ฉ์ธ์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ค์์ผ๋ก FrontendConfig
์ ๋ด์ฉ์ ํ์ธํ๊ฒ ์ต๋๋ค.
apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
name: keycloak-config
spec:
redirectToHttps:
enabled: true
ํคํด๋ฝ์ ์ฒซ ํ๋ฉด(ํ๋ก ํธ์๋)์ ์ ์ ์ ์ฌ์ฉํ ๋คํธ์ํฌ ์ค์ ์ ์ ๋ ฅํ๋ ์ค๋ธ์ ํธ์ ๋๋ค. ์ฌ๊ธฐ์๋ HTTP ํ๋กํ ์ฝ๋ก ์ ์ ์ ์๋์ผ๋ก HTTPS๋ก ๋ฆฌ๋ค์ด๋ ํธ๋ฅผ ์ฒ๋ฆฌํ๋ผ๋ ๋ด์ฉ์ ์ค์ ์ด ๋์ด ์์ต๋๋ค.
์ค์ ์ธ๊ทธ๋ ์ค(Ingress)๊ฐ ์์ฑ๋๋ ๋ถ๋ถ์ ๋๋ค.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: keycloak-ingress
annotations:
spec.ingressClassName: "gce"
kubernetes.io/ingress.global-static-ip-name: "hj-keycloak-oncloud-1-static-ip"
networking.gke.io/managed-certificates: "keycloak-managed-cert"
networking.gke.io/v1beta1.FrontendConfig: "keycloak-config"
spec:
defaultBackend:
service:
name: keycloak
port:
number: 80
์ด์ ๊ฐ์ ์ค์ ์ ingress
์ค๋ธ์ ํธ์์ ์ ๋ํ
์ด์
์ผ๋ก ์ฐธ์กฐํด, GKE ๋ด๋ถ ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด ํคํด๋ฝ์ ์ธ๋ถ์์ HTTPS ์ ์ํ ์ ์๋๋ก ํ๋ ๊ฒ์
๋๋ค. ์ ๊ณผ์ ์ ํตํด์ ํคํด๋ฝ์ ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ ๊ตฌ๊ธ์ด HTTPS ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๋ ๋ฐ 30๋ถ์์ 2์๊ฐ ์ ๋๊ฐ ์์๋ฉ๋๋ค.
5. ํคํด๋ฝ์ ์ ๊ทผํด์ ๊ตฌ๊ธ OIDC์ ์ ๊ทผํด์ ์ธ์ฆ์ ์ฒ๋ฆฌํ ์ ์๋ ์ค์ ์ ์งํ
๋จผ์ GKE์ ๋ฐฐํฌ๊ฐ ์๋ฃ๋ ํคํด๋ฝ์ ์ฃผ์์ธ [https://oncloud-1.site
] ๋ก ์ ์ํด๋ณด๊ฒ ์ต๋๋ค.
์ ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ด ๋ํ๋ฉ๋๋ค. ๋ํ๋ ํ๋ฉด์์ ์์ด๋๋ admin
,๋น๋ฐ๋ฒํธ๋ admin
์ ์
๋ ฅํ๋ฉด ๋ฐฐํฌ๋ ํคํด๋ฝ์ ์ ์ํ ์ ์์ต๋๋ค.
![ํด๋ฝ ๋ก๊ทธ์ธ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ3.png)
์ ์์ด ๋์๋ค๋ฉด ์ข์ธก ๋ฉ๋ด์ Realm์ด๋ผ๊ณ ํ๋ ๋จ์๋ฅผ ์ค์ ํ๋ ๋๋กญ๋ค์ด UI๊ฐ ์์ต๋๋ค. ํ์ฌ๋ master
๊ฐ์ผ๋ก ์ง์ ์ด ๋์ด์์ต๋๋ค. ์ด Realm์ ์ฟ ๋ฒ๋คํฐ์ค์ ๋ค์์คํ์ด์ค์ฒ๋ผ ํคํด๋ฝ ์ฌ์ฉ์, ์ธ์ฆ ๋์ ์ ํ๋ฆฌ์ผ์ด์
๊ทธ๋ฆฌ๊ณ ์ญํ ๊ณผ ๊ฐ์ ๊ฒ๋ค์ ๊ด๋ฆฌํ๋ ๊ณต๊ฐ์ด๋ผ๊ณ ์ดํดํ์๋ฉด ๋ฉ๋๋ค.
์ด ํ๋ฉด์์ ์ฟ ๋ฒ๋คํฐ์ค ํตํฉ ์ธ์ฆ์ ์ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ ๋ค๋ฅธ Realm๋ฅผ ์์ฑํ๊ธฐ ์ํด์ [Create Realm]
์ ๋๋ฆ
๋๋ค.
![ํด๋ฝ ๋ง์คํฐ ๋ ๋ฆ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ4.png)
Create realm ํ๋ฉด์์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ํตํฉ ์ธ์ฆ์ ์ํด์ Realm name์ kubernetes
๋ฅผ ์
๋ ฅํ๊ณ [Create]
๋ฒํผ์ ๋๋ฌ kubernetes
๋ผ๋ realm์ ์์ฑํ๋๋ก ํ๊ฒ ์ต๋๋ค.
![ํด๋ฝ kubernetes Realm์ ๋ง๋๋ ์ค์ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ5.png)
๋ค์์ผ๋ก ํคํด๋ฝ์์ ์ธ์ฆ์ ๋์์ด ๋๋ ๋จ์๋ฅผ ์ง์ ํ๋ Client๋ฅผ ์ค์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด ํคํด๋ฝ ํ๋ฉด ์ข์ธก์ ์์นํ Clients
๋ฉ๋ด๋ก ์ด๋ํ๊ฒ ์ต๋๋ค. ๋ํ๋๋ ํ๋ฉด์์ Create client
๋ฉ๋ด๋ฅผ ๋๋ฌ์ ์๋ก์ด Client๋ฅผ ์์ฑํ๋๋ก ํ๊ฒ ์ต๋๋ค.
![ํด๋ฝ ์ข์ธก ๋ฉ๋ด์์ Clients๋ฅผ ์ ํํ๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ6.png)
Client๋ฅผ ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ด ๋ํ๋ฉ๋๋ค.
ํด๋ผ์ด์ธํธ๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์ธ์ฆ์ ์ฌ์ฉ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ถ์ ์ํด์ ํด๋ผ์ด์ธํธ ID์ ์ด๋ฆ์ ๋ชจ๋ k8s-auth
๋ก ์ค์ ํฉ๋๋ค. ๋ค์์ผ๋ก, ์ธ์ฆ ์ ์ฌ์ฉํ ํด๋ผ์ด์ธํธ ํ์
์ OpenID Connect๋ก ์ค์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉํ๋ OpenID Connect๋ JWT(Json Web Token)์ ์ด์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐ์์ ์ฌ์ฉ์์ ์ ์์ ํ์ธํ๋ ์ธ์ฆ ํ๋กํ ์ฝ์
๋๋ค. ๋ง์ง๋ง์ผ๋ก Always display in UI ๊ฐ์ On์ผ๋ก ์ค์ ํ ๋ค์ [Next]
๋ฅผ ๋๋ฌ ๋ค์์ผ๋ก ์ด๋ํ๊ฒ ์ต๋๋ค.
![๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ํตํฉ ์ธ์ฆ์ ์ํ Client ์ค์ - ์ด๋ฆ ์ค์ ](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ7.png)
Client์ ๋ํด์ ์ธ์ฆ๊ณผ ์ธ๊ฐ ์ค์ ์ ๋ชจ๋ ํ์ฑํํ์ฌ์ผ ํตํฉ ์ธ์ฆ์ด ๊ฐ๋ฅํ๋ฏ๋ก, Client Authentication ๋ฐ Client Authorization ๋ชจ๋ <์ผ๋ก>[On]
์ผ๋ก ์ ํํ ๋ค์ [Next]
๋ฅผ ๋๋ฌ์ ๋ค์์ผ๋ก ์ด๋ํ๊ฒ ์ต๋๋ค.
![๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ํตํฉ ์ธ์ฆ์ ์ํ Client ์ค์ - ์ธ์ฆ/์ธ๊ฐ ์ต์
์ ์ค์ ํ๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ8.png)
ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ ์ฌ์
์(IdP, Identity provider)๋ฅผ ํตํ์ฌ ์ธ์ฆ์ด ์๋ฃ๋ ๋ค์์, id ์ ๋ณด๋ฅผ ์ ๋ฌํ ๊ณณ์ ์ค์ ํ๊ธฐ ์ํ ํ๋ฉด์
๋๋ค. ์ฌ๊ธฐ์ Valid redirect URIs๋ฅผ [http://localhost:8000
] ๊ทธ๋ฆฌ๊ณ [http://localhost:18000
]์ผ๋ก ์ค์ ํ ๋ค์ [Save]
๋ฅผ ๋๋ฌ์ Client ์์ฑ์ ์๋ฃํฉ๋๋ค.
![๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ํตํฉ ์ธ์ฆ์ ์ํ Client ์ค์ - ์ธ์ฆ/์ธ๊ฐ ์ต์
์ ์ค์ ํ๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ9.png)
์ด๋ฒ ์ค์ต์์๋ ์ฌ์ฉ์ ์ ๋ณด์ ๊ธฐ๋ณธ ๊ทธ๋ฃน ์ ๋ณด๋ฅผ ํจ๊ป ํฌํจ์์ผ์ ์ฟ ๋ฒ๋คํฐ์ค ์ธ์ฆ์ ์ฒ๋ฆฌํ๊ณ ์ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ์ด์ ๋ ์ฟ ๋ฒ๋คํฐ์ค์์ ์ง์ RBAC์ ํตํด์ ์ธ๊ฐ๋ฅผ ํ๊ธฐ ์ํด์์ด๋ฉฐ, RBAC์ ๊ธฐ๋ณธ ๊ทธ๋ฃน ๋จ์๋ก ํ๋ ์ด์ ๋ ํน๋ณํ ์ค์ ์ ํ์ง ์์๋ ๊ธฐ๋ณธ ์ ์ฉ๋์ด ์ฌ์ฉ์ด ํธ๋ฆฌํ๊ธฐ ๋๋ฌธ์
๋๋ค.์์ ๋ด์ฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ [Client scopes]
ํญ ๋ฉ๋ด๋ก๋ก ์ด๋ํฉ๋๋ค.
๋จผ์ Assigned client scope ๋ชฉ๋ก์์ k8s-auth-dedicated
๋ฅผ ํด๋ฆญํฉ๋๋ค.
![JWT์ ํ๋๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด Client scopes๋ก ์ด๋ํ๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ10.png)
group
ํ๋๋ฅผ JWT์ ์ถ๊ฐํ๊ธฐ ์ํด์ Add mapper ๋๋กญ๋ค์ด ๋ฒํผ์ [From predefined mappers]
๋ฅผ ํด๋ฆญํฉ๋๋ค.
![JWT์ ํ๋๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด Add mapper > From predefined mappers์ ์ ํํ๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ11.png)
Add predefined mappers ํ์
(๋๋ ๋ชจ๋ฌ)์ด ์ด๋ฆฝ๋๋ค. ์ด ์ค groups
๋ฅผ ์ ํํ๊ณ [Add]
๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
์ด 'groups' mapper๋ JWT groups ํค์ ์ฌ์ฉ์์ Realm Role์ ๋งคํํ๋ ์ญํ ์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด์ ์ฌ์ฉ์์ Realm role์ด JWT์ groups ์ ๋ณด๋ก ์ถ๊ฐ๊ฐ ๋ฉ๋๋ค.
![JWT์ ํ๋์ groups์ ์ถ๊ฐํ๊ธฐ ์ํด groups๋ฅผ ์ ํํ๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ12.png)
๋ค์์ผ๋ก ์ฌ์ฉ์์๊ฒ ์ ์ฉํ Realm Role์ ๋ง๋ค๊ธฐ ์ํด์ ํคํด๋ฝ ์ข์ธก ๋ฉ๋ด์ ์์นํ Realm roles ๋ฉ๋ด๋ก ์ด๋ ํ [Create Role]
๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
![ํคํด๋ฝ ์ฌ์ฉ์์๊ฒ Role์ ๋ถ์ฌํ๊ธฐ ์ํด์ <FontIcon icon="iconfont icon-select"/>์ ๋๋ฅด๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ13.png)
[Create Role]
์ ๋๋ฅด๋ ํ๋ฉดJWT์ group ํ๋๋ก ์ค์ ํ๋ ๊ฐ์ devops๋ก ์ง์ ํ๊ธฐ ์ํด์ Realm role์ ์ด๋ฆ์ devops ๋ก ์ค์ ํ๊ณ Save๋ฅผ ๋๋ฆ ๋๋ค.
![ํคํด๋ฝ ์ฌ์ฉ์์๊ฒ Role์ ๋ถ์ฌํ๊ธฐ ์ํด์ Role์ ๋ง๋๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ14.png)
ํคํด๋ฝ์์ ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํ์์ ๋ ์ฌ์ฉ์ ๊ด๋ฆฌ๋ฅผ ์ํ ๊ทธ๋ฃน์ด ํ์ํฉ๋๋ค. ์ข์ธก์ Groups ๋ฉ๋ด๋ก ์ด๋ํด์ devops
๊ทธ๋ฃน์ ๋ง๋ค๋๋ก ํ๊ฒ ์ต๋๋ค.
![ํคํด๋ฝ ์ฌ์ฉ์๋ฅผ ๋ชจ์ผ๊ธฐ ์ํ Group์ ๋ง๋ค๊ธฐ ์ํด <FontIcon icon="iconfont icon-select"/>์ ๋๋ฅด๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ15.png)
[Create Group]
์ ๋๋ฅด๋ ํ๋ฉดRealm Role๊ณผ ํผ์ ์ด ์๊ธฐ์ง ์๋๋ก ๊ทธ๋ฃน์ ์ด๋ฆ์ devops-group
์ผ๋ก ์ค์ ํ๊ณ [Create]
๋ฅผ ๋๋ฆ
๋๋ค.
![ํคํด๋ฝ ๊ทธ๋ฃน์ ์์ฑํ๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ16.png)
devops-group
ํคํด๋ฝ ๊ทธ๋ฃน์ ์์ฑํ๋ ํ๋ฉดdevops-group
๊ทธ๋ฃน์ด ์์ฑ๋์๋ค๋ฉด, ๊ทธ๋ฃน ๋จ์๋ก ์ญํ ์ ๋ถ์ฌํด devops-group์ ์๋ ์ฌ๋๋ค์ devops ์ญํ ์ ๊ฐ์ง ์ ์๋๋ก'Role mapping' ํญ์ผ๋ก ์ด๋ํ ํ, Assign role๋ฅผ ๋๋ฆ
๋๋ค.
![ํคํด๋ฝ ๊ทธ๋ฃน์ role์ ํ ๋น ํ๊ธฐ ์ํด์ Assign role์ ๋๋ฅด๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ17.png)
devops-group
ํคํด๋ฝ ๊ทธ๋ฃน์ role์ ํ ๋น ํ๊ธฐ ์ํด์ Assign role์ ๋๋ฅด๋ ํ๋ฉด์์ ์์ฑํ devops ์ญํ ์ devops-group
๊ทธ๋ฃน์ ์ค์ ํ๊ธฐ ์ํด์ devops ์ฒดํฌ๋ฐ์ค๋ฅผ ์ ํํ ๋ค์์ Assign์ ๋๋ฆ
๋๋ค.
![ํคํด๋ฝ ๊ทธ๋ฃน์ devops role์ ํ ๋นํ๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ18.png)
devops-group
ํคํด๋ฝ ๊ทธ๋ฃน์ devops role์ ํ ๋นํ๋ ํ๋ฉด์ด ๊ณผ์ ์ ํตํด์ ์ฐ๋ฆฌ๋ ํตํฉ ์ธ์ฆ์ ํ์ํ ์ธ์ฆ ์ค์ ์ ์๋ฃํ์์ต๋๋ค. ๋ค์์ผ๋ก๋ ์ค์ต ํธ์๋ฅผ ์ํ์ฌ ํคํด๋ฝ ์ธ๋ถ๋ก๋ถํฐ ์ฌ์ฉ์๊ฐ ํคํด๋ฝ์ ๋ฑ๋ก์ด ๋ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก devops-group
์ ์ถ๊ฐ๋๋๋ก ์ค์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ข์ธก ํ๋จ์ Realm settings ๋ฉ๋ด ์๋ User registration ํญ์ผ๋ก ์ด๋ํฉ๋๋ค. ๋ํ๋ ํ๋ฉด์์ Default groupsํญ์ ์ ํ ํ๊ณ Add groups๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
![kubernetes Realm์ ๊ธฐ๋ณธ ๊ทธ๋ฃน์ ์ค์ ํ๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ19.png)
์ต์ด ์ฌ์ฉ์๊ฐ devops-group
๊ทธ๋ฃน์ ๋ค์ด๊ฐ ์ ์๋๋ก devops-group
์ ์ ํ ํ Add๋ฅผ ํด๋ฆญํฉ๋๋ค.
![ํคํด๋ฝ ๊ทธ๋ฃน์ ๊ธฐ๋ณธ ๊ทธ๋ฃน์ผ๋ก ์ค์ ํ๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ20.png)
devops-group
ํคํด๋ฝ ๊ทธ๋ฃน์ ๊ธฐ๋ณธ ๊ทธ๋ฃน์ผ๋ก ์ค์ ํ๋ ํ๋ฉดAdd ๋ฒํผ์ ๋๋ฅธ ํ ์๋์ ๊ฐ์ด Realm์ ์๋กญ๊ฒ ์ถ๊ฐ๋๋ ์ฌ์ฉ์์ ๋ํด์ devops-group
์ ์ถ๊ฐ๋๋๋ก ์ค์ ํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
![ํคํด๋ฝ ๊ทธ๋ฃน์ด ๊ธฐ๋ณธ ๊ทธ๋ฃน์ผ๋ก ์ค์ ๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ21.png)
devops-group
ํคํด๋ฝ ๊ทธ๋ฃน์ด ๊ธฐ๋ณธ ๊ทธ๋ฃน์ผ๋ก ์ค์ ๋ ํ๋ฉด6. ๊ตฌ๊ธ ํด๋ผ์ฐ๋์์ ํคํด๋ฝ์ ์ธ๋ถ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋๋ก ๊ตฌ์ฑ ์ถ๊ฐ
์์ [๊ทธ๋ฆผ 1] ๋ค์ด์ด๊ทธ๋จ์์ ๊ตฌ๊ธ API๋ฅผ ํตํด์ ์ฌ์ฉ์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ ๊ตฌ๊ธ API๋ฅผ ํตํด ๊ตฌ๊ธ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํคํด๋ฝ์ ์ ์ฅ์ํค๋ ๊ธฐ๋ฅ์ธ Identity providers๋ฅผ ์ฌ์ฉํด์ ์ฐ๋์ ์งํํฉ๋๋ค. ์ด ์ฐ๋์ ๊ตฌ์ฑํ๊ธฐ ์ํด์ ๋จผ์ ๊ตฌ๊ธ API์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ์ค์ ํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์๊ตฌ๊ธ ํด๋ผ์ฐ๋ ์ฝ์์์ Google API & Services > Credentials ๋ฉ๋ด๋ก ์ด๋ํ์ฌ์ ์ฐ๋ ์ ๋ณด๋ฅผ ๋ฐ์ ํ ํคํด๋ฝ์์ ๊ตฌ๊ธ ๋ก๊ทธ์ธ์ ํตํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐ์ ์ ์๋๋ก ์ฒ๋ฆฌํ๊ฒ ์ต๋๋ค.
๊ตฌ๊ธ ํด๋ผ์ฐ๋ ์ฝ์ ์ด๋ํ์์ ๋ ์๋จ์ [+ CREATE CREDENTIALS]
๋ฅผ ํด๋ฆญํ๊ณ OAuth client ID๋ฅผ ์ ํํฉ๋๋ค.
![๊ตฌ๊ธ ํด๋ผ์ฐ๋ ์ฝ์์์ ๊ตฌ๊ธ API ์ฌ์ฉ์ ์ํ ์ค์ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ22.png)
Application type์ ํ์ฌ ํคํด๋ฝ์ด ์น์ผ๋ก ๋ฐฐํฌ๋์ด์์ผ๋ Web application์ผ๋ก ์ค์ ํ๊ณ , ์ด๋ฆ์ hj-keycloak-oncloud-1-cred
๋ก ์ค์ ํ๊ณ [Create]
๋ฅผ ๋๋ฆ
๋๋ค.
![ํคํด๋ฝ์์ ์ฌ์ฉํ ๊ตฌ๊ธ API ์ค์ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ23.png)
์์ฑ์ ์๋ฃํ๋ฉด keycloak Client์ Client ID์ Client Secret์ด ์ถ๋ ฅ๋ ํ์ ์ผ๋ก ๋ํ๋ฉ๋๋ค.
Client ID์ Client Secret์ ํคํด๋ฝ๊ณผ ๊ตฌ๊ธ ์ฌ์ฉ์ ์ธ์ฆ์ ๋ณด๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
์ด ๋ถ๋ถ์ ํ์ ์ผ๋ก ๋ณด๊ธฐ ์ด๋ ค์ฐ๋ฏ๋ก [๊ทธ๋ฆผ 25]๋ฅผ ํตํ ์ฐ๊ฒฐ ๊ตฌ์กฐ๋ก ๋ค์ ํ๋ฒ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ ๋ณด๋ฅผ ํ์ธํ์๋ค๋ฉด ๋ค์ ํคํด๋ฝ์์ Identity providers ๋ฉ๋ด๋ก ์ด๋ํ ํ, ๊ตฌ๊ธ์ ์ ํํด์ ๊ตฌ๊ธ ์ฌ์ฉ์๊ฐ ํคํด๋ฝ์ ๋ฑ๋ก๋ ์ ์๋๋ก ํฉ๋๋ค.
![๊ตฌ๊ธ API ์ฐ๋ํ๊ธฐ ์ํ ํคํด๋ฝ Identity providers ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ24.png)
๊ตฌ๊ธ ํด๋ผ์ฐ๋์ Google API & Services > Credentials ๋ฉ๋ด์์ ์์ฑํ Client ID(hj-keycloak-oncloud-1-cred
)์ Client ID์ Client secret ๊ฐ์ Google API & Services์ keycloak Client์์ ๋ช
์๋ Client ID์ Client secret ๊ฐ์ผ๋ก ์
๋ ฅํฉ๋๋ค.
- ํคํด๋ฝ > Identity providers ๋ฉ๋ด > Google
- General settings
- Client ID: ๊ตฌ๊ธ ํด๋ผ์ฐ๋ ์ฝ์ > Google API & Services > Credentials >
hj-keycloak-oncloud-1-cred
Client ID - Client Secret: ๊ตฌ๊ธ ํด๋ผ์ฐ๋ ์ฝ์ > Google API & Services > Credentials >
hj-keycloak-oncloud-1-cred
Client secret
- Client ID: ๊ตฌ๊ธ ํด๋ผ์ฐ๋ ์ฝ์ > Google API & Services > Credentials >
- General settings
์ฌ๊ธฐ์ Client ID์ Client Secret์ ๊ณต๊ฐํค์ ๊ฐ์ธํค ์ญํ ์ ํฉ๋๋ค. Client ID๋ ๊ณต๊ฐ๋์ด ์์ง๋ง, Client ID๋ฅผ ํตํด ๋ฐ์ JWT๋ฅผ ๋ณตํธํ ํ๋ ์ญํ ์ Client Secret์ด ์ํํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Client Secret์ ๊ณต๊ฐ๋๋ฉด ์ ๋๋ ์ค์ํ ์ ๋ณด์ ๋๋ค.
๊ตฌ๊ธ ํด๋ผ์ฐ๋์ Google API & Services > Credentials ๋ฉ๋ด์์ ์์ฑํ Client ID(hj-keycloak-oncloud-1-cred)์ Authorized redirect URIs ์ฃผ์๋ฅผKeycloak์ Redirect URI์ฃผ์๋ก ์ ๋ ฅํฉ๋๋ค.
- ๊ตฌ๊ธ ํด๋ผ์ฐ๋ ์ฝ์ > Google API & Services > Credentials ๋ฉ๋ด >
hj-keycloak-oncloud-1-cred
- Authorized redirect URIs
- URIs: ํคํด๋ฝ > Identity providers > Google > General settings์ โRedirected URIโ
- Authorized redirect URIs
์ด๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
![ํคํด๋ฝ๊ณผ ๊ตฌ๊ธ API ๊ฐ ์๋ก ํ์ํ ์ ๋ณด๋ฅผ ์
๋ ฅํ๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ25.png)
ํคํด๋ฝ๊ณผ ๊ตฌ๊ธ ํด๋ผ์ฐ๋ ์ฝ์์ ๋ํด์ ๊ฐ์ ์์ ๊ฐ์ด ๊ฐ์ด ์ค์ ํ ํ, ํคํด๋ฝ์ ์ค์ ์ ์ ์ฉํ๊ธฐ ์ํด [Save]
๋ฅผ ํด๋ฆญํฉ๋๋ค.
7. ์ด๋ฉ์ผ 2์ฐจ ์ธ์ฆ ๊ตฌ์ฑ
EKS ๋ฑ ๊ด๋ฆฌํ ์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค๋ค์ OIDC ๋ฐฉ์์ ์ธ์ฆ์ ๊ตฌ์ฑํ ๋, ์ฌ์ฉ์ ์ธ์ฆํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฉ์ผ ์ธ์ฆ์ ์๊ตฌํฉ๋๋ค. ์ด๋ฐ ๋ณด์ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๊ธฐ ์ํด์ ์ด๋ฉ์ผ ์ธ์ฆ ์ต์ ์ ์ผ ํ, ๊ตฌ๊ธ SMTP ์๋ฒ๋ฅผ ์ฌ์ฉํด์ ์ด๋ฉ์ผ์ ๋ณด๋ผ ์ ์๋ ์ค์ ์ ์งํํ๋๋ก ํ๊ฒ ์ต๋๋ค.
ํคํด๋ฝ์์ ์ด๋ฉ์ผ ์ธ์ฆ ๊ธฐ๋ฅ์ ํตํด ์ด๋ฉ์ผ ๋ฐ์ก์ ์ค์ ํ๊ธฐ ์ํด์, ํคํด๋ฝ ๊ด๋ฆฌ์์ ์ ๋ณด๋ฅผ ์ฑ์์ผํฉ๋๋ค. ๋ฐ๋ผ์ ์ฐ์ธก ์๋จ admin ๋๋กญ๋ค์ด์ ํด๋ฆญํ ๋ค์์ [Manage account]
๋ฅผ ๋๋ฆ
๋๋ค.
![์ด๋ฉ์ผ ์ธ์ฆ์ ์ค์ ํ๊ธฐ ์ํด์ ๋จผ์ <FontIcon icon="iconfont icon-select"/>๋ก ์ด๋ํ๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ26.png)
Manage account
๋ก ์ด๋ํ๋ ํ๋ฉด๋๋ฌ์ ๋ํ๋ ํ๋ฉด์์ ๊ด๋ฆฌ์ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด์ [Personal info]
๋ฅผ ํด๋ฆญํฉ๋๋ค.
![๊ด๋ฆฌ์ ์ด๋ฉ์ผ ์ค์ ์ ์ํ <FontIcon icon="iconfont icon-select"/>๋ก ์ด๋ํ๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ27.png)
[Personal Info]
๋ก ์ด๋ํ๋ ํ๋ฉด๊ด๋ฆฌ์์ ์ด๋ฉ์ผ๊ณผ ์ด๋ฆ์ ์
๋ ฅ ํ [Save]
๋ฅผ ํด๋ฆญํฉ๋๋ค.
- Email: ์ฌ์ฉ ๊ฐ๋ฅํ Email (์: Gmail, Naver ๋ฑ)
- First name: ์ด๋ฆ
- Last name: ์ฑ
![๊ด๋ฆฌ์ ์ด๋ฉ์ผ์ ํ์ํ ์ค์ ๊ฐ์ ์
๋ ฅ](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ28.png)
![๋ค์ ์งํํ๋ ์ด๋ฉ์ผ ๋ฐ์ก ์ค์ ์ ํ๊ธฐ ์ํด ์๋จ์ <FontIcon icon="iconfont icon-select"/>์ ํด๋ฆญํฉ๋๋ค.](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ29.png)
[Back to security admin console]
์ ํด๋ฆญํฉ๋๋ค.![์ค๋ฅธ์ชฝ ์๋จ์ admin์ ์ด๋ฆ์ด ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํฉ๋๋ค.](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ30.png)
์ฌ์ฉ์์ ์ด๋ฉ์ผ ์ธ์ฆ์ ์ฌ์ฉํ๊ธฐ ์ํด์ Realm settings ๋ฉ๋ด์ ๋ก๊ทธ์ธ ํญ์์ ์คํฌ๋กค์ ๋ด๋ ค Verify email ์ต์
์ [On]
์ผ๋ก ์ค์ ํฉ๋๋ค.
![์ด๋ฉ์ผ ํ์ธ ์ต์
์ ํ์ฑํ](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ31.png)
์ด๋ฉ์ผ ์ธ์ฆ์ ๋ํ ์ต์ ์ด ์ผ์ก๋ค๋ฉด, ์ด๋ฉ์ผ์ ๋ณด๋ด๊ธฐ ์ํ ์ค์ ์ ์งํํ๊ธฐ ์ํด์ Realm Settings์ Email ํญ์ผ๋ก ์ด๋ํฉ๋๋ค. Email ํญ์ Template ์ค์ ์ ์๋์ ๊ฐ์ด ๊ตฌ์ฑํฉ๋๋ค.
- ํคํด๋ฝ > Realm settings ๋ฉ๋ด > Email ํญ
- Template
- From *: ์ด๋ฉ์ผ ๊ณ์
- From display name: Keycloak Admin
- Reply to: ์ด๋ฉ์ผ ๊ณ์
- Reply to display name: Keycloak Admin
- Envelope from: Keycloak Admin
- Template
![์ด๋ฉ์ผ ๋ฐ์ก์ ์ํ Template๋ฅผ ์ค์ ํ๋ ํ๋ฉด](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ32.png)
Email ํญ ์๋ Connection & Authentication ์ค์ ์ ์๋์ ๊ฐ์ด ๊ตฌ์ฑํฉ๋๋ค.
- ํคํด๋ฝ > Realm settings > Email
- Connection & Authentication
- Host: smtp.gmail.com (๋ฐ์กํ๋ smtp์ ๋ฐ๋ผ ์ค์ ์ ๋ค๋ฆ)
- Port: 465
- Encryption
- Enable SSL: On
- Enable StartTLS: On
- Username: Gmail ๊ณ์ (๋ฐ์กํ๋ smtp์ ๋ฐ๋ผ ๋ค๋ฆ)
- Password: ๊ณ์ ๋น๋ฐ๋ฒํธ
- Connection & Authentication
![์
๋ ฅ ํ, <FontIcon icon="iconfont icon-select"/>๋ฅผ ๋๋ฌ์ ์ ์ฅํฉ๋๋ค.](https://yozm.wishket.com/media/news/2427/๊ทธ๋ฆผ33.png)
[Save]
๋ฅผ ๋๋ฌ์ ์ ์ฅํฉ๋๋ค.๊ธธ๊ณ ํ๋ํ ์ฌ์ ์์ ์ ์๋ฃํ์ต๋๋ค. ์์ผ๋ก๋ ํคํด๋ฝ์ Client๋ฅผ ํ์ฉํด ์ฌ๋ฌ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์ธ์ฆ์ OIDC๋ฅผ ํตํด์ ์ฒ๋ฆฌํ๋ ์ค์ต์ ์งํํ๋๋ก ํ๊ฒ ์ต๋๋ค.