μ μ
db.updateUser( username, update, writeConcern )λ©μλλ₯Ό μ€ννλ λ°μ΄ν°λ² μ΄μ€μμ μ¬μ©μ νλ‘νμ μ λ°μ΄νΈν©λλ€. νλλ₯Ό μ λ°μ΄νΈνλ©΄ μ΄μ νλμ κ°μ΄ μμ ν λ°λλλ€. μ¬κΈ°μλ μ¬μ©μμ
rolesλ°°μ΄μ λν μ λ°μ΄νΈκ° ν¬ν¨λ©λλ€.κ²½κ³
rolesλ°°μ΄ μ μ λ°μ΄νΈ νλ©΄ μ΄μ λ°°μ΄μ κ°μ΄ μμ ν λ°λλλ€. μ¬μ©μμ κΈ°μ‘΄ μν μ λͺ¨λ λ°κΎΈμ§ μκ³ μν μ μΆκ°νκ±°λ μ κ±° νλ €λ©΄db.grantRolesToUser()λλdb.revokeRolesFromUser()λ©μλλ₯Ό μ¬μ©ν©λλ€.db.updateUser()λ©μλλ λ€μ ꡬ문μ μ¬μ©ν©λλ€.ν
λ©μλ/λͺ λ Ή νΈμΆμ λΉλ°λ²νΈλ₯Ό μ§μ μ§μ νλ λμ
passwordPrompt()λ©μλλ₯Ό λ€μν μ¬μ©μ μΈμ¦/κ΄λ¦¬ λ©μλ/λͺ λ Ήκ³Ό ν¨κ» μ¬μ©νμ¬ λΉλ°λ²νΈλ₯Ό μ λ ₯νλΌλ λ©μμ§λ₯Ό νμν μ μμ΅λλ€. κ·Έλ¬λ μ΄μ λ²μ μmongoshell μμμ λ§μ°¬κ°μ§λ‘ λΉλ°λ²νΈλ₯Ό μ§μ μ§μ ν μ μμ΅λλ€.db.updateUser( "<username>", { customData : { <any information> }, roles : [ { role: "<role>", db: "<database>" } | "<role>", ... ], pwd: passwordPrompt(), // Or "<cleartext password>" authenticationRestrictions: [ { clientSource: ["<IP>" | "<CIDR range>", ...], serverAddress: ["<IP>", | "<CIDR range>", ...] }, ... ], mechanisms: [ "<SCRAM-SHA-1|SCRAM-SHA-256>", ... ], passwordDigestor: "<server|client>" }, writeConcern: { <write concern> } ) db.updateUser()λ©μλμλ λ€μκ³Ό κ°μ μΈμκ° μ¬μ©λ©λλ€.Parameterμ νμ€λͺusernameλ¬Έμμ΄
μ λ°μ΄νΈν μ¬μ©μμ μ΄λ¦μ λλ€.
updateλ¬Έμ
μ¬μ©μμ λ체 λ°μ΄ν°κ° ν¬ν¨λ λ¬Έμμ λλ€. μ΄ λ°μ΄ν°λ μ¬μ©μμ ν΄λΉ λ°μ΄ν°λ₯Ό μμ ν λ체ν©λλ€.
writeConcernλ¬Έμ
μ ν μ¬νμ λλ€. μμ μ λν μ°κΈ° κ³ λ € μμ€μ λλ€. μ°κΈ° κ³ λ € μ¬μμ μ°Έμ‘°νμΈμ.
updateλ¬Έμλ μ λ°μ΄νΈν νλμ ν΄λΉ μ κ°μ μ§μ ν©λλ€.updateλ¬Έμμ λͺ¨λ νλλ μ ν μ¬νμ΄μ§λ§ νλ μ΄μμ νλλ₯Ό ν¬ν¨ν΄μΌ ν©λλ€.updateλ¬Έμμ λ€μκ³Ό κ°μ νλκ° μμ΅λλ€:νλμ νμ€λͺcustomDataλ¬Έμ
μ ν μ¬ν. λͺ¨λ μμ μ 보μ λλ€.
rolesλ°°μ΄
μ ν μ¬ν. μ¬μ©μμκ² λΆμ¬λ μν μ λλ€.
rolesλ°°μ΄μ λν μ λ°μ΄νΈλ μ΄μ λ°°μ΄μ κ°μ μ¬μ μν©λλ€.pwdλ¬Έμμ΄
μ ν μ¬ν. μ¬μ©μμ λΉλ°λ²νΈμ λλ€. κ°μ λ€μ μ€ νλμΌ μ μμ΅λλ€.
μΌλ° ν μ€νΈ λ¬Έμμ΄λ‘ λ μ¬μ©μμ λΉλ°λ²νΈ
passwordPrompt()μ(λ) μ¬μ©μμ λΉλ°λ²νΈλ₯Ό 묻λ λ©μμ§λ₯Ό νμν©λλ€.
λ©μλ/λͺ λ Ή νΈμΆμ λΉλ°λ²νΈλ₯Ό μ§μ μ§μ νλ λμ
passwordPrompt()λ©μλλ₯Ό λ€μν μ¬μ©μ μΈμ¦/κ΄λ¦¬ λ©μλ/λͺ λ Ήκ³Ό ν¨κ» μ¬μ©νμ¬ λΉλ°λ²νΈλ₯Ό μ λ ₯νλΌλ λ©μμ§λ₯Ό νμν μ μμ΅λλ€. κ·Έλ¬λ μ΄μ λ²μ μmongoshell μμμ λ§μ°¬κ°μ§λ‘ λΉλ°λ²νΈλ₯Ό μ§μ μ§μ ν μ μμ΅λλ€.authenticationRestrictionsλ°°μ΄
μ ν μ¬ν. μλ²κ° μ¬μ©μμκ² μ μ©νλ μΈμ¦ μ ν μ¬νμ λλ€. μ¬μ©μκ° μλ²μ μ°κ²°ν μ μκ±°λ μλ²κ° μ¬μ©μλ₯Ό μλ½ν μ μλ IP μ£Όμ λ° CIDR λ²μμ λͺ©λ‘μ μ§μ ν©λλ€.
λ²μ 3.6μ μλ‘ μΆκ°λμμ΅λλ€.
mechanismsλ°°μ΄
μ ν μ¬ν. μ¬μ©μ μ격 μ¦λͺ μ λν νΉμ SCRAM λ©μ»€λμ¦(1κ° λλ μ¬λ¬ κ°)μ λλ€.
authenticationMechanismsλ₯Ό μ§μ νλ©΄authenticationMechanismsμ νμ μ§ν©λ§ μ§μ ν μ μμ΅λλ€.λΉλ°λ²νΈ μμ΄ λ©μ»€λμ¦ νλλ₯Ό μ λ°μ΄νΈνλ κ²½μ° μ¬μ©μμ νμ¬ λ©μ»€λμ¦μ νμ μ§ν©λ§ μ§μ ν μ μμΌλ©°, μ§μ λ λ©μ»€λμ¦(1κ° λλ μ¬λ¬ κ°)μ λν κΈ°μ‘΄ μ¬μ©μ μ격 μ¦λͺ λ§ μ μ§λ©λλ€.
λ©μ»€λμ¦κ³Ό ν¨κ» λΉλ°λ²νΈλ₯Ό μ λ°μ΄νΈνλ κ²½μ° μ¬μ©μμ λν μ격 μ¦λͺ μΈνΈκ° μ μ₯λ©λλ€.
μ ν¨ν κ°μ λ€μκ³Ό κ°μ΅λλ€.
"SCRAM-SHA-1"SHA-1ν΄μ ν¨μλ₯Ό μ¬μ©ν©λλ€.
"SCRAM-SHA-256"SHA-256ν΄μ ν¨μλ₯Ό μ¬μ©ν©λλ€.featureCompatibilityVersionμ΄
4.0μΌλ‘ μ€μ λμ΄μΌ ν©λλ€.passwordDigestorκ°
serverμ¬μΌ ν©λλ€.
passwordDigestorλ¬Έμμ΄
μ ν μ¬νμ λλ€. μλ² λλ ν΄λΌμ΄μΈνΈ μ€ μ΄λ μͺ½μμ λΉλ°λ²νΈλ₯Ό ν΄λ ν μ§λ₯Ό λνλ λλ€.
μ¬μ© κ°λ₯ν κ°μ λ€μκ³Ό κ°μ΅λλ€.
"server"(κΈ°λ³Έκ°)- μλ²λ ν΄λΌμ΄μΈνΈλ‘λΆν° λ€μ΄μ μ€νΈλμ§ μμ λΉλ°λ²νΈλ₯Ό μμ νμ¬ λΉλ°λ²νΈλ₯Ό λ€μ΄μ μ€νΈν©λλ€.
"client"(SCRAM-SHA-256κ³Ό νΈνλμ§ μμ)- ν΄λΌμ΄μΈνΈλ λΉλ°λ²νΈλ₯Ό λ€μ΄μ μ€νΈνκ³ , μ΄ν λ€μ΄μ μ€νΈλ λΉλ°λ²νΈλ₯Ό μλ²μ μ λ¬ν©λλ€.
μν
roles νλμμ κΈ°λ³Έ μ 곡 μν κ³Ό μ¬μ©μ μ μ μν μ λͺ¨λ μ§μ ν μ μμ΅λλ€.
db.updateUser()κ° μ€νλλ λμΌν λ°μ΄ν°λ² μ΄μ€μ μ‘΄μ¬νλ μν μ μ§μ νλ €λ©΄ μν μ μ΄λ¦κ³Ό ν¨κ» μν μ μ§μ ν μ μμ΅λλ€.
"readWrite"
λλ λ€μκ³Ό κ°μ΄ λ¬Έμλ‘ μν μ μ§μ ν μλ μμ΅λλ€.
{ role: "<role>", db: "<database>" }
λ€λ₯Έ λ°μ΄ν°λ² μ΄μ€μ μ‘΄μ¬νλ μν μ μ§μ νλ €λ©΄ λ¬Έμλ₯Ό μ¬μ©νμ¬ μν μ μ§μ ν©λλ€.
μΈμ¦ μ ν
λ²μ 3.6μ μλ‘ μΆκ°λμμ΅λλ€.
authenticationRestrictions λ¬Έμμλ λ€μ νλλ§ ν¬ν¨λ μ μμ΅λλ€. authenticationRestrictions λ¬Έμμ μΈμν μ μλ νλκ° ν¬ν¨λμ΄ μμΌλ©΄ μλ²μμ μ€λ₯λ₯Ό λ°μμν΅λλ€.
νλ μ΄λ¦ | κ° | μ€λͺ
|
|---|---|---|
| IP μ£Όμ λ°/λλ CIDR λ²μμ λ°°μ΄ | μ‘΄μ¬νλ κ²½μ°, μ¬μ©μλ₯Ό μΈμ¦ν λ μλ²λ ν΄λΌμ΄μΈνΈμ IP μ£Όμκ° μ§μ λ λͺ©λ‘μ μκ±°λ λͺ©λ‘μ μλ CIDR λ²μμ μνλμ§ νμΈν©λλ€. ν΄λΌμ΄μΈνΈμ IP μ£Όμκ° μλ κ²½μ° μλ²λ μ¬μ©μλ₯Ό μΈμ¦νμ§ μμ΅λλ€. |
| IP μ£Όμ λ°/λλ CIDR λ²μμ λ°°μ΄ | ν΄λΌμ΄μΈνΈκ° μ°κ²°ν μ μλ IP μ£Όμ λλ CIDR λ²μμ λͺ©λ‘μ λλ€. μ‘΄μ¬νλ κ²½μ°, μλ²λ μ£Όμ΄μ§ λͺ©λ‘μ IP μ£Όμλ₯Ό ν΅ν΄ ν΄λΌμ΄μΈνΈμ μ°κ²°μ΄ μΉμΈλμλμ§ νμΈν©λλ€. μΈμν μ μλ IP μ£Όμλ₯Ό ν΅ν΄ μ°κ²°μ΄ μλ½λ κ²½μ° μλ²λ μ¬μ©μλ₯Ό μΈμ¦νμ§ μμ΅λλ€. |
μ€μ
μ¬μ©μκ° μΈμ¦ μ νμ΄ νΈνλμ§ μλ μ¬λ¬ μν μ μμνλ κ²½μ° ν΄λΉ μ¬μ©μλ μ¬μ©ν μ μκ² λ©λλ€.
μλ₯Ό λ€μ΄, μ¬μ©μκ° clientSource νλκ° ["198.51.100.0"]μΈ μν κ³Ό clientSource νλκ° ["203.0.113.0"]μΈ λ€λ₯Έ μν μ μμνλ κ²½μ° μλ²λ μ¬μ©μλ₯Ό μΈμ¦ν μ μμ΅λλ€.
MongoDBμ μΈμ¦μ λν μμΈν λ΄μ©μ μΈμ¦μ μ°Έμ‘°νμΈμ.
db.updateUser() λ©μλλ updateUser λͺ
λ Ήμ λνν©λλ€.
νΈνμ±
μ΄ λ©μλλ λ€μ νκ²½μμ νΈμ€ν λλ λ°°ν¬μμ μ¬μ©ν μ μμ΅λλ€.
μ€μ
μ΄ λͺ λ Ήμ MongoDB Atlas ν΄λ¬μ€ν°μμ μ§μλμ§ μμ΅λλ€. λͺ¨λ λͺ λ Ήμ λν Atlas μ§μ μ λν μμΈν λ΄μ©μ μ§μλμ§ μλ λͺ λ Ήμ μ°Έμ‘°νμΈμ.
MongoDB Enterprise: MongoDBμ ꡬλ κΈ°λ° μ체 κ΄λ¦¬ λ²μ
MongoDB Community: MongoDBμ μμ€ μ¬μ© κ°λ₯ λ¬΄λ£ μ체 κ΄λ¦¬ λ²μ
νλ
볡μ λ³Έ μΈνΈ
볡μ λ³Έ μΈνΈμμ μ€νν κ²½μ°, db.updateUser()λ κΈ°λ³Έκ°μΌλ‘ "majority" μ°κΈ° κ³ λ €(write concern)λ₯Ό μ¬μ©νμ¬ μ€νλ©λλ€.
μνΈν (Encryption)
κ²½κ³
κΈ°λ³Έμ μΌλ‘ db.updateUser()λ passwordPrompt()λ₯Ό μ¬μ©νλ κ²½μ°μλ μ§μ λ λͺ¨λ λ°μ΄ν°λ₯Ό μΌλ° ν
μ€νΈλ‘ MongoDB μΈμ€ν΄μ€μ μ μ‘ν©λλ€. db.updateUser()μμ λ³΄λΈ μνΈλ₯Ό ν¬ν¨νμ¬ ν΄λΌμ΄μΈνΈμ μλ² κ°μ ν΅μ μ 보νΈνλ €λ©΄ TLS μ μ‘ μνΈνλ₯Ό μ¬μ©ν©λλ€. TLS μ μ‘ μνΈνλ₯Ό νμ±ννλ λ°©λ²μ λν μ§μΉ¨μ TLS/SSLμ μν mongod λ° mongos ꡬμ±μ μ°Έμ‘°νμΈμ.
MongoDBλ λΉλ°λ²νΈλ₯Ό μΌλ° ν μ€νΈλ‘ μ μ₯νμ§ μμ΅λλ€. λΉλ°λ²νΈλ ν΄λΌμ΄μΈνΈμ μλ² κ°μ μ μ‘ μ κ·Έλ¦¬κ³ TLS μ μ‘ μνΈνκ° νμ±νλμ§ μμ κ²½μ°μλ§ μ·¨μ½ν©λλ€.
νμν μ‘μΈμ€ κΆν
μ¬μ©μμ roles λ°°μ΄μ μ
λ°μ΄νΈνλ €λ©΄ λͺ¨λ λ°μ΄ν°λ² μ΄μ€μ λν revokeRole μ‘°μΉλ₯Ό ν¬ν¨νλ μ‘μΈμ€ κΆνμ΄ μμ΄μΌ ν©λλ€.
μ¬μ©μμ μν μ μΆκ°νλ €λ©΄ μν μ λ°μ΄ν°λ² μ΄μ€μ grantRole μ‘°μΉκ° μμ΄μΌ ν©λλ€.
λ€λ₯Έ μ¬μ©μμ pwd λλ customData νλλ₯Ό λ³κ²½νλ €λ©΄ ν΄λΉ μ¬μ©μμ λ°μ΄ν°λ² μ΄μ€μ changePassword λ° changeCustomData μ‘°μΉκ° κ°κ° μμ΄μΌ ν©λλ€.
μμ μ λΉλ°λ²νΈμ μ¬μ©μ μ§μ λ°μ΄ν°λ₯Ό μμ νλ €λ©΄ μ¬μ©μ λ°μ΄ν°λ² μ΄μ€μμ κ°κ° changeOwnPassword λ° changeOwnCustomData μ‘°μΉλ₯Ό λΆμ¬ν μ μλ κΆνμ΄ μμ΄μΌ ν©λλ€.
μμ
λ€μ μ¬μ©μ μ λ³΄κ° ν¬ν¨λ products λ°μ΄ν°λ² μ΄μ€μ μ¬μ©μ appClient01μ΄(κ°) μ 곡λ©λλ€.
{ _id : "products.appClient01", userId : UUID("c5d88855-3f1e-46cb-9c8b-269bef957986"), user : "appClient01", db : "products", customData : { empID : "12345", badge : "9156" }, roles : [ { role : "readWrite", db : "products" }, { role : "read", db : "inventory" } ], mechanisms : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ], authenticationRestrictions : [ { clientSource: ["69.89.31.226"], serverAddress: ["172.16.254.1"] } ] }
λ€μ db.updateUser() λ©μλλ μ¬μ©μμ customData λ° roles λ°μ΄ν°λ₯Ό μμ ν λ체ν©λλ€.
use products db.updateUser( "appClient01", { customData : { employeeId : "0x3039" }, roles : [ { role : "read", db : "assets" } ] } )
products λ°μ΄ν°λ² μ΄μ€μ μ¬μ©μ appClient01λ μ΄μ λ€μκ³Ό κ°μ μ¬μ©μ μ 보λ₯Ό κ°μ΅λλ€.
{ _id : "products.appClient01", userId : UUID("c5d88855-3f1e-46cb-9c8b-269bef957986"), user : "appClient01", db : "products", customData : { employeeId : "0x3039" }, roles : [ { role : "read", db : "assets" } ], mechanisms : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ], authenticationRestrictions : [ { clientSource: ["69.89.31.226"], serverAddress: ["172.16.254.1"] } ] }
SCRAM-SHA-256 μ격 μ¦λͺ
λ§ μ¬μ©νλλ‘ μ¬μ©μ μ
λ°μ΄νΈ
μ°Έκ³
SCRAM-SHA-256 μ μ¬μ©νλ €λ©΄ featureCompatibilityVersion μ 4.0 λ‘ μ€μ ν΄μΌ ν©λλ€. For more information on featureCompatibilityVersion, see View FeatureCompatibilityVersion and setFeatureCompatibilityVersion.
λ€μ μμ
μ νμ¬ SCRAM-SHA-256 λ° SCRAM-SHA-1 μ격 μ¦λͺ
μ λͺ¨λ κ°κ³ μλ μ¬μ©μκ° SCRAM-SHA-256 μ격 μ¦λͺ
λ§ κ°λλ‘ μ
λ°μ΄νΈν©λλ€.
μ°Έκ³
λΉλ°λ²νΈκ°
mechanismsκ³Ό ν¨κ» μ§μ λμ§ μμ κ²½μ°mechanismsλ₯Ό μ¬μ©μμ νμ¬ SCRAM λ©μ»€λμ¦μ νμ μ§ν©μΌλ‘λ§ μ λ°μ΄νΈν μ μμ΅λλ€.λΉλ°λ²νΈκ°
mechanismsκ³Ό ν¨κ» μ§μ λ κ²½μ° μ§μλλ SCRAM λ©μ»€λμ¦(1κ° λλ μ¬λ¬ κ°)μ μ§μ ν μ μμ΅λλ€.SCRAM-SHA-256μ κ²½μ°passwordDigestorλ κΈ°λ³Έκ°"server"μ΄μ΄μΌ ν©λλ€.
use reporting db.updateUser( "reportUser256", { mechanisms: [ "SCRAM-SHA-256" ] } )