자체 관리 배포에서 사용자 및 역할 관리
이 튜토리얼에서는 자체 관리형 배포를 위한 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
작업이 있으면 새 역할의 권한은 물론 상속의 출처가 될 역할까지 지정할 수 있습니다.
기본 제공 역할인 userAdmin
및 userAdminAnyDatabase
은(는) 각자의 리소스에 대해 createRole
작업 및 grantRole
작업을 제공합니다.
authenticationRestrictions
이(가) 지정된 역할을 생성하려면 이 역할이 생성되는 데이터베이스 리소스에 대한 setAuthenticationRestriction
작업이 있어야 합니다.
mongosh
을(를) 사용해 사용자 지정 역할을 추가하는 방법은 다음 예시를 참조하세요.
현재 작업을 관리할 역할 만들기
다음 예제는 manageOpRole
이라는 이름의 역할을 생성하며, 이 역할은 db.currentOp()
와 db.killOp()
를 실행할 수 있는 권한만 제공합니다. [1]
참고
mongod
인스턴스에서 본인의 작업을 보거나 종료하기 위해 특정 권한이 필요하지 않습니다. 자세한 내용은 db.currentOp()
및 db.killOp()
를 참조하세요.
적절한 권한으로 MongoDB에 연결합니다.
사전 요구 사항 섹션에 명시된 권한으로 mongod
또는 mongos
에 연결합니다.
다음 절차에서는 자체 관리형 배포에서 액세스 제어 활성화에서 생성된 myUserAdmin
을 사용합니다.
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
myUserAdmin
에는 admin
및 기타 데이터베이스에서 역할을 생성할 수 있는 권한이 있습니다.
현재 작업을 관리할 새 역할 생성
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
다음 예시에서는 mongostat
을 실행하는 권한만 제공하는 mongostatRole
이라는 역할을 만듭니다. [2]
적절한 권한으로 MongoDB에 연결합니다.
사전 요구 사항 섹션에 명시된 권한으로 mongod
또는 mongos
에 연결합니다.
다음 절차에서는 자체 관리형 배포에서 액세스 제어 활성화에서 생성된 myUserAdmin
을 사용합니다.
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
myUserAdmin
에는 admin
및 기타 데이터베이스에서 역할을 생성할 수 있는 권한이 있습니다.
현재 작업을 관리할 새 역할 생성
mongostatRole
은 클러스터 리소스에서 작동하는 권한을 가지고 있습니다. 따라서 admin
데이터베이스에서 해당 역할을 만들어야 합니다.
use admin db.createRole( { role: "mongostatRole", privileges: [ { resource: { cluster: true }, actions: [ "serverStatus" ] } ], roles: [] } )
[2] | 내장 역할 clusterMonitor 는 다른 권한과 함께 mongostat 를 실행하는 권한도 제공합니다. |
데이터베이스 전체에서 컬렉션을 제거하는 system.views
역할 생성
다음 예시에서는 모든 데이터베이스에서 system.views
컬렉션을 삭제할 수 있는 권한을 제공하는 dropSystemViewsAnyDatabase
라는 역할을 생성합니다.
적절한 권한으로 MongoDB에 연결합니다.
사전 요구 사항 섹션에 명시된 권한으로 mongod
또는 mongos
에 연결합니다.
다음 절차에서는 자체 관리형 배포에서 액세스 제어 활성화에서 생성된 myUserAdmin
을 사용합니다.
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
myUserAdmin
에는 admin
및 기타 데이터베이스에서 역할을 생성할 수 있는 권한이 있습니다.
모든 데이터베이스에서 컬렉션을 제거하는 새 system.views
역할을 만듭니다.
역할에 대해 다음과 같이 구성된 권한을 지정합니다.
dropCollection
작업을 포함하는actions
배열데이터베이스에는 빈 문자열(
""
), 컬렉션에는 문자열"system.views"
을(를) 지정하는 리소스 문서. 자세한 내용은 데이터베이스 전반의 컬렉션을 리소스로 지정을 참조하세요.
use admin db.createRole( { role: "dropSystemViewsAnyDatabase", privileges: [ { actions: [ "dropCollection" ], resource: { db: "", collection: "system.views" } } ], roles: [] } )
기존 사용자의 액세스 권한 수정
참고
MongoDB Atlas에서 기존 데이터베이스 사용자의 역할을 수정하려면 MongoDB Atlas 문서의 데이터베이스 사용자 수정을 참조하세요.
전제 조건
절차
적절한 권한으로 MongoDB에 연결합니다.
mongod
또는 mongos
을(를) 전제 조건 섹션에 지정된 권한을 가진 사용자로 연결합니다.
다음 절차에서는 자체 관리형 배포에서 액세스 제어 활성화에서 생성된 myUserAdmin
을 사용합니다.
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
사용자의 역할과 권한을 식별합니다.
수정할 사용자의 역할과 권한을 표시하려면 db.getUser()
및 db.getRole()
메서드를 사용합니다.
예를 들어, 추가 예시에서 생성된 reportsUser
에 대한 역할을 보려면 다음을 실행하세요.
use reporting db.getUser("reportsUser")
"accounts"
데이터베이스에서 readWrite
역할을 통해 사용자에게 부여된 권한을 표시하려면 다음을 실행합니다.
use accounts db.getRole( "readWrite", { showPrivileges: true } )
부여하거나 취소할 권한을 식별합니다.
사용자에게 추가적인 권한이 필요한 경우, 사용자에게 필요한 권한이 있는 역할을 부여합니다. 이러한 역할이 존재하지 않을 경우 적절한 권한을 가진 새 역할을 만듭니다.
기존 역할에 의해 제공된 권한의 하위 집합을 철회하려면 원래 역할을 철회하고 필요한 권한만 가진 새로운 역할을 부여해야 합니다. 역할이 존재하지 않을 경우 새 역할을 생성해야 할 수 있습니다.
사용자의 액세스 권한을 수정합니다.
역할 취소
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
조치가 있어야 합니다.
절차
적절한 권한으로 MongoDB에 연결합니다.
전제 조건 섹션에 지정된 권한을 사용해 mongod
또는 mongos
에 연결합니다.
다음 절차에서는 자체 관리형 배포에서 액세스 제어 활성화에서 생성된 myUserAdmin
을 사용합니다.
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
비밀번호를 변경합니다.
사용자 이름과 새 비밀번호를 db.changeUserPassword()
메서드에 전달합니다.
다음 작업에서는 reporting
사용자의 비밀번호를 SOh3TbYhxuLiW8ypJPxmt1oOfL
로 변경합니다.
db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")
사용자 역할 보기
참고
MongoDB Atlas에서 사용자의 역할을 보려면 MongoDB Atlas 문서에서 데이터베이스 사용자 및 인증서 보기를 참조하세요.
전제 조건
다른 사용자의 정보를 확인하려면 다른 사용자의 데이터베이스에 viewUser
조치가 있어야 합니다.
사용자는 자신의 정보를 확인할 수 있습니다.
절차
적절한 권한으로 MongoDB에 연결합니다.
mongod
또는 mongos
을(를) 전제 조건 섹션에 지정된 권한을 가진 사용자로 연결합니다.
다음 절차에서는 자체 관리형 배포에서 액세스 제어 활성화에서 생성된 myUserAdmin
을 사용합니다.
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
사용자의 역할을 식별합니다.
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
조치가 있어야 합니다.
절차
적절한 권한으로 MongoDB에 연결합니다.
mongod
또는 mongos
을(를) 전제 조건 섹션에 지정된 권한을 가진 사용자로 연결합니다.
다음 절차에서는 자체 관리형 배포에서 액세스 제어 활성화에서 생성된 myUserAdmin
을 사용합니다.
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
역할에서 부여한 권한을 식별합니다.
지정된 역할에 대해 db.getRole()
메서드 또는 showPrivileges
옵션과 함께 rolesInfo
명령을 사용합니다.
예를 들어, products
데이터베이스에서 read
역할에 의해 부여된 권한을 보려면 다음과 같은 작업을 사용할 수 있습니다.
use products db.getRole( "read", { showPrivileges: true } )
반환된 문서에서는 privileges
및 inheritedPrivileges
배열입니다. 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" ] } ]