역할 기반 액세스 제어를 사용한 데이터베이스 액세스
Amazon DocumentDB (MongoDB 호환)의 역할 기반 액세스 제어 (RBAC)를 사용하여 데이터베이스에서 사용자가 수행할 수 있는 작업에 대한 액세스를 제한할 수 있습니다. RBAC는 사용자에게 하나 이상의 역할을 부여하여 작동합니다. 이러한 역할은 사용자가 데이터베이스 리소스에서 수행할 수 있는 작업을 결정합니다. Amazon DocumentDB는 현재, read
, readWrite
, readAnyDatabase
, clusterAdmin
등 데이터베이스 수준에서 범위가 지정된 기본 제공 역할과, 요구 사항에 따라 특정 작업으로 범위를 지정할 수 있는 사용자 정의 역할과 컬렉션과 같은 세분화된 리소스를 모두 지원합니다.
RBAC의 일반적인 사용 사례에는 클러스터의 데이터베이스에 대한 읽기 전용 액세스 권한을 가진 사용자를 생성하여 최소 권한을 적용하는 것과 단일 사용자가 클러스터의 지정된 데이터베이스에 액세스할 수 있도록 하는 다중 테넌트 애플리케이션 디자인이 포함됩니다.
참고
2020년 3월 26일 이전에 생성된 모든 새 사용자에게는 dbAdminAnyDatabase
, readWriteAnyDatabase
및 clusterAdmin
역할이 부여되었습니다. 기존 사용자를 모두 재평가하고 필요에 따라 역할을 수정하여 클러스터에 대한 최소 권한을 적용하는 것이 좋습니다.
주제
RBAC 개념
다음은 역할 기반 액세스 제어와 관련된 중요한 용어와 개념입니다. Amazon DocumentDB 사용자에 관한 자세한 내용은 Amazon DocumentDB 사용자 관리 단원을 참조하세요.
-
사용자 - 데이터베이스에 대해 인증하고 작업을 수행할 수 있는 개별 엔터티입니다.
-
암호 - 사용자를 인증하는 데 사용되는 암호입니다.
-
역할 - 사용자에게 하나 이상의 데이터베이스에서 작업을 수행할 수 있는 권한을 부여합니다.
-
관리 데이터베이스 - 사용자가 저장되고 권한이 부여되는 데이터베이스입니다.
-
데이터베이스(
db
) - 문서를 저장하기 위한 컬렉션을 포함하는 클러스터 내의 네임스페이스입니다.
다음 명령은 sample-user
라는 사용자를 생성합니다.
db.createUser({user: "sample-user", pwd: "abc123", roles: [{role: "read", db: "sample-database"}]})
이 예제에서는 다음이 적용됩니다.
-
user: "sample-user"
- 사용자 이름을 나타냅니다. -
pwd: "abc123"
- 사용자 암호를 나타냅니다. -
role: "read", "db: "sample-database"
-sample-user
사용자에게sample-database
에서 읽기 권한이 있음을 나타냅니다.
다음 예제에서는 db.getUser(sample-user)
를 사용하여 sample-user
사용자를 가져온 후 출력을 보여 줍니다. 이 예제에서 sample-user
사용자는 admin
데이터베이스에 상주하지만 sample-database
데이터베이스에 대한 읽기 역할이 있습니다.
사용자를 만들 때 역할 지정 시 db
필드를 생략하면 Amazon DocumentDB에서 연결이 실행되는 데이터베이스에 역할의 속성을 암시적으로 지정합니다. 예를 들어, sample-database
데이터베이스에 대해 연결이 실행되고 다음 명령을 실행하면 sample-user
사용자가 admin
데이터베이스에 생성되고 sample-database
데이터베이스에 대한 readWrite
권한이 부여됩니다.
db.createUser({user: "sample-user", pwd: "abc123", roles: ["readWrite"]})
이 작업의 출력은 다음과 같이 표시됩니다.
{
"user":"sample-user",
"roles":[
{
"db":"sample-database",
"role":"readWrite"
}
]
}
모든 데이터베이스에서 범위가 지정된 역할(예: readAnyDatabase
)을 가진 사용자를 생성하려면 사용자를 생성할 때 admin
데이터베이스 컨텍스트에 있거나 사용자를 생성할 때 역할에 대한 데이터베이스를 명백하게 명시해야 합니다. admin
데이터베이스에 대해 명령을 실행하려면 use admin
명령을 사용할 수 있습니다. 자세한 내용은 공통 명령 단원을 참조하십시오.
RBAC 내장된 역할 시작하기
역할 기반 액세스 제어를 시작하는 데 도움이 되도록 이 단원에서는 서로 다른 작업 기능을 가진 세 명의 사용자에 대한 역할을 생성하여 최소 권한을 적용하는 예제 시나리오를 설명합니다.
-
user1
은 클러스터의 모든 데이터베이스를 보고 액세스할 수 있어야 하는 새로운 관리자입니다. -
user2
는 동일한 클러스터에서 하나의 데이터베이스sample-database-1
에만 액세스해야 하는 신입 직원입니다. -
user3
은 동일한 클러스터에서 이전에 액세스할 수 없었던 다른 데이터베이스sample-database-2
를 보고 액세스해야 하는 기존 직원입니다.
나중에 user1
과 user2
모두 회사를 떠나서 그들의 액세스를 취소해야 합니다.
사용자를 생성하고 역할을 부여하려면 클러스터에 인증하는 사용자에게 createUser
및 grantRole
에 대한 작업을 수행할 수 있는 연결된 역할이 있어야 합니다. 예를 들어 admin
및 userAdminAnyDatabase
역할은 모두 이러한 능력을 부여할 수 있습니다. 각 역할의 작업에 대한 자세한 내용은 역할 기반 액세스 제어를 사용한 데이터베이스 액세스 단원을 참조하십시오.
참고
Amazon DocumentDB에서 모든 사용자 및 역할 작업(예: create
, get
, drop
, grant
, revoke
, admin
등)은 admin
데이터베이스에 대해 명령을 실행하는지 여부에 관계없이 데이터베이스에서 암시적으로 수행됩니다.
먼저 클러스터에 현재 사용자 및 역할이 무엇인지 이해하려면 다음 예제와 같이 show users
명령을 실행할 수 있습니다. 두 명의 사용자, 즉 serviceadmin
과 클러스터의 기본 사용자가 표시됩니다. 이 두 사용자는 항상 존재하며 삭제할 수 없습니다. 자세한 내용은 Amazon DocumentDB 사용자 관리 단원을 참조하십시오.
show users
user1
의 경우 다음 명령을 사용하여 전체 클러스터의 모든 데이터베이스에 대해 읽기 및 쓰기 액세스 권한이 있는 역할을 만듭니다.
db.createUser({user: "user1", pwd: "abc123", roles: [{role: "readWriteAnyDatabase", db: "admin"}]})
이 작업의 출력은 다음과 같이 표시됩니다.
{
"user":"user1",
"roles":[
{
"role":"readWriteAnyDatabase",
"db":"admin"
}
]
}
user2
의 경우 다음 명령을 사용하여 데이터베이스 sample-database-1
에 대한 읽기 전용 액세스 권한이 있는 역할을 만듭니다.
db.createUser({user: "user2", pwd: "abc123", roles: [{role: "read", db: "sample-database-1"}]})
이 작업의 출력은 다음과 같이 표시됩니다.
{
"user":"user2",
"roles":[
{
"role":"read",
"db":"sample-database-1"
}
]
}
user3
이 기존 사용자인 시나리오를 시뮬레이션하려면 먼저 사용자 user3
를 만든 다음 user3
에 새 역할을 할당합니다.
db.createUser({user: "user3", pwd: "abc123", roles: [{role: "readWrite", db: "sample-database-1"}]})
이 작업의 출력은 다음과 같이 표시됩니다.
{ "user":"user3", "roles":[ { "role":"readWrite", "db":"sample-database-1" } ] }
이제 사용자 user3
이 생성되었으므로 user3
에 read
, sample-database-2
역할을 할당합니다.
db.grantRolesToUser("user3", [{role: "read", db: "sample-database-2"}])
마지막으로, user1
과 user2
모두 회사를 떠나고 클러스터에 대한 그들의 액세스가 취소되어야 합니다. 다음과 같이 사용자를 삭제하여 이 작업을 수행할 수 있습니다.
db.dropUser("user1") db.dropUser("user2")
모든 사용자에게 적절한 역할이 있는지 확인하려면 다음 명령을 사용하여 모든 사용자를 나열할 수 있습니다.
show users
이 작업의 출력은 다음과 같이 표시됩니다.
{
"_id":"serviceadmin",
"user":"serviceadmin",
"db":"admin",
"roles":[
{
"db":"admin",
"role":"root"
}
]
}
{
"_id":"master-user",
"user":"master-user",
"db":"admin",
"roles":[
{
"db":"admin",
"role":"root"
}
]
}
{
"_id":"user3",
"user":"user3",
"db":"admin",
"roles":[
{
"db":"sample-database-2",
"role":"read"
},
{
"db":"sample-database-1",
"role":"readWrite"
}
]
}
RBAC 사용자 정의 역할 시작하기
사용자 정의 역할을 시작하는 데 도움이 되도록 이 단원에서는 서로 다른 작업 기능을 가진 세 명의 사용자에 대한 역할을 생성하여 최소 권한을 적용하는 예제 시나리오를 설명합니다.
이 예에서 이하의 내용이 모두 적용됩니다.
-
user1
은 클러스터의 모든 데이터베이스를 보고 액세스할 수 있어야 하는 새로운 관리자입니다. -
user2
은 동일한 클러스터에서 하나의 데이터베이스sample-database-1
에만 ‘찾기’ 작업이 필요한 신입 직원입니다. -
user3
은 동일한 클러스터에서 이전에 액세스할 수 없었던 다른 데이터베이스sample-database-2
내의 특정 컬렉션, col2를 보고 액세스해야 하는 기존 직원입니다. -
user1
의 경우 다음 명령을 사용하여 전체 클러스터의 모든 데이터베이스에 대해 읽기 및 쓰기 액세스 권한이 있는 역할을 만듭니다.
db.createUser( { user: "user1", pwd: "abc123", roles: [{role: "readWriteAnyDatabase", db: "admin"}] } )
이 작업의 출력은 다음과 같이 표시됩니다.
{ "user":"user1", "roles":[ { "role":"readWriteAnyDatabase", "db":"admin" } ] }
user2
의 경우, 다음 명령을 사용하여 데이터베이스 sample-database-1
의 모든 컬렉션에 대해 '찾기' 권한이 있는 역할을 생성합니다. 이 역할을 사용하면 연결된 모든 사용자가 찾기 쿼리만 실행할 수 있다는 점에 유의하세요.
db.createRole( { role: "findRole", privileges: [ { resource: {db: "sample-database-1", collection: ""}, actions: ["find"] }], roles: [] } )
이 작업의 출력은 다음과 같이 표시됩니다.
{ "role":"findRole", "privileges":[ { "resource":{ "db":"sample-database-1", "collection":"" }, "actions":[ "find" ] } ], "roles":[ ] }
그런 다음 사용자(user2
)를 만들고 최근에 만든 역할을 findRole
사용자에게 연결합니다.
db.createUser( { user: "user2", pwd: "abc123", roles: [] }) db.grantRolesToUser("user2",["findRole"])
user3
이 기존 사용자인 시나리오를 시뮬레이션하려면 먼저 사용자 user3
를 만든 후, 다음 단계에서 user3
에 새 역할을 할당할 collectionRole이라는 새 역할을 생성합니다.
이제 새 역할을 user3
에 할당할 수 있습니다. 이 새 역할을 통해 user3
이 sample-database-2
내의 하나의 특정 컬렉션 col2에 액세스를 삽입, 업데이트, 삭제하고 액세스 권한을 찾을 수 있습니다.
db.createUser( { user: "user3", pwd: "abc123", roles: [] }) db.createRole( { role: "collectionRole", privileges: [ { resource: {db: "sample-database-2", collection: "col2"}, actions: ["find", "update", "insert", "remove"] }], roles: [] } )
이 작업의 출력은 다음과 같이 표시됩니다.
{ "role":"collectionRole", "privileges":[ { "resource":{ "db":"sample-database-2", "collection":"col2" }, "actions":[ "find", "update", "insert", "remove" ] } ], "roles":[ ] }
이제 사용자 user3
이 생성되었으므로 user3
에 역할 collectionFind
을 부여합니다.
db.grantRolesToUser("user3",["collectionRole"])
마지막으로, user1
과 user2
모두 회사를 떠나고 클러스터에 대한 그들의 액세스가 취소되어야 합니다. 다음과 같이 사용자를 삭제하여 이 작업을 수행할 수 있습니다.
db.dropUser("user1") db.dropUser("user2")
모든 사용자에게 적절한 역할이 있는지 확인하려면 다음 명령을 사용하여 모든 사용자를 나열할 수 있습니다.
show users
이 작업의 출력은 다음과 같이 표시됩니다.
{ "_id":"serviceadmin", "user":"serviceadmin", "db":"admin", "roles":[ { "db":"admin", "role":"root" } ] } { "_id":"master-user", "user":"master-user", "db":"admin", "roles":[ { "db":"admin", "role":"root" } ] } { "_id":"user3", "user":"user3", "db":"admin", "roles":[ { "db":"admin", "role":"collectionRole" } ] }
Amazon DocumentDB에 사용자로 연결
Amazon DocumentDB 클러스터에 연결할 때 특정 데이터베이스의 컨텍스트에서 연결합니다. 기본적으로 연결 문자열에 데이터베이스를 지정하지 않으면 test
데이터베이스의 컨텍스트에서 클러스터에 자동으로 연결됩니다. test
데이터베이스의 컬렉션에 대해 insert
및 find
같은 모든 컬렉션 레벨 명령이 발행됩니다.
컨텍스트에 있는 또는, 달리 말해, 명령이 발행되는 데이터베이스를 보려면 다음과 같이 mongo 쉘에서 db
명령을 사용하십시오.
쿼리:
db
출력:
test
기본 연결이 test
데이터베이스 컨텍스트에 있을 수 있지만 해당 연결과 연결된 사용자가 test
데이터베이스에서 작업을 수행할 수 있는 권한이 있는 것은 아닙니다. 앞의 예제 시나리오에서 sample-database-1
데이터베이스에 대한 readWrite
역할이 있는 사용자 user3
으로 인증하는 경우 연결의 기본 컨텍스트는 test
데이터베이스입니다. 그러나 test
데이터베이스의 컬렉션에 문서를 삽입하려고 하면 권한 부여 실패 오류 메시지가 나타납니다. 아래와 같이 해당 사용자가 해당 데이터베이스에서 해당 명령을 수행할 권한이 없기 때문입니다.
쿼리:
db
출력:
test
쿼리:
db.col.insert({x:1})
출력:
WriteCommandError({ "ok" : 0, "code" : 13, "errmsg" : "Authorization failure" })
sample-database-1
데이터베이스에 대한 연결 컨텍스트를 변경하면 사용자가 그렇게 할 수 있는 권한을 가진 컬렉션에 쓸 수 있습니다.
쿼리:
use sample-database-1
출력:
switched to db sample-database-1
쿼리:
db.col.insert({x:1})
출력:
WriteResult({ "nInserted" : 1})
특정 사용자를 사용하여 클러스터에 인증하는 경우 연결 문자열에서 데이터베이스를 지정할 수도 있습니다. 이렇게 하면 사용자가 admin
데이터베이스에 인증된 후 use
명령을 수행할 필요가 없습니다.
다음 연결 문자열은 admin
데이터베이스에 대해 사용자를 인증하지만 연결 컨텍스트는 sample-database-1
데이터베이스에 대한 것입니다.
mongo "mongodb://user3:abc123@sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/sample-database-2"
공통 명령
이 단원에서는 Amazon DocumentDB에서 역할 기반 액세스 제어를 사용하는 공통 명령의 예를 제공합니다. 사용자 및 역할을 만들고 수정하려면 admin
데이터베이스의 컨텍스트에 있어야 합니다. use admin
명령을 사용하여 admin
데이터베이스로 전환할 수 있습니다.
참고
사용자 및 역할에 대한 수정은 admin
데이터베이스에서 암시적으로 발생합니다. 모든 데이터베이스에서 범위가 지정된 역할(예: readAnyDatabase
)을 가진 사용자를 생성하려면 사용자를 생성할 때 admin
데이터베이스(즉 use
admin
) 컨텍스트에 있거나 사용자를 생성할 때 역할에 대한 데이터베이스를 명백하게 명시해야 합니다(이 단원의 예제 2 참조).
예제 1: 데이터베이스foo
에 대한 read
역할을 가진 사용자를 만듭니다.
db.createUser({user: "readInFooBar", pwd: "abc123", roles: [{role: "read", db: "foo"}]})
이 작업의 출력은 다음과 같이 표시됩니다.
{
"user":"readInFooBar",
"roles":[
{
"role":"read",
"db":"foo"
}
]
}
예제 2: 모든 데이터베이스에서 읽기 권한이 있는 사용자를 만듭니다.
db.createUser({user: "readAllDBs", pwd: "abc123", roles: [{role: "readAnyDatabase", db: "admin"}]})
이 작업의 출력은 다음과 같이 표시됩니다.
{
"user":"readAllDBs",
"roles":[
{
"role":"readAnyDatabase",
"db":"admin"
}
]
}
예제 3: 새 데이터베이스의 기존 사용자에게 read
역할을 부여합니다.
db.grantRolesToUser("readInFooBar", [{role: "read", db: "bar"}])
예제 4: 사용자의 역할을 업데이트합니다.
db.updateUser("readInFooBar", {roles: [{role: "read", db: "foo"}, {role: "read", db: "baz"}]})
예제 5: 사용자의 데이터베이스에 대한 액세스 권한을 취소합니다.
db.revokeRolesFromUser("readInFooBar", [{role: "read", db: "baz"}])
예제 6: 기본 제공 역할을 설명합니다.
db.getRole("read", {showPrivileges:true})
이 작업의 출력은 다음과 같이 표시됩니다.
{
"role":"read",
"db":"sample-database-1",
"isBuiltin":true,
"roles":[
],
"inheritedRoles":[
],
"privileges":[
{
"resource":{
"db":"sample-database-1",
"collection":""
},
"actions":[
"changeStream",
"collStats",
"dbStats",
"find",
"killCursors",
"listCollections",
"listIndexes"
]
}
],
"inheritedPrivileges":[
{
"resource":{
"db":"sample-database-1",
"collection":""
},
"actions":[
"changeStream",
"collStats",
"dbStats",
"find",
"killCursors",
"listCollections",
"listIndexes"
]
}
}
예제 7: 클러스터에서 사용자를 삭제합니다.
db.dropUser("readInFooBar")
이 작업의 출력은 다음과 같이 표시됩니다.
true
예제 8: 특정 컬렉션에 대한 읽기 및 쓰기 권한이 있는 역할 생성합니다.
db.createRole( { role: "collectionRole", privileges: [ { resource: {db: "sample-database-2", collection: "col2"}, actions: ["find", "update", "insert", "remove"] }], roles: [] } )
이 작업의 출력은 다음과 같이 표시됩니다.
{ "role":"collectionRole", "privileges":[ { "resource":{ "db":"sample-database-2", "collection":"col2" }, "actions":[ "find", "update", "insert", "remove" ] } ], "roles":[ ] }
예제 9: 사용자를 생성하고 사용자 정의 역할을 할당합니다.
db.createUser( { user: "user3", pwd: "abc123", roles: [] }) db.grantRolesToUser("user3",["collectionRole"])
예제 10: 사용자 정의 역할에 추가 권한을 부여합니다.
db.grantPrivilegesToRole( "collectionRole", [ { resource: { db: "sample-database-1", collection: "col1" }, actions: ["find", "update", "insert", "remove"] } ] )
예제 11: 사용자 정의 역할에서 권한을 제거합니다.
db.revokePrivilegesFromRole( "collectionRole", [ { resource: { db: "sample-database-1", collection: "col2" }, actions: ["find", "update", "insert", "remove"] } ] )
예제 12: 기존 사용자 정의 역할을 업데이트합니다.
db.updateRole( "collectionRole", { privileges: [ { resource: {db: "sample-database-3", collection: "sample-collection-3"}, actions: ["find", "update", "insert", "remove"] }], roles: [] } )
기능적 차이
Amazon DocumentDB에서, 사용자 및 역할 정의는 admin
데이터베이스에 저장되고 사용자는 admin
데이터베이스에 대해 인증됩니다. 이 기능은 MongoDB Community Edition과 다르지만 MongoDB Atlas와 일치합니다.
Amazon DocumentDB는 또한 클러스터의 컬렉션 내에서 발생하는 변경 이벤트 시퀀스를 시간 순서대로 제공하는 변경 스트림을 지원합니다. listChangeStreams
작업은 클러스터 수준에서(즉, 모든 데이터베이스에 걸쳐) 적용되고 modifyChangeStreams
작업은 데이터베이스 수준 및 클러스터 수준에서 적용됩니다.
Limits
다음 표에는 Amazon DocumentDB의 역할 기반 액세스 제어에 대한 제한이 포함되어 있습니다.
설명 | Limit |
---|---|
클러스터당 사용자 수 | 1000 |
사용자와 연결된 역할 수 | 1000 |
사용자 정의 역할 수 | 100 |
권한과 관련된 리소스 수 | 100 |
역할 기반 액세스 제어를 사용한 데이터베이스 액세스
역할 기반 액세스 제어를 사용하면 사용자를 생성하고 사용자에게 하나 이상의 역할을 부여하여 사용자가 데이터베이스 또는 클러스터에서 수행할 수 있는 작업을 결정할 수 있습니다.
다음은 Amazon DocumentDB에서 현재 지원되는 기본 제공 역할 목록입니다.
참고
Amazon DocumentDB 4.0 및 5.0에서는, ListCollection
및 ListDatabase
명령을 사용하면 선택적으로 authorizedCollections
및 authorizedDatabases
매개변수를 사용하여 사용자가 각각 listCollections
및 listDatabase
역할을 요구하지 않고도 액세스 권한이 있는 컬렉션과 데이터베이스를 나열할 수 있습니다. 또한, 이제 사용자는 KillCursor
역할이 없이도 자신의 커서를 죽일 수도 있습니다.