자체 관리 배포서버에 대한 LDAP 권한 부여
New in version 3.4: MongoDB Enterprise supports querying an LDAP server for the LDAP groups to which the authenticated user belongs. MongoDB 는 반환된 각 그룹 의 고유 이름(DN)을 admin
데이터베이스 의 역할 에 매핑합니다. MongoDB 는 매핑된 역할 및 관련 권한을 기반으로 사용자에게 권한을 부여합니다. 자세한 내용은 LDAP 권한 부여 를 참조하세요.
LDAP 인증 프로세스는 아래에 요약되어 있습니다:
클라이언트는 MongoDB에 연결하고 외부 인증을 지원하는 인증메커니즘을 사용하여 인증을 수행합니다.
$external
인증 사용자(Kerberos, LDAP 또는 x.509 사용자)와 함께 클라이언트 세션 및 인과적 일관성 보장 을 사용하려면 사용자 이름이 10k 바이트를 초과할 수 없습니다.MongoDB는
security.ldap.servers
로 지정된 LDAP 서버에security.ldap.bind.queryUser
와security.ldap.bind.queryPassword
로 지정된 자격 증명을 사용하여 바인딩합니다.MongoDB는 기본적으로 단순 바인딩을 사용하지만
security.ldap.bind.method
및security.ldap.bind.saslMechanisms
으로구성된 경우sasl
바인딩을 대신 사용할 수 있습니다.MongoDB는
security.ldap.authz.queryTemplate
을 사용하여 LDAP 쿼리를 구성하고 인증된 사용자의 그룹 노드십을 LDAP 서버에 쿼리합니다.MongoDB는
security.ldap.userToDNMapping
옵션으로 사용자 이름을 변환하여 쿼리 템플릿을 지원할 수 있습니다.LDAP 서버는 쿼리를 평가하고 인증된 사용자가 속한 그룹 목록을 반환합니다.
MongoDB는 반환된 각 그룹의 고유 이름(DN)을
admin
데이터베이스의 역할에 매핑하여 서버에서 조치를 수행할 수 있는 권한을 사용자에게 부여합니다. 반환된 그룹 DN이admin
데이터베이스의 기존 역할 이름과 정확히 일치하는 경우, MongoDB는 사용자에게 해당 역할에 할당된 역할 및 권한을 부여합니다. 자세한 내용은 LDAP 인증을 위한 MongoDB 역할을 참조하세요.클라이언트는 MongoDB 서버에서 인증된 사용자에게 부여된 역할 또는 권한이 필요한 조치를 수행할 수 있습니다.
ldapUserCacheInvalidationInterval
로 정의된 간격으로 MongoDB는$external
캐시를 플러시합니다. 외부에서 권한이 부여된 사용자가 수행하는 후속 작업을 실행하기 전에 MongoDB는 LDAP 서버에서 해당 사용자의 그룹 멤버십을 다시 획득합니다.
고려 사항
Docker에 대한 전체 설명은 이 문서의 범위를 벗어납니다. 이 페이지에서는 Docker에 대한 사전 지식이 있다고 가정합니다.
이 문서에서는 MongoDB LDAP 권한 부여에 대해서만 설명하며 LDAP의 다른 리소스를 대체하지 않습니다. LDAP 인증을 구성하기 전에 LDAP 및 관련 주제를 철저히 숙지하는 것이 좋습니다.
MongoDB는 MongoDB 배치에 대해 LDAP 권한 부여의 최적 구성을 위한 전문 서비스를 제공할 수 있습니다.
호환 가능한 인증 메커니즘
MongoDB는 다음과 같은 권한 부여 방법으로 LDAP 인증을 지원합니다:
이 구성에서 MongoDB는 LDAP, X.509 또는 Kerberos 권한 부여를 사용하여 클라이언트 연결을 인증합니다.
연결 풀
인증/권한 부여를 위해 LDAP 서버에 연결할 때 MongoDB는 기본적으로 다음을 수행합니다.
실행하면 연결 풀링을 사용합니다:
또는
를 사용하여 MongoDB Enterprise 바이너리가 libldap_r에대해 링크되는 Linux에서.
실행하면 연결 풀링을 사용하지 않습니다:
MongoDB Enterprise 바이너리는 Linux에서 libldap에 대해 링크됩니다.
연결 풀링 동작을 변경하려면 ldapUseConnectionPool
매개변수를 업데이트하십시오.
libldap
개인정보 정책에 libldap_r
libldap
(예: RHEL에서 실행되는 경우) 에 연결된 MongoDB 4.2 엔터프라이즈 바이너리의 경우 libldap
액세스가 동기화되므로 일부 성능/대기 시간 비용이 발생합니다.
0}에 연결된 MongoDB 4.2 Enterprise 바이너리의 libldap_r
경우 이전 MongoDB 버전과 동작이 변경되지 않습니다.
사용자 관리
LDAP 권한 부여를 사용하면 LDAP 서버에서 사용자 생성 및 관리가 이루어집니다. MongoDB를 사용하려면 admin
데이터베이스에 각 역할의 이름이 LDAP 그룹의 고유 이름(DN)과 정확히 일치하는 역할을 생성해야 합니다. 이는 $external
데이터베이스에 사용자를 생성해야 하는 MongoDB 관리형 권한 부여와 대조됩니다.
MongoDB 서버에서 역할을 관리하려면, 역할 관리 권한을 가진admin
데이터베이스 역할과 연관된 그룹 멤버인 사용자로 인증해야 합니다. 이는 userAdmin
과 같은 역할을 통해 제공됩니다. LDAP 그룹 DN에 해당하는 역할을 생성하거나 업데이트하여 해당 그룹의 구성원이 있는 사용자가 적절한 역할 및 권한을 받을 수 있도록 합니다.
예를 들어, 데이터베이스 관리자용 LDAP 그룹에는 어드민 역할 및 권한이 있는 역할이 있을 수 있습니다. 마케팅 또는 분석 사용자를 위한 LDAP 그룹에는 특정 데이터베이스에서 읽기 권한만 있는 역할이 있을 수 있습니다.
중요
해당 LDAP 그룹에 대한 역할을 구성할 때 해당 그룹의 구성원 자격을 가진 모든 사용자가 구성된 역할 및 권한을 받을 수 있으니 주의하시기 바랍니다. MongoDB 역할, LDAP 그룹 또는 그룹 멤버십을 구성할 때는 최소 권한 원칙을 적용하는 것이 좋습니다.
역할 관리 권한이 있는 역할이 존재하지 않고 이러한 권한이 없는$external
사용자가 존재하지 않으면 LDAP 서버에서 그룹 또는 그룹 멤버십의 추가 또는 변경을 반영하도록 새 역할이나 기존 역할을 변경할 수 없으므로 사실상 사용자 관리를 수행할 수 없습니다.
MongoDB 서버에서 역할을 관리할 수 없는 시나리오를 해결하려면 다음 절차를 수행하세요.
권한 부여 및 LDAP 인증 없이 MongoDB 서버 다시 시작
이름이 적절한 LDAP 그룹 고유 이름(Distinguished Name)에 해당하는
admin
데이터베이스에 역할을 만듭니다. 그룹 DN을 선택할 때 데이터베이스 관리에 가장 적합한지 고려하십시오.인증 및 LDAP 권한 부여를 통해 MongoDB Server를 다시 시작합니다.
생성된 관리 역할에 해당하는 그룹 멤버로서 인증합니다.
기존 사용자
LDAP를 사용하여 권한을 부여하는 MongoDB 서버는 $external
데이터베이스의 기존 사용자에게 액세스할 수 없습니다. $external
데이터베이스에 기존 사용자가 있는 경우 계속 액세스할 수 있도록 하려면 데이터베이스의 각 사용자에 대해 다음 요구 사항$external
을 충족해야 합니다:
사용자가 LDAP 서버에 해당 사용자 객체를 가지고 있습니다.
사용자 객체는 적절한 LDAP 그룹의 멤버십을 가지고 있습니다
MongoDB는 사용자의 LDAP 그룹을 나타내는
admin
데이터베이스에 역할을 가지고 있으며, 이를 통해 부여된 역할과 권한은$external
이 아닌 사용자에게 부여된 것과 동일합니다.
$external
데이터베이스에 없는 사용자가 액세스할 수 있도록 계속 허용하려면 authenticationMechanisms
매개 변수에 SCRAM-SHA-1
및/또는 SCRAM-SHA-256
가 적절하게 포함되어 있는지 확인합니다. 또는 해당 사용자를 LDAP 권한 부여로 전환하기 위해 위에 나열된 요구 사항을 적용합니다.
복제본 세트
복제본 세트의 경우, 프라이머리를 구성하기 전에 먼저 세컨더리 및 중재자 멤버에 대한 LDAP 권한 부여를 구성합니다. 이는 샤드 복제본 세트 또는 config 서버 복제본 세트에도 적용됩니다. 한 번에 하나의 복제본 세트 멤버를 설정하여 대다수의 멤버가 쓰기 가용성을 유지하도록 합니다.
샤딩된 클러스터
샤딩된 클러스터는 클러스터 수준 사용자를 위해 config 서버 LDAP 권한을 구성해야 합니다. 필요한 경우 각 샤드에서 샤드 로컬 사용자를 위한 LDAP 권한을 구성할 수도 있습니다.
구성
LDAP 권한 부여를 사용하려면 다음 설정을 구성해야 합니다.
운영 체제 라이브러리를 통해 LDAP를 권한 부여에 사용하려면, mongod
또는 mongos
구성 파일에서 특정 설정을 지정해야 합니다.
옵션 | 설명 | 필수 사항 |
---|---|---|
따옴표로 묶은 쉼표로 구분된 host[:port] 형식의 LDAP 서버 목록입니다. | 네 | |
RFC4515 및 RFC4516 사용자가 속한 LDAP 그룹을 가져오기 위해 MongoDB에서 실행하는 LDAP 형식의 쿼리 URL 템플릿입니다. 쿼리는 템플릿에서 다음 토큰을 사용할 수 있습니다.
| 네 | |
LDAP 서버에 연결하고 작업과 쿼리를 실행할 때 MongoDB Server가 바인딩하는 ID입니다. 지정한 사용자는 구성된 | 네 | |
queryUser 사용 시 LDAP 서버에 바인딩하는 데 사용되는 비밀번호입니다. | 네 | |
아니요, LDAP 서버에 바인딩하기 위해 sasl 사용하지 않는 한. | ||
아니요, method 를 sasl 로 설정하지 않는 이상, 다른 또는 추가적인 SASL 메커니즘은 필요하지 않습니다. | ||
Windows MongoDB 배포는 LDAP 서버에 연결할 때와 마찬가지로 인증 또는 바인딩을 위해 queryUser 및 queryPassword 대신 운영 체제 자격 증명을 사용할 수 있습니다. | 아니요, queryUser 와 queryPassword 를대체하지 않는 한. | |
queryTemplate 에 따라, 인증된 클라이언트 사용자 이름을 LDAP 쿼리 URL을 지원하도록 변환할 필요가 있을 수 있습니다. userToDNMapping 를 통해 MongoDB는 들어오는 사용자 이름을 변환할 수 있습니다. | 클라이언트 사용자 이름을 LDAP DN으로 변환해야 하는 경우가 아니면 NO입니다. |
LDAP 권한 부여을(를) 구성했으면 mongod
또는 mongos
를 다시 시작해야 합니다. 이제 서버는 X.509, Kerberos 또는 LDAP을 사용하여 클라이언트 연결을 인증합니다.
LDAP 쿼리 템플릿
MongoDB는 security.ldap.authz.queryTemplate
(을)를 사용하여 RFC4516 형식의 LDAP 쿼리 URL을 생성합니다. 템플릿에서는 다음 중 하나를 사용할 수 있습니다.
{USER}
플레이스홀더를 사용하여 인증된 사용자 이름을 LDAP 쿼리 URL로 대체할 수 있습니다. MongoDB가userToDNMapping
을 사용하여 사용자 이름을 변환한 경우 MongoDB는 LDAP 쿼리 URL을 구성할 때{USER}
토큰을 변환된 사용자 이름으로 바꿉니다.{PROVIDED_USER}
인증 또는 LDAP 변환 전에 제공된 사용자 이름은 LDAP 쿼리로 대체하는 자리 표시자입니다.
사용자 그룹을 조회하기 위한 쿼리 템플릿을 디자인하세요.
예시
다음 쿼리 템플릿은 LDAP 사용자 객체의 memberOf
속성에 나열된 모든 그룹을 반환합니다. 이 쿼리는 memberOf
속성이 존재한다고 가정합니다. 특정 LDAP 배포에서는 그룹 멤버십을 추적하는 데 다른 속성이나 방법론을 사용할 수 있습니다. 또한 이 쿼리에서는 사용자가 전체 LDAP DN을 사용자 이름으로 사용하여 인증한다고 가정합니다.
"{USER}?memberOf?base"
LDAP 쿼리 URL은 RFC4516에 정의된 형식을 준수해야 합니다.
[ dn [ ? [attributes] [ ? [scope] [ ? [filter] [ ? [Extensions] ] ] ] ] ]
RFC4516에서 인용된 대로 각 구성 요소의 정의를 고려하세요.
dn
은 RFC4514에 설명된 문자열 형식을 사용하는 LDAP 고유 이름입니다. 이는 LDAP 검색의 기본 객체 또는 비검색 작업의 대상을 식별합니다.
attributes
구성은 항목에서 반환해야 하는 특성을 나타내는 데 사용됩니다.
scope
구성은 지정된 LDAP 서버에서 수행할 검색 범위를 지정하는 데 사용됩니다. 허용되는 범위는 기본 객체 검색의 경우 'base', 단일 수준 검색의 경우 'one' 또는 하위 트리 검색의 경우 'sub'입니다.
filter
는 검색 중에 지정된 범위 내의 항목에 적용할 검색 필터를 지정하는 데 사용됩니다. 이 형식은 [RFC4515]에 지정되어 있습니다.
extensions
구문은 LDAP URL에 확장성 메커니즘을 제공하여 URL의 기능을 향후 확장할 수 있도록 합니다.
쿼리에 attribute
이 포함된 경우 MongoDB는 쿼리가 이 엔터티가 속한 DN을 검색한다고 가정합니다.
쿼리에 속성이 포함되어 있지 않으면 MongoDB는 쿼리가 사용자가 속한 모든 엔터티를 검색한다고 가정합니다.
MongoDB는 현재 LDAP 쿼리에 지정된 모든 확장자를 무시합니다.
중요
RFC4516 또는 LDAP 쿼리 URL 구성에 대한 전체적인 설명은 이 문서의 범위를 벗어납니다.
Tutorials
다음 튜토리얼에는 운영 체제 LDAP 라이브러리를 통해 LDAP 서버에 연결하는 절차가 포함되어 있습니다.
LDAP 권한 부여를 사용하여 MongoDB 서버에 연결하기
권한 부여를 위해 LDAP를 사용하는 경우 mongosh
(을)를 통해 연결하는 사용자는 다음을 수행해야 합니다.
--authenticationDatabase
(을)를$external
(으)로 설정합니다.적절한 인증 메커니즘에 맞게
--authenticationMechanism
을 설정합니다.LDAP 인증을 사용하는 경우, 이를
PLAIN
으로 설정하고Kerberos 인증사용하는 경우,
GSSAPI
로 설정합니다.x.509를 사용하는 경우 이 값을
MONGODB-X.509
로 설정합니다.--username
security.ldap.authz.queryTemplate
또는 구성된security.ldap.userToDNMapping
템플릿을 준수하는 사용자 이름으로 설정합니다.--password
를 적절한 비밀번호로 설정합니다.
배포 서버와 관련된 다른 옵션과 함께 MongoDB 서버의 --host
및 --port
(을)를 포함합니다.
예를 들어, 다음 작업은 LDAP 인증 및 권한 부여를 통해 실행 중인 MongoDB Server를 인증합니다.
mongosh --username alice@dba.example.com --password --authenticationDatabase '$external' --authenticationMechanism "PLAIN" --host "mongodb.example.com" --port 27017
-password
명령줄 옵션에 비밀번호를 지정하지 않으면 mongosh
에서 비밀번호를 입력하라는 메시지를 표시합니다.
중요
셸이 $external
을 변수로 해석하지 못하도록 하려면 $external
인수를 큰따옴표가 아닌 작은따옴표로 묶어야 합니다.
LDAP 권한 부여를 위한 MongoDB 역할
MongoDB는 LDAP query
에서 반환된 각 반환된 그룹 DN(고유 이름)을 admin
데이터베이스의 역할에 매핑합니다.
만약 MongoDB가 DN이 기존 역할의 이름과 정확히 일치하는 그룹을 얻는다면, 인증된 사용자에게 해당 역할과 관련된 권한을 부여합니다. MongoDB가 반환된 그룹 중 어느 것도 역할에 매핑할 수 없다면, 사용자에게는 어떠한 권한도 부여되지 않습니다.
참고
중요
권한 부여에 LDAP를 사용 중이고 LDAP 그룹 DN에 RFC4514 이스케이프 시퀀스가 포함된 경우 admin
데이터베이스에서 만드는 역할도 RFC4514에 따라 이스케이프 처리해야 합니다.
예시
데이터베이스에 다음과 같은 역할이 admin
데이터베이스에 구성되어 있습니다:
{ role: "CN=dba,CN=Users,DC=example,DC=com", privileges: [], roles: [ "dbAdminAnyDatabase", "clusterAdmin" ] } { role: "CN=analytics,CN=Users,DC=example,DC=com" privileges: [], roles: [ { role : "read", db : "web_statistics" }, { role : "read", db : "user_statistics" } ] }
$external
데이터베이스에 대해 사용자 alice@dba.example.com
를 인증한 후 MongoDB 서버는 구성된 query template
에서 파생된 쿼리를 수행하여 인증된 사용자를 멤버로 포함하는 그룹을 검색합니다. 이 예시에서 MongoDB 서버는 사용자에 대해 다음 그룹 DN을 검색합니다.
dn:CN=dba,CN=Users,dc=example,dc=com dn:CN=admin,CN=Users,dc=example,dc=com
MongoDB는 이러한 그룹 DN을 admin
데이터베이스의 역할에 매핑합니다. 첫 번째 그룹 DN은 첫 번째 역할과 일치하며, MongoDB는 인증된 사용자에게 그 역할과 권한을 부여합니다. 두 번째 그룹 DN은 서버의 어떠한 역할과도 일치하지 않으므로, MongoDB는 추가적인 권한을 부여하지 않습니다.
새 사용자 bob@analytics.example.com
이 $external
데이터베이스에 대해 인증합니다. MongoDB 서버는 쿼리 템플릿에 제공된 사용자 이름을 사용하여 쿼리 프로세스를 반복합니다. 이 예시에서 MongoDB 서버는 사용자에 대해 다음 그룹 DN을 검색합니다.
dn:cn=analytics,CN=Users,dc=example,dc=com
MongoDB는 이러한 그룹 DN을 admin
데이터베이스의 역할에 매핑하고 인증된 사용자에게 두 번째 역할의 역할 및 권한을 부여합니다.
새 사용자 workstation@guest.example.com
이 $external
데이터베이스에 대해 인증합니다. MongoDB 서버는 쿼리 템플릿에 제공된 사용자 이름을 사용하여 쿼리 프로세스를 반복합니다. 이 예시에서 MongoDB 서버는 사용자에 대해 다음 그룹 DN을 검색합니다.
dn:cn=guest,CN=Users,dc=example,dc=com
MongoDB는 그룹을 admin
데이터베이스의 역할에 매핑하고, 일치하는 역할이 없기 때문에 사용자에게 추가 권한을 부여하지 않습니다.