๋ฌธ์„œ ๋ฉ”๋‰ด

๋ฌธ์„œ ํ™ˆ โ†’ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ โ†’ MongoDB ๋งค๋‰ด์–ผ

๋ณต์ œ๋ณธ ์„ธํŠธ๋ฅผ ํ‚ค ํŒŒ์ผ ์ธ์ฆ์œผ๋กœ ์—…๋ฐ์ดํŠธ(๋‹ค์šดํƒ€์ž„ ์—†์Œ)

์ด ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ

  • ๊ฐœ์š”
  • ๊ธฐ์กด ๋ณต์ œ๋ณธ ์„ธํŠธ์— ํ‚ค ํŒŒ์ผ ์•ก์„ธ์Šค ์ œ์–ด ์ ์šฉ
  • x.509 ๋‚ด๋ถ€ ์ธ์ฆ

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

๋ฐฐํฌ์„œ๋ฒ„์—์„œ ํ˜„์žฌ ์ธ์ฆ์„ ์ ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ --transitionToAuth ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์šดํƒ€์ž„ ์—†์ด ์ธ์ฆ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „ 3.4์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋จ : MongoDB 3.2 ์ดํ•˜ ๋ฒ„์ „์€ ์ธ์ฆ ์‹œํ–‰์„ ์œ„ํ•œ ๋‹ค์šดํƒ€์ž„ ์—†๋Š” ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด MongoDB 3.2 ๋ณต์ œ๋ณธ ์„ธํŠธ์—์„œ ์ธ์ฆ์„ ์‹œํ–‰ํ•˜๋ ค๋ฉด ํ‚ค ํŒŒ์ผ ์ธ์ฆ์œผ๋กœ ๋ณต์ œ๋ณธ ์„ธํŠธ ์—…๋ฐ์ดํŠธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ๋‚ด๋ถ€ ๋ณด์•ˆ์„ ์œ„ํ•ด ํ‚คํŒŒ์ผ ๋‚ด๋ถ€ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ์„ ์œ„ํ•ด SCRAM๊ธฐ๋ฐ˜ ์—ญํ•  ๊ธฐ๋ฐ˜ ์•ก์„ธ์Šค ์ œ์–ด ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Cloud Manager ๋˜๋Š” Ops Manager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ ์ธ์ฆ์„ ์‹œํ–‰ํ•˜๋ ค๋ฉด ํ•ด๋‹น Cloud Manager ๋งค๋‰ด์–ผ ๋˜๋Š” Ops Manager ๋งค๋‰ด์–ผ ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ๊ธฐ์กด ํ”„๋ผ์ด๋จธ๋ฆฌ ๋ณต์ œ๋ณธ ์„ธํŠธ ๋ฉค๋ฒ„๋ฅผ ๋ฌผ๋Ÿฌ๋‚˜๊ฒŒ ํ•œ ํ›„ ๋ณต์ œ๋ณธ ์„ธํŠธ๊ฐ€ ์ƒˆ ํ”„๋ผ์ด๋จธ๋ฆฌ ๋ฅผ ์„ ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

mongod ๋กœ ์‹คํ–‰๋˜๋Š” ๋Š” ์ธ์ฆ๋œ ์—ฐ๊ฒฐ๊ณผ ์ธ์ฆ๋˜์ง€ ์•Š์€ ์—ฐ๊ฒฐ์„ ๋ชจ๋‘ --transitionToAuth ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์ „ํ™˜ ์ƒํƒœ ๋™์•ˆ mongod ์— ์—ฐ๊ฒฐ๋œ ํด๋ผ์ด์–ธํŠธ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฝ๊ธฐ, ์“ฐ๊ธฐ ๋ฐ ๊ด€๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ ˆ์ฐจ๊ฐ€ ๋๋‚˜๋ฉด ๋ณต์ œ๋ณธ ์„ธํŠธ๋Š” ์ธ์ฆ๋˜์ง€ ์•Š์€ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ˆ์ฐจ์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ณต์ œ๋ณธ ์„ธํŠธ์— ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉํ•  ์‚ฌ์šฉ์ž ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” โžค ์—ญํ•  ๊ธฐ๋ฐ˜ ์•ก์„ธ์Šค ์ œ์–ด ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

2} ๋ฐmongod mongos MongoDB localhost ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค.

์ค‘์š”

์‹œ์Šคํ…œ ๋ณด์•ˆ์„ ๋ณด์žฅํ•˜๊ณ  ์•…์˜์ ์ธ ์•ก์„ธ์Šค๋ฅผ ๋ฐฉ์ง€ํ•˜๊ฑฐ๋‚˜ ์ง€์—ฐํ•˜๋ ค๋ฉด ์•”ํ˜ธ๋Š” ์ž„์˜์ ์ด๊ณ  ๊ธธ๋ฉฐ ๋ณต์žกํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”

๋ณ€๊ฒฝ๋œ IP ์ฃผ์†Œ๋กœ ์ธํ•ด ๊ตฌ์„ฑ์ด ์—…๋ฐ์ดํŠธ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด IP ์ฃผ์†Œ ๋Œ€์‹  DNS ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ํŠนํžˆ ๋ณต์ œ๋ณธ ์„ธํŠธ ๊ตฌ์„ฑ์› ๋˜๋Š” ์ƒค๋“œ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์›์„ ๊ตฌ์„ฑํ•  ๋•Œ IP ์ฃผ์†Œ ๋Œ€์‹  DNS ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

IP ์ฃผ์†Œ ๋Œ€์‹  ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„ํ• ๋œ ๋„คํŠธ์›Œํฌ ๋ฒ”์œ„์— ๊ฑธ์ณ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. MongoDB 5 ๋ถ€ํ„ฐ ์‹œ์ž‘.0, IP ์ฃผ์†Œ๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ๋…ธ๋“œ๋Š” ์‹œ์ž‘ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ์‹คํŒจํ•˜์—ฌ ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

1

ํ”„๋ผ์ด๋จธ๋ฆฌ ์— ์—ฐ๊ฒฐํ•˜์—ฌ userAdminAnyDatabase ์—ญํ• ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. userAdminAnyDatabase ์—ญํ• ์€ ๋ฐฐํฌ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž ์ƒ์„ฑ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” admin ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— userAdminAnyDatabase ์—ญํ• ์„ ๊ฐ€์ง„ fred ์‚ฌ์šฉ์ž๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ค‘์š”

์‹œ์Šคํ…œ ๋ณด์•ˆ์„ ๋ณด์žฅํ•˜๊ณ  ์•…์˜์ ์ธ ์•ก์„ธ์Šค๋ฅผ ๋ฐฉ์ง€ํ•˜๊ฑฐ๋‚˜ ์ง€์—ฐํ•˜๋ ค๋ฉด ์•”ํ˜ธ๋Š” ์ž„์˜์ ์ด๊ณ  ๊ธธ๋ฉฐ ๋ณต์žกํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŒ

mongo shell ๋ฒ„์ „ 4.2๋ถ€ํ„ฐ ๋ฉ”์„œ๋“œ/๋ช…๋ น ํ˜ธ์ถœ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜๋Š” ๋Œ€์‹  passwordPrompt() ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ/๊ด€๋ฆฌ ๋ฉ”์„œ๋“œ/๋ช…๋ น๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ „ ๋ฒ„์ „์˜ mongo shell์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "fred",
pwd: " passwordPrompt(), // or cleartext password
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)

์ด ์ ˆ์ฐจ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ณต์ œ๋ณธ ์„ธํŠธ์˜ ์‚ฌ์šฉ์ž๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ์‚ฌ์šฉ์ž ๋˜๋Š” ์œ ์‚ฌํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ œ๊ณต ์—ญํ•  ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์ž‘์—…๊ณผ ๊ด€๋ จ๋œ ์—ญํ• ์˜ ์ „์ฒด ๋ชฉ๋ก์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž ์—ญํ• ์—์„œ ํ™•์ธํ•˜์„ธ์š”.

2

ํ”„๋ผ์ด๋จธ๋ฆฌ ์— ์—ฐ๊ฒฐํ•˜์—ฌ clusterAdmin ์—ญํ• ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. clusterAdmin ์—ญํ• ์€ ๋ณต์ œ๋ณธ ์„ธํŠธ ๊ตฌ์„ฑ๊ณผ ๊ฐ™์€ ๋ณต์ œ ์ž‘์—…์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” admin ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— clusterAdmin ์—ญํ• ์„ ๊ฐ€์ง„ ravi ์‚ฌ์šฉ์ž๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ค‘์š”

์‹œ์Šคํ…œ ๋ณด์•ˆ์„ ๋ณด์žฅํ•˜๊ณ  ์•…์˜์ ์ธ ์•ก์„ธ์Šค๋ฅผ ๋ฐฉ์ง€ํ•˜๊ฑฐ๋‚˜ ์ง€์—ฐํ•˜๋ ค๋ฉด ์•”ํ˜ธ๋Š” ์ž„์˜์ ์ด๊ณ  ๊ธธ๋ฉฐ ๋ณต์žกํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŒ

mongo shell ๋ฒ„์ „ 4.2๋ถ€ํ„ฐ ๋ฉ”์„œ๋“œ/๋ช…๋ น ํ˜ธ์ถœ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜๋Š” ๋Œ€์‹  passwordPrompt() ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ/๊ด€๋ฆฌ ๋ฉ”์„œ๋“œ/๋ช…๋ น๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ „ ๋ฒ„์ „์˜ mongo shell์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

db.getSiblingDB("admin").createUser(
{
"user" : "ravi",
"pwd" : passwordPrompt(), // or cleartext password
roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
}
)

์ด ์ ˆ์ฐจ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ณต์ œ๋ณธ ์„ธํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น ์‚ฌ์šฉ์ž ๋˜๋Š” ์œ ์‚ฌํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณต์ œ๋ณธ ์„ธํŠธ ์ž‘์—…๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋ณธ ์ œ๊ณต ์—ญํ• ์˜ ์ „์ฒด ๋ชฉ๋ก์€ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ ์—ญํ• ์—์„œ ํ™•์ธํ•˜์„ธ์š”.

3

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

์ฝ๊ธฐ ์ „์šฉ ๋ฐ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ์—ญํ• ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž ์—ญํ• ์—์„œ ํ™•์ธํ•˜์„ธ์š”.

๋‹ค์Œ์€ foo ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”

์‹œ์Šคํ…œ ๋ณด์•ˆ์„ ๋ณด์žฅํ•˜๊ณ  ์•…์˜์ ์ธ ์•ก์„ธ์Šค๋ฅผ ๋ฐฉ์ง€ํ•˜๊ฑฐ๋‚˜ ์ง€์—ฐํ•˜๋ ค๋ฉด ์•”ํ˜ธ๋Š” ์ž„์˜์ ์ด๊ณ  ๊ธธ๋ฉฐ ๋ณต์žกํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

foo ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ readWrite ์—ญํ• ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํŒ

mongo shell ๋ฒ„์ „ 4.2๋ถ€ํ„ฐ ๋ฉ”์„œ๋“œ/๋ช…๋ น ํ˜ธ์ถœ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜๋Š” ๋Œ€์‹  passwordPrompt() ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ/๊ด€๋ฆฌ ๋ฉ”์„œ๋“œ/๋ช…๋ น๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ „ ๋ฒ„์ „์˜ mongo shell์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

db.getSiblingDB("foo").createUser(
{
"user" : "joe",
"pwd" : passwordPrompt(), // or cleartext password
roles: [ { "role" : "readWrite", "db" : "foo" } ]
}
)

์ด ์‚ฌ์šฉ์ž๋กœ ์ธ์ฆํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” foo ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์ œ๋ณธ ์„ธํŠธ์— ๋Œ€ํ•œ ์ธ์ฆ๋œ ์—ฐ๊ฒฐ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ ์€ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์‚ฌ์šฉ์ž ์ถ”๊ฐ€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‚ฌ์šฉ์ž ์ถ”๊ฐ€ ํŠœํ† ๋ฆฌ์–ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ์ƒˆ ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ๋ณด์•ˆ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜์„ธ์š”.

4

์ ˆ์ฐจ์˜ ์ด ์ ์—์„œ ๋ณต์ œ๋ณธ ์„ธํŠธ๋Š” ์ธ์ฆ์„ ์‹œํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์—ฌ์ „ํžˆ ์ธ์ฆ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ง€์ •ํ•˜๊ณ  ๋ณต์ œ๋ณธ ์„ธํŠธ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ๋œ ์‚ฌ์šฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์ œ๋ณธ ์„ธํŠธ์— ์ธ์ฆํ•˜๋„๋ก ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฆ๋œ ์—ฐ๊ฒฐ์—๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ ์ธ์ฆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์€ ๋ณต์ œ๋ณธ ์„ธํŠธ ์ด๋ฆ„ mongoRepl ์— ์—ฐ๊ฒฐํ•˜๊ณ  ์‚ฌ์šฉ์ž joe๋กœ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.

mongosh -u joe -password -authenticationDatabase foo --host mongoRepl/mongo1.example.net:27017, mongo2.example.net:27017, mongo3.example.net:27017

-p ๋ช…๋ น์ค„ ์˜ต์…˜์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด mongosh ์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ MongoDB ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ธ์ฆ๋œ ์—ฐ๊ฒฐ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์ง€์นจ์€ ๊ด€๋ จ ๋“œ๋ผ์ด๋ฒ„ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด ํŠœํ† ๋ฆฌ์–ผ์„ ์™„๋ฃŒํ•˜๋ฉด ๋ณต์ œ๋ณธ ์„ธํŠธ๋Š” ์ธ์ฆ๋˜์ง€ ์•Š์€ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ด ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ „ํ™˜ ์ „ํ›„์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณต์ œ๋ณธ ์„ธํŠธ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5

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

์ฐธ๊ณ 

MongoDB 4.2๋ถ€ํ„ฐ ๋‚ด๋ถ€ ๋ฉค๋ฒ„์‹ญ ์ธ์ฆ์„ ์œ„ํ•œ ํ‚ค ํŒŒ์ผ์€ YAML ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค ํŒŒ์ผ์— ์—ฌ๋Ÿฌ ํ‚ค๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. YAML ํ˜•์‹์€ ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ๋‹จ์ผ ํ‚ค ๋ฌธ์ž์—ด(์ด์ „ ๋ฒ„์ „๊ณผ ๋™์ผ)

  • ํ‚ค ๋ฌธ์ž์—ด์˜ ์ˆœ์„œ

YAML ํ˜•์‹์€ ํ…์ŠคํŠธ ํŒŒ์ผ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด์˜ ๋‹จ์ผ ํ‚ค ํ‚คํŒŒ์ผ๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

ํ‚ค ๊ธธ์ด๋Š” 6~1024์ž ์‚ฌ์ด์—ฌ์•ผ ํ•˜๋ฉฐ, base64 ์„ธํŠธ์˜ ๋ฌธ์ž๋งŒ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์ œ๋ณธ ์„ธํŠธ์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ณตํ†ต ํ‚ค๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

UNIX ์‹œ์Šคํ…œ์—์„œ๋Š” ํ‚ค ํŒŒ์ผ์— ๊ทธ๋ฃน ๋˜๋Š” ์›”๋“œ ๊ถŒํ•œ์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Windows ์‹œ์Šคํ…œ์—์„œ๋Š” ํ‚ค ํŒŒ์ผ ๊ถŒํ•œ์ด ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ž‘์—…์—์„œ๋Š” openssl ์‚ฌ์šฉํ•˜์—ฌ ๊ณต์œ  ์•”ํ˜ธ๋กœ ์‚ฌ์šฉํ•  ๋ณต์žกํ•œ ์˜์‚ฌ ๋‚œ์ˆ˜ 1024์ž ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ chmod ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์†Œ์œ ์ž์—๊ฒŒ๋งŒ ์ฝ๊ธฐ ๊ถŒํ•œ์„ ์ œ๊ณตํ•˜๋„๋ก ํŒŒ์ผ ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

openssl rand -base64 756 > <path-to-keyfile>
chmod 400 <path-to-keyfile>

ํ‚คํŒŒ์ผ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์„ธ๋ถ€ ์ •๋ณด ๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ์€ ํ‚คํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

6

๋ณต์ œ๋ณธ ์„ธํŠธ ๋ฉค๋ฒ„๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๊ฐ ์„œ๋ฒ„์— ํ‚ค ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. mongod ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ์ผ์˜ ์†Œ์œ ์ž์ด๋ฉฐ ํ‚ค ํŒŒ์ผ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

USB ๋“œ๋ผ์ด๋ธŒ ๋˜๋Š” ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์ €์žฅ ์žฅ์น˜์™€ ๊ฐ™์ด mongod ์ธ์Šคํ„ด์Šค๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ํ•˜๋“œ์›จ์–ด์—์„œ ์‰ฝ๊ฒŒ ๋ถ„๋ฆฌ๋  ์ˆ˜ ์žˆ๋Š” ์ €์žฅ ๋งค์ฒด์— ํ‚ค ํŒŒ์ผ์„ ์ €์žฅํ•˜์ง€ ๋งˆ์„ธ์š”.

7

๊ตฌ์„ฑ์„ ํฌํ•จํ•˜์—ฌ ๋ณต์ œ๋ณธ ์„ธํŠธ์˜ ๊ฐ ์„ธ์ปจ๋”๋ฆฌ ๋˜๋Š” ์ค‘์žฌ์ž ๋ฉค๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋ณต์ œ๋ณธ ์„ธํŠธ์— ์žˆ๋Š” ๋ฉค๋ฒ„์˜ ๋Œ€๋ถ€๋ถ„์ด ์˜จ๋ผ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ ค๋ฉด ๊ฐ ๋ฉค๋ฒ„๋ฅผ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์žฌ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ธ์ปจ๋”๋ฆฌ ๋˜๋Š” ์ค‘์žฌ์ž์— ์—ฐ๊ฒฐ๋œ mongosh ์„ธ์…˜์—์„œ admin ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด db.shutdownServer() ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

admin = db.getSiblingDB("admin")
admin.shutdownServer()

๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ๋‹ค์Œ ์„ค์ •์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • security.keyFile์„(๋ฅผ) ํ‚ค ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ํ•จ๊ป˜ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • replication.replSetName ์›๋ž˜ ๋ณต์ œ๋ณธ ์„ธํŠธ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

  • security.transitionToAuth ~ true.

mongod ๋ฐ mongos ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ ๊ตฌ์„ฑ์›์ด ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์›๊ฒฉ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ฐฐํฌ์— ์—ฐ๊ฒฐํ•˜๋ ค๋Š” ๊ฒฝ์šฐ net.bindIp ์„ค์ •์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

security:
keyFile: <path-to-keyfile>
transitionToAuth: true
replication:
replSetName: <replicaSetName>

mongod ์„(๋ฅผ) ์‹œ์ž‘ํ•  ๋•Œ ๊ตฌ์„ฑ ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ํ•จ๊ป˜ --config ์˜ต์…˜์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค

mongod --config <path-to-config-file>

๊ตฌ์„ฑ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ตฌ์„ฑ ์˜ต์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋˜๋Š” ์ด์— ์ƒ์‘ํ•˜๋Š” mongod ๋ช…๋ น์ค„ ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: --transitionToAuth ๋ฐ --keyFile) mongod. ์ „์ฒด ์˜ต์…˜ ๋ชฉ๋ก์€ mongod ์ฐธ๊ณ  ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฐฐํฌ์— ์ ํ•ฉํ•œ ์ถ”๊ฐ€ ์„ค์ •์„ ํฌํ•จํ•˜์„ธ์š”.

์ด ๋‹จ๊ณ„๊ฐ€ ๋๋‚˜๋ฉด ๋ชจ๋“  ๋ณด์กฐ ๋ฐ ์ค‘์žฌ์ž๊ฐ€ ๋กœ ์„ค์ •๋œ security.transitionToAuth true ์ƒํƒœ๋กœ ์‹คํ–‰๋˜์–ด ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

8

๋ณต์ œ๋ณธ ์„ธํŠธ์˜ ํ”„๋ผ์ด๋จธ๋ฆฌ ๋ฉค๋ฒ„๋ฅผ ๊ฐ•๋“ฑํ•˜๊ณ  ๊ตฌ์„ฑ์„ ํฌํ•จํ•˜์—ฌ ๋ฉค๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

mongosh ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ผ์ด๋จธ๋ฆฌ์— ์—ฐ๊ฒฐํ•˜๊ณ  rs.stepDown() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ผ์ด๋จธ๋ฆฌ๋ฅผ ๋‹จ๊ณ„์ ์œผ๋กœ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค.

rs.stepDown()

ํ”„๋ผ์ด๋จธ๋ฆฌ๊ฐ€ ์ค‘๋‹จ๋˜๊ณ  ๋ณต์ œ๋ณธ ์„ธํŠธ๊ฐ€ ์ƒˆ ํ”„๋ผ์ด๋จธ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๋ฉด ์ด์ „ ํ”„๋ผ์ด๋จธ๋ฆฌ mongod ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ํ”„๋ผ์ด๋จธ๋ฆฌ์— ์—ฐ๊ฒฐ๋œ mongosh ์„ธ์…˜์—์„œ admin ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— db.shutdownServer() ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

admin = db.getSiblingDB("admin")
admin.shutdownServer()

๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ๋‹ค์Œ ์„ค์ •์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • security.keyFile์„(๋ฅผ) ํ‚ค ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ํ•จ๊ป˜ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • replication.replSetName ์›๋ž˜ ๋ณต์ œ๋ณธ ์„ธํŠธ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

  • security.transitionToAuth ~ true.

๊ตฌ์„ฑ์— ํ•„์š”ํ•œ ์ถ”๊ฐ€ ์˜ต์…˜์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์›๊ฒฉ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ฐฐํฌ์— ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ๋ฐฐํฌ ๋ฉค๋ฒ„๊ฐ€ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋„๋ก ํ•˜๋ ค๋ฉด net.bindIp ์„ค์ •์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

security:
keyFile: <path-to-keyfile>
transitionToAuth: true
replication:
replSetName: <replicaSetName>

๊ตฌ์„ฑ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ mongod ์„(๋ฅผ) ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

mongod --config <path-to-config-file>

๊ตฌ์„ฑ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ตฌ์„ฑ ์˜ต์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋˜๋Š” ์ด์— ์ƒ์‘ํ•˜๋Š” mongod ๋ช…๋ น์ค„ ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: --transitionToAuth ๋ฐ --keyFile) mongod. ์ „์ฒด ์˜ต์…˜ ๋ชฉ๋ก์€ mongod ์ฐธ๊ณ  ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฐฐํฌ์— ์ ํ•ฉํ•œ ์ถ”๊ฐ€ ์„ค์ •์„ ํฌํ•จํ•˜์„ธ์š”.

์ด ๋‹จ๊ณ„๊ฐ€ ๋๋‚˜๋ฉด security.transitionToAuth ์„ true ๋กœ, security.keyFile ๋ฅผ ํ‚ค ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ์„ค์ •ํ•˜์—ฌ ๋ณต์ œ๋ณธ ์„ธํŠธ์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋ฅผ ๊ฐ€๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

9

๋ณต์ œ๋ณธ ์„ธํŠธ์˜ ๊ฐ ์„ธ์ปจ๋”๋ฆฌ ๋˜๋Š” ์ค‘์žฌ์ž ๋ฉค๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๊ณ  ์žฌ์‹œ์ž‘ ์‹œ security.transitionToAuth ์˜ต์…˜์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋ณต์ œ๋ณธ ์„ธํŠธ์— ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฉค๋ฒ„๊ฐ€ ์˜จ๋ผ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ ค๋ฉด ์ด ์ž‘์—…์„ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณต์ œ๋ณธ ์„ธํŠธ ๊ตฌ์„ฑ์›์˜ ๋Œ€๋ถ€๋ถ„์ด ๋™์‹œ์— ์˜คํ”„๋ผ์ธ ์ƒํƒœ์ธ ๊ฒฝ์šฐ ๋ณต์ œ๋ณธ ์„ธํŠธ๋Š” Go ์ฝ๊ธฐ ์ „์šฉ ๋ชจ๋“œ๋กœ ์ „ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mongosh ๋ฅผ ์„ธ์ปจ๋”๋ฆฌ ๋˜๋Š” ์ค‘์žฌ์ž์— ์—ฐ๊ฒฐํ•˜๊ณ  admin ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ db.shutdownServer() ๋ฅผ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.

admin = db.getSiblingDB("admin")
admin.shutdownServer()

์ด๋ฒˆ์—๋Š” ์˜ต์…˜ security.transitionToAuth ์—†์ด ๊ณผ ๊ฐ™์€ mongod ๋‚ด๋ถ€ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฅผ security.keyFile ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ๋‹ค์Œ ์„ค์ •์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • security.keyFile์„(๋ฅผ) ํ‚ค ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ํ•จ๊ป˜ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • replication.replSetName ์›๋ž˜ ๋ณต์ œ๋ณธ ์„ธํŠธ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ์— ํ•„์š”ํ•œ ์ถ”๊ฐ€ ์˜ต์…˜์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์›๊ฒฉ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ฐฐํฌ์— ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ๋ฐฐํฌ ๋ฉค๋ฒ„๊ฐ€ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋„๋ก ํ•˜๋ ค๋ฉด net.bindIp ์„ค์ •์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

security:
keyFile: <path-to-keyfile>
replication:
replSetName: <replicaSetName>

๊ตฌ์„ฑ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ mongod๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

mongod --config <path-to-config-file>

๊ตฌ์„ฑ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ตฌ์„ฑ ์˜ต์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์„(๋ฅผ) ์‹œ์ž‘ํ•  ๋•Œ mongod ์ด์— ์ƒ์‘ํ•˜๋Š” mongod ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์˜ต์…˜ ๋ชฉ๋ก์€ mongod ์ฐธ๊ณ  ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฐฐํฌ์— ์ ํ•ฉํ•œ ์ถ”๊ฐ€ ์„ค์ •์„ ํฌํ•จํ•˜์„ธ์š”.

์ด ๋‹จ๊ณ„๊ฐ€ ๋๋‚˜๋ฉด ๋ชจ๋“  ๋ณด์กฐ ๋ฐ ์ค‘์žฌ์ž๊ฐ€ ๋‚ด๋ถ€ ์ธ์ฆ์ด ๊ตฌ์„ฑ๋œ ์ƒํƒœ๋กœ ์‹คํ–‰๋˜๊ณ  ์‹คํ–‰๋˜์–ด์•ผ ํ•˜์ง€๋งŒ security.transitionToAuth ์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌ์„ฑ๋œ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด์„œ๋งŒ ์ด๋Ÿฌํ•œ mongod ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

10

๋ณต์ œ๋ณธ ์„ธํŠธ์˜ ํ”„๋ผ์ด๋จธ๋ฆฌ ๋ฉค๋ฒ„๋ฅผ ๊ฐ•๋“ฑํ•œ ๋‹ค์Œ security.transitionToAuth ์˜ต์…˜ ์—†์ด ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”

์ด ๋‹จ๊ณ„๊ฐ€ ๋๋‚˜๋ฉด ์ธ์ฆ์œผ๋กœ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” ๋ณต์ œ๋ณธ ์„ธํŠธ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด ์ด ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒ ํ•˜๊ธฐ ์ „์— ์ธ์ฆ์„ ํ†ตํ•ด ์—ฐ๊ฒฐํ•˜๋„๋ก ํด๋ผ์ด์–ธํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์„ธ์š”.

mongosh ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ผ์ด๋จธ๋ฆฌ์— ์—ฐ๊ฒฐํ•˜๊ณ  rs.stepDown() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ผ์ด๋จธ๋ฆฌ๋ฅผ ๋‹จ๊ณ„์ ์œผ๋กœ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค.

rs.stepDown()

ํ”„๋ผ์ด๋จธ๋ฆฌ๊ฐ€ ์ค‘๋‹จ๋˜๊ณ  ๋ณต์ œ๋ณธ ์„ธํŠธ๊ฐ€ ์ƒˆ ํ”„๋ผ์ด๋จธ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๋ฉด ์ด์ „ ํ”„๋ผ์ด๋จธ๋ฆฌ mongod ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ํ”„๋ผ์ด๋จธ๋ฆฌ์— ์—ฐ๊ฒฐ๋œ mongosh ์„ธ์…˜์—์„œ admin ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— db.shutdownServer() ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

admin = db.getSiblingDB("admin")
admin.shutdownServer()

์ด๋ฒˆ์—๋Š” security.transitionToAuth์˜ต์…˜ ์—†์ด ๊ณผ ๊ฐ™์€ mongod ๋‚ด๋ถ€ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฅผ ๋‹ค์‹œ security.keyFile ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค

๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ๋‹ค์Œ ์„ค์ •์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • security.keyFile์„(๋ฅผ) ํ‚ค ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ํ•จ๊ป˜ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • replication.replSetName ์›๋ž˜ ๋ณต์ œ๋ณธ ์„ธํŠธ ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

security:
keyFile: <path-to-keyfile>
replication:
replSetName: <replicaSetName>

๊ตฌ์„ฑ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ mongod๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

mongod --config <path-to-config-file>

๊ตฌ์„ฑ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ตฌ์„ฑ ์˜ต์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

mongod๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์ด์— ์ƒ์‘ํ•˜๋Š” mongod ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์˜ต์…˜ ๋ชฉ๋ก์€ mongod ์ฐธ๊ณ  ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฐฐํฌ์— ์ ํ•ฉํ•œ ์ถ”๊ฐ€ ์„ค์ •์„ ํฌํ•จํ•˜์„ธ์š”.

์ด ๋‹จ๊ณ„๊ฐ€ ๋๋‚˜๋ฉด ๋ณต์ œ๋ณธ ์„ธํŠธ์˜ ๋ชจ๋“  ๊ตฌ์„ฑ์›์ด ์ธ์ฆ์ด ์‹œํ–‰๋œ ์ƒํƒœ์—์„œ ์‹คํ–‰ ์ค‘์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌ์„ฑ๋œ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด์„œ๋งŒ ์ด๋Ÿฌํ•œ mongod ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ์ธ์ฆ์— x.509๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ x.509 ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉค๋ฒ„ ์ธ์ฆ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ‚คํŒŒ์ผ ๋‚ด๋ถ€ ์ธ์ฆ์—์„œ x.509 ๋‚ด๋ถ€ ์ธ์ฆ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๋ฉด ํ‚คํŒŒ์ผ ์ธ์ฆ์—์„œ x.509 ์ธ์ฆ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.