๋ค์ดํฐ๋ธ LDAP๋ฅผ ํตํด ์์ฒด ๊ด๋ฆฌํ Active Directory๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌํ๊ธฐ
์ด ํ์ด์ง์ ๋ด์ฉ
์ฐธ๊ณ
MongoDB 8.0 ๋ถํฐ ์์๋ฉ๋๋ค. LDAP ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ ๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. LDAP ๋ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ MongoDB 8 ์ ์๋ช ๊ธฐ๊ฐ ๋์ ๋ณ๊ฒฝ ์์ด ๊ณ์ ์๋ํฉ๋๋ค. LDAP ๋ ํฅํ ์ฃผ์ ์ถ์ํ๋ค ์์ ์ ๊ฑฐ๋ ์์ ์ ๋๋ค.
์์ธํ ๋ด์ฉ์ LDAP ์ฌ์ฉ ์ค๋จ์ ์ฐธ์กฐํ์ธ์.
MongoDB Enterprise ๋ ํ๋ซํผ LDAP ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด Active Directory(AD)์ ๊ฐ์ ์ง์ ๋ LDAP(LDAP Directory Access Protocol) ์๋น์ค์ ๋ํ ํ๋ก์ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ ์์ฒญ์ ์ง์ ํฉ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ ํ๋ซํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด AD(Active Directory) ์๋ฒ๋ฅผ ํตํด ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ๋ฅผ ์ํํ๋๋ก MongoDB๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
์ฐธ๊ณ
libldap
์ ์ฐ๊ฒฐ๋ MongoDB 4.2 ์ํฐํ๋ผ์ด์ฆ ๋ฐ์ด๋๋ฆฌ์ ๊ฒฝ์ฐ(์: RHEL์์ ์คํํ๋ ๊ฒฝ์ฐ), libldap
์ ๋ํ ์ก์ธ์ค๊ฐ ๋๊ธฐํ๋์ด ์ผ๋ถ ์ฑ๋ฅ/์ง์ฐ ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค.
0}์ ์ฐ๊ฒฐ๋ MongoDB 4.2 Enterprise ๋ฐ์ด๋๋ฆฌ์ libldap_r
๊ฒฝ์ฐ ์ด์ MongoDB ๋ฒ์ ๊ณผ ๋์์ด ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
์ ์ ์กฐ๊ฑด
์ค์
๊ณ์ ์งํํ๊ธฐ ์ ์ ๋ค์ ์ฃผ์ ๋ฅผ ์ฒ ์ ํ ์์งํฉ๋๋ค.
AD ์ ๋ํ ์ ์ฒด ์ค๋ช ์ ์ด ํํ ๋ฆฌ์ผ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค. ์ด ํํ ๋ฆฌ์ผ์์๋ AD ์ ๋ํ ์ฌ์ ์ง์์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
MongoDB๋ MongoDB ์๋ฒ์ AD ๊ฐ์ ๋ฐ์ธ๋ฉ์ SASL ๋ฉ์ปค๋์ฆ ์ฌ์ฉ์ ์ง์ํฉ๋๋ค. SASL, SASL ๋ฉ์ปค๋์ฆ์ ๋ํ ์ ์ฒด ์ค๋ช ๋๋ ํน์ SASL ๋ฉ์ปค๋์ฆ์ ๋ํ ํน์ AD ๊ตฌ์ฑ ์๊ตฌ ์ฌํญ์ ์ด ํํ ๋ฆฌ์ผ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค. ์ด ํํ ๋ฆฌ์ผ์ SASL ๋ฐ ๊ด๋ จ ์ฃผ์ ์ ๋ํ ์ฌ์ ์ง์์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ด๋ถ ๊ตฌ์ฑ์ ์ธ์ฆ ๊ตฌ์ฑ
ํด๋ฌ์คํฐ์ ๋ํ LDAP ์ธ์ฆ ๋๋ ๊ถํ์ ์ค์ ํ๋ ค๋ฉด ๋จผ์ ๋ด๋ถ ๋ฉค๋ฒ ์ธ์ฆ์ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
๊ณ ๋ ค ์ฌํญ
์ด ํํ ๋ฆฌ์ผ์์๋ AD ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ๋ฅผ ์ํด MongoDB๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
์์ฒด MongoDB Server์์ ์ด ์ ์ฐจ๋ฅผ ์ํํ๋ ค๋ฉด ์์ฒด ํน์ ์ธํ๋ผ, ํนํ Active Directory ๊ตฌ์ฑ, AD ์ฟผ๋ฆฌ ๊ตฌ์ฑ ๋๋ ์ฌ์ฉ์ ๊ด๋ฆฌ์ ๊ด๋ จํ์ฌ ์ง์ ๋ ์ ์ฐจ๋ฅผ ์์ ํด์ผ ํฉ๋๋ค.
์ ์ก ๊ณ์ธต ๋ณด์
๊ธฐ๋ณธ์ ์ผ๋ก MongoDB๋ AD ์๋ฒ์ ๋ฐ์ธ๋ฉํ ๋ TLS/SSL ์ฐ๊ฒฐ์ ์์ฑํฉ๋๋ค. ์ด๋ฅผ ์ํด์๋ MongoDB Server์ ํธ์คํธ๊ฐ AD ์๋ฒ์ ์ธ์ฆ ๊ธฐ๊ด(CA) ์ธ์ฆ์์ ์ก์ธ์คํ ์ ์๋๋ก ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ ํ์ํ ํธ์คํธ ๊ตฌ์ฑ์ ๋ํ ์ง์นจ์ ์ ๊ณตํฉ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ ์ฌ์ฉ์๊ฐ AD ์๋ฒ์ CA ์ธ์ฆ์์ ์ก์ธ์คํ ์ ์๊ณ MongoDB ์๋ฒ์ ์ธ์ฆ์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์ฌ์ฉ์ ์ด๋ฆ
2} ์ธ์ฆ ์ฌ์ฉ์(Kerberos, LDAP ๋๋ x.509 ์ฌ์ฉ์)์ ํจ๊ป ํด๋ผ์ด์ธํธ ์ธ์
๋ฐ ์ธ๊ณผ์ ์ผ๊ด์ฑ ๋ณด์ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ์ฌ์ฉ์ ์ด๋ฆ์ด 10KB๋ณด๋ค ํด ์ ์์ต๋๋ค. $external
Active Directory ์คํค๋ง ์์
์ด ํํ ๋ฆฌ์ผ์์๋ ๋ค์ ์์ AD ๊ฐ์ฒด๋ฅผ ์ ๊ณต๋ ์ฟผ๋ฆฌ, ๊ตฌ์ฑ ๋ฐ ์ถ๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ๊ฐ ๊ฐ์ฒด๋ ๊ฐ๋ฅํ ์์ฑ์ ํ์ ์งํฉ๋ง ํ์ํฉ๋๋ค.
์ฌ์ฉ์ ๊ฐ์ฒด
dn:CN=bob,CN=Users,DC=marketing,DC=example,DC=com userPrincipalName: bob@marketing.example.com memberOf: CN=marketing,CN=Users,DC=example,DC=com dn:CN=alice,CN=Users,DC=engineering,DC=example,DC=com userPrincipalName: alice@engineering.example.com memberOf: CN=web,CN=Users,DC=example,DC=com memberOf: CN=PrimaryApplication,CN=Users,DC=example,DC=com dn:CN=sam,CN=Users,DC=dba,DC=example,DC=com userPrincipalName: sam@dba.example.com memberOf: CN=dba,CN=Users,DC=example,DC=com memberOf: CN=PrimaryApplication,CN=Users,DC=example,DC=com dn:CN=joe,CN=Users,DC=analytics,DC=example,DC=com userPrincipalName: joe@analytics.example.com memberof: CN=marketing,CN=Users,DC=example,DC=com
๊ฐ์ฒด ๊ทธ๋ฃนํ
dn:CN=marketing,CN=Users,DC=example,DC=com member:CN=bob,CN=Users,DC=marketing,DC=example,DC=com member:CN=joe,CN=Users,DC=analytics,DC=example,DC=com dn:CN=engineering,CN=Users,DC=example,DC=com member:CN=web,CN=Users,DC=example,DC=com member:CN=dba,CN=users,DC=example,DC=com dn:CN=web,CN=Users,DC=example,DC=com member:CN=alice,CN=Users,DC=engineering,DC=example,DC=com dn:CN=dba,CN=Users,DC=example,DC=com member:CN=sam,CN=Users,DC=dba,DC=example,DC=com dn:CN=PrimaryApplication,CN=Users,DC=example,DC=com member:CN=sam,CN=Users,DC=dba,DC=example,DC=com member:CN=alice,CN=Users,DC=engineering,DC=example,DC=com
์กํฐ๋ธ ๋๋ ํ ๋ฆฌ ์๊ฒฉ ์ฆ๋ช
์ด ํํ ๋ฆฌ์ผ์์๋ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ฌ AD ์๋ฒ์์ ์ฟผ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค. ์ ๊ณต๋ ์๊ฒฉ ์ฆ๋ช
์๋ security.ldap.userToDNMapping
๋๋ security.ldap.authz.queryTemplate
์ ๊ด๋ จ๋ ์ฟผ๋ฆฌ๋ฅผ ์ง์ํ๊ธฐ ์ํ AD ์๋ฒ์ ๋ํ ์ถฉ๋ถํ ๊ถํ์ด ์์ด์ผ ํฉ๋๋ค.
๋ณต์ ๋ณธ ์ธํธ
MongoDB LDAP ๊ถํ ๋ถ์ฌ๋ฅผ ๋ฐ์ผ๋ ค๋ฉด ๋ณต์ ๋ณธ ์ธํธ์ ๋ชจ๋ mongod
๊ฐ ์ต์ํ MongoDB 3.4.0 ์ด์์ ์์ด์ผ ํฉ๋๋ค.
์ค๋ฉ๋ ํด๋ฌ์คํฐ
MongoDB LDAP ๊ถํ ๋ถ์ฌ๋ฅผ ์ํด์๋ ์ค๋ฉ๋ ํด๋ฌ์คํฐ์ ๋ชจ๋ mongod
๋ฐ mongos
๊ฐ ์ต์ํ MongoDB 3.4.0 ์ด์์ด์ด์ผ ํฉ๋๋ค.
์ ์ฐจ
MongoDB๋ฅผ ์คํํ๋ ์๋ฒ์ ๋ํด TLS/SSL ๊ตฌ์ฑ
TLS/SSL์ ํตํด AD (AD) ์๋ฒ์ ์ฐ๊ฒฐํ๋ ค๋ฉด mongod
๋๋ mongos
์ด(๊ฐ) AD ์๋ฒ์ ์ธ์ฆ ๊ธฐ๊ด(CA) ์ธ์ฆ์์ ์ก์ธ์คํด์ผ ํฉ๋๋ค.
Linux์์๋ ldap.conf
ํ์ผ์ TLS_CACERT
๋๋ TLS_CACERTDIR
์ต์
์ ํตํด AD ์๋ฒ์ CA ์ธ์ฆ์๋ฅผ ์ง์ ํฉ๋๋ค.
ํ๋ซํผ์ ํจํค์ง ๊ด๋ฆฌ์๋ MongoDB Enterprise์ libldap
์ข
์์ฑ์ ์ค์นํ๋ ๋์ ldap.conf
ํ์ผ์ ์์ฑํฉ๋๋ค. ๊ตฌ์ฑ ํ์ผ ๋๋ ์ฐธ์กฐ๋ ์ต์
์ ๋ํ ์ ์ฒด ๋ฌธ์๋ฅผ ํ์ธํ๋ ค๋ฉด ldap.conf๋ฅผ ์ฐธ์กฐํ์ธ์.
Microsoft Windows ์์๋ ํ๋ซํผ์ ์๊ฒฉ ์ฆ๋ช ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ AD ์๋ฒ์ ์ธ์ฆ ๊ธฐ๊ด(CA) ์ธ์ฆ์๋ฅผ ๋ก๋ํฉ๋๋ค. ์ ํํ ์๊ฒฉ ์ฆ๋ช ๊ด๋ฆฌ ๋๊ตฌ๋ Windows ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์ด ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ฌ์ฉ ์ค์ธ Windows ๋ฒ์ ์ ๋ํ ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ธ์.
mongod
๋๋ mongos
๊ฐ AD CA ํ์ผ์ ์ก์ธ์คํ ์ ์๋ ๊ฒฝ์ฐ, Active Directory ์๋ฒ์ ๋ํ TLS/SSL ์ฐ๊ฒฐ์ ์์ฑํ ์ ์์ต๋๋ค.
์ ํ์ ์ผ๋ก TLS/SSL์ ๋นํ์ฑํํ๋ ค๋ฉด security.ldap.transportSecurity
๋ฅผ none
์ผ๋ก ์ค์ ํฉ๋๋ค.
๊ฒฝ๊ณ
transportSecurity
๋ฅผ none
๋ก ์ค์ ํ๋ฉด MongoDB์ AD ์๋ฒ ๊ฐ์ ์ฌ์ฉ์ ์๊ฒฉ ์ฆ๋ช
์ ํฌํจํ ์ผ๋ฐ ํ
์คํธ ์ ๋ณด๊ฐ ์ ์ก๋ฉ๋๋ค.
MongoDB ์๋ฒ์ ์ฐ๊ฒฐํฉ๋๋ค.
--host
๋ฐ --port
์ต์
์ ํตํด mongosh
(์)๋ฅผ ์ฌ์ฉํด MongoDB ์๋ฒ์ ์ฐ๊ฒฐํฉ๋๋ค.
mongosh --host <hostname> --port <port>
ํ์ฌ MongoDB ์๋ฒ๊ฐ ์ธ์ฆ์ ์ํํ๋ ๊ฒฝ์ฐ userAdmin
๋๋ userAdminAnyDatabase
์์ ์ ๊ณตํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ญํ ๊ด๋ฆฌ ๊ถํ์ด ์๋ ์ฌ์ฉ์๋ก admin
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธ์ฆํด์ผ ํฉ๋๋ค. MongoDB ์๋ฒ์ ๊ตฌ์ฑ๋ ์ธ์ฆ ๋ฉ์ปค๋์ฆ์ ์ ํฉํ --authenticationMechanism
์ ํฌํจํ์ธ์.
mongosh --host <hostname> --port <port> --username <user> --password <pass> --authenticationDatabase="admin" --authenticationMechanism="<mechanism>"
์ฌ์ฉ์ ๊ด๋ฆฌ ์ญํ ์ ๋ง๋ญ๋๋ค.
AD ๋ฅผ ์ฌ์ฉํ์ฌ MongoDB ์ฌ์ฉ์๋ฅผ ๊ด๋ฆฌํ๋ ค๋ฉด userAdmin
๋๋ userAdminAnyDatabase
์์์ ๊ณตํ๋ ์ญํ ๊ณผ ๊ฐ์ด ์ญํ ์ ์์ฑํ๊ณ ๊ด๋ฆฌํ ์ ์๋ admin
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ญํ ์ ํ๋ ์ด์ ์์ฑํด์ผ ํฉ๋๋ค.
์ญํ ์ ์ด๋ฆ์ AD ๊ทธ๋ฃน์ ๊ณ ์ ์ด๋ฆ๊ณผ ์ ํํ ์ผ์นํด์ผ ํฉ๋๋ค. ์ด ๊ทธ๋ฃน์๋ AD ์ฌ์ฉ์๊ฐ ํ ๋ช ์ด์ ์์ด์ผ ํฉ๋๋ค.
์ฌ์ฉ ๊ฐ๋ฅํ Active Directory ๊ทธ๋ฃน ์ด ์ฃผ์ด์ง๋ฉด ๋ค์ ์์ ์ด ์ํ๋ฉ๋๋ค.
AD ๊ทธ๋ฃน
CN=dba,CN=Users,DC=example,DC=com
์ ํด๋นํ๋ ์ญํ ์ ์์ฑํฉ๋๋ค.admin
๋ฐ์ดํฐ๋ฒ ์ด์ค์์userAdminAnyDatabase
์ญํ ์ ํ ๋นํฉ๋๋ค.
var admin = db.getSiblingDB("admin") admin.createRole( { role: "CN=dba,CN=Users,DC=example,DC=com", privileges: [], roles: [ "userAdminAnyDatabase" ] } )
์ฌ์ฉ์๊ฐ ์ฌ์ฉ์ ๊ด๋ฆฌ์ ๊ถํ์ ๊ฐ์ ธ์ผ ํ๋ ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ userAdmin
์ญํ ์ ๋ถ์ฌํ ์๋ ์์ต๋๋ค. ์ด๋ฌํ ์ญํ ์ ์ญํ ์์ฑ ๋ฐ ๊ด๋ฆฌ์ ํ์ํ ๊ถํ์ ์ ๊ณตํฉ๋๋ค.
์ค์
์ต์ ๊ถํ ์์น ์ ์ฉ ๊ณ ๋ ค MongoDB ์ญํ , AD ๊ทธ๋ฃน ๋๋ ๊ทธ๋ฃน ๋ฉค๋ฒ์ญ์ ๊ตฌ์ฑํ ๋ ์ฌ์ฉํฉ๋๋ค.
MongoDB ๊ตฌ์ฑ ํ์ผ์ ์์ฑํฉ๋๋ค.
MongoDB ๊ตฌ์ฑ ํ์ผ์ ํ์ผ ํ์ฅ์๊ฐ .conf
์ธ ์ผ๋ฐ ํ
์คํธ YAML ํ์ผ์
๋๋ค.
๊ธฐ์กด MongoDB ๋ฐฐํฌ๋ฅผ ์ ๊ทธ๋ ์ด๋ํ๋ ๊ฒฝ์ฐ ํ์ฌ ๊ตฌ์ฑ ํ์ผ์ ๋ณต์ฌํ๊ณ ํด๋น ๋ณต์ฌ๋ณธ์์ ์์ ํ์ธ์.
(Linux๋ง ํด๋น) ์ ๊ท ๋ฐฐํฌ์ด๊ณ ํ๋ซํผ์ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ์ฌ MongoDB Enterprise๋ฅผ ์ค์นํ ๊ฒฝ์ฐ, ์ค์น์๋
/etc/mongod.conf
๊ธฐ๋ณธ๊ฐ ๊ตฌ์ฑ ํ์ผ์ด ํฌํจ๋ฉ๋๋ค. ํด๋น ๊ธฐ๋ณธ๊ฐ ๊ตฌ์ฑ ํ์ผ์ ์ฌ์ฉํ๊ฑฐ๋ ํด๋น ํ์ผ์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด ์์ ํ ์ ์์ต๋๋ค.ํด๋น ํ์ผ์ด ์๋ ๊ฒฝ์ฐ ํ์ฅ์๊ฐ
.conf
์ธ ๋น ํ์ผ์ ๋ง๋ค๊ณ ์ ๊ตฌ์ฑ ํ์ผ์์ ์์ ํฉ๋๋ค.
Active Directory์ ์ฐ๊ฒฐํ๋๋ก MongoDB๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
MongoDB ๊ตฌ์ฑ ํ์ผ์์ security.ldap.servers
๋ฅผ AD ์๋ฒ์ ํธ์คํธ ๋ฐ ํฌํธ๋ก ์ค์ ํฉ๋๋ค. AD ์ธํ๋ผ์ ๋ณต์ ๋ชฉ์ ์ ์ฌ๋ฌ AD ์๋ฒ๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ์๋ฒ์ ํธ์คํธ์ ํฌํธ๋ฅผ ์ผํ๋ก ๊ตฌ๋ถ๋ ๋ชฉ๋ก์ผ๋ก security.ldap.servers
์ง์ ํ์ธ์.
๋ํ security.authorization
๋ฅผ enabled
๋ก ์ค์ ํ๊ณ setParameter
authenticationMechanisms
๋ฅผ PLAIN
๋ก ์ค์ ํ์ฌ LDAP ์ธ์ฆ์ ์ฌ์ฉํ๋๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
์์
activedirectory.example.net
์ ์๋ AD ์๋ฒ์ ์ฐ๊ฒฐํ๋ ค๋ฉด ๊ตฌ์ฑ ํ์ผ์ ๋ค์์ ํฌํจํฉ๋๋ค.
security: authorization: "enabled" ldap: servers: "activedirectory.example.net" setParameter: authenticationMechanisms: 'PLAIN'
์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ ค๋ฉด MongoDB๊ฐ AD ์๋ฒ์ ๋ฐ์ธ๋ฉ๋์ด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก MongoDB๋ ๊ฐ๋จํ ์ธ์ฆ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ AD ์๋ฒ์ ์์ฒด์ ์ผ๋ก ๋ฐ์ธ๋ฉํฉ๋๋ค.
๋๋ ๊ตฌ์ฑ ํ์ผ์์ ๋ค์ ์ค์ ์ ๊ตฌ์ฑํ์ฌ SASL
๋ฅผ ์ฌ์ฉํ์ฌ AD ์๋ฒ์ ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค.
security.ldap.bind.method
๋ฅผsasl
๋ก ์ค์ ํฉ๋๋ค.security.ldap.bind.saslMechanisms
, AD ์๋ฒ๊ฐ ์ง์ํ๋ ์ผํ๋ก ๊ตฌ๋ถ๋ SASL ๋ฉ์ปค๋์ฆ ๋ฌธ์์ด์ ์ง์ ํฉ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ ๊ธฐ๋ณธ๊ฐ simple
LDAP ์ธ์ฆ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค.
๊ถํ ๋ถ์ฌ๋ฅผ ์ํ LDAP ์ฟผ๋ฆฌ ํ ํ๋ฆฟ์ ๊ตฌ์ฑํฉ๋๋ค.
MongoDB ๊ตฌ์ฑ ํ์ผ์์ security.ldap.authz.queryTemplate
์ RFC4516 ํ์์ LDAP ์ฟผ๋ฆฌ URL ํ
ํ๋ฆฟ์ผ๋ก ์ค์ ํฉ๋๋ค.
ํ ํ๋ฆฟ์์๋ ๋ค์ ์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
{USER}
ํ๋ ์ด์คํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆ๋ ์ฌ์ฉ์ ์ด๋ฆ์ LDAP ์ฟผ๋ฆฌ URL๋ก ๋์ฒดํ ์ ์์ต๋๋ค.{PROVIDED_USER}
์ธ์ฆ ๋๋ LDAP ๋ณํ ์ ์ ์ ๊ณต๋ ์ฌ์ฉ์ ์ด๋ฆ์ LDAP ์ฟผ๋ฆฌ๋ก ๋์ฒดํ๋ ์๋ฆฌ ํ์์์ ๋๋ค.
์ฐธ๊ณ
RFC4515 ์ ๋ํ ์ ์ฒด ์ค๋ช
, RFC4516 ๋๋ AD ์ฟผ๋ฆฌ๋ ์ด ํํ ๋ฆฌ์ผ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค. ์ด ํํ ๋ฆฌ์ผ์์ ์ ๊ณตํ๋ queryTemplate
๋ ์์์ผ ๋ฟ์ด๋ฉฐ ํน์ AD ๋ฐฐํฌ์๋ฒ์๋ ์ ์ฉ๋์ง ์์ ์ ์์ต๋๋ค.
์์
๋ค์ ์ฟผ๋ฆฌ ํ
ํ๋ฆฟ์ ์ฌ๊ท ๊ทธ๋ฃน ๋ฉค๋ฒ์ญ์ ๋ฐ๋ผ {USER}
์(๋ฅผ) ๋ฉค๋ฒ๋ก ๋์ดํ๋ ๋ชจ๋ ๊ทธ๋ฃน์ ๋ฐํํฉ๋๋ค. ์ด LDAP ์ฟผ๋ฆฌ๋ ๊ทธ๋ฃน ๊ฐ์ฒด๊ฐ member
์์ฑ์ ์ฌ์ฉํ์ฌ ์ ์ฒด ์ฌ์ฉ์ DN(๊ณ ์ ์ด๋ฆ)์ ์ ์ฅํ์ฌ ์ฌ์ฉ์ ๋ฉค๋ฒ์ญ์ ์ถ์ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ฟผ๋ฆฌ์๋ 1.2.840.113556.1.4.1941
LDAP_MATCHING_RULE_IN_CHAIN ์ ๋ํ AD ํน์ ์ผ์น ๊ท์น OID ๊ฐ ํฌํจ๋ฉ๋๋ค. . ์ด ์ผ์น ๊ท์น์ LDAP Atlas Search ํํฐ์ ๋ํ AD ํน์ ํ์ฅ์
๋๋ค.
๊ฒฝ๊ณ
AD ํฌ๋ฆฌ์คํธ์ ๋ง์ ์์ ๊ทธ๋ฃน์ด ํฌํจ๋ ๊ฒฝ์ฐ ์ฌ๊ท member:1.2.840.113556.1.4.1941
ํํฐํ๋ค ๋ก ์ธํด ์ฑ๋ฅ์ด ํฌ๊ฒ ์ ํ๋ ์ ์์ต๋๋ค.
security: ldap: authz: queryTemplate: "DC=example,DC=com??sub?(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={USER}))"
MongoDB๋ ์ฟผ๋ฆฌ ํ
ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ {USER}
๋ฅผ ์ธ์ฆ๋ ์ฌ์ฉ์ ์ด๋ฆ์ผ๋ก ๋์ฒดํ์ฌ LDAP ์๋ฒ๋ฅผ ์ฟผ๋ฆฌํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ CN=sam,CN=Users,DC=dba,DC=example,DC=com
์ผ๋ก ์ธ์ฆํฉ๋๋ค. MongoDB๋ queryTemplate
๊ธฐ๋ฐ์ผ๋ก LDAP ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ , {USER}
ํ ํฐ์ ์ธ์ฆ๋/๋ณํ๋ ์ฌ์ฉ์ ์ด๋ฆ์ผ๋ก ๋์ฒดํฉ๋๋ค. Active Directory ์๋ฒ๋ ์ฌ์ฉ์๋ฅผ ๊ตฌ์ฑ์์ผ๋ก ์ง์ ๋๋ ์ ์ด์ ์ผ๋ก ๋์ดํ๋ ๋ชจ๋ ๊ทธ๋ฃน์ ๋ํด ์ฌ๊ท์ ๊ทธ๋ฃน ์กฐํ๋ฅผ ์ํํฉ๋๋ค. AD์๋ฒ๋ Active Directory ๊ทธ๋ฃน ์ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ ๊ทธ๋ฃน์ ๋ฐํํฉ๋๋ค.
CN=dba,CN=Users,DC=example,DC=com
CN=engineering,CN=Users,DC=example,DC=com
CN=PrimaryApplication,CN=Users,DC=example,DC=com
MongoDB๋ ๋ฐํ๋ ๊ฐ ๊ทธ๋ฃน DN ์ admin
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ญํ ์ ๋งคํํฉ๋๋ค. ๋งคํ๋ ๊ฐ ๊ทธ๋ฃน DN ์ ๋ํด admin
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฆ์ด ์ ํํ DN ๊ณผ ์ผ์นํ๋ ๊ธฐ์กด ์ญํ ์ด ์๋ ๊ฒฝ์ฐ MongoDB๋ ์ฌ์ฉ์์๊ฒ ํด๋น ์ญํ ์ ํ ๋น๋ ์ญํ ๋ฐ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
๋งค์นญ ๊ท์น LDAP_MATCHING_RULE_IN_CHAIN
์์๋ ์ธ์ฆ ์ฌ์ฉ์์ ์ ์ฒด ๊ณ ์ ์ด๋ฆ ์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ฌ์ฉ์ ์ด๋ฆ ํ์์ ์ฌ์ฉํ์ฌ ์ธ์ฆํ๋ user
principal name
๊ฒฝ์ฐ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ด์ค๋ ์ฌ์ฉ์ ์ด๋ฆ์ DN ์ผ๋ก ๋ณํํด์ผ security.ldap.userToDNMapping
ํฉ๋๋ค.
์ ํ ์ฌํญ: Active Directory๋ฅผ ํตํ ์ธ์ฆ์ ์ํด ๋ค์ด์ค๋ ์ฌ์ฉ์ ์ด๋ฆ์ ๋ณํํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ์ ์ฒด LDAP ๊ณ ์ ์ด๋ฆ์ด ์๋ ์ฌ์ฉ์ ์ด๋ฆ์ผ๋ก ์ธ์ฆํ๋ ๊ฒฝ์ฐ LDAP ์ธ์ฆ ๋๋ ๊ถํ ๋ถ์ฌ๋ฅผ ์ง์ํ๋๋ก ์ฌ์ฉ์ ์ด๋ฆ์ ๋ณํํด์ผ ํ ์ ์์ต๋๋ค. MongoDB๋ ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ ๋ชจ๋์ ๋ณํ๋ ์ฌ์ฉ์ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค.
MongoDB ๊ตฌ์ฑ ํ์ผ์์ ์ค์ ํ์ฌ userToDNMapping
์ธ์ฆ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ์ฌ์ฉ์ ์ด๋ฆ์ ์ ์ง์ํ๋ AD ๊ณ ์ queryTemplate
์ด๋ฆ์ผ๋ก ๋ณํํฉ๋๋ค.
์์
๊ตฌ์ฑ๋ queryTemplate
๊ฐ ์ฃผ์ด์ง๋ฉด ์ฌ์ฉ์๋ ์ ์ฒด LDAP ๊ณ ์ ์ด๋ฆ์ผ๋ก ์ธ์ฆํด์ผ ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋์ userPrincipalName
์ ์ฌ์ฉํ์ฌ ์ธ์ฆํ๋ ๊ฒฝ์ฐ ์ ๊ณต๋ ์ฌ์ฉ์ ์ด๋ฆ์ ์ ์ฒด LDAP DN์ผ๋ก ๋ณํํ๋๋ก ๋ณํ์ ์ ์ฉํด์ผ ํฉ๋๋ค.
๋ค์ userToDNMapping
๊ตฌ์ฑ์ match
์ ๊ท ํํ์ ํํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ณต๋ ์ฌ์ฉ์ ์ด๋ฆ์ ์บก์ฒํฉ๋๋ค. MongoDB๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ ์ ์บก์ฒ๋ ์ฌ์ฉ์ ์ด๋ฆ์ ldapQuery
์ฟผ๋ฆฌ ํ
ํ๋ฆฟ์ ์ฝ์
ํฉ๋๋ค.
security: ldap: userToDNMapping: '[ { match : "(.+)", ldapQuery: "DC=example,DC=com??sub?(userPrincipalName={0})" } ]'
Active Directory ์๋ฒ๋ ์ผ์นํ๋ userPrincipalName
๋ฅผ ๊ฐ์ง ์ฌ์ฉ์ ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋ ์ ์ฒด LDAP ๊ณ ์ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ MongoDB๋ ์ด ๋ณํ๋ ์ฌ์ฉ์ ์ด๋ฆ์ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฐฐํฌ์๋ฒ์ ์ผ์นํ๋๋ก ์ง์ ๋ ์ํ ๊ตฌ์ฑ์ ์์ ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ldapQuery
๊ธฐ๋ณธ ๊ณ ์ ์ด๋ฆ ์ ์ฌ์ฉ์ ์ํฐํฐ๊ฐ ํฌํจ๋ ๊ธฐ๋ณธ ๊ณ ์ ์ด๋ฆ ๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค. AD ๋ฐฐํฌ๋ฅผ ์ง์ํ๊ธฐ ์ํด ๋ค๋ฅธ ์์ ์ด ํ์ํ ์ ์์ต๋๋ค.
์์
์ฌ์ฉ์๊ฐ alice@ENGINEERING.EXAMPLE.COM
์ผ๋ก ์ธ์ฆํฉ๋๋ค. MongoDB๋ ๋จผ์ userToDNMapping
์ ์ง์ ๋ ๋ชจ๋ ๋ณํ์ ์ ์ฉํฉ๋๋ค. MongoDB๋ ์ ๊ณต๋ ๊ตฌ์ฑ์ ๋ฐ๋ผ match
๋จ๊ณ์์ ์ฌ์ฉ์ ์ด๋ฆ์ ์บก์ฒํ๊ณ LDAP ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
DC=example,DC=com??sub?(userPrincipalName=alice@ENGINEERING.EXAMPLE.COM)
๊ตฌ์ฑ๋ Active Directory ์ฌ์ฉ์ ์ ๋ฐ๋ผ AD ์๋ฒ๋ CN=alice,CN=Users,DC=engineering,DC=example,DC=com
๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ MongoDB๋ queryTemplate
์ ๊ตฌ์ฑ๋ LDAP ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ฌ {USER}
ํ ํฐ์ ๋ณํ๋ ์ฌ์ฉ์ ์ด๋ฆ CN=alice,CN=Users,DC=engineering,DC=example,DC=com
์ผ๋ก ๋ฐ๊ฟ๋๋ค.
์ค์
userToDNMapping
์ substitution
๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ฃน ์ด๋ฆ์ ๋ณํํ๋ ๊ฒฝ์ฐ ๋์ฒด ๊ฒฐ๊ณผ๋ ๋ฐ๋์ RFC4514 ์ด์ค์ผ์ดํ๋ ๋ฌธ์์ด์ด์ด์ผ ํฉ๋๋ค.
์ฟผ๋ฆฌ ์๊ฒฉ ์ฆ๋ช ์ ๊ตฌ์ฑํฉ๋๋ค.
MongoDB๋ AD ์๋ฒ์์ ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ ค๋ฉด ์๊ฒฉ ์ฆ๋ช ์ด ํ์ํฉ๋๋ค.
๊ตฌ์ฑ ํ์ผ์์ ๋ค์ ์ค์ ์ ๊ตฌ์ฑํฉ๋๋ค.
, AD ์๋ฒ์์ ์ฟผ๋ฆฌ๋ฅผ
security.ldap.bind.queryUser
mongos
์ํํ๊ธฐmongod
์ํด ๋๋ ๋ฐ์ธ๋ํ๋ Active Directory ์ฌ์ฉ์๋ฅผ ์ง์ ํฉ๋๋ค.security.ldap.bind.queryPassword
๋ฅผ ํตํด ์ง์ ๋queryUser
์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ง์ ํฉ๋๋ค.
security: ldap: bind: queryUser: "mongodbadmin@dba.example.com" queryPassword: "secret123"
Windows MongoDB Server์์๋ security.ldap.bind.useOSDefaults
๋ฅผ true
๋ก ์ค์ ํ์ฌ queryUser
๋ฐ queryPassword
๋์ OS ์ฌ์ฉ์์ ์๊ฒฉ ์ฆ๋ช
์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
queryUser
์๋ MongoDB๋ฅผ ๋์ ํ์ฌ ๋ชจ๋ LDAP ์ฟผ๋ฆฌ๋ฅผ ์ํํ ์ ์๋ ๊ถํ์ด ์์ด์ผ ํฉ๋๋ค.
์ ํ ์ฌํญ: ์ถ๊ฐ ๊ตฌ์ฑ ์ค์ ์ ์ถ๊ฐํฉ๋๋ค.
๋ฐฐํฌ์ ํ์ํ ์ถ๊ฐ ๊ตฌ์ฑ ์ต์
์ ์ถ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ํ๋ storage.dbPath
๋ฅผ ์ง์ ํ๊ฑฐ๋ ๊ธฐ๋ณธ net.port
๋ฒํธ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
mongod
๋ฐ mongos
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ก์ปฌ ํธ์คํธ์ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค. ๋ฐฐํฌ ๊ตฌ์ฑ์์ด ๋ค๋ฅธ ํธ์คํธ์์ ์คํ๋๊ฑฐ๋ ์๊ฒฉ ํด๋ผ์ด์ธํธ๋ฅผ ๋ฐฐํฌ์ ์ฐ๊ฒฐํ๋ ค๋ ๊ฒฝ์ฐ net.bindIp
์ค์ ์ ์ง์ ํด์ผ ํฉ๋๋ค.
Active Directory ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ๋ฅผ ์ฌ์ฉํ์ฌ MongoDB Server๋ฅผ ์์ํฉ๋๋ค.
์ด ์ ์ฐจ ์ค์ ์์ฑ๋ ๊ตฌ์ฑ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ์ฌ --config
์ต์
์ผ๋ก MongoDB ์๋ฒ๋ฅผ ์์ํฉ๋๋ค. ํ์ฌ MongoDB ์๋ฒ๊ฐ ์คํ ์ค์ธ ๊ฒฝ์ฐ ์๋ฒ๋ฅผ ์ค์งํ ์ ์๋๋ก ์ ์ ํ ์ค๋น๋ฅผ ํฉ๋๋ค.
mongod --config <path-to-config-file>
Windows MongoDB ๋ฐฐํฌ์์๋ {7 mongod.exe
์(๋ฅผ) ์ฌ์ฉํด์ผ ํฉ๋๋ค mongod
MongoDB ์๋ฒ์ ์ฐ๊ฒฐํฉ๋๋ค.
MongoDB ์๋ฒ์ ์ฐ๊ฒฐํ์ฌ ์ง์ ๋๋ ์ ์ด์ ๊ทธ๋ฃน ๋ฉค๋ฒ์ญ์ด userAdmin
๊ณผ userAdminAnyDatabase
๊ฐ ์๋ admin
๋ฐ์ดํฐ๋ฒ ์ด์ค์ MongoDB ์ญํ ๋๋ ์ด์ ๋๋ฑํ ๊ถํ์ด ์๋ ์ฌ์ฉ์ ์ง์ ์ญํ ์ ํด๋นํ๋ ์ฌ์ฉ์๋ก ์ธ์ฆํฉ๋๋ค.
mongosh
๋ฅผ ์ฌ์ฉํ์ฌ MongoDB ์๋ฒ์ ์ธ์ฆํ๊ณ ๋ค์ ์ต์
์ ์ค์ ํฉ๋๋ค.
--host
๋ฅผ MongoDB ์๋ฒ์ ํธ์คํธ ์ด๋ฆ์ผ๋ก ์ฌ์ฉ--port
๋ฅผ MongoDB ์๋ฒ์ ํฌํธ๋ก ์ฌ์ฉ--username
์ฌ์ฉ์์ ์ฌ์ฉ์ ์ด๋ฆ์--password
์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ์--authenticationMechanism
to'PLAIN'
--authenticationDatabase
to'$external'
์์
์ด ์ ์ฐจ์ ์ด์ ๋จ๊ณ์์๋ ํ์ํ ๊ถํ์ผ๋ก admin
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ dn:CN=dba,CN=Users,DC=example,DC=com
์ญํ ์ ๊ตฌ์ฑํ์ต๋๋ค. ์ด ์ญํ ์ AD ๊ทธ๋ฃน์ ํด๋นํฉ๋๋ค. ๊ตฌ์ฑ๋ AD ์ฌ์ฉ์ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก sam@dba.example.com
์ฌ์ฉ์๋ก ์ธ์ฆํ๊ณ ํ์ํ ๊ถํ์ ๋ฐ์ ์ ์์ต๋๋ค.
mongosh --username sam@DBA.EXAMPLE.COM --password --authenticationMechanism 'PLAIN' --authenticationDatabase '$external' --host <hostname> --port <port>
-p
๋ช
๋ น์ค ์ต์
์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด mongosh
(์ด)๊ฐ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฌป๋ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค.
Windows MongoDB ๋ฐฐํฌ์์๋mongosh
๋์ mongo.exe
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค
๊ตฌ์ฑ๋ ํ์ฑํ ๋๋ ํ ๋ฆฌ ์ฌ์ฉ์๊ฐ ์ฃผ์ด์ง๋ฉด ์ฌ์ฉ์๋ ์ฑ๊ณต์ ์ผ๋ก ์ธ์ฆ๋๊ณ ์ ์ ํ ๊ถํ์ ๋ฐ์ต๋๋ค.
์ฐธ๊ณ
$external
์ด ์๋ ๊ธฐ์กด ์ฌ์ฉ์๋ก ์ธ์ฆํ๋ ค๋ฉด --authenticationMechanism
์ SCRAM ์ธ์ฆ ๋ฉ์ปค๋์ฆ(์ํฉ์ ๋ฐ๋ผ SCRAM-SHA-1
๋๋ SCRAM-SHA-256
)์ผ๋ก ์ค์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ค๋ฉด MongoDB ์๋ฒ์ setParameter
authenticationMechanisms
์ SCRAM-SHA-1
๋ฐ/๋๋ SCRAM-SHA-256
์ ํฌํจํด์ผ ํฉ๋๋ค.
๋ฐํ๋ AD ๊ทธ๋ฃน์ ๋งคํํ๊ธฐ ์ํ์ญํ ์ ๋ง๋ญ๋๋ค.
MongoDB ๊ถํ ๋ถ์ฌ์ ์ฌ์ฉํ๋ ค๋ AD ์๋ฒ์ ๊ฐ ๊ทธ๋ฃน์ ๋ํด MongoDB ์๋ฒ์ admin
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ผ์นํ๋ ์ญํ ์ ์์ฑํด์ผ ํฉ๋๋ค.
์์
๋ค์ ์์
์์๋ AD ๊ทธ๋ฃน DN CN=PrimaryApplication,CN=Users,DC=example,DC=com
์ ์ด๋ฆ์ ๋ด ์ญํ ์ ์์ฑํ๊ณ ํด๋น ๊ทธ๋ฃน์ ์ ์ ํ ์ญํ ๋ฐ ๊ถํ์ ํ ๋นํฉ๋๋ค.
db.getSiblingDB("admin").createRole( { role: "CN=PrimaryApplication,CN=Users,DC=example,DC=com", privileges: [], roles: [ { role: "readWrite", db: "PrimaryApplication" } ] } )
๊ตฌ์ฑ๋ Active Directory ๊ทธ๋ฃน์ด ์ฃผ์ด์ง๋ฉด MongoDB๋ sam@DBA.EXAMPLE.COM
๋๋ alice@ENGINEERING.EXAMPLE.COM
์ค ํ๋๋ก ์ธ์ฆํ๋ ์ฌ์ฉ์์๊ฒ PrimaryApplication
๋ฐ์ดํฐ๋ฒ ์ด์ค์readWrite
์ญํ ์ ๋ถ์ฌํฉ๋๋ค.
์ฐธ๊ณ
admin
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ญํ ์ ๊ด๋ฆฌํ๋ ค๋ฉด admin
, userAdminAnyDatabase
์์ userAdmin
์ ๊ฐ์ง ์ฌ์ฉ์๋ก ์ธ์ฆ๋์๊ฑฐ๋ ๋๋ฑํ ๊ถํ์ด ์๋ ์ฌ์ฉ์ ์ง์ ์ญํ ์ด ์ผ์ ธ ์์ด์ผ ํฉ๋๋ค.
๊ธฐ์กด ์ฌ์ฉ์๋ฅผ $external
์์ ActiveDirectory ์๋ฒ ๋ก์ ํํฉ๋๋ค.
$external
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์ฑ๋ ์ฌ์ฉ์ ๋ก ๊ธฐ์กด ์ค์น๋ฅผ ์
๊ทธ๋ ์ด๋ํ๋ ๊ฒฝ์ฐ AD ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ๋ฅผ ์ํด MongoDB๋ฅผ ๊ตฌ์ฑํ ํ ๊ฐ ์ฌ์ฉ์๊ฐ ์ก์ธ์คํ ์ ์๋๋ก ๋ค์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํด์ผ ํฉ๋๋ค.
์ฌ์ฉ์๋ AD ์๋ฒ์ ํด๋น ์ฌ์ฉ์ ๊ฐ์ฒด๊ฐ ์์ต๋๋ค.
์ฌ์ฉ์๋ AD ์๋ฒ์์ ์ ์ ํ ๊ทธ๋ฃน์ ๋ฉค๋ฒ์ญ์ด ์์ต๋๋ค.
MongoDB์๋ ์ฌ์ฉ์์ AD ๊ทธ๋ฃน์ ๋ฐ๋ผ ๋ช ๋ช ๋
admin
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ญํ ์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก ๊ถํ์ด ๋ถ์ฌ๋ ์ฌ์ฉ์๊ฐ ํด๋น ๊ถํ์ ์ ์งํ ์ ์์ต๋๋ค.
์์
$external
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ค์ ์ฌ์ฉ์๊ฐ ์์ต๋๋ค.
{ user : "joe@ANALYTICS.EXAMPLE.COM", roles: [ { role : "read", db : "web_analytics" }, { role : "read", db : "PrimaryApplication" } ] }
์ฌ์ฉ์๊ฐ AD ๊ทธ๋ฃน CN=marketing,CN=Users,DC=example,DC=com
์ ์ํด ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋ค์ ์์
์ ์ ์ ํ ๊ถํ์ ๊ฐ์ง ์ผ์นํ๋ ์ญํ ์ ์์ฑํฉ๋๋ค.
db.getSiblingDB("admin").createRole( { role: "CN=marketing,CN=Users,DC=example,DC=com", privileges: [], roles: [ { role: "read", db: "web_analytics" } { role: "read", db: "PrimaryApplication" } ] } )
๊ตฌ์ฑ๋ queryTemplate
์ ๋ฐ๋ผ MongoDB๋ CN=marketing,CN=Users,DC=example,DC=com
๊ทธ๋ฃน์ ์ง์ ๋๋ ์ ์ด ๋ฉค๋ฒ์ญ์ด ์๋ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ web_analytics
๋ฐ PrimaryApplication
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ read
์์
์ ์ํํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
์ค์
ํด๋น AD ๊ทธ๋ฃน์ ์ญํ ์ ๊ตฌ์ฑํ ๋๋ ํด๋น ๊ทธ๋ฃน์ ๋ฉค๋ฒ์ญ์ด ์๋ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ํ ๋น๋ ์ญํ ๊ณผ ๊ถํ์ ๋ฐ์ ์ ์๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์. ์ต์ ๊ถํ ์์น ์ ์ฉ ๊ณ ๋ ค MongoDB ์ญํ , AD ๊ทธ๋ฃน ๋๋ ๊ทธ๋ฃน ๋ฉค๋ฒ์ญ์ ๊ตฌ์ฑํ ๋ ์ฌ์ฉํฉ๋๋ค.
$external
๊ฐ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฌ์ฉ์๊ฐ MongoDB์ ์ก์ธ์คํ ์ ์๋๋ก ๊ณ์ ํ์ฉํ๋ ค๋ฉด SCRAM ์ธ์ฆ ๋ฉ์ปค๋์ฆ์ ํฌํจํด์ผ ํฉ๋๋ค(์: SCRAM-SHA-1
๋ฐ/๋๋ SCRAM-SHA-256
)์ setParameter
authenticationMechanisms
๊ตฌ์ฑ ์ต์
์ ํฌํจํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
setParameter: authenticationMechanisms: "PLAIN,SCRAM-SHA-1,SCRAM-SHA-256"
๋๋ ์์ ์ ์ฐจ์ ๋ฐ๋ผ$external
๊ฐ ์๋ ์ฌ์ฉ์๋ฅผ AD ๋ก ์ ํํฉ๋๋ค.
์ด ์ ์ฐจ๋ฅผ ์ํํ๋ฉด ๋ค์ ๊ตฌ์ฑ ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
security: authorization: "enabled" ldap: servers: "activedirectory.example.net" bind: queryUser: "mongodbadmin@dba.example.com" queryPassword: "secret123" userToDNMapping: '[ { match: "(.+)", ldapQuery: "DC=example,DC=com??sub?(userPrincipalName={0})" } ]' authz: queryTemplate: "DC=example,DC=com??sub?(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={USER}))" setParameter: authenticationMechanisms: "PLAIN"
์ง์ ๋ ์ํ ๊ตฌ์ฑ์ Active Directory ์คํค๋ง, ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ ๋ฐ ๊ตฌ์ฑ์ ๋ง๊ฒ ์์ ํด์ผ ํฉ๋๋ค. ๋ฐฐํฌ์๋ฒ๋ฅผ ์ํ ์ถ๊ฐ ๊ตฌ์ฑ ํ์ผ ์ต์ ์ด ํ์ํ ์๋ ์์ต๋๋ค.
์ญํ ๋ฐ ๊ถํ ๊ตฌ์ฑ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ค์์ ์ฐธ์กฐํ์ธ์.