Docs Menu

Atlas ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐ ์ธ์ฆ์— ๋Œ€ํ•œ ์ง€์นจ

์ธ์ฆ์€ ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ์ž…๋‹ˆ๋‹ค. Atlas ์•ก์„ธ์Šค ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ž์‹ ์„ ์ธ์ฆํ•˜๋„๋ก ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ๋Š” ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€๋งŒ, ์ธ์ฆ์€ ๊ถŒํ•œ ๋ถ€์—ฌ์™€ ๊ตฌ๋ณ„๋ฉ๋‹ˆ๋‹ค.

  • ์ธ์ฆ์€ ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    Atlas ๊ธฐ์กด ID ์‹œ์Šคํ…œ๊ณผ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜๋Š” ๊ฐ•๋ ฅํ•œ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜์—ฌ ๊ฐ•๋ ฅํ•œ ID ํŽ˜๋”๋ ˆ์ด์…˜์„ ํ†ตํ•ด UI, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค,API์— ์•ˆ์ „ํ•˜๊ฒŒ ์•ก์„ธ์Šค ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ๊ตฌ์„ฑํ•˜์—ฌ MongoDB Atlas ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ถŒํ•œ ๋ถ€์—ฌ๋Š” ๋ฆฌ์†Œ์Šค ๋ฐ ์ž‘์—…์— ๋Œ€ํ•œ ํ™•์ธ๋œ ์‚ฌ์šฉ์ž์˜ ์•ก์„ธ์Šค๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

    Atlas๋Š” Atlas์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์—ญํ•  ๊ธฐ๋ฐ˜ ์•ก์„ธ์Šค ์ œ์–ด(RBAC)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฆฌ์†Œ์Šค ๋ฐ ์ž‘์—…์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž์˜ ์•ก์„ธ์Šค๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ• ์ด ํ•˜๋‚˜ ์ด์ƒ ํ• ๋‹น๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ญํ• ์ด ํ• ๋‹น๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๋Š” ์‹œ์Šคํ…œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

MongoDB Atlas ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์ธ์ฆ ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž Atlas ์ธ์ฆ์˜ ๊ถŒ์žฅ์‚ฌํ•ญ์€ OIDC(OpenID Connect) ๋˜๋Š” SAML 2.0์„ ํ†ตํ•œ ์—ฐํ•ฉ ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜์—ฌ Atlas์™€ ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž๋ฅผ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉํ•˜๊ณ , ๋‹ค์ค‘์š”์†Œ์ธ์ฆ(MFA)์œผ๋กœ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜์—ฌ ํ˜„๋Œ€์ ์ธ ์ธ์ฆ ๋ฐ ๋ณด์•ˆ ํƒœ์„ธ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์›Œํฌ๋กœ๋“œ ์ธ์ฆ ์˜ ๊ฒฝ์šฐ Atlas OAuth2.0 ๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ๊ถŒํ•œ ๋ถ€์—ฌ ์„œ๋น„์Šค์™€์˜ ์›ํ™œํ•œ ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•˜๊ณ  ํŽ˜๋”๋ ˆ์ด์…˜๋œ IdP์— ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Atlas ์—์„œ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์„ ๋ฐ›์•„์•ผ Atlas UI, Atlas ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ Atlas ๊ด€๋ฆฌ API ์•ก์„ธ์Šค . ๊ฐ Atlas ๋ฆฌ์†Œ์Šค ์— ๋Œ€ํ•œ ๋‹ค์Œ ์ธ์ฆ ๋ฐฉ๋ฒ•์€ ์ธ์ฆ ์•ˆ์ „ํ•˜๊ณ  ์ ์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. Atlas ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Atlas UI ์•ก์„ธ์Šค ์—๋Š” ํŽ˜๋”๋ ˆ์ด์…˜ ์ธ์ฆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ํŽ˜๋”๋ ˆ์ด์…˜ ์ธ์ฆ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด Atlas ์ž๊ฒฉ ์ฆ๋ช… ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ Google ๋˜๋Š” Github ๋กœ ๋กœ๊ทธ์ธ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Atlas ์ž๊ฒฉ ์ฆ๋ช… ์˜ ๊ฒฝ์šฐ, ์ƒ์ฒด ์ธ์‹๊ณผ ๊ฐ™์€ ํ”ผ์‹ฑ ๋ฐฉ์ง€ MFA์™€ ํ•จ๊ป˜ ๊ฐ•๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ณ„์ • ์ž ๊ธˆ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์„ธ์ปจ๋”๋ฆฌ MFA ์š”์†Œ๋ฅผ ์„ค์ •ํ•˜๋‹ค ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Atlas ์ž๊ฒฉ ์ฆ๋ช… ์— ๋Œ€ํ•œ MFA ์•ก์„ธ์Šค ๋ณด์žฅํ•˜๋ ค๋ฉด ์กฐ์ง ์„ค์ •์—์„œ MFA ์‹œํ–‰์„ ์ผœ์„ธ์š”. ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ํŽ˜๋”๋ ˆ์ด์…˜์„ ์„ค์ •ํ•˜๋‹ค ํ•œ ํ›„์—๋Š” ํŽ˜๋”๋ ˆ์ด์…˜ ์ธ์ฆ ์ค‘๋‹จ๋œ ๊ธด๊ธ‰ Break-Glass ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋งŒ Atlas ์ž๊ฒฉ ์ฆ๋ช… ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฐํ•ฉ ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Atlas UI์— ๋Œ€ํ•œ ๋ชจ๋“  ์ธ์ฆ์„ ํ†ตํ•ฉํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UI ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•ด Atlas๋Š” SAML 2.0์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง์› ID ์—ฐํ•ฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Okta, Microsoft Entra ID, Ping Identity์™€ ๊ฐ™์€ SAML ํ˜ธํ™˜ ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž ๋‚ด์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณต์žก์„ฑ, ์ž๊ฒฉ ์ฆ๋ช… ํšŒ์ „, MFA ๋“ฑ์˜ ๋ณด์•ˆ ์ •์ฑ…์„ ์‹œํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋ฅผ ํฌํ•จํ•˜๋Š” IP ๋ฒ”์œ„์˜ ์—ฐ๊ฒฐ๋งŒ ํ—ˆ์šฉํ•˜๋„๋ก Atlas UI ์—์„œ IP ์•ก์„ธ์Šค ๋ชฉ๋ก ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ํ•™์Šต ์€ ํŽ˜๋”๋ ˆ์ด์…˜ ์ธ์ฆ ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Atlas ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ธ๊ฐ„ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด MFA๋ฅผ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. MFA๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด Atlas ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ์˜ ์‹๋ณ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž์˜ ์ž๊ฒฉ ์ฆ๋ช…

  • ๋‹ค์Œ ๊ถŒ์žฅ ์š”์ธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

    • ๋ณด์•ˆ ํ‚ค

    • ์ƒ์ฒด ์ธ์‹

    • OTP ์ธ์ฆ์ž

    • ํ‘ธ์‹œ ์•Œ๋ฆผ

    • SMS( ํ”„๋ผ์ด๋จธ๋ฆฌ ์š”์†Œ๋กœ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Œ)

    • ์ด๋ฉ”์ผ(๊ธฐ๋ณธ ์š”์†Œ๋กœ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Œ)

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์ค‘ ์ธ์ฆ ์˜ต์…˜ ๊ด€๋ฆฌํ•˜๊ธฐ ํ•ญ๋ชฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Atlas ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

MongoDB Shell ๋ฐ Compass ์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด Atlas ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์— ๋Œ€ํ•œ ์›Œํฌํฌ์Šค(ํœด๋จผ ์‚ฌ์šฉ์ž) ์•ก์„ธ์Šค ๊ตฌ์„ฑํ•˜๋ ค๋ฉด OIDC์™€ํ•จ๊ป˜ Workforce Identity Federation์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

MongoDB ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Atlas ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์›Œํฌ๋กœ๋“œ(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜) ์•ก์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํŽ˜๋”๋ ˆ์ด์…˜, AWS-IAM ์ธ์ฆ ๋˜๋Š” X.509 ์ธ์ฆ์„œ ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. SCRAM ์ธ์ฆ์€ ๊ฐœ๋ฐœ ๋˜๋Š” ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Atlas๋Š” ๋‹ค์Œ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

Workforce Identity Federation์„ ์‚ฌ์šฉํ•˜๋ฉด ID ์ œ๊ณต์ž ํ†ตํ•ด Atlas ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ธ์ฆ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์„ธ์Šค ์˜ ๊ฒฝ์šฐ, Okta, Microsoft Entra ID ๋˜๋Š” Ping Identity์™€ ๊ฐ™์€ OIDCํ˜ธํ™˜ ID ์ œ๊ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ID ์ œ๊ณต์ž ๋‚ด์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณต์žก์„ฑ, ์ž๊ฒฉ ์ฆ๋ช… ์ˆœํ™˜, MFA์™€ ๊ฐ™์€ ๋ณด์•ˆ ์ •์ฑ…์„ ์‹œํ–‰ํ•˜๋‹ค ์ข‹์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ OIDC๋กœ Workforce Identity Federation ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Workload Identity Federation์„ ์‚ฌ์šฉํ•˜๋ฉด Azure ๋ฐ Google Cloud์™€ ๊ฐ™์€ cloud ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž ์ž๊ฒฉ ์ฆ๋ช… ๊ด€๋ฆฌ ํ•  ํ•„์š” ์—†์ด Atlas ๋กœ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Workload Identity Federation์„ ์‚ฌ์šฉํ•˜๋ฉด Azure ๊ด€๋ฆฌํ˜• ID, Google ์„œ๋น„์Šค ๊ณ„์ • ๋˜๋Š” ๋ชจ๋“  OAuth ํ˜ธํ™˜ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Atlas ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž๋ฅผ ๊ด€๋ฆฌ ํ•  ์ˆ˜ 2.0์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ Atlas ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์— ์•”ํ˜ธ ์—†๋Š” ์•ก์„ธ์Šค ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ๊ด€๋ฆฌ ๊ฐ„์†Œํ™”ํ•˜๊ณ  ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ์›Œํฌ๋กœ๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— Workload Identity Federation์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๋น„์ƒ ์ƒํ™ฉ ์™ธ์—๋Š” ์‚ฌ์šฉ์ž์˜ ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

AWS IAM ์—ญํ• ์„ ํ†ตํ•ด ์ธ์ฆํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ณด์•ˆ ๋ฐ ๋ชจ๋“  Atlas ์ œ์–ด ๋ฐ ๋ฐ์ดํ„ฐ ํ‰๋ฉด์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์‰ฝ๊ฒŒ ํ•˜๋ ค๋ฉด ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž๋ฅผ ํ†ตํ•ด Workforce ๋˜๋Š” Workload Identity Federation์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํŽ˜๋”๋ ˆ์ด์…˜์šฉ ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ Atlas ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์œ„ํ•œ X.509 ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. X.509 ์ธ์ฆ์„œ๋Š” ์ƒํ˜ธ TLS์˜ ๋ณด์•ˆ์„ ์ œ๊ณตํ•˜์—ฌ ์Šคํ…Œ์ด์ง• ๋ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•˜๋ฉฐ, X.509์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ž์ฒด ์ธ์ฆ ๊ธฐ๊ด€์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. X.509์˜ ๋‹จ์ ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธก์—์„œ ์ธ์ฆ์„œ์™€ ๊ทธ ๋ณด์•ˆ์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด Workload Identity Federation์„ ์‚ฌ์šฉํ•˜๋ฉด ์•”ํ˜ธ ์—†๋Š” ์•ก์„ธ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ์ด ๋” ๊ฐ„ํŽธํ•ด์ง‘๋‹ˆ๋‹ค.

Atlas ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์œ„ํ•ด SCRAM ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ์„ ์ง€์›ํ•˜์ง€๋งŒ, ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋งŒ SCRAM์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

X.509 ๋˜๋Š” SCRAM ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, HashiCorp Vault ๋˜๋Š” AWS Secrets Manager์™€ ๊ฐ™์€ ํƒ€์‚ฌ ๋น„๋ฐ€ ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž๊ฒฉ ์ฆ๋ช…์„ ์ƒ์„ฑํ•˜๊ณ  ์ €์žฅํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์„ ์•Œ์•„๋ณด๋ ค๋ฉด ๋‹ค์Œ ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Atlas๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋œ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ž๋™์œผ๋กœ ๋งŒ๋ฃŒ๋˜๋Š” ์ž„์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž ์ƒ์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • 6์‹œ๊ฐ„

  • 1์ผ

  • 1์ฃผ

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

HashiCorp Vault ๋˜๋Š” AWS Secrets Manager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž๊ฒฉ ์ฆ๋ช…์„ ์ƒ์„ฑํ•˜๊ณ  ์ €์žฅํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ฐ€ ๊ด€๋ฆฌ์ž๋Š” Atlas ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ์„ค์ •๋œ ์—ญํ• ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž๊ฒฉ ์ฆ๋ช…์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ MongoDB Atlas ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋น„๋ฐ€์„ HashiCorp Vault์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Atlas๋Š” Atlas Administration API์— ์ธ์ฆํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๊ณ„์ •์€ ์—…๊ณ„ ํ‘œ์ค€ OAuth ๋ฅผ2.0 ์‚ฌ์šฉํ•˜์—ฌ Atlas Administration API ํ†ตํ•ด Atlas ์— ์•ˆ์ „ํ•˜๊ฒŒ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค ๊ณ„์ •์€ ๋‹จ๊ธฐ ์•ก์„ธ์Šค ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๊ณ  ํ•„์ˆ˜ ์ž๊ฒฉ ์ฆ๋ช… ๋กœํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋ฏ€๋กœ ๊ฐ€๋Šฅํ•˜๋ฉด API ํ‚ค ๋Œ€์‹  ์„œ๋น„์Šค ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๊ณ„์ •์€ Preview ๊ธฐ๋Šฅ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Atlas UI ๋˜๋Š” Atlas Administration API ํ†ตํ•ด์„œ๋งŒ ์„œ๋น„์Šค ๊ณ„์ •์— ๋Œ€ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์˜ ์•ก์„ธ์Šค ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Atlas CLI ๋˜๋Š” Terraform์„ ํ†ตํ•ด ์„œ๋น„์Šค ๊ณ„์ •์— ๋Œ€ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์˜ ์•ก์„ธ์Šค ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์„œ๋น„์Šค ๊ณ„์ • ๊ฐœ์š”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์„œ๋น„์Šค ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ API ํ‚ค ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ ์•ก์„ธ์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. API ํ‚ค ๊ธฐ๋ฐ˜ ์ธ์ฆ์€ HTTP ๋‹ค์ด์ œ์ŠคํŠธ ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. API ๊ณต๊ฐœ ํ‚ค๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„์œผ๋กœ, ํ•ด๋‹น ๊ฐœ์ธ ํ‚ค๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ‚ค๋Š” AWS Secrets Manager ๋˜๋Š” HashiCorp Vault์™€ ๊ฐ™์€ ํƒ€์‚ฌ ๋น„๋ฐ€ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์— ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. HashiCorp Vault์— ์ด๋Ÿฌํ•œ ํ‚ค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๋ฉด HashiCorp Vault์—์„œ MongoDB Atlas ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋น„๋ฐ€์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ณด์•ˆ์„ ๋”์šฑ ๊ฐ•ํ™”ํ•˜๊ณ  ๋ฌด๋‹จ ์•ก์„ธ์Šค์˜ ์œ„ํ—˜์„ ์ตœ์†Œํ™”ํ•˜๋ ค๋ฉด:

  • ์ •๊ธฐ์ ์œผ๋กœ API ํ‚ค๋ฅผ ๊ต์ฒดํ•˜๊ธฐ ์œ„ํ•œ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ๋”ฐ๋ฅด์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด HashiCorp Vault๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ํ‚ค๋ฅผ ํšŒ์ „ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๋ฉด Hashicorp ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  • API ํ‚ค์— IP ์•ก์„ธ์Šค ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Atlas ๊ด€๋ฆฌ API์— ๋Œ€ํ•œ IP ์•ก์„ธ์Šค ๋ชฉ๋ก ์š”๊ตฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ž์„ธํ•œ ๋‚ด์šฉ์€ Atlas ๊ด€๋ฆฌ API ์ธ์ฆ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฐฐํฌ์— ๊ด€ํ•œ ๊ถŒ์žฅ์‚ฌํ•ญ์€ ์ธ์ฆ๊ณผ ๊ด€๋ จ๋œ Atlas ์กฐ์ง, ํ”„๋กœ์ ํŠธ ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์ง€์นจ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌ ํ•˜๋ ค๋ฉด Atlas์˜ ๊ฐ•๋ ฅํ•œ ์—ญํ•  ๊ธฐ๋ฐ˜ ์•ก์„ธ์Šค ์ œ์–ด(RBAC)๋ฅผ ๊ตฌํ˜„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Atlas ์—๋Š” Atlas ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ์ˆ˜์ค€์˜ ์•ก์„ธ์Šค ์ œ๊ณตํ•˜๋Š” ๋‚ด์žฅ ์—ญํ• ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์˜์—ญ์—์„œ Atlas cluster์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ธ๋ถ„ํ™”๋œ ์‚ฌ์šฉ์ž ์ง€์ • ์—ญํ• ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ญํ•  ์ด ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์„ธ๋ถ„ํ™”๋œ ๋ฒ”์œ„๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์†Œ ๊ถŒํ•œ ์›์น™์„ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, Atlas๋ฅผ ์—ฐํ•ฉ ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž์™€ ํ†ตํ•ฉํ•˜๋ฉด ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž ๊ทธ๋ฃน์„ Atlas ์—ญํ• ์— ๋งคํ•‘ํ•˜์—ฌ ํ”„๋กœ๋น„์ €๋‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์•ก์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๊ณ  ํ”Œ๋žซํผ ์ „๋ฐ˜์— ๊ฑธ์ณ ์•ˆ์ „ํ•˜๊ณ  ์ฒด๊ณ„์ ์ธ ์—ญํ•  ํ• ๋‹น์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๊ณ„์ธต์˜ ํ”„๋กœ๋น„์ €๋‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ณด์•ˆ ๋ฐ ๊ฒฐ์ •๋ก ์  ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ๋œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ ์„œ๋น„์Šค ๊ณ„์ •์œผ๋กœ๋งŒ ์ƒ์œ„ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ํ•ญ์ƒ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ์ค‘์—๋Š” ํ•˜์œ„ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ๋žŒ์˜ ์•ก์„ธ์Šค ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž, ์„œ๋น„์Šค ๊ณ„์ •, API ํ‚ค๋ฅผ ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์— ํ• ๋‹นํ•˜์—ฌ Atlas ์กฐ์ง, ํ”„๋กœ์ ํŠธ ๋˜๋Š” ๋‘˜ ๋‹ค ๋‚ด์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Identity Federation์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ฃน-์—ญํ•  ๋งคํ•‘์„ ํ†ตํ•ด ID ์ œ๊ณต์ž ๊ทธ๋ฃน์„ Atlas ์—ญํ• ์— ์—ฐ๊ฒฐํ•˜์—ฌ ์•ก์„ธ์Šค ๊ด€๋ฆฌ .

Azure Entra ID, Okta ๋˜๋Š” Ping Identity์™€ ๊ฐ™์€ SAML์„ ์ง€์›ํ•˜๋Š” ์ตœ์‹  ์—ฐํ•ฉ ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž(IdP)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ถŒํ•œ ๋ถ€์—ฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋” ์•ˆ์ „ํ•ด์ง€๊ณ , ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž ๊ทธ๋ฃน์„ Atlas ์—ญํ• ์— ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ํ• ๋‹นํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํšŒ์‚ฌ์˜ ๋„๋ฉ”์ธ์„ ์ œํ•œํ•˜์—ฌ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์—†๋Š” ์‚ฌ์šฉ์ž๊ฐ€ Atlas์— ๋กœ๊ทธ์ธํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์—ฐํ•ฉ ์ธ์ฆ์„ ์œ„ํ•œ ๋„๋ฉ”์ธ ๋งคํ•‘ ๊ด€๋ฆฌ ์ ˆ์ฐจ๋ฅผ ๋”ฐ๋ฅด์„ธ์š”. ์—ฌ๊ธฐ์—์„œ ์—ญํ•  ๋งคํ•‘ ํ”„๋กœ์„ธ์Šค์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž ๊ทธ๋ฃน์„ Atlas ์—ญํ• ์— ๋งคํ•‘ํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ฐ BU ๋˜๋Š” ๋ถ€์„œ๋ณ„๋กœ ์—ฐ๊ฒฐ๋œ ์กฐ์ง์ด ์žˆ๋Š” ๋‹จ์ผ ์ฒญ๊ตฌ ์กฐ์ง์˜ ํ‘œ์ค€ Atlas ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒฝ์šฐ์—๋Š” ์กฐ์ง ์‚ฌ์šฉ์ž๋ฅผ ์šด์˜ ๋˜๋Š” ํ”Œ๋žซํผ ํŒ€ ๊ด€๋ฆฌ์ž๋กœ ์ œํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ ํŒ€ ๋˜๋Š” ์ œํ’ˆ ํŒ€์—๋Š” ํ”„๋กœ์ ํŠธ ์—ญํ• ์„ ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์œ„ ํ™˜๊ฒฝ์—์„œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์˜ ์ ‘๊ทผ๋งŒ ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์—ญํ• ์— ๋Œ€ํ•œ ๋‹ค์Œ ๊ถŒ์žฅ์‚ฌํ•ญ์€ ์ผ๋ฐ˜์ ์ธ ์ง€์นจ์œผ๋กœ ์ œ๊ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Organization Owner ์—ญํ•  ์กฐ์ง ์ „์ฒด์˜ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ตฌ์„ฑ์„ ์‚ญ์ œ ๊ธฐ๋Šฅ ์žˆ์œผ๋ฏ€๋กœ ์—„๊ฒฉํ•˜๊ฒŒ ์ œํ•œํ•ด์•ผ ํ•˜๋ฉฐ ์‚ฌ๋žŒ์—๊ฒŒ ํ• ๋‹นํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ญํ•  ์ฒ˜์Œ์— ์กฐ์ง ์„ค์ •ํ•˜๋‹ค ํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ •์— ํ• ๋‹น๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์ƒ์„ฑ ํ›„ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์ • ์ž ๊ธˆ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • JIT(Just-in-Time) ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š”SAML ์กฐ์ง ์†Œ์œ ์ž ๊ทธ๋ฃน .

    • ์กฐ์ง ์†Œ์œ ์ž ์—ญํ•  ์žˆ๋Š” API ํ‚ค์ž…๋‹ˆ๋‹ค. Break-Glass ๊ธด๊ธ‰ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€๋น„ํ•œ ๊ฐ•๋ ฅํ•œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ ํ†ตํ•ด ์•ˆ์ „ํ•œ ์žฅ์†Œ์— ๋ณด๊ด€ํ•˜์„ธ์š”.

  • Organization Member ์—ญํ• ์€ ์กฐ์ง์˜ ์„ค์ • ๋ฐ ๊ตฌ์„ฑ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์šด์˜ ๋ฐ ํ”Œ๋žซํผ ํŒ€์˜ ๊ด€๋ฆฌ์ž์—๊ฒŒ ํ• ๋‹น๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Organization Project Creator ์—ญํ•  ๊ฐœ๋ฐœ ๋ฐ ์ œํ’ˆ ํŒ€์„ ์œ„ํ•œ ์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋Œ€์‹ ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ์„œ๋น„์Šค ๊ณ„์ •์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Organization Billing Admin ์—ญํ•  Billing API ์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ฒญ๊ตฌ์„œ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์žฌ๋ฌด ์šด์˜ ๋„๊ตฌ์— ์ œ๊ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ ์„œ๋น„์Šค ๊ณ„์ •์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋™์ผํ•œ ์„œ๋น„์Šค ๊ณ„์ •์€ ์‚ฌ์šฉ ๋ณด๊ณ  ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋“  ์—ฐ๊ฒฐ๋œ ์กฐ์ง์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Project Owner ์—ญํ•  ์šด์˜ ๋ฐ ํ”„๋กœ๋น„์ €๋‹ ํŒ€ ์—์„œ ์‹œํ–‰ํ•˜๋Š” ๊ฑฐ๋ฒ„๋„Œ์Šค ์— ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ญํ•  ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์‚ญ์ œ ๊ธฐ๋Šฅ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋งคํ‹ฑ ์„œ๋น„์Šค ๊ณ„์ •์— ํ• ๋‹นํ•˜์„ธ์š”. ์ƒŒ๋“œ๋ฐ•์Šค ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์—๊ฒŒ Project Owner ์•ก์„ธ์Šค ๋ถ€์—ฌํ•˜์—ฌ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋ฐฐํฌ์„œ๋ฒ„ ํŒŒ์ดํ”„๋ผ์ธ ๊ฑฐ์น˜์ง€ ์•Š๊ณ ๋„ ์ฝ”๋“œ ๋ฐ ์‚ฌ์šฉ ์‚ฌ๋ก€ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ”„๋กœ๋น„์ €๋‹ํ•  ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ•˜์œ„ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ฐœ๋ฐœ ํŒ€์ด ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ์ค‘์— ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ฟผ๋ฆฌ ๋ฐ ์„ฑ๋Šฅ ์ง€ํ‘œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋กProject Data Access Admin ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์•ก์„ธ์Šค๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํƒ์ƒ‰๊ธฐ์—์„œ ๋ฐ์ดํ„ฐ ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ด ์—ญํ• ์„ ํ—ˆ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์ปฌ๋ ‰์…˜, ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑ ๋ฐ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ  ํŽธ์ง‘ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์–ด ์‹ ์†ํ•œ ์‹คํ—˜๊ณผ ๊ฐœ๋ฐœ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœ ํŒ€์—๊ฒŒ ์ด ์ˆ˜์ค€์˜ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ•œ ๊ฒฝ์šฐ Project Data Access Read Only ์—ญํ• ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฐ์ดํ„ฐ ๋ฐ ์„ฑ๋Šฅ ํ†ต๊ณ„์— ๋Œ€ํ•œ ์ฝ๊ธฐ ์ „์šฉ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฐ์ดํ„ฐ์— ์ฝ๊ธฐ ์ „์šฉ ์•ก์„ธ์Šค๋ฅผ ๋ถ€์—ฌํ•˜๋ ค๋ฉด Project Observability Viewer ์—ญํ• ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ Atlas ์‚ฌ์šฉ์ž ์—ญํ• ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ง์› ๋ฐ ์›Œํฌ๋กœ๋“œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ํŠน์ • ํ”„๋กœ์ ํŠธ๋‚˜ ๊ฐœ๋ณ„ ํด๋Ÿฌ์Šคํ„ฐ์— ๋งž์ถ˜ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์„ธ๋ถ„ํ™”๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ญํ• (์‚ฌ์ „ ์ •์˜ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ •)์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ…Œ์ด์ง• ๋ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Identity Federation์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž(IdP)๋ฅผ Atlas์— ์—ฐ๋™ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•œ ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ ๊ณผ์ •์„ ๋ณด๋‹ค ํ˜„๋Œ€์ ์ด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž์—์„œ ๊ทธ๋ฃน ๋ฉค๋ฒ„์‹ญ์„ ๊ตฌ์„ฑํ•˜๋ฉด ๊ทธ๋ฃน์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž์— ๋งคํ•‘ํ•˜์—ฌ ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž ๋‚ด์—์„œ ์•ก์„ธ์Šค ์ œ์–ด๋ฅผ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›Œํฌ๋กœ๋“œ ID์˜ ๊ฒฝ์šฐ groups ๋Œ€์‹  users ํด๋ ˆ์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ์—ญํ• ์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์ „ ์ •์˜๋œ readWriteAny ์—ญํ• ์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์œ„ ํ™˜๊ฒฝ์œผ๋กœ ์ด๋™ํ•  ๋•Œ๋Š” ์ตœ์†Œ ๊ถŒํ•œ ์›์น™์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์˜ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์—ญํ• ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

GitHub์—์„œ ๋ชจ๋“  ์˜์—ญ์— ๊ฑธ์ณ ์Šคํ…Œ์ด์ง•/ํ”„๋กœ๋•์…˜ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋Š” Terraform ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ์ž๋™ํ™” ์œ„ํ•ด Atlas ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ ๋ฐ ์‚ฌ์šฉ์ž ์ง€์ • ์—ญํ• ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ง€์ •๋œ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด IAM ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ•ด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์„ธ์š”.

atlas dbusers create \
--projectId "6698000acf48197e089e4085" \
--username "MyRoleARN" \
--awsIAMType "ROLE" \
--role "clusterMonitor" \
--scope "myCluster"

๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ SCRAM ์ธ์ฆ ์‚ฌ์šฉํ•˜์—ฌ ์ž„์‹œ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

atlas dbusers create \
--projectId 6698000acf48197e089e4085 \
--username "tempUser" \
--password "securePassword" \
--role "readWrite" \
--scope "myCluster" \
--deleteAfter "2025-02-01T12:00:00Z"

๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ OIDC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Workforce Identity Federation์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

atlas federatedAuthentication federationSettings identityProvider create oidc Azure \
--audience "https://management.azure.com/" \
--authorizationType "USER" \
--desc "oidc-for-azure" \
--federationSettingsId "5d1113b25a115342acc2d1aa" \
--groupsClaim "groups" \
--idpType "WORKFORCE" \
--issuerUri "https://sts.windows.net/" \
--userClaim "sub"

๋‹ค์Œ ์˜ˆ์‹œ๋Š” ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. Terraform์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด:

  • ๊ฒฐ์ œ ์กฐ์ง์„ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น ๊ฒฐ์ œ ์กฐ์ง์— ๋Œ€ํ•œ API ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ API ํ‚ค๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•˜์„ธ์š”.

    export MONGODB_ATLAS_PUBLIC_KEY="<insert your public key here>"
    export MONGODB_ATLAS_PRIVATE_KEY="<insert your private key here>"
  • Terraform ์„ค์น˜ํ•˜๊ธฐ

๊ฐ ์˜ˆ์‹œ ์— ๋Œ€ํ•ด ๋‹ค์Œ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์˜ˆ์‹œ ์— ๋Œ€ํ•œ ํŒŒ์ผ์„ ์ž์ฒด ๋””๋ ‰ํ† ๋ฆฌ ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ID์™€ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ Terraform์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , Terraform ๊ณ„ํš์„ ํ™•์ธํ•œ ๋‹ค์Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉ .

locals {
tags = {
CreatedBy = "Terraform"
Owner = var.owner
Module = "tf-example-oidc-azure"
Name = var.project_name
}
}
resource "azurerm_resource_group" "this" {
name = var.project_name
location = var.location
tags = local.tags
}
resource "azurerm_virtual_network" "this" {
name = var.project_name
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.this.location
resource_group_name = azurerm_resource_group.this.name
tags = local.tags
}
resource "azurerm_subnet" "internal" {
name = "internal"
resource_group_name = azurerm_resource_group.this.name
virtual_network_name = azurerm_virtual_network.this.name
address_prefixes = ["10.0.2.0/24"]
}
resource "azurerm_public_ip" "vm-public-ip" {
name = "public-ip-${var.project_name}"
location = var.location
resource_group_name = azurerm_resource_group.this.name
allocation_method = "Dynamic"
domain_name_label = var.project_name
tags = local.tags
}
resource "azurerm_network_interface" "this" {
name = "ip-${var.project_name}"
location = var.location
resource_group_name = azurerm_resource_group.this.name
tags = local.tags
ip_configuration {
subnet_id = azurerm_subnet.internal.id
name = "public"
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.vm-public-ip.id
}
}
resource "azurerm_user_assigned_identity" "this" {
location = var.location
name = var.project_name
resource_group_name = azurerm_resource_group.this.name
tags = local.tags
}
resource "azurerm_linux_virtual_machine" "this" {
name = var.project_name
resource_group_name = azurerm_resource_group.this.name
location = var.location
size = "Standard_F2"
admin_username = var.vm_admin_username
custom_data = data.cloudinit_config.this.rendered
network_interface_ids = [azurerm_network_interface.this.id]
tags = local.tags
admin_ssh_key {
username = var.vm_admin_username
public_key = var.ssh_public_key
}
source_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-server-jammy"
sku = "22_04-lts"
version = "latest"
}
os_disk {
storage_account_type = "Standard_LRS"
caching = "ReadWrite"
disk_size_gb = 30
}
identity {
type = "UserAssigned"
identity_ids = [azurerm_user_assigned_identity.this.id]
}
}
variable "user" {
description = "MongoDB Atlas User"
type = list(string)
default = ["dbuser1", "dbuser2"]
}
variable "database_name" {
description = "The Database in the cluster"
type = list(string)
}
variable "org_id" {
description = "MongoDB Organization ID"
type = string
}
variable "project_id" {
description = "MongoDB Atlas Project ID"
type = string
}
variable "connection_strings" {
description = "List of MongoDB connection strings to the cluster"
type = list(string)
}
variable "token_audience" {
description = "The token audience used by the OIDC identity provider"
type = string
default = "https://management.azure.com/" # Example audience
}
variable "trusted_domains" {
description = "List of associated domains to trust"
type = list(string)
default = ["myOrg.com", "another-trusted-domain.org"] # Example domains
}
org_id = "32b6e34b3d91647abb20e7b8"
project_id = "67212db237c5766221eb6ad9"
user = ["testUser"]
database_name = ["myTestDb"]
connection_strings = ["mongodb+srv://cluster0.mongodb.net"]
token_audience = "https://management.azure.com/"
trusted_domains = ["myOrg.com", "example-domain.org"]

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ ํ†ตํ•ด Atlas user ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

locals {
test_user_password = random_password.password.result
}
# Generates 12 characters long random password without special characters
resource "random_password" "password" {
length = 12
special = false
}
resource "mongodbatlas_database_user" "user1" {
username = var.user[0]
password = local.test_user_password
project_id = var.project_id
auth_database_name = "admin"
scopes = var.clusters[0]
roles {
role_name = "readWriteAny"
database_name = var.database_name[0]
}
}
output "user1" { value = mongodbatlas_database_user.user1.username }
output "userpwd" { value = mongodbatlas_database_user.user1.password sensitive = true }

๋‹ค์Œ ์˜ˆ์‹œ ์‚ฌ์šฉํ•˜์—ฌ Azure ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Atlas ์—์„œ OIDC ํŽ˜๋”๋ ˆ์ด์…˜ ID ์ œ๊ณต์ž ์„ค์ •ํ•˜๋‹ค ํ•œ ๋‹ค์Œ,OIDC ํŽ˜๋”๋ ˆ์ด์…˜ ์ธ์ฆ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Azure Active Directory์—์„œ ๋ฐœ๊ธ‰ํ•œ OIDC ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

# Connection string to use in this configuration
locals {
mongodb_uri = var.connection_strings[0]
}
# Fetch MongoDB Atlas Federated Settings
data "mongodbatlas_federated_settings" "this" {
org_id = var.org_id
}
# Configure an identity provider for federated authentication
resource "mongodbatlas_federated_settings_identity_provider" "oidc" {
federation_settings_id = data.mongodbatlas_federated_settings.this.id
associated_domains = var.trusted_domains
audience = var.token_audience
authorization_type = "USER"
description = "OIDC Identity Provider for Azure AD"
# Replace with actual Azure Tenant ID
issuer_uri = "https://sts.windows.net/${data.azurerm_client_config.current.tenant_id}/"
idp_type = "WORKFORCE"
name = "OIDC-for-azure"
protocol = "OIDC"
user_claim = "sub" # Claim to extract the user's principal identity
}
resource "mongodbatlas_federated_settings_org_config" "this" {
federation_settings_id = data.mongodbatlas_federated_settings.this.id
org_id = var.org_id
domain_restriction_enabled = false
domain_allow_list = []
data_access_identity_provider_ids = [mongodbatlas_federated_settings_identity_provider.oidc.idp_id]
}
# Create an OIDC-authenticated Database User
resource "mongodbatlas_database_user" "oidc" {
project_id = var.project_id
username = "${mongodbatlas_federated_settings_identity_provider.oidc.idp_id}/${data.azurerm_client_config.current.client_id}"
oidc_auth_type = "USER"
auth_database_name = "$external" # Required when using OIDC for USER authentication
roles {
role_name = "atlasAdmin"
database_name = "admin"
}
}
# Azure-specific data source needed for Tenant ID and Client ID
data "azurerm_client_config" "current" {}
output "vm_fqdn" {
value = azurerm_public_ip.vm-public-ip.fqdn
description = "Fully Qualified Domain Name (FQDN) of the Virtual Machine (VM)"
}
output "ssh_connection_string" {
value = "ssh ${var.vm_admin_username}@${azurerm_public_ip.vm-public-ip.fqdn}"
description = "Useful for connecting to the instance"
}
output "user_test_conn_string" {
value = "mongodb+srv://${var.user[0]}:<password>@${replace(local.mongodb_uri, "mongodb+srv://", "")}/?retryWrites=true"
description = "Connection string for testing regular database user access"
sensitive = true
}
output "user_oidc_conn_string" {
value = "mongodb+srv://${mongodbatlas_database_user.oidc.username}:<OIDCToken>@${replace(local.mongodb_uri, "mongodb+srv://", "")}/?authMechanism=MONGODB-OIDC&retryWrites=true"
description = "Connection string for OIDC-authenticated user"
sensitive = true
}

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ํด๋Ÿฌ์Šคํ„ฐ ์— ๋Œ€ํ•œ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ ์˜ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ”„๋กœ์ ํŠธ ๋ฉค๋ฒ„ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

resource "mongodbatlas_database_user" "admin_user" {
project_id = "6698000acf48197e089e4085"
username = "adminUser"
password = "securePassword" # Use a secure password
auth_database_name = "admin"
roles {
role_name = "atlasAdmin" # Admin role for the cluster
database_name = "admin"
}
roles {
role_name = "readWriteAnyDatabase" # Project member rights
database_name = "admin"
}
}

๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ID ์ œ๊ณต์ž์˜ ํŠน์ • ๊ทธ๋ฃน ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ID ์ œ๊ณต์ž Okta๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋˜ํ•œ ID ์ œ๊ณต์ž ๊ทธ๋ฃน ์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ Atlas cluster ์— ๋Œ€ํ•œ dbAdmin ๋ฐ readWrite ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

atlas dbusers create \
--projectId "6698000acf48197e089e4085" \
--username "okta/my-idp-group" \
--role "readWrite,dbAdmin" \
--oidcType "IDP_GROUP"

๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ํŽ˜๋”๋ ˆ์ด์…˜ ์„ค์ •์—์„œ OIDC ํ˜ธํ™˜ ID ์ œ๊ณต์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

atlas federatedAuthentication federationSettings identityProvider create oidc IDPName \
--audience "api://12345678-1234-1234-1234-123456789abc" \
--authorizationType "GROUP" \
--clientId "abcdef12-3456-7890-abcd-ef1234567890" \
--desc "MyOIDCProvider test" \
--federationSettingsId "5d1113b25a115342acc2d1aa" \
--groupsClaim "groups" \
--idpType "WORKLOAD" \
--issuerUri "https://sts.windows.net/12345678-1234-1234-1234-123456789abc/" \
--userClaim "sub" \
--associatedDomain "example.com"

๋‹ค์Œ ์˜ˆ์‹œ๋Š” ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. Terraform์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด:

  • ๊ฒฐ์ œ ์กฐ์ง์„ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น ๊ฒฐ์ œ ์กฐ์ง์— ๋Œ€ํ•œ API ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ API ํ‚ค๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•˜์„ธ์š”.

    export MONGODB_ATLAS_PUBLIC_KEY="<insert your public key here>"
    export MONGODB_ATLAS_PRIVATE_KEY="<insert your private key here>"
  • Terraform ์„ค์น˜ํ•˜๊ธฐ

๊ฐ ์˜ˆ์‹œ ์— ๋Œ€ํ•ด ๋‹ค์Œ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์˜ˆ์‹œ ์— ๋Œ€ํ•œ ํŒŒ์ผ์„ ์ž์ฒด ๋””๋ ‰ํ† ๋ฆฌ ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ID์™€ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ Terraform์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , Terraform ๊ณ„ํš์„ ํ™•์ธํ•œ ๋‹ค์Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉ .

locals {
tags = {
CreatedBy = "Terraform"
Owner = var.owner
Module = "tf-example-oidc-azure"
Name = var.project_name
}
}
resource "azurerm_resource_group" "this" {
name = var.project_name
location = var.location
tags = local.tags
}
resource "azurerm_virtual_network" "this" {
name = var.project_name
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.this.location
resource_group_name = azurerm_resource_group.this.name
tags = local.tags
}
resource "azurerm_subnet" "internal" {
name = "internal"
resource_group_name = azurerm_resource_group.this.name
virtual_network_name = azurerm_virtual_network.this.name
address_prefixes = ["10.0.2.0/24"]
}
resource "azurerm_public_ip" "vm-public-ip" {
name = "public-ip-${var.project_name}"
location = var.location
resource_group_name = azurerm_resource_group.this.name
allocation_method = "Dynamic"
domain_name_label = var.project_name
tags = local.tags
}
resource "azurerm_network_interface" "this" {
name = "ip-${var.project_name}"
location = var.location
resource_group_name = azurerm_resource_group.this.name
tags = local.tags
ip_configuration {
subnet_id = azurerm_subnet.internal.id
name = "public"
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.vm-public-ip.id
}
}
resource "azurerm_user_assigned_identity" "this" {
location = var.location
name = var.project_name
resource_group_name = azurerm_resource_group.this.name
tags = local.tags
}
resource "azurerm_linux_virtual_machine" "this" {
name = var.project_name
resource_group_name = azurerm_resource_group.this.name
location = var.location
size = "Standard_F2"
admin_username = var.vm_admin_username
custom_data = data.cloudinit_config.this.rendered
network_interface_ids = [azurerm_network_interface.this.id]
tags = local.tags
admin_ssh_key {
username = var.vm_admin_username
public_key = var.ssh_public_key
}
source_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-server-jammy"
sku = "22_04-lts"
version = "latest"
}
os_disk {
storage_account_type = "Standard_LRS"
caching = "ReadWrite"
disk_size_gb = 30
}
identity {
type = "UserAssigned"
identity_ids = [azurerm_user_assigned_identity.this.id]
}
}
# Azure Variables
variable "token_audience" {
type = string
default = "https://management.azure.com/"
description = "Used as resource when getting the access token. See more in the [Azure documentation](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token#get-a-token-using-http)"
}
# MongoDB Atlas variables
variable "org_id" {
type = string
description = "MongoDB Atlas Organization ID"
}
variable "project_id" {
type = string
description = "MongoDB Atlas Project ID"
}
variable "project_name" {
type = string
description = "MongoDB Atlas Project Name"
}
variable "connection_strings" {
type = list(string)
description = "MongoDB Atlas Cluster Standard Connection Strings"
}
org_id = "32b6e34b3d91647abb20e7b8"
project_id = "67212db237c5766221eb6ad9"
project_name = "My Project"
connection_strings =
token_audience = "https://management.azure.com/"
output "vm_fqdn" {
value = azurerm_public_ip.vm-public-ip.fqdn
description = "Fully Qualified Domain Name (FQDN) of the Virtual Machine (VM)"
}
output "ssh_connection_string" {
value = "ssh ${var.vm_admin_username}@${azurerm_public_ip.vm-public-ip.fqdn}"
description = "Useful for connecting to the instance"
}
output "user_test_conn_string" {
value = "mongodb+srv://${local.test_user_username}:${local.test_user_password}@${replace(mongodbatlas_advanced_cluster.this.connection_strings[0].standard_srv, "mongodb+srv://", "")}/?retryWrites=true"
sensitive = true
description = "Useful for connecting to the database from Compass or other tool to validate data"
}
output "user_oidc_conn_string" {
value = local.mongodb_oidc_uri
sensitive = true
description = "Useful to see the format of the OIDC connection string"
}

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ Azure ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Atlas ์—์„œ OIDC ํŽ˜๋”๋ ˆ์ด์…˜ ID ์ œ๊ณต์ž ์„ค์ •ํ•˜๋‹ค ํ•ฉ๋‹ˆ๋‹ค.Azure Active Directory์—์„œ ๋ฐœ๊ธ‰ํ•œ OIDC ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# Connection string to use in this configuration
locals {
mongodb_uri = var.connection_strings[0]
}
# Atlas organization details to use in the configuration
data "mongodbatlas_federated_settings" "this" {
org_id = var.org_id
name = var.project_name
project_id = var.project_id
}
# Configure an identity provider for federated authentication
resource "mongodbatlas_federated_settings_identity_provider" "oidc" {
federation_settings_id = data.mongodbatlas_federated_settings.this.id
audience = var.token_audience
authorization_type = "USER"
description = "oidc-for-azure"
# e.g. "https://sts.windows.net/91405384-d71e-47f5-92dd-759e272cdc1c/"
issuer_uri = "https://sts.windows.net/${azurerm_user_assigned_identity.this.tenant_id}/"
idp_type = "WORKLOAD"
name = "OIDC-for-azure"
protocol = "OIDC"
# groups_claim = null
user_claim = "sub"
}
resource "mongodbatlas_federated_settings_org_config" "this" {
federation_settings_id = data.mongodbatlas_federated_settings.this.id
org_id = var.org_id
domain_restriction_enabled = false
domain_allow_list = []
data_access_identity_provider_ids = [mongodbatlas_federated_settings_identity_provider.oidc.idp_id]
}

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ OIDC ์—ฐํ•ฉ ์ธ์ฆ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

resource "mongodbatlas_database_user" "oidc" {
project_id = var.project_id
username = "${mongodbatlas_federated_settings_identity_provider.oidc.idp_id}/${azurerm_user_assigned_identity.this.principal_id}"
oidc_auth_type = "USER"
auth_database_name = "$external" # required when using OIDC USER authentication
roles {
role_name = "atlasAdmin"
database_name = "admin"
}
}

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฆ„์ด myDb์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ ๋ชจ๋“  ์ปฌ๋ ‰์…˜ ์— ๋Œ€ํ•ด ์—…๋ฐ์ดํŠธ, ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ ์ž‘์—…์„ ํ—ˆ์šฉํ•˜๋Š” my_custom_role(์ด)๋ผ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์—ญํ•  ๋งŒ๋“ญ๋‹ˆ๋‹ค.

resource "mongodbatlas_custom_db_role" "create_role" {
project_id = var.project_id
role_name = "my_custom_role"
actions {
action = "UPDATE"
resources {
database_name = "myDb"
}
}
actions {
action = "INSERT"
resources {
database_name = "myDb"
}
}
actions {
action = "REMOVE"
resources {
database_name = "myDb"
}
}
}

ํŠน์ • ๊ทธ๋ฃน์— Atlas ์—ญํ•  ํ• ๋‹น๋œ Atlas ํ”„๋กœ์ ํŠธ์˜ ์˜ˆ์‹œ๋Š” ์˜ˆ์ œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.