์ ์ํ์ธ, ํตํฉ์ธ์ฆ๊ด๋ฆฌ ์คํ์์ค 'ํคํด๋ฝ'์ ์์๋ณด์
์ ์ํ์ธ, ํตํฉ์ธ์ฆ๊ด๋ฆฌ ์คํ์์ค 'ํคํด๋ฝ'์ ์์๋ณด์ ๊ด๋ จ
*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๋ถ์์ ์ดํด๋ณผ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํคํด๋ฝ์ ๋ํ ๊ฐ๋จํ ์๊ฐ
- IAM์ ์๋ฏธ
- ์ธ์ฆ๊ณผ ์ธ๊ฐ์ ์ฐจ์ด์
- ํคํด๋ฝ์ ์ฌ์ฉํ ๋ ๋ํ์ ์ธ ์ด์
- ํคํด๋ฝ์์ ํตํฉ ์ธ์ฆ์ ์ํด์ ์ฌ์ฉํ๋ ๊ธฐ๋ฒ
ํคํด๋ฝ์ ๋ํ ๊ฐ๋จํ ์๊ฐ
ํคํด๋ฝ์ ์ ์(Identity)์ ํ์ธํ๊ณ ํตํฉ ์ธ์ฆ ๊ด๋ฆฌ(Access Management)๋ฅผ ํด ์ค ์ ์๋ ์คํ์์ค์ ๋๋ค. ํคํด๋ฝ์ 2023๋ 4์์ CNCF(Cloud Native Computing Foundation)์ ์ธํ๋ฒ ์ดํ (incubating) ๋ ๋ฒจ๋ก ํฉ๋ฅํ์์ต๋๋ค. ์ฃผ์ ๊ด๋ฆฌ ์ฃผ์ฒด๋ ๋ ๋ํ์ ๋๋ค.
ํคํด๋ฝ์ด ์ฟ ๋ฒ๋คํฐ์ค์ ๊ฐ์ ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ์์ ์ฐจ์งํ๋ ์์์ ์๊ณ ์ ํ์ ๋ค๋ฉด ๋ค์์ ๋งํฌ๋ฅผ ํตํด์ ์ผ์ชฝ ์๋จ์ ์๋ ํคํด๋ฝ์ ํ์ธํด ๋ณด์๋ ๊ฒ๋ ์ข์ต๋๋ค.
ํคํด๋ฝ์์ ์ธ๊ธํ๋ ์ ์ ํ์ธ ๋ฐ ํตํฉ ์ธ์ฆ ๊ด๋ฆฌ๋ผ๋ ์๋ฏธ๋ก ์ฐ์ด๋ IAM์ ๋ํด์ ์ด๋ฏธ ํด๋ผ์ฐ๋ ์๋น์ค๋ฅผ ์ฌ์ฉํ์๋ ๋ถ๋ค์ด๋ผ๋ฉด ํ ๋ฒ์ฏค์ ๋ค์ด๋ณด์ จ์ ๊ฒ์ ๋๋ค. ํ์ง๋ง IAM์ ํด๋ผ์ฐ๋ ์๋น์ค์ ๊ตญํ ๋์ด ์ฌ์ฉ๋๋ ๊ฒ์ ์๋๋๋ค. IAM์ ๋ํด์ ์ต์ํ์ง ์์ ๋ถ๋ค์ ์ํด์ ์ด๋ฅผ ์ฐ์ ์ค๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
IAM์ ์๋ฏธ
IAM(Identity and Access Management)์ ํ๋ง๋๋ก, ์๋ณํ ์ ์๋ 'ํน์ ๋์'์๊ฒ ๋ฆฌ์์ค์ ๋ํด ์ ํฉํ ์ ๊ทผ '๊ถํ'์ ๋ถ์ฌํ๋ ๊ด๋ฆฌ ์์คํ ์ ๋๋ค. ์ฌ๊ธฐ์ 'ํน์ ๋์'์ Email ๊ฐ์ ์ฌ์ฉ์ ๊ณ์ ์ด๋, ํน์ ์๋ฒ๊ฐ ๋ ์ ์๊ณ '๊ถํ'์ CRUD(create, read, update, delete) ๊ฐ์ ๊ถํ(Permission)์ด๋, ๋ค์์ ๊ถํ์ด ํ๋๋ก ๋ฌถ์ธ ์ญํ (Role)์ด ๋ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ IAM์ ํน์ ๋์์ ํ์ธํ๋ ์ธ์ฆ(Authentication, Authn)๊ณผ ์ธ์ฆ ์ดํ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋ ์ธ๊ฐ(Authorization, Authz)๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก IAM์ ์ดํดํ๊ธฐ ์ํด์๋ ์ธ์ฆ๊ณผ ์ธ๊ฐ๋ฅผ ์ดํดํ ํ์๊ฐ ์์ต๋๋ค. ๋ค์ ๊ทธ๋ฆผ๊ณผ ํจ๊ป ์ธ์ฆ๊ณผ ์ธ๊ฐ์ ๋ํด์ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
์ธ์ฆ๊ณผ ์ธ๊ฐ์ ์ฐจ์ด์
์ธ์ฆ(Authentication)
์ธ์ฆ์ IT๋ฅผ ์ ์ธํ๊ณ ๋ ์ฐ๋ฆฌ ์ผ์์์ ๊ต์ฅํ ๋ง์ด ์ฌ์ฉ๋๋ ๊ฐ๋ ์ ๋๋ค. ๋ํ์ ์ธ ์์๋ก๋ ์ธํฐ๋ท๋ฑ ํน์ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ฑ ํน ์ ํ๋ฆฌ์ผ์ด์ ์์์ ์ฐ๋ฆฌ๊ฐ ๊ณต๋์ธ์ฆ์(๊ณต์ธ์ธ์ฆ์)๋ฅผ ํตํด์ ์ก๊ธ์๊ฐ ๋ณธ์ธ์์ ํ์ธํ๋ ๊ฒ๋ ์ธ์ฆ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋ ๋ค๋ฅธ ์์๋ฅผ ๋ค์๋ฉด, KubeCon๊ณผ ๊ฐ์ ํ์ฌ์์๋ ์ ์ฅํ๋ ์ฌ๋๋ค์ ์ ์์ ํ์ธํ๊ธฐ ์ํด์ ์ ๋ถ์ฆ ๋ฐ ์ฌ๊ถ๊ณผ KubeCon ํ์ฌ ์ ์ฅ๊ถ์ ๊ตฌ๋งค ๋ด์ญ์ผ๋ก ๋ณธ์ธ์์ ์ฆ๋นํ์ฌ ์๋์ ๊ฐ์ KubeCon ์ ์ฅ์ ์ํ ํฐ์ผ์ ๋ฐ์ ์ ์์ต๋๋ค.
์ด ํฐ์ผ์๋ ์ด๋ฆ, ์์, ๊ทธ๋ฆฌ๊ณ ํ์ฌ์ฅ์์์ ์ญํ ์ด ์ฐ์ฌ์์ต๋๋ค. ๊ทธ๋์ KubeCon ํ์ฌ์ฅ์์ ์ด ํฐ์ผ์ ํจ์ฉํ๊ณ ์๋ค๋ฉด ํ์ฌ์ฅ ์ ๊ตฌ๋ฅผ ์งํค๋ ์ฌ๋์ด ํฐ์ผ์ ๋ณด๊ณ , ์ด ์ฌ๋์ด KubeCon ํ์ฌ์ฅ์ ์ ์ฅ์ด ๊ฐ๋ฅํ์ง ํ๋ณํฉ๋๋ค. ์ด ์ ์ฐจ๋ฅผ ์ธ์ฆ์ด๋ผ๊ณ ํฉ๋๋ค. (์ฌ์ค QR์ ์ฐ์ด์ ์ ํํ๊ฒ ํ์ธํฉ๋๋ค.)
์ธ๊ฐ(Authorization)
์ธ๊ฐ๋ ์ธ์ฆ์ ํตํด์ ๋์์ด ํ์ฉ๋๋ ์ฌ๋์ด๋ผ๋ ๊ฒ์ ์ ์ดํ์ ์ผ์ด๋๊ฒ ๋ฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด IT ์ปจํผ๋ฐ์ค๋ผ๋ฉด ํ์ฌ ์ฐธ์ฌ์๋ ํฌ๊ฒ ๋ฐํ์์ ์ฒญ์ค์ผ๋ก ๋๋์ด์ง ๊ฒ์ ๋๋ค. ์ด๋ ๋ชจ๋ ํ์ฌ ์ฐธ์์๊ฐ ๋ฐํ์๋ก ์ธ๊ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐํ์ ๋จ์์ ์ฌ๋ผ์ ๋ฐํํ ์๋ ์์ ๊ฒ์ ๋๋ค. ํ์ง๋ง ๋ฐํ์๋ผ๊ณ ์ธ๊ฐ๊ฐ ๋ ์ฌ๋์ด๋ผ๋ฉด ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ฐํ์๋ก์ ๋ฌด๋์ ์ฌ๋ผ๊ฐ์ ๋ฐํ๋ฅผ ํ ์ ์์ต๋๋ค! ์ด์ ๊ฐ์ ๊ฒ์ 'ํน์ ๊ถํ์ ์ธ๊ฐ ๋ฐ์๋ค'๊ณ ๋งํ ์ ์์ต๋๋ค.
ํคํด๋ฝ์ ์ฌ์ฉํ ๋ ๋ํ์ ์ธ ์ด์
๊ทธ๋ฐ๋ฐ ์ธ์ฆ/์ธ๊ฐ๋ผ๋ ๊ฐ๋ ์ด ํคํด๋ฝ์ ํตํด์๋ง ์ด๋ฃจ์ด์ง๊น์?
์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ์ฆ๊ฒจ ์ฌ์ฉํ๊ณ ์๋ ์์ด๋์ ๋น๋ฐ๋ฒํธ์๋ ์ธ์ฆ/์ธ๊ฐ๊ฐ ์ด๋ฏธ ํฌํจ๋์ด ์์ต๋๋ค. ํ์ง๋ง ์์ด๋์ ๋น๋ฐ๋ฒํธ์๋ ์น๋ช ์ ์ธ ๋จ์ ์ด ์กด์ฌํ๋๋ฐ, ๋ชจ๋ ๋ค ๊ธฐ์ตํ๊ณ ์์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณด์์ ์ธ ๊ด์ ์์ ๋ชจ๋ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฝ๊ฒ ์์ฑํ๋ ๊ฒ์ ๋งค์ฐ ์ ์ข์ต๋๋ค.
์์ ๊ทธ๋ฆผ์ ์์๊ณ ๋ง๋ ๊ฒ์ด๊ธฐ๋ ํ์ง๋ง, ์ค์ ๋ก ๊ทผ๊ฑฐ๊ฐ ์๋ ๊ฒ, ๋น๋ฐ๋ฒํธ๊ฐ ์ฌ์์ ํ์ทจ๋๋ ๊ฒฝ์ฐ๊ฐ ๊ฝค ๋ง์ด ์์ต๋๋ค. ์๋ ํต๊ณ๋ 2023๋ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋ ๋น๋ฐ๋ฒํธ ์ ๋๋ค.
'Top 20 most common passwords of 2023'
RANK | PASSWORD | TIME TAKEN TO CRACK | NUMBER OF TIMES USED |
---|---|---|---|
1 | 123456 | < 1 Second | 4,524,867 |
2 | admin | < 1 Second | 4,008,850 |
3 | 12345678 | < 1 Second | 1,371,152 |
4 | 123456789 | < 1 Second | 1,213,047 |
5 | 1234 | < 1 Second | 969,811 |
6 | 12345 | < 1 Second | 728,414 |
7 | password | < 1 Second | 710,321 |
8 | 123 | < 1 Second | 528,086 |
9 | Aa123456 | < 1 Second | 319,725 |
10 | 1234567890 | < 1 Second | 302,709 |
๋ณด์ ์์ ์ฑ ์ธก๋ฉด์์ ์์ ํ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ๊ถ๊ณ ํ๊ณ ์์ต๋๋ค.
๋น๋ฐ๋ฒํธ ๋ฒ ์คํธ ํ๋ํฐ์ค 2023
- ๋ชจ๋ ๊ณ์ ์ ๊ฐ๋ ฅํ๊ณ ๊ณ ์ ํ ๋น๋ฐ๋ฒํธ๊ฐ ์ค์ ๋์ด ์๋์ง ํ์ธํ์ธ์.
- ๋น๋ฐ๋ฒํธ๋ ๋๋ฌธ์, ์๋ฌธ์, ์ซ์, ๊ธฐํธ๋ฅผ ์กฐํฉํ์ฌ ์ฌ์ฉํ์ธ์.
- ๋น๋ฐ๋ฒํธ๋ณด๋ค๋ ๊ธฐ์ตํ๊ธฐ ์ฌ์ด ์ต์ 14์ ์ด์์ ๋น๋ฐ๋ฒํธ ๋ฌธ๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์.
- ์ฌ๋ฌ ๊ณ์ ์์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฌ์ฉํ์ง ๋ง์ธ์
- ์์ ๋ฏธ๋์ด ํ๋กํ(์๋ ์์ผ, ๋ฐฐ์ฐ์ ๋๋ ์ ์๋๋ฌผ ์ด๋ฆ ๋ฑ)์์ ์ฐพ์ ์ ์๊ฑฐ๋ ๋ค๋ฅธ ์ฌ๋์๊ฒ ์๋ ค์ง ์ ๋ณด๋ฅผ ๋น๋ฐ๋ฒํธ์ ์ฌ์ฉํ์ง ๋ง์ธ์.
- ํนํ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ๊ณ์ ์ ๊ฒฝ์ฐ 2๋จ๊ณ ์ธ์ฆ์ด ์ค์ ๋์ด ์๋์ง ํ์ธํ์ธ์.
- ์์ ํ ๋น๋ฐ๋ฒํธ ์์ฑ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ๋ฌธ์์ด์ ์์ฑํ์ธ์
- ์ฌ์ ์ ๋์ค๋ ๋จ์ด์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ง ๋ง์ธ์.
- ๊ฐ๋ ฅํ ๋น๋ฐ๋ฒํธ์ ์์ ํ ์ ์ฅ์๋ฅผ ์์ฑํ๋ ค๋ฉด ๋น๋ฐ๋ฒํธ ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ๊ณ ๋น๋ฐ๋ฒํธ ์ ์ฅ์์ ๊ธธ๊ณ ๋ณต์กํ ๋น๋ฐ๋ฒํธ ๋ฌธ๊ตฌ๋ฅผ ์ค์ ํ์ธ์.
์ ๊ถ๊ณ ๋๋ก ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํ ๋ '๊ณ์ ๋ง๋ค ๊ณ ์ ํ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ง๋ค๊ธฐ'๋ ์ด๋ ค์ธ ๋ฟ๋ง ์๋๋ผ ๊ด๋ฆฌํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค. ์ด๋ฐ ๋ฌธ์ ๊ฐ ๊ฐ์ธ์ผ๋ก์๋ ๊ฐ์์ ๋ฐฉ๋ฒ์ผ๋ก ์งํํ๋ฉด ๋์ง๋ง, ์กฐ์ง์์๋ ์ ์ฑ ์ ์ผ๋ก ์์คํ ์ ์ผ๋ก ํด๊ฒฐํด์ผ ํฉ๋๋ค.
์ด๋ฐ ๊ฒฝ์ฐ์ ๋ณดํต ์ผ๋ฐ์ ์ธ ๊ธฐ์ ์์๋ ์ค์ ์ง์ค ์์คํ ์์ ๊ณ์ ์ ์ธ์ฆํ๊ณ ๊ฐ ์๋น์ค์ ์ธ์ฆ๋ ์ฌ์ฉ์์์ ์๋ ค์ฃผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ํ์ ์ธ ์๋น์ค๊ฐ ์๋์ AD(Active Directory)๋ฅผ ์ด์ฉํ LDAP ์ธ์ฆ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ๊ฐ์ ํํ๋ฅผ ๋ฐ๋ก SSO(Single-Sign On)๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
SSO๋ ์ฌ์ฉ์๊ฐ ํ ๊ฐ์ง ๋ก๊ทธ์ธ ์ ๋ณด๋ก ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์๋น์ค์ ๋ํด ๋์์ ์ธ์ฆ์ ๋ฐ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์์์ ์์๋ก ์ค๋ช ํ ํ์ฌ ๋ด๋ถ์ AD๋ฅผ ์ด์ฉํ ํตํฉ ์ธ์ฆ ์ธ์๋ ๊ฐ ์๋น์ค์์ ์์ ๋ก๊ทธ์ธ์ ํตํด์ ๋ก๊ทธ์ธ์ ์งํํ๋ ๊ฒ๋ SSO๋ฅผ ํตํ ๊ธฐ๋ฅ์ ๋๋ค.
์ฌ์ค SSO ๊ธฐ๋ฅ์ Okta๋ OneLogin ์ฒ๋ผ ์ ๋ช ํ Identity ๊ด๋ฆฌ ์๋ฃจ์ ์ด ์ ๋ฃ๋ก ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด์ง๋ง ํคํด๋ฝ์ ์คํ์์ค์ด๊ธฐ์ ์ฐ๋ฆฌ๋ ์ด ๊ธฐ๋ฅ์ ๋ฌด๋ฃ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
ํคํด๋ฝ์์ ํตํฉ ์ธ์ฆ์ ์ํด์ ์ฌ์ฉํ๋ ๊ธฐ๋ฒ
ํคํด๋ฝ์ ์์ ๊ฐ์ ํตํฉ ์ธ์ฆ์ ์ํด์ ์ธ์ฆ ํ์ค์ธ 'OIDC(OpenId Connect / OAuth 2.0(Open Authorization 2.0)'๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฌผ๋ก OIDC ์ธ์๋ 'SAML 2.0(Security Assertion Markup Language)'์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด์ ๊ฐ์ ํ์ค ํ๋กํ ์ฝ์ ๋ค์ํ ์ธ์ฆ ์ฌ์ ์(IDP, Identity Provider, ์ฝ๊ฒ ๋งํ๋ฉด ๊ตฌ๊ธ ๊นํ๋ธ ์นด์นด์ค๋ฑ ์์ ์๋น์ค ํํ๋ก ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ผ์ ์์ฝ๊ฒ ํตํฉ ์ธ์ฆ์ ๊ตฌํํ ์ ์์ต๋๋ค.
์์์ ํคํด๋ฝ์ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค์ ์ธ์ฆ๊ณผ ์ธ๊ฐ๊ฐ ๋ค์ด์๋ค๊ณ ๋ง์๋๋ ธ๋ ์ด์ ๊ฐ ๋ฐ๋ก ์ฌ๊ธฐ ์์ต๋๋ค. ํคํด๋ฝ์ด ์ค์ํ๋ OIDC'์ SAML 2.0'๊ฐ ๋ฐ๋ก ์ธ์ฆ๊ณผ ์ธ๊ฐ๋ฅผ ์ํ ํ์ค ํ๋กํ ์ฝ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฌ๊ธฐ๊น์ง ํคํด๋ฝ์ ๊ฐ๋ , IAM, ์ธ์ฆ/์ธ๊ฐ ๊ทธ๋ฆฌ๊ณ ํคํด๋ฝ์ ์ด์ ๊ณผ ํตํฉ ์ธ์ฆ์ ์ํ ๊ธฐ๋ฒ์ ๋ํด์ ๋ํด ์์๋ณด์์ต๋๋ค.
๋ค์ 2๋ถ์์ ํคํด๋ฝ์ผ๋ก ๋ฉํฐ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ํตํฉ ์ธ์ฆํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
๋ชจ๋๊ฐ ์ด๋ฌํ ์ค์ต ํ๊ฒฝ์ ๊พธ๋ฏธ๊ณ ํ ์คํธํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ์์ธํ๊ฒ ์ค์ตํ๋ ๋๋์ผ๋ก ์ค๋ช ํ์์ต๋๋ค. ์ด๋ฅผ ํตํด์ ๋ด์ฉ์ ๊ฐ๊ด์ ์ผ๋ก ์ดํดํ ์ ์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
ํ ์คํธ๋ฅผ ์ํ ์ฌ์ ์ค๋น ์์
์ง๋ ๋ฒ ๊ฒ์๊ธ์ ํตํด์ ํคํด๋ฝ์ ๋ํด ์ด๋์ ๋ ์ดํดํ์ จ์ ๊ฒ์ผ๋ก ์๊ฐํฉ๋๋ค.
์ด์ ์ค์ ๋ก ๋ฉํฐ ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์ ์๋ ์ธ์ฆ๋ค์ ํคํด๋ฝ์ ํตํด์ ํตํฉ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด์, ์ค์ต์ ํตํด ๋ฐฐ์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ํตํฉ ์ธ์ฆ์ ๊ตฌ์ฑํ๊ธฐ ์ํด์ ์์ ๋ณด์ฌ๋๋ ธ๋ [๊ทธ๋ฆผ 1] ๋ค์ด์ด๊ทธ๋จ๊ณผ ๊ฐ์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ๋ฐฐํฌํ๊ณ , ํคํด๋ฝ์ ๊ตฌ์ฑํ๊ธฐ ์ํด์ ๊ธด ์ฌ์ ์์ ์ด ํ์ํฉ๋๋ค.
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
# root@k8s:~/IaC/Keycloak
Keycloak ๋๋ ํฐ๋ฆฌ์ ์๋ 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 ์๋น์ค์ ์๋์ ๊ฐ์ด ํ์ฌ ๋๋ฉ์ธ์ ์ฐ๊ฒฐํด์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
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
๋ก ์ ์ํด๋ณด๊ฒ ์ต๋๋ค.
์ ์์ด ๋์๋ค๋ฉด ์ข์ธก ๋ฉ๋ดRealm์ด๋ผ๊ณ ํ๋ ๋จ์๋ฅผ ์ค์ ํ๋ ๋๋กญ๋ค์ด UI๊ฐ ์์ต๋๋ค. ํ์ฌ๋ master
๊ฐ์ผ๋ก ์ง์ ์ด ๋์ด์์ต๋๋ค. ์ด Realm์ ์ฟ ๋ฒ๋คํฐ์ค์ ๋ค์์คํ์ด์ค์ฒ๋ผ ํคํด๋ฝ ์ฌ์ฉ์, ์ธ์ฆ ๋์ ์ ํ๋ฆฌ์ผ์ด์
๊ทธ๋ฆฌ๊ณ ์ญํ ๊ณผ ๊ฐ์ ๊ฒ๋ค์ ๊ด๋ฆฌํ๋ ๊ณต๊ฐ์ด๋ผ๊ณ ์ดํดํ์๋ฉด ๋ฉ๋๋ค.
๋ค์์ผ๋ก ํคํด๋ฝ์์ ์ธ์ฆ์ ๋์์ด ๋๋ ๋จ์๋ฅผ ์ง์ ํ๋ Client๋ฅผ ์ค์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
Client๋ฅผ ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ด ๋ํ๋ฉ๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ ์ฌ์ ์(IdP, Identity provider)๋ฅผ ํตํ์ฌ ์ธ์ฆ์ด ์๋ฃ๋ ๋ค์์, id ์ ๋ณด๋ฅผ ์ ๋ฌํ ๊ณณ์ ์ค์ ํ๊ธฐ ์ํ ํ๋ฉด์ ๋๋ค.
์ด๋ฒ ์ค์ต์์๋ ์ฌ์ฉ์ ์ ๋ณด์ ๊ธฐ๋ณธ ๊ทธ๋ฃน ์ ๋ณด๋ฅผ ํจ๊ป ํฌํจ์์ผ์ ์ฟ ๋ฒ๋คํฐ์ค ์ธ์ฆ์ ์ฒ๋ฆฌํ๊ณ ์ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ์ด์ ๋ ์ฟ ๋ฒ๋คํฐ์ค์์ ์ง์ RBAC์ ํตํด์ ์ธ๊ฐ๋ฅผ ํ๊ธฐ ์ํด์์ด๋ฉฐ, RBAC์ ๊ธฐ๋ณธ ๊ทธ๋ฃน ๋จ์๋ก ํ๋ ์ด์ ๋ ํน๋ณํ ์ค์ ์ ํ์ง ์์๋ ๊ธฐ๋ณธ ์ ์ฉ๋์ด ์ฌ์ฉ์ด ํธ๋ฆฌํ๊ธฐ ๋๋ฌธ์
๋๋ค์์ ๋ด์ฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ [Client scopes]
ํญ ๋ฉ๋ด๋ก๋ก ์ด๋ํฉ๋๋ค.
์ด 'groups' mapper๋ JWT groups ํค์ ์ฌ์ฉ์์ Realm Role์ ๋งคํํ๋ ์ญํ ์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด์ ์ฌ์ฉ์์ Realm role์ด JWT์ groups ์ ๋ณด๋ก ์ถ๊ฐ๊ฐ ๋ฉ๋๋ค.
ํคํด๋ฝ์์ ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํ์์ ๋ ์ฌ์ฉ์ ๊ด๋ฆฌ๋ฅผ ์ํ ๊ทธ๋ฃน์ด ํ์ํฉ๋๋ค.
์ด ๊ณผ์ ์ ํตํด์ ์ฐ๋ฆฌ๋ ํตํฉ ์ธ์ฆ์ ํ์ํ ์ธ์ฆ ์ค์ ์ ์๋ฃํ์์ต๋๋ค. ๋ค์์ผ๋ก๋ ์ค์ต ํธ์๋ฅผ ์ํ์ฌ ํคํด๋ฝ ์ธ๋ถ๋ก๋ถํฐ ์ฌ์ฉ์๊ฐ ํคํด๋ฝ์ ๋ฑ๋ก์ด ๋ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก devops-group
์ ์ถ๊ฐ๋๋๋ก ์ค์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ข์ธก ํ๋จ์ [Realm settings]
๋ฉ๋ด ์๋ User registration ํญ์ผ๋ก ์ด๋ํฉ๋๋ค.
6. ๊ตฌ๊ธ ํด๋ผ์ฐ๋์์ ํคํด๋ฝ์ ์ธ๋ถ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋๋ก ๊ตฌ์ฑ ์ถ
์์ [๊ทธ๋ฆผ 1] ๋ค์ด์ด๊ทธ๋จ์์ ๊ตฌ๊ธ API๋ฅผ ํตํด์ ์ฌ์ฉ์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ ๊ตฌ๊ธ API๋ฅผ ํตํด ๊ตฌ๊ธ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํคํด๋ฝ์ ์ ์ฅ์ํค๋ ๊ธฐ๋ฅ์ธ Identity providers๋ฅผ ์ฌ์ฉํด์ ์ฐ๋์ ์งํํฉ๋๋ค. ์ด ์ฐ๋์ ๊ตฌ์ฑํ๊ธฐ ์ํด์ ๋จผ์ ๊ตฌ๊ธ API์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ์ค์ ํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ๊ตฌ๊ธ ํด๋ผ์ฐ๋ ์ฝ์์์ Google API & Services > Credentials ๋ฉ๋ด๋ก ์ด๋ํ์ฌ์ ์ฐ๋ ์ ๋ณด๋ฅผ ๋ฐ์ ํ ํคํด๋ฝ์์ ๊ตฌ๊ธ ๋ก๊ทธ์ธ์ ํตํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐ์ ์ ์๋๋ก ์ฒ๋ฆฌํ๊ฒ ์ต๋๋ค.
์์ฑ์ ์๋ฃํ๋ฉด keycloak Client์ Client ID์ Client Secret์ด ์ถ๋ ฅ๋ ํ์ ์ผ๋ก ๋ํ๋ฉ๋๋ค.
Client ID์ Client Secret์ ํคํด๋ฝ๊ณผ ๊ตฌ๊ธ ์ฌ์ฉ์ ์ธ์ฆ์ ๋ณด๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
๊ตฌ๊ธ ํด๋ผ์ฐ๋์ 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
ํคํด๋ฝ๊ณผ ๊ตฌ๊ธ ํด๋ผ์ฐ๋ ์ฝ์์ ๋ํด์ ๊ฐ์ ์์ ๊ฐ์ด ๊ฐ์ด ์ค์ ํ ํ, ํคํด๋ฝ์ ์ค์ ์ ์ ์ฉํ๊ธฐ ์ํด [Save]
๋ฅผ ํด๋ฆญํฉ๋๋ค.
7. ์ด๋ฉ์ผ 2์ฐจ ์ธ์ฆ ๊ตฌ์ฑ
.EKS ๋ฑ ๊ด๋ฆฌํ ์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค๋ค์ OIDC ๋ฐฉ์์ ์ธ์ฆ์ ๊ตฌ์ฑํ ๋, ์ฌ์ฉ์ ์ธ์ฆํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฉ์ผ ์ธ์ฆ์ ์๊ตฌํฉ๋๋ค. ์ด๋ฐ ๋ณด์ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๊ธฐ ์ํด์ ์ด๋ฉ์ผ ์ธ์ฆ ์ต์ ์ ์ผ ํ, ๊ตฌ๊ธ SMTP ์๋ฒ๋ฅผ ์ฌ์ฉํด์ ์ด๋ฉ์ผ์ ๋ณด๋ผ ์ ์๋ ์ค์ ์ ์งํํ๋๋ก ํ๊ฒ ์ต๋๋ค.
- Email: ์ฌ์ฉ ๊ฐ๋ฅํ Email (์: Gmail, Naver ๋ฑ)
- First name: ์ด๋ฆ
- Last name: ์ฑ
์ด๋ฉ์ผ ์ธ์ฆ์ ๋ํ ์ต์ ์ด ์ผ์ก๋ค๋ฉด, ์ด๋ฉ์ผ์ ๋ณด๋ด๊ธฐ ์ํ ์ค์ ์ ์งํํ๊ธฐ ์ํด์ Realm Settings์ Email ํญ์ผ๋ก ์ด๋ํฉ๋๋ค.
- ํคํด๋ฝ > Realm settings ๋ฉ๋ด > Email ํญ
- Template
- From *:
์ด๋ฉ์ผ ๊ณ์
- From display name:
Keycloak Admin
- Reply to:
์ด๋ฉ์ผ ๊ณ์
- Reply to display name:
Keycloak Admin
- Envelope from:
Keycloak Admin
- From *:
- Template
- ํคํด๋ฝ > Realm settings > Email
- Connection & Authentication
- Host:
smtp.gmail.com
(๋ฐ์กํ๋ smtp์ ๋ฐ๋ผ ์ค์ ์ ๋ค๋ฆ) - Port:
465
- Host:
- Encryption
- Enable SSL:
On
- Enable StartTLS:
On
- Enable SSL:
- Username: Gmail ๊ณ์ (๋ฐ์กํ๋ smtp์ ๋ฐ๋ผ ๋ค๋ฆ)
- Password: ๊ณ์ ๋น๋ฐ๋ฒํธ
- Connection & Authentication
์
๋ ฅ ํ, [Save]
๋ฅผ ๋๋ฌ์ ์ ์ฅํฉ๋๋ค.
๊ธธ๊ณ ํ๋ํ ์ฌ์ ์์ ์ ์๋ฃํ์ต๋๋ค. ์์ผ๋ก๋ ํคํด๋ฝ์ Client๋ฅผ ํ์ฉํด ์ฌ๋ฌ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์ธ์ฆ์ OIDC๋ฅผ ํตํด์ ์ฒ๋ฆฌํ๋ ์ค์ต์ ์งํํ๋๋ก ํ๊ฒ ์ต๋๋ค.
8. GKE์ OIDC ๊ธฐ๋ฅ ๊ตฌ์ฑํ๊ธฐ
๋จผ์ ํ์ฌ ๋๋ ํฐ๋ฆฌ์ ์์นํ 1-3.clientconfig-gke-keycloak-w-oidc.yaml
์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
.1-3.clientconfig-gke-keycloak-w-oidc.yaml
์ ์ฌ์ ์ค๋น ์์
์์ GKE ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ ๋ ์ถ๊ฐ๋ก ์
๋ ฅํ --enable-identity-service
์ผ๋ก ๋ง๋ค์ด์ง ๊ตฌ๊ธ ํด๋ผ์ฐ๋์ ์ปค์คํ
์ค๋ธ์ ํธ์
๋๋ค. ์ด ํ์ผ ๋ด๋ถ์๋ OIDC ์ธ์ฆ์ ์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
oidc:
clientSecret: ...
clientID: k8s-auth
cloudConsoleRedirectURI: https://console.cloud.google.com/kubernetes/oidc
extraParams: resource=token-groups-claim
groupPrefix: '-'
groupsClaim: groups
issuerURI: https://oncloud-1.site/realms/kubernetes
kubectlRedirectURI: http://localhost:8000
scopes: openid
userClaim: preferred_username
userPrefix: '-'
internalServer: ""
name: hj-keycloak-oncloud-1-gke
์ด์ ๊ฐ์ ํ๋ผ๋ฏธํฐ์ ๋ํ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ ์ ์์ต๋๋ค.
clientSecret
: [์ํฌ๋ฆฟ]- OIDC ๊ณต๊ธ์ ์ฒด๊ฐ OIDC ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ณต์ ํ๋ ClientSecret์ ๋๋ค.
- Google์ด 'k8s-auth'ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ ์ ์๋๋ก 'k8s-auth'ํด๋ผ์ด์ธํธ์ Client Secret์ ์ ๋ ฅํฉ๋๋ค.
clientID
:k8s-auth
- OIDC ๊ณต๊ธ์ ์ฒด์๊ฒ ์ธ์ฆ์ ์์ฒญํ๋ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ID์ ๋๋ค.
- 'k8s-auth'ํด๋ผ์ด์ธํธ์ Client ID๋ฅผ ์ ๋ ฅํฉ๋๋ค.
cloudConsoleRedirectURI
:https://console.cloud.google.com/kubernetes/oidc
extraParams
:resource=token-groups-claim
- OIDC ๊ณต๊ธ์ ์ฒด์ ์ ์กํ ์ถ๊ฐ์ ์ธ ํค-๊ฐ ๋งค๊ฐ๋ณ์์ ๋๋ค.
- Google์๊ฒ ๊ทธ๋ฃน ํด๋ ์์ ํ๊ธฐ ์ํด '
resource=token-groups-claim
'๋ฅผ ์ ๋ ฅํฉ๋๋ค.
groupPrefix
: '-''- ๊ธฐ์กด ์ด๋ฆ๊ณผ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ถ๊ฐํ๋ ๊ทธ๋ฃน ํด๋ ์์ ์ถ๊ฐ๋๋ ํ๋ฆฌํฝ์ค์ ๋๋ค.
groupsClaim
: groups- JWT ํ๋์์ ์ฌ์ฉ์์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ ํ๋๋ฅผ ์ ๋ ฅํฉ๋๋ค. ์ด ์ค์ต์์๋ ํคํด๋ฝ์์ ์ถ๊ฐ๋ก ์ค์ ํ groups๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ groups๋ก ์ค์ ํฉ๋๋ค.
- ํคํด๋ฝ์ Realm Roles์ ํด๋นํฉ๋๋ค.
issuerURI
:https://oncloud-1.site/realms/kubernetes
- OIDC ์น์ธ์ ์์ฒญํ๋ URL์ ๋๋ค. URI๋ HTTPS๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉฐ, 'https://example.com/adfs'๊ณผ ๊ฐ์ ํ์์ ๊ฐ์ก์ต๋๋ค.
- 'k8s-auth'ํด๋ผ์ด์ธํธ๊ฐ ์ํ 'kubernetes' Realm ์ฃผ์๋ฅผ ์ ๋ ฅํฉ๋๋ค.
kubectlRedirectURI
:http://localhost:8000
- ์ธ๊ฐ๋ฅผ ์ํด kubectl oidc login์ ์ฌ์ฉ๋๋ ๋ฆฌ๋๋ ์ URL์ ๋๋ค.
- 'k8s-auth'ํด๋ผ์ด์ธํธ์ 'Valid redirect URIs'๋ฅผ ์ ๋ ฅํฉ๋๋ค.
scopes
- OIDC ์ ๊ณต์ ์ฒด์ ์ ์กํ ์ถ๊ฐ์ ์ธ ๋ฒ์์ ๋๋ค
- Google์๊ฒ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด openid๋ฅผ ์ ๋ ฅํฉ๋๋ค.
userClaim
:preferred_username
- JWT ํ๋์์ ์ฌ์ฉ์์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ ํ๋๋ฅผ ์ ๋ ฅํฉ๋๋ค. ์ด ์ค์ต์์๋ ์ด๋ฉ์ผ์ ๋ฐ๋ก ์ฌ์ฉ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์ preferred_username์ ์ฌ์ฉํฉ๋๋ค.
userPrefix
: '-'- ๊ธฐ์กด ์ด๋ฆ๊ณผ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ ํด๋ ์์ ์ถ๊ฐ๋ ํ๋ฆฌํฝ์ค์
๋๋ค. ์ ์ ํด๋ ์์ด email์ด ์๋ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ๊ธ์ ํ๋ฆฌํฝ์ค๊ฐ Kubernetes API server์ ์ ๊ณต๋
userID
์์ ๋ถ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ์ฌ์ฉ์ ์๋ณ์๋ 'ISSUER_URI#USER
'๊ฐ ๋ฉ๋๋ค. - ๋ณธ ์ค์ต์์๋ ์ ์ ํด๋ ์์ email๋ก ์งํํ๋ฏ๋ก ํ๋ฆฌํฝ์ค๋ฅผ '-'๋ก ์ค์ ํ์ฌ ํ๋ฆฌํฝ์ค๋ฅผ ์ฌ์ฉ ์ค์งํฉ๋๋ค.
- ๊ธฐ์กด ์ด๋ฆ๊ณผ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ ํด๋ ์์ ์ถ๊ฐ๋ ํ๋ฆฌํฝ์ค์
๋๋ค. ์ ์ ํด๋ ์์ด email์ด ์๋ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ๊ธ์ ํ๋ฆฌํฝ์ค๊ฐ Kubernetes API server์ ์ ๊ณต๋
๊ฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฑ์๋ฃ์๋ค๋ฉด kubectl replace -f 1-3.clientconfig-gke-keycloak-w-oidc.yaml
๋ก ๋ณ๊ฒฝํฉ๋๋ค.
kubectl replace -f 1-3.clientconfig-gke-keycloak-w-oidc.yaml
#
# clientconfig.authentication.gke.io/default replaced
9. EKS๋ฅผ OIDC ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ํํ๋ก ๋ฐฐํฌํ๊ธฐ
GKE ์ด์ธ์ AWS, Azure, Alibaba ๋ฑ ๋ค์ํ ํด๋ผ์ฐ๋ ๊ณต๊ธ์๋ค์ด ์ ๊ณตํ๋ ๊ด๋ฆฌํ ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์์ง๋ง, ๊ตญ๋ด์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ AWS์ EKS ํด๋ฌ์คํฐ๋ฅผ ์ถ๊ฐ ๋ฐฐํฌํ๊ณ ํตํฉ ์ธ์ฆ์ ๊ตฌ์ฑํ๊ฒ ์ต๋๋ค.
OIDC ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ EKS๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ํด์๋ 2-1.deploy-eks-env-only.sh
์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ฉด ๋ฉ๋๋ค. ์ด ์คํฌ๋ฆฝํธ๋ EKS๋ฅผ ๊ด๋ฆฌํ๋ eksctl
๋ก EKS ํด๋ฌ์คํฐ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ํ์ํ EKS ํด๋ฌ์คํฐ์ ์ค์ ์ ๊ฐ์ ์์น์ ์๋ eksctl-config
๋๋ ํฐ๋ฆฌ ์๋์ keycloak-w-oidc.yaml
์ ์ ์๋์ด ์์ต๋๋ค. EKS ํด๋ฌ์คํฐ์ ์ ์ฉ๋ ํคํด๋ฝ ํตํฉ ์ธ์ฆ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
identityProviders:
- name: keycloak
type: oidc
issuerUrl: https://oncloud-1.site/realms/kubernetes
clientId: k8s-auth
usernameClaim: preferred_username
usernamePrefix:
groupsClaim: groups
์ฝ๋๋ฅผ ๋ณด์์ ๋ usernameClaim
์ผ๋ก ์ฌ์ฉ์ ์ด๋ฆ์ ์๋ณํ๊ณ groupsClaim
์ ํตํด์ group ์ ๋ณด๋ฅผ ์๋ณํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ๋ ํคํด๋ฝ์ ๋ํ ์ธ์ฆ ํ์
์ oidc์ด๋ฉฐ issuerUrl
์๋ GKE ๊ตฌ์ฑ๊ณผ ๋์ผํ๊ฒ ํคํด๋ฝ์ ์ ์ URL์ ๊ธฐ์
ํ๊ณ ์์ต๋๋ค.
๋ค์์ผ๋ก๋ OIDC ํตํฉ ์ธ์ฆ์ ์ํํ ๋ ๋ง์ฃผํ ์ ์๋ ๋ถํธํจ์ ํด๊ฒฐํ๊ธฐ ์ํด์ ์๋ก์ด ๋ช
๋ น์ด์ธ kubelogin
์ ๋ง๋ค๊ฒ ๋ ์ด์ผ๊ธฐ๋ฅผ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
kubelogin
์ด ๊ฐ์ง๋ ์๋ฏธ์ ๊ตฌ์กฐ ์ค๋ช
ํ ์คํธ๋ฅผ ์ํ ์ฌ์ ์ค๋น ์์ ๊ณผ OIDC ๊ธฐ๋ฅ์ ํฌํจํ๋ EKS์ GKE๋ฅผ ๊ตฌ์ฑํ์์ต๋๋ค. ์ด์ ๋จ์ ๊ฒ์ 'ํตํฉ ์ธ์ฆ์ ํตํด์ ๋ก๊ทธ์ธ์ ์งํํ๋ฉด๋๋?' ๋ผ๋ ์๊ฐ์ด ๋์ค ์ ์๊ฒ ์ง๋ง, ์์ง์ ํตํฉ ์ธ์ฆ์ ์ํํ ์ ์์ต๋๋ค.
๊ทธ ์ด์ ๋ EKS์ GKE์ ์ฟ ๋ฒ๋คํฐ์ค ์ธ์ฆ ๋ฐฉ์์ OIDC๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ๊ฐ์ง๋ง, ์ด๋ ์ฌ์ฉ๋๋ ๋ช ๋ น์ด์ ๋ช ๋ น์ด ๊ตฌ์กฐ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค.
EKS๋ kubectl
๊ณผ ๊ฐ์ ๋ช
๋ น์ด ์คํ๋ ๋ kubectl oidc-login get-token
๋ช
๋ น์ด๋ก JWT๋ฅผ ํคํด๋ฝ์ผ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์์ ์ธ์ฆํ๋ ๋ฐฉ์์ด๊ณ , GKE๋ kubectl oidc login
๋ช
๋ น์ผ๋ก ์ธ์ฆ์ด ๋ ๋ณ๋์ ์ปจํ
์คํธ(context)๋ฅผ ์์ฑํด์ ์ฟ ๋ฒ๋คํฐ์ค ํตํฉ ์ธ์ฆ์ ์งํํ๋ ๋ฐฉ์์
๋๋ค. ํด๋ฌ์คํฐ ์ธ์ฆ ๋ช
๋ น์ด๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ช
๋ น์ด๋ฅผ ๋ ๊ฐ ์จ์ผ ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ต๋๋ค. ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํด์ ํ์ฌ ์ค์ ๊ฐ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์ํ๋ ์๋ก์ด ๋ช
๋ น์ด๋ฅผ ๋ง๋ค๊ฒ ๋์์ต๋๋ค. ์ด ๋ช
๋ น์ด๊ฐ kubelogin
์
๋๋ค.
์์ด๋์ด๋ ์ด๋ ์ต๋๋ค. ํ์ฌ ์ปจํ
์คํธ ์ด๋ฆ ์์ gke๋ผ๋ ๊ฐ์ด ์๋ค๋ฉด ํด๋น ํด๋ฌ์คํฐ๋ฅผ gke๋ก ํ๋ณํ์ฌ์ ์ปจํ
์คํธ๋ฅผ ์์ฑํ๋๋ก ์กฐ์นํ๊ณ , ๊ทธ ์ด์ธ์๋ kubectl oidc-login get-token
๋ช
๋ น์ ํตํด JWT๋ฅผ ๋ฐ๊ธ๋ฐ์์ ์ธ์ฆ์ ์ฒ๋ฆฌํ๊ฒ ํ๋ ๋ฐฉ์์
๋๋ค. ๊ทธ๋ ๊ฒ ์์ฑ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#!/usr/bin/env bash
function kubelogin() {
local vendor="$(cat ~/.kube/config | grep current-context | cut -d ':' -f2 | grep gke)"
if [ "$vendor" != "" ]; then
kubectl oidc login --cluster="hj-keycloak-oncloud-1-gke" --login-config="/Users/mz01-hj/.keycloak/config"
else
kubectl oidc-login get-token \
--oidc-issuer-url=https://oncloud-1.site/realms/kubernetes \
--oidc-client-id=k8s-auth \
--oidc-client-secret=6qfWVLJ91PrGABqqXD613ScVk6j2Qw1d
fi
}
kubelogin
์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ํตํด์ ๊ฐ๋ตํ๊ฒ ์์ฑํ๋ค ๋ณด๋ ํ๋์ฝ๋ฉ๋์ด ์๋ ๋ถ๋ถ์ด ๋ง์ต๋๋ค. ๋ฐ๋ผ์ ๊ตฌ๊ธ ํด๋ผ์ฐ๋์์ ๋ค๋ฅธ GKE ํด๋ฌ์คํฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋์์ ๋ ๋ฐ์ํ๋ ์์ธ ์ํฉ์๋ ๋์์ด ์ ๋์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํคํด๋ฝ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๊ฐ์ ๋งค๋ฒ ์ ๋ฐ์ดํธ ํด์ผํ๋ ๋ถํธํจ์ด ์์ต๋๋ค.
๋งค๋ฒ ์
๋ฐ์ดํธํด์ผ ํ๋ ๋ถํธํจ์ ํด๊ฒฐํ๊ธฐ ์ํด์ kubelogin
์ ์์ฑํ๋ kubelogin-installer.sh
์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์์ต๋๋ค.
# declare variable.
DOMAIN_NAME=oncloud-1
CLIENT_SECRET=6qfWVLJ91PrGABqqXD613ScVk6j2Qw1d
# keycloak-login-config
rm -rf ~/.keycloak ; mkdir ~/.keycloak
kubectl get clientconfig --context=hj-keycloak-${DOMAIN_NAME}-gke -n kube-public default -o yaml > ~/.keycloak/config
rm -rf /usr/local/bin/kubelogin
cat > "/usr/local/bin/kubelogin.tmp" <'EOF'
#!/usr/bin/env bash
function kubelogin() {
local vendor="$(cat ~/.kube/config | grep current-context | cut -d ':' -f2 | grep gke)"
if [ "$vendor" != "" ]; then
kubectl oidc login --cluster="hj-keycloak-${DOMAIN_NAME}-gke" --login-config="/Users/mz01-hj/.keycloak/config"
else
kubectl oidc-login get-token \
--oidc-issuer-url=https://${DOMAIN_NAME}.site/realms/kubernetes \
--oidc-client-id=k8s-auth \
--oidc-client-secret=${CLIENT_SECRET}
fi
}
kubelogin
EOF
vendor='$vendor' DOMAIN_NAME=$DOMAIN_NAME CLIENT_SECRET=$CLIENT_SECRET envsubst < /usr/local/bin/kubelogin.tmp >> /usr/local/bin/kubelogin
rm /usr/local/bin/kubelogin.tmp
sudo chmod 755 "/usr/local/bin/kubelogin"
echo "kubelogin installed successfully"
.kubelogin-installer.sh
๋ DOMAIN_NAME
์ด๋ CLIENT_SECRET
๊ณผ ๊ฐ์ ๊ฐ์ ํ๊ฒฝ๋ณ์๋ก load
์์ผ์ kubelogin
์
ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ด ๊ฐ๋ฅํ ๊ฒฝ๋ก์ ์์ฑํ๋ ๋ฐฉ์์
๋๋ค.
์ด์ ํ ์คํธ๋ฅผ ์ํ ๋ชจ๋ ์ค์ ์ ๋ง์ณค์ผ๋ EKS์ GKE์ ๋ํด์ ์ธ์ฆ/์ธ๊ฐ ์ค์ต์ ์งํํ๋๋ก ํ๊ฒ ์ต๋๋ค.
EKS์ GKE์ ๋ํ ์ธ์ฆ/์ธ๊ฐ ์ค์ต
์ด๋ ๊ฒ์ ๋จผ์ ํด๋ ์๊ด์ ์์ง๋ง, GKE๋ ์๋ก ์ปจํ ์คํธ๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ EKS๋ฅผ ๋จผ์ ํ๋ ๊ฒ์ด ์ข ๋ ๋ฌด๋ํ๊ฒ ์ค์ตํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ EKS์ ๋ํ ์ธ์ฆ/์ธ๊ฐ๋ฅผ ์ฐ์ ์ค์ตํ๋๋ก ํ๊ฒ ์ต๋๋ค.
1. EKS์ ๋ํ ์ธ์ฆ/์ธ๊ฐ ์ค์ต
EKS ํด๋ฌ์คํฐ์ ์ธ์ฆ/์ธ๊ฐ ์ค์ต์ ์ํด์ EKS ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
tree EKS
#
# 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
#
# 0 directories, 3 files
์ฒซ ๋ฒ์งธ๋ก ๋จผ์ kubectl get pods
๋ก ์ฟ ๋ฒ๋คํฐ์ค ํ๋๊ฐ ์กฐํ๋๋์ง ํ์ธํฉ๋๋ค.
eksctl๋ก EKS๋ฅผ ์์ฑํ ๊ฒฝ์ฐ ์ต์ด์๋ ๊ด๋ฆฌ์ ๊ถํ์ด ๋ด๊ธด ์ฌ์ฉ์์ด๊ธฐ ๋๋ฌธ์ ์กฐํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. EKS ํตํฉ ์ธ์ฆ์ ๊ฒฝ์ฐ ํ์ฌ ์ํ์์ ์ธ๊ฐ๋ ํคํด๋ฝ์ ํตํด์ ์งํ๋๊ณ ๊ทธ๋ค์ ์ฌ์ฉ์๋ก๋ถํฐ ์ฟ ๋ฒ๋คํฐ์ค์ ๋ํ ์ธ๊ฐ๋ RBAC์ ํตํด์ ์ด๋ค์ง๋๋ค. ๋ฐ๋ผ์ ํ์ฌ ๋๋ ํฐ๋ฆฌ์ ์๋ 1.clusterrolebinding-4-devops-group-as-admin.yaml
์ ์ ์ฉํด์ ํคํด๋ฝ ํตํฉ ์ธ์ฆ์ ํตํด ์ ์ํ ์ฌ์ฉ์๋ค์ด kubectl์ ์ฌ์ฉํ ์ ์๋๋ก ํ๊ฒ ์ต๋๋ค. 1.clusterrolebinding-4-devops-group-as-admin.yaml
์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ๊ด๋ฆฌ์ ๊ถํ์ group์ด devops ์ธ ์ฌ๋์๊ฒ ๋ถ์ฌํ๊ฒ ๋ค๋ ๋ด์ฉ์ ๋ด๊ณ ์์ต๋๋ค.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: oidc-group-cluster-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: devops
์ด๋ ๊ฒ ํด๋ฌ์คํฐ๋กค๋ฐ์ธ๋ฉ์ผ๋ก ์ธ๊ฐ์ ๋ํ ๋ถ๋ถ์ ์ค์ ํ์์ต๋๋ค.
๋ ๋ฒ์งธ๋ก ์๋ก์ด ์ฌ์ฉ์๋ก EKS์ kubectl
์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง ํ์ธํ๊ธฐ ์ํด์ ์๋ก์ด ์ฌ์ฉ์๋ก ์ ํํด์ผํฉ๋๋ค. ํ์ฌ ๋๋ ํฐ๋ฆฌ์ ์์นํ 2-oncloud-1.swtich-ctx-hoon-to-soojin.sh
์ผ๋ก ์๋ก์ด ์ปจํ
์คํธ๋ฅผ ๋ง๋ค๊ณ ์ฌ์ฉ์๋ฅผ ๋ณ๊ฒฝํ๊ฒ ์ต๋๋ค.
์ด ์
ธ ์คํฌ๋ฆฝํธ๋ aws ๋ช
๋ น์ ํตํด์ EKS์ ์๋ก์ด ์ฌ์ฉ์๋ก ์ ์ํ ์ ์๋ ์ปจํ
์คํธ๋ฅผ ์์ฑํ๋ ๋ช
๋ น์
๋๋ค. ์ปจํ
์คํธ๊ฐ ์์ฑ๋๊ณ ์๋ก์ด ์ปจํ
์คํธ๋ก ๋ณ๊ฒฝ๋ ํ์ ๋ค์ kubectl get pods
๋ช
๋ น์ ์
๋ ฅํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์๋ก์ด ์ปจํ
์คํธ์ ๋ํด์ ์ธ์ฆํ์ง ์์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
kubectl get pod
#
# error: You must be logged in to the server (Unauthorized)
์ธ ๋ฒ์งธ๋ก, ํคํด๋ฝ์ ์ด์ฉํ ํตํฉ์ธ์ฆ ์งํ์ ์ํด์ 3.set-cred-4-oidc-user.sh
์
ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํฉ๋๋ค. 3.set-cred-4-oidc-user.sh
๋ oidc-user๋ผ๋ ์๋ก์ด kubectl
์ ์ฌ์ฉ์๋ฅผ ๋ง๋ค๊ณ kubelogin
์ kubectl
์ ์ฌ์ฉํ ๋๋ง๋ค ํธ์ถํ๋๋ก ์ค์ ํ๋ ๋ด์ฉ์ ์คํฌ๋ฆฝํธ์
๋๋ค. ์ด๋ฅผ ํตํด์ ํคํด๋ฝ์ ํตํ JWT๋ฅผ ๋ช
๋ น ์คํ ๋ง๋ค ๋ฐ์ ์ ์๊ณ ์ธ์ฆ์ด ๊ฐ๋ฅํ๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค.
#!/usr/bin/env bash
kubectl config set-credentials oidc-user \
--exec-api-version=client.authentication.k8s.io/v1beta1 \
--exec-command=kubelogin
์ ๋ด์ฉ์ด ์ค์ ๋ก๋ ์๋์ ๊ฐ์ด ์ฒ๋ฆฌ๋ฉ๋๋ค. ์๋์ ๊ฐ์ ํ์ฌ EKS๋ฅผ ํฌํจํ ์จํ๋ ๋ฏธ์ค์ ์์นํ ๋๋ถ๋ถ์ ์ฟ ๋ฒ๋คํฐ์ค์ ์ ์ฉํ ์ ์๋ ํตํฉ ์ธ์ฆ ์ค์ ์ ๋๋ค.
kubectl oidc-login get-token \
--oidc-issuer-url=https://oncloud-1.site/realms/kubernetes \
--oidc-client-id=k8s-auth \
--oidc-client-secret=[์ํฌ๋ฆฟ]
์
ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ฌ oidc-user
๋ผ๋ ์ฌ์ฉ์๋ฅผ ๋ง๋ค์๋ค๋ฉด, kubectl get pods -A --user=oidc-user
๋ช
๋ น์ ํตํด์ ๋ค์ ์ฟ ๋ฒ๋คํฐ์ค ํ๋๋ฅผ ์กฐํํด๋ณด๊ฒ ์ต๋๋ค. ํด๋น ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ์์ ๋ ํฐ๋ฏธ๋์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋์ง ์๊ณ ๋ค์๊ณผ ๊ฐ์ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ๋ํ๋ฉ๋๋ค.
์ค์ ๋ก ์ฌ์ฉํ๋ ๋ฉ์ผ ์๋น์ค์ ๋ฉ์ผํจ์ ํ์ธํ์์ ๋ ์๋์ ๊ฐ์ ์ธ์ฆ ๋ฉ์ผ์ด ์จ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์[Link to e-mail address verification]
์ ๋๋ฅด๋ฉด ํฐ๋ฏธ๋์์ ์คํํ๋ ๋ช
๋ น ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค.
2. GKE์ ๋ํ ์ธ์ฆ/์ธ๊ฐ
GKE ํ๊ฒฝ์์์ ์ธ์ฆ/์ธ๊ฐ๋ฅผ ํ ์คํธํ๊ธฐ ์ํด์ ์์ ๋๋ ํฐ๋ฆฌ์ ์์นํ GKE ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํฉ๋๋ค.
tree GKE
#
# 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
์์์ ๋ง์๋๋ฆฐ ๊ฒ์ฒ๋ผ GKE์ ๊ฒฝ์ฐ EKS์ ๋ค๋ฅธ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ๋ค๋ฅด๊ฒ ํตํฉ ์ธ์ฆ์ ์ํ ์ปจํ
์คํธ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ๊ทธ๋์ ์ปจํ
์คํธ๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋จผ์ ์ง๊ธ์ EKS ์ปจํ
์คํธ์์ GKE ์ปจํ
์คํธ๋ก ์ด๋์ด ํ์ํฉ๋๋ค. ์ด๋ kubectx
๋ช
๋ น ๋๋ kubectl config use-context
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ๋ก ์ ํ์ด ๊ฐ๋ฅํฉ๋๋ค.
ํฐ๋ฏธ๋์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
#
# 2023/10/30 19:11:46 Started webserver on localhost: 8000.
# 2023/10/30 19:11:46 Attempting to open http://127.0.0.1:8000/login in default browser.
# 2023/10/30 19:11:47 OIDC Authentication successful.
#
์ธ์ฆ์ด ์๋ฃ๋์๋ค๊ณ ๋ํ๋จ๊ณผ ๋์์ ์๋ก์ด ์ปจํ ์คํธ๊ฐ ์์ฑ๋๊ณ , ์ง๊ธ ์ปจํ ์คํธ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
ํ์ฌ ์ํ์์ GKE ํด๋ฌ์คํฐ์ kubectl get pods
๋ฅผ ์
๋ ฅํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ํ๋ฉ๋๋ค.
kubectl get pods
#
# Error from server (Forbidden): pods is forbidden: User "hj@mz.co.kr" cannot list resource "pods" in API group in the namespace "default"
์ด๋ ํคํด๋ฝ์ ํตํด์ ์ธ์ฆ์ ์๋ฃ๋์์ง๋ง ์ฟ ๋ฒ๋คํฐ์ค RBAC์ ํตํด์๋ ์ธ๊ฐ๊ฐ ๋์ง ์์์ ๋ฐ์ํ๋ ์๋ฌ์
๋๋ค. ์ด ๋ฌธ์ ๋ GKE ํด๋ฌ์คํฐ์ ์ด๋๋ฏผ ์ปจํ
์คํธ๋ก ๋ค์ ๋์๊ฐ ํด๋ฌ์คํฐ๋กค๋ฐ์ธ๋ฉ์ ์ ์ฉํด์ฃผ๋ฉด ํด๊ฒฐ ๋ฉ๋๋ค. ์ ์ฉํ ํด๋ฌ์คํฐ๋กค๋ฐ์ธ๋ฉ์ 2-hoon.clusterrolebinding-4-devops-user-as-admin.yaml
์
๋๋ค.
kubectl apply -f
#
# 2-hoon.clusterrolebinding-4-devops-user-as-admin.yaml
Note
EKS์ ๋์ผํ๊ฒ ๊ทธ๋ฃน์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ์ด ๊ธ์ ์์ฑํ๋ ์์ ์์ ๊ตฌ๊ธ GKE์์ JWT๋ก๋ถํฐ ๊ทธ๋ฃน์ ๋ํ ํ๋๋ฅผ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ์ด ์ ์๋์ํ์ง ์๊ณ ์๊ธฐ ๋๋ฌธ์ ์ค์ต์์๋ ๋ถ๋์ดํ๊ฒ ๊ฐ์ธ์ RBAC ์ธ๊ฐ ์ฒ๋ฆฌ๋ฅผ ์งํํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๋ถ๋ถ์ ํฅํ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
๋ค์์ผ๋ก kubectx
๋ก <ํด๋ฌ์คํฐ์ด๋ฆ>-<ํด๋ฌ์คํฐ์ด๋ฆ-anthos-default-user>
์ ๊ฐ์ ์ด๋ฆ ํ์์ ์ฌ์ฉํ๋ GKE ์ปจํ
์คํธ๋ก ์ด๋ํฉ๋๋ค. ์ด๋ํ์๋ค๋ฉด ๋ค์ kubectl get pods
๋ฅผ ์
๋ ฅํด๋ณด๊ฒ ์ต๋๋ค.
kubectl get pods
#
# NAME READY STATUS RESTARTS AGE
# keycloak-0 1/1 Running 0 85m
# keycloak-postgresql-0 1/1 Running 0 85m
ํคํด๋ฝ์ ํตํ ์ธ์ฆ์ด ์๋ฃ๋ ์ฌ์ฉ์๊ฐ ์ด์ ๋ kubectl get pods
๋ฅผ ํตํด์ ํ๋๋ฅผ ํ์ธํ ์ ์๋ ๊ฒ์ ์์๋ดค์ต๋๋ค.
ํคํด๋ฝ์ ์ด์ฉํ ํตํฉ ์ธ์ฆ์ผ๋ก ์ป์ ์ ์๋ ์ด์ ๋ค ์ ๋ฆฌ
์ง๊ธ๊น์ง์ ์ค์ต์ ํตํด์ ํคํด๋ฝ์ ์ด์ฉํ ์ฟ ๋ฒ๋คํฐ์ค ํตํฉ ์ธ์ฆ์ ๊ตฌ์ฑํ๊ณ ์๋ก ๋ค๋ฅธ ํด๋ผ์ฐ๋์ ๋ฐฐํฌ๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์ธ์ฆ/์ธ๊ฐ๋ฅผ ์งํ ํ์ต๋๋ค. ์ ๋ฆฌ๋ฅผ ์ํด์ ํคํด๋ฝ ํตํฉ ์ธ์ฆ์ผ๋ก ์ป์ ์ ์๋ ์ด์ ์ ์์ฝํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฒซ ๋ฒ์งธ๋ ๋จ์ํ๊ฒ EKS, GKE ๋ฟ๋ง ์๋๋ผ ์จํ๋ ๋ฏธ์ค ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ๋น๋กฏํด SAML๊ณผ OIDC๋ฅผ ์ง์ํ๋ ๋ค๋ฅธ ์คํ์์ค ์ฑ๋ค์์๋ ํตํฉ ์ธ์ฆ์ ๊ตฌ์ฑํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ ๋ฒ์งธ๋ก๋ ๋๋ถ๋ถ Okta์ Onelogin๊ณผ ๊ฐ์ ์๋ฃจ์ ์ ์ฌ์ฉํ์ค ์ ์์ง๋ง ๋ฒ๋ น ์์ ๊ท์ ๋ก SaaS๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ธ์ต๊ถ ๋ฐ ๊ณต๊ณต๊ธฐ๊ด์์ ์คํ์์ค๋ฅผ ํ์ฉํด ๋ด๋ถ ์กฐ์ง์ ์ธ์ฆ ์ฌ์ ์(IdP)๋ฅผ ๊ตฌ์ฑํ์ค ์ ์์ต๋๋ค.
์ธ ๋ฒ์งธ๋ก๋ ์ธ์ฆ๊ณผ ์ธ๊ฐ์ ๋ํ ์ค์ ์ ์ค์์์ ๊ด๋ฆฌํ ์ ์๋ค๋ ์ ์ ๋๋ค. ์กฐ์ง์ด ์ปค์ง๋ฉด ์ปค์ง์๋ก ์ฌ์ฉ์๋ฅผ ๊ด๋ฆฌํ๊ณ ๊ถํ์ ๋ถ์ฌํ๋ ์ผ๋ค์ด ๊ต์ฅํ ํ๋ ์ผ์ด ๋ ์ ์๋๋ฐ, ํคํด๋ฝ์ Realm๊ณผ Role๋ก ์ฌ์ฉ์๋ค์ ๋ํ ๊ด๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ํ ์ ์๋ค๋ ์ ์ ๋๋ค.
๊ธด ๊ธ์ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.