Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

자체 관리 배포에서 사용자 및 역할 관리

이 페이지의 내용

  • 전제 조건
  • 사용자 정의 역할 생성
  • 기존 사용자의 액세스 권한 수정
  • 기존 사용자의 비밀번호 수정
  • 사용자 역할 보기
  • 역할 권한 보기

이 튜토리얼에서는 자체 관리형 배포를 위한 MongoDB의 권한 부여 모델에 따른 사용자 및 역할 관리 예제를 제공합니다. 새 사용자를 만들려면 자체 관리형 배포에서 사용자 생성을 참조하세요.

배포에 대한 액세스 제어를 활성화한 경우 각 섹션에 지정된 필수 권한을 가진 사용자로 인증해야 합니다. 이 튜토리얼에 나열된 작업을 수행하려면 사용자 관리자에게 특정 데이터베이스에서 userAdminAnyDatabase 역할 또는 userAdmin 역할이 필요합니다. 사용자 관리자를 첫 번째 사용자로 추가하는 방법에 대한 자세한 내용은 자체 관리형 배포에서 액세스 제어 활성화를 참조하세요.

참고

MongoDB Atlas에서 사용자 정의 역할을 생성하려면 MongoDB Atlas 문서의 사용자 정의 역할 추가를 참조하세요.

역할은 사용자에게 MongoDB 리소스에 대한 액세스 권한을 부여합니다. MongoDB는 관리자가 MongoDB 시스템 액세스 제어에 사용할 수 있는 여러 가지 기본 제공 역할을 지원합니다. 그러나 이러한 역할이 원하는 권한 세트를 설명하지 못하는 경우 특정 데이터베이스에 새로운 역할을 생성할 수 있습니다.

admin 데이터베이스에서 만든 역할을 제외하고 역할은 해당 데이터베이스에 적용되는 권한만 포함할 수 있으며 해당 데이터베이스의 다른 역할로부터만 상속할 수 있습니다.

admin 데이터베이스에서 만든 역할에는 admin 데이터베이스, 다른 데이터베이스 또는 클러스터 리소스에 적용되는 권한이 포함될 수 있으며, admin 데이터베이스뿐만 아니라 다른 데이터베이스의 역할에서 상속될 수 있습니다.

새 역할을 생성하려면 db.createRole() 메서드를 사용해 privileges 배열에 권한을 지정하고 roles 배열에 상속된 역할을 지정합니다.

MongoDB는 데이터베이스 이름과 역할 이름을 결합해 역할을 고유하게 정의합니다. 각 역할의 범위는 역할을 생성한 데이터베이스로 지정되지만, MongoDB는 모든 역할 정보를 admin 데이터베이스의 admin.system.roles 컬렉션에 저장합니다.

데이터베이스에서 역할을 생성하려면 다음 항목이 있어야 합니다.

  • 해당 데이터베이스 리소스에 대한 createRole 작업

  • 해당 데이터베이스에 대한 grantRole 작업이 있으면 새 역할의 권한은 물론 상속의 출처가 될 역할까지 지정할 수 있습니다.

기본 제공 역할인 userAdminuserAdminAnyDatabase은(는) 각자의 리소스에 대해 createRole 작업 및 grantRole 작업을 제공합니다.

authenticationRestrictions이(가) 지정된 역할을 생성하려면 이 역할이 생성되는 데이터베이스 리소스에 대한 setAuthenticationRestriction 작업이 있어야 합니다.

mongosh을(를) 사용해 사용자 지정 역할을 추가하는 방법은 다음 예시를 참조하세요.

다음 예제는 manageOpRole이라는 이름의 역할을 생성하며, 이 역할은 db.currentOp()db.killOp()를 실행할 수 있는 권한만 제공합니다. [1]

참고

mongod 인스턴스에서 본인의 작업을 보거나 종료하기 위해 특정 권한이 필요하지 않습니다. 자세한 내용은 db.currentOp()db.killOp()를 참조하세요.

1

사전 요구 사항 섹션에 명시된 권한으로 mongod 또는 mongos에 연결합니다.

다음 절차에서는 자체 관리형 배포에서 액세스 제어 활성화에서 생성된 myUserAdmin을 사용합니다.

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

myUserAdmin에는 admin 및 기타 데이터베이스에서 역할을 생성할 수 있는 권한이 있습니다.

2

manageOpRole 클러스터 리소스를 비롯해 다양한 데이터베이스에 따른 조치를 취할 수 있는 권한이 있습니다. 따라서 admin 데이터베이스에서는 반드시 역할을 만들어야 합니다.

use admin
db.createRole(
{
role: "manageOpRole",
privileges: [
{ resource: { cluster: true }, actions: [ "killop", "inprog" ] },
{ resource: { db: "", collection: "" }, actions: [ "killCursors" ] }
],
roles: []
}
)

새 역할은 모든 작업을 종료할 수 있는 권한을 부여합니다.

경고

실행 중인 작업은 매우 주의해서 종료합니다. 클라이언트가 시작한 작업을 종료하려면 db.killOp() 메서드나 killOp 명령만 사용하고 내부 데이터베이스 작업은 종료하지 않아야 합니다.

[1] 기본 제공 역할 clusterMonitor은(는) 다른 권한과 함께 db.currentOp()을(를) 실행할 수 있는 권한도 제공하며, 기본 제공 역할 hostManager은(는) 다른 권한과 함께 db.killOp()을(를) 실행할 수 있는 권한을 제공합니다.

다음 예시에서는 mongostat을 실행하는 권한만 제공하는 mongostatRole이라는 역할을 만듭니다. [2]

1

사전 요구 사항 섹션에 명시된 권한으로 mongod 또는 mongos에 연결합니다.

다음 절차에서는 자체 관리형 배포에서 액세스 제어 활성화에서 생성된 myUserAdmin을 사용합니다.

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

myUserAdmin에는 admin 및 기타 데이터베이스에서 역할을 생성할 수 있는 권한이 있습니다.

2

mongostatRole클러스터 리소스에서 작동하는 권한을 가지고 있습니다. 따라서 admin 데이터베이스에서 해당 역할을 만들어야 합니다.

use admin
db.createRole(
{
role: "mongostatRole",
privileges: [
{ resource: { cluster: true }, actions: [ "serverStatus" ] }
],
roles: []
}
)
[2] 내장 역할 clusterMonitor는 다른 권한과 함께 mongostat를 실행하는 권한도 제공합니다.

다음 예시에서는 모든 데이터베이스에서 system.views 컬렉션을 삭제할 수 있는 권한을 제공하는 dropSystemViewsAnyDatabase라는 역할을 생성합니다.

1

사전 요구 사항 섹션에 명시된 권한으로 mongod 또는 mongos에 연결합니다.

다음 절차에서는 자체 관리형 배포에서 액세스 제어 활성화에서 생성된 myUserAdmin을 사용합니다.

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

myUserAdmin에는 admin 및 기타 데이터베이스에서 역할을 생성할 수 있는 권한이 있습니다.

2

역할에 대해 다음과 같이 구성된 권한을 지정합니다.

use admin
db.createRole(
{
role: "dropSystemViewsAnyDatabase",
privileges: [
{
actions: [ "dropCollection" ],
resource: { db: "", collection: "system.views" }
}
],
roles: []
}
)

참고

MongoDB Atlas에서 기존 데이터베이스 사용자의 역할을 수정하려면 MongoDB Atlas 문서의 데이터베이스 사용자 수정을 참조하세요.

  • 해당 데이터베이스에 역할을 부여하려면 데이터베이스에 grantRole 작업이 있어야 합니다.

  • 해당 데이터베이스에서 역할을 철회하려면 데이터베이스에 revokeRole 조치가 있어야 합니다.

  • 역할 정보를 확인하려면 해당 역할을 명시적으로 부여 받았거나 역할 데이터베이스에 viewRole 조치가 있어야 합니다.

1

mongod 또는 mongos을(를) 전제 조건 섹션에 지정된 권한을 가진 사용자로 연결합니다.

다음 절차에서는 자체 관리형 배포에서 액세스 제어 활성화에서 생성된 myUserAdmin을 사용합니다.

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2

수정할 사용자의 역할과 권한을 표시하려면 db.getUser()db.getRole() 메서드를 사용합니다.

예를 들어, 추가 예시에서 생성된 reportsUser에 대한 역할을 보려면 다음을 실행하세요.

use reporting
db.getUser("reportsUser")

"accounts" 데이터베이스에서 readWrite 역할을 통해 사용자에게 부여된 권한을 표시하려면 다음을 실행합니다.

use accounts
db.getRole( "readWrite", { showPrivileges: true } )
3

사용자에게 추가적인 권한이 필요한 경우, 사용자에게 필요한 권한이 있는 역할을 부여합니다. 이러한 역할이 존재하지 않을 경우 적절한 권한을 가진 새 역할을 만듭니다.

기존 역할에 의해 제공된 권한의 하위 집합을 철회하려면 원래 역할을 철회하고 필요한 권한만 가진 새로운 역할을 부여해야 합니다. 역할이 존재하지 않을 경우 새 역할을 생성해야 할 수 있습니다.

4

db.revokeRolesFromUser() 메서드를 사용하여 역할을 취소합니다. 다음 예시 작업은 reportsUser에서 accounts 데이터베이스의 readWrite 역할을 제거합니다.

use reporting
db.revokeRolesFromUser(
"reportsUser",
[
{ role: "readWrite", db: "accounts" }
]
)

db.grantRolesToUser() 메서드를 사용해 역할을 부여합니다. 예를 들어, 다음 작업은 reportsUser 사용자에게 accounts 데이터베이스에서 read 역할을 부여합니다.

use reporting
db.grantRolesToUser(
"reportsUser",
[
{ role: "read", db: "accounts" }
]
)

샤딩된 클러스터의 경우, 명령이 실행되는 mongos에서 사용자에 관한 변경 사항이 즉시 적용됩니다. 하지만 클러스터 내 다른 mongos 인스턴스의 경우에는 사용자 캐시가 업데이트될 때까지 최대 10분이 걸릴 수 있습니다. 자세한 내용은 userCacheInvalidationIntervalSecs을(를) 참조하세요.

참고

기존 MongoDB Atlas 사용자의 비밀번호를 수정하려면 MongoDB Atlas 문서에서 데이터베이스 사용자 수정을 참조하세요.

데이터베이스에서 다른 사용자의 비밀번호를 수정하려면 해당 데이터베이스에 changePassword 조치가 있어야 합니다.

1

전제 조건 섹션에 지정된 권한을 사용해 mongod 또는 mongos에 연결합니다.

다음 절차에서는 자체 관리형 배포에서 액세스 제어 활성화에서 생성된 myUserAdmin을 사용합니다.

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2

사용자 이름과 새 비밀번호를 db.changeUserPassword() 메서드에 전달합니다.

다음 작업에서는 reporting 사용자의 비밀번호를 SOh3TbYhxuLiW8ypJPxmt1oOfL로 변경합니다.

db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")

다음도 참조하세요.

참고

MongoDB Atlas에서 사용자의 역할을 보려면 MongoDB Atlas 문서에서 데이터베이스 사용자 및 인증서 보기를 참조하세요.

다른 사용자의 정보를 확인하려면 다른 사용자의 데이터베이스에 viewUser 조치가 있어야 합니다.

사용자는 자신의 정보를 확인할 수 있습니다.

1

mongod 또는 mongos을(를) 전제 조건 섹션에 지정된 권한을 가진 사용자로 연결합니다.

다음 절차에서는 자체 관리형 배포에서 액세스 제어 활성화에서 생성된 myUserAdmin을 사용합니다.

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2

usersInfo 명령 또는 db.getUser() 메서드를 사용해 사용자 정보를 표시합니다.

예를 들어, 추가 예시에서 생성된 reportsUser에 대한 역할을 보려면 다음을 실행하세요.

use reporting
db.getUser("reportsUser")

반환된 문서의 roles 필드에 reportsUser에 대한 모든 역할이 표시됩니다.

...
"roles" : [
{ "role" : "readWrite", "db" : "accounts" },
{ "role" : "read", "db" : "reporting" },
{ "role" : "read", "db" : "products" },
{ "role" : "read", "db" : "sales" }
]

참고

MongoDB Atlas에서 역할의 권한을 보려면 MongoDB Atlas 문서의 사용자 정의 역할 보기를 참조하세요.

역할 정보를 확인하려면 해당 역할을 명시적으로 부여 받았거나 역할 데이터베이스에 viewRole 조치가 있어야 합니다.

1

mongod 또는 mongos을(를) 전제 조건 섹션에 지정된 권한을 가진 사용자로 연결합니다.

다음 절차에서는 자체 관리형 배포에서 액세스 제어 활성화에서 생성된 myUserAdmin을 사용합니다.

mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2

지정된 역할에 대해 db.getRole() 메서드 또는 showPrivileges 옵션과 함께 rolesInfo 명령을 사용합니다.

예를 들어, products 데이터베이스에서 read 역할에 의해 부여된 권한을 보려면 다음과 같은 작업을 사용할 수 있습니다.

use products
db.getRole( "read", { showPrivileges: true } )

반환된 문서에서는 privilegesinheritedPrivileges 배열입니다. privileges의 경우 역할에 의해 직접적으로 지정된 권한만 표시되며 다른 역할로부터 상속받은 권한은 제외됩니다. inheritedPrivileges의 경우 이 역할에 의해 부여된 모든 권한(직접적으로 지정되거나 상속된 권한 모두)이 표시됩니다. 다른 역할에서 상속되지 않은 역할의 경우 두 필드는 동일합니다.

...
"privileges" : [
{
"resource": { "db" : "products", "collection" : "" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
},
{
"resource" : { "db" : "products", "collection" : "system.js" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
}
],
"inheritedPrivileges" : [
{
"resource": { "db" : "products", "collection" : "" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
},
{
"resource" : { "db" : "products", "collection" : "system.js" },
"actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
}
]

돌아가기

사용자 정의 역할