Azure Cosmos DB for MongoDB에서 역할 기반 액세스 제어 구성

적용 대상: MongoDB

이 문서에서는 Azure Cosmos DB for MongoDB에서 데이터 평면 작업을 위한 역할 기반 액세스 제어에 대해 설명합니다.

관리 평면 작업을 사용하는 경우 해당 관리 평면 작업 문서에 적용되는 역할 기반 액세스 제어를 참조하세요.

Azure Cosmos DB for MongoDB는 세분화된 역할 기반 권한 모델을 사용하여 데이터 요청에 권한을 부여할 수 있는 기본 제공 RBAC(역할 기반 액세스 제어) 시스템을 노출합니다. 사용자 및 역할은 데이터베이스 내에 있으며 Azure CLI, Azure PowerShell 또는 ARM(Azure Resource Manager)을 사용하여 관리됩니다.

개념

리소스

리소스는 액세스 제어 규칙을 적용하는 컬렉션 또는 데이터베이스입니다.

권한

권한은 특정 리소스에서 수행할 수 있는 작업입니다. 예를 들어 "컬렉션 xyz에 대한 읽기 액세스"입니다. 권한은 특정 역할에 할당됩니다.

역할

역할에는 하나 이상의 권한이 있습니다. 역할은 해당 권한에 정의된 작업을 수행할 수 있도록 사용자(0명 이상)에게 할당됩니다. 역할은 단일 데이터베이스 내에 저장됩니다.

진단 로그 감사

호출 userId 된 또 다른 열이 Azure Portal의 진단 기능에서 테이블에 추가 MongoRequests 되었습니다. 이 열은 데이터 계획 작업을 수행한 사용자를 식별합니다. RBAC를 사용하지 않으면 이 열의 값이 비어 있습니다.

사용 가능한 권한

쿼리 및 쓰기

  • find
  • 삽입
  • remove
  • 업데이트

스트림 변경

  • changeStream

데이터베이스 관리

  • createCollection
  • createIndex
  • dropCollection
  • killCursors
  • killAnyCursor

서버 관리

  • dropDatabase
  • dropIndex
  • reIndex

진단

  • collStats
  • dbStats
  • listDatabases
  • listCollections
  • listIndexes

기본 제공 역할

이러한 역할은 이미 모든 데이터베이스에 존재하며 만들 필요가 없습니다.

read readWrite dbAdmin dbOwner
changeStream ✅ 예 ✅ 예 ✅ 예 ✅ 예
collStats ✅ 예 ✅ 예 ✅ 예 ✅ 예
listCollections ✅ 예 ✅ 예 ✅ 예 ✅ 예
listIndexes ✅ 예 ✅ 예 ✅ 예 ✅ 예
createCollection ✖️ 아니요 ✅ 예 ✅ 예 ✅ 예
createIndex ✖️ 아니요 ✅ 예 ✅ 예 ✅ 예
dropCollection ✖️ 아니요 ✅ 예 ✅ 예 ✅ 예
dbStats ✖️ 아니요 ✖️ 아니요 ✅ 예 ✅ 예
dropDatabase ✖️ 아니요 ✖️ 아니요 ✅ 예 ✅ 예
reIndex ✖️ 아니요 ✖️ 아니요 ✅ 예 ✅ 예
find ✅ 예 ✅ 예 ✖️ 아니요 ✅ 예
killCursors ✅ 예 ✅ 예 ✖️ 아니요 ✅ 예
dropIndex ✖️ 아니요 ✅ 예 ✅ 예 ✅ 예
insert ✖️ 아니요 ✅ 예 ✖️ 아니요 ✅ 예
remove ✖️ 아니요 ✅ 예 ✖️ 아니요 ✅ 예
update ✖️ 아니요 ✅ 예 ✖️ 아니요 ✅ 예

Azure CLI 설정(빠른 시작)

Windows 사용할 때는 cmd를 사용하는 것이 좋습니다.

  1. 최신 CLI 버전(확장 아님)이 로컬로 설치되어 있는지 확인합니다. az upgrade 명령을 사용합니다.
  2. 구독에 연결합니다.
az cloud set -n  AzureCloud
az login
az account set --subscription <your subscription ID>
  1. 기존 API for MongoDB 데이터베이스 계정에서 RBAC 기능을 사용하도록 설정합니다. 데이터베이스 계정에 "EnableMongoRoleBasedAccessControl" 기능을 추가해야 합니다. RBAC는 대신 Azure Portal의 기능 탭을 통해 사용하도록 설정할 수도 있습니다. 대신 새 데이터베이스 계정을 선호하는 경우 RBAC 기능이 true로 설정된 새 데이터베이스 계정을 만듭니다.
az cosmosdb create -n <account_name> -g <azure_resource_group> --kind MongoDB --capabilities EnableMongoRoleBasedAccessControl
  1. 사용자가 Azure Portal에서 연결할 데이터베이스를 만듭니다.
  2. 기본 제공 읽기 역할이 있는 RBAC 사용자를 만듭니다.
az cosmosdb mongodb user definition create --account-name <YOUR_DB_ACCOUNT> --resource-group <YOUR_RG> --body {\"Id\":\"<YOUR_DB_NAME>.<YOUR_USERNAME>\",\"UserName\":\"<YOUR_USERNAME>\",\"Password\":\"<YOUR_PASSWORD>\",\"DatabaseName\":\"<YOUR_DB_NAME>\",\"CustomData\":\"Some_Random_Info\",\"Mechanisms\":\"SCRAM-SHA-256\",\"Roles\":[{\"Role\":\"read\",\"Db\":\"<YOUR_DB_NAME>\"}]}

pymongo를 사용하여 인증

from pymongo import MongoClient
client = MongoClient("mongodb://<YOUR_HOSTNAME>:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000", username="<YOUR_USER>", password="<YOUR_PASSWORD>", authSource='<YOUR_DATABASE>', authMechanism='SCRAM-SHA-256', appName="<YOUR appName FROM CONNECTION STRING IN AZURE PORTAL>")

Node.js 드라이버를 사용하여 인증

connectionString = "mongodb://" + "<YOUR_USER>" + ":" + "<YOUR_PASSWORD>" + "@" + "<YOUR_HOSTNAME>" + ":10255/" + "<YOUR_DATABASE>" +"?ssl=true&retrywrites=false&replicaSet=globaldb&authmechanism=SCRAM-SHA-256&appname=@" + "<YOUR appName FROM CONNECTION STRING IN AZURE PORTAL>" + "@";
var client = await mongodb.MongoClient.connect(connectionString, { useNewUrlParser: true, useUnifiedTopology: true });

Java 드라이버를 사용하여 인증

connectionString = "mongodb://" + "<YOUR_USER>" + ":" + "<YOUR_PASSWORD>" + "@" + "<YOUR_HOSTNAME>" + ":10255/" + "<YOUR_DATABASE>" +"?ssl=true&retrywrites=false&replicaSet=globaldb&authmechanism=SCRAM-SHA-256&appname=@" + "<YOUR appName FROM CONNECTION STRING IN AZURE PORTAL>" + "@";
MongoClientURI uri = new MongoClientURI(connectionString);
MongoClient client = new MongoClient(uri);

Mongosh를 사용하여 인증

mongosh --authenticationDatabase <YOUR_DB> --authenticationMechanism SCRAM-SHA-256 "mongodb://<YOUR_USERNAME>:<YOUR_PASSWORD>@<YOUR_HOST>:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000"

MongoDB 나침반/Azure Data Studio를 사용하여 인증

connectionString = "mongodb://" + "<YOUR_USER>" + ":" + "<YOUR_PASSWORD>" + "@" + "<YOUR_HOSTNAME>" + ":10255/" + "?ssl=true&retrywrites=false&replicaSet=globaldb&authmechanism=SCRAM-SHA-256&appname=@" + "<YOUR appName FROM CONNECTION STRING IN AZURE PORTAL>" + "@"
+"&authSource=" +"<YOUR_DATABASE>";

Azure CLI RBAC 명령

RBAC 관리 명령은 최신 버전의 Azure CLI가 설치된 경우에만 작동합니다. 시작하는 방법은 위의 빠른 시작을 참조하세요.

역할 정의 만들기

az cosmosdb mongodb role definition create --account-name <account-name> --resource-group <resource-group-name> --body {\"Id\":\"test.My_Read_Only_Role101\",\"RoleName\":\"My_Read_Only_Role101\",\"Type\":\"CustomRole\",\"DatabaseName\":\"test\",\"Privileges\":[{\"Resource\":{\"Db\":\"test\",\"Collection\":\"test\"},\"Actions\":[\"insert\",\"find\"]}],\"Roles\":[]}

JSON 파일 본문을 전달하여 역할 만들기

az cosmosdb mongodb role definition create --account-name <account-name> --resource-group <resource-group-name> --body role.json
JSON 파일
{
	"Id": "test.My_Read_Only_Role101",
	"RoleName": "My_Read_Only_Role101",
	"Type": "CustomRole",
	"DatabaseName": "test",
	"Privileges": [{
		"Resource": {
			"Db": "test",
			"Collection": "test"
		},
		"Actions": ["insert", "find"]
	}],
	"Roles": []
}

역할 정의 업데이트

az cosmosdb mongodb role definition update --account-name <account-name> --resource-group <resource-group-name> --body {\"Id\":\"test.My_Read_Only_Role101\",\"RoleName\":\"My_Read_Only_Role101\",\"Type\":\"CustomRole\",\"DatabaseName\":\"test\",\"Privileges\":[{\"Resource\":{\"Db\":\"test\",\"Collection\":\"test\"},\"Actions\":[\"insert\",\"find\"]}],\"Roles\":[]}

JSON 파일 본문을 전달하여 역할 업데이트

az cosmosdb mongodb role definition update --account-name <account-name> --resource-group <resource-group-name> --body role.json
JSON 파일
{
	"Id": "test.My_Read_Only_Role101",
	"RoleName": "My_Read_Only_Role101",
	"Type": "CustomRole",
	"DatabaseName": "test",
	"Privileges": [{
		"Resource": {
			"Db": "test",
			"Collection": "test"
		},
		"Actions": ["insert", "find"]
	}],
	"Roles": []
}

역할 나열

az cosmosdb mongodb role definition list --account-name <account-name> --resource-group <resource-group-name>

역할이 있는지 확인

az cosmosdb mongodb role definition exists --account-name <account-name> --resource-group <resource-group-name> --id test.My_Read_Only_Role

역할 삭제

az cosmosdb mongodb role definition delete --account-name <account-name> --resource-group <resource-group-name> --id test.My_Read_Only_Role

사용자 정의 만들기

az cosmosdb mongodb user definition create --account-name <account-name> --resource-group <resource-group-name> --body {\"Id\":\"test.myName\",\"UserName\":\"myName\",\"Password\":\"pass\",\"DatabaseName\":\"test\",\"CustomData\":\"Some_Random_Info\",\"Mechanisms\":\"SCRAM-SHA-256\",\"Roles\":[{\"Role\":\"My_Read_Only_Role101\",\"Db\":\"test\"}]}

JSON 파일 본문을 전달하여 사용자 만들기

az cosmosdb mongodb user definition create --account-name <account-name> --resource-group <resource-group-name> --body user.json
JSON 파일
{
	"Id": "test.myName",
	"UserName": "myName",
	"Password": "pass",
	"DatabaseName": "test",
	"CustomData": "Some_Random_Info",
	"Mechanisms": "SCRAM-SHA-256",
	"Roles": [{
		"Role": "My_Read_Only_Role101",
		"Db": "test"
	}]
}

사용자 정의 업데이트

사용자 암호를 업데이트하려면 암호 필드에 새 암호를 보냅니다.

az cosmosdb mongodb user definition update --account-name <account-name> --resource-group <resource-group-name> --body {\"Id\":\"test.myName\",\"UserName\":\"myName\",\"Password\":\"pass\",\"DatabaseName\":\"test\",\"CustomData\":\"Some_Random_Info\",\"Mechanisms\":\"SCRAM-SHA-256\",\"Roles\":[{\"Role\":\"My_Read_Only_Role101\",\"Db\":\"test\"}]}

JSON 파일 본문을 전달하여 사용자 업데이트

az cosmosdb mongodb user definition update --account-name <account-name> --resource-group <resource-group-name> --body user.json
JSON 파일
{
	"Id": "test.myName",
	"UserName": "myName",
	"Password": "pass",
	"DatabaseName": "test",
	"CustomData": "Some_Random_Info",
	"Mechanisms": "SCRAM-SHA-256",
	"Roles": [{
		"Role": "My_Read_Only_Role101",
		"Db": "test"
	}]
}

사용자 나열

az cosmosdb mongodb user definition list --account-name <account-name> --resource-group <resource-group-name>

사용자가 있는지 확인

az cosmosdb mongodb user definition exists --account-name <account-name> --resource-group <resource-group-name> --id test.myName

사용자 삭제

az cosmosdb mongodb user definition delete --account-name <account-name> --resource-group <resource-group-name> --id test.myName

제한 사항

  • 만들 수 있는 사용자 및 역할의 수는 10,000개 이하여야 합니다.
  • listCollections, listDatabases, killCursors, currentOp 명령은 RBAC에서 제외됩니다.
  • 데이터베이스 간의 사용자 및 역할은 지원되지 않습니다.
  • 사용자 암호는 Azure CLI/Azure PowerShell을 통해서만 설정/다시 설정할 수 있습니다.
  • 사용자 및 역할 구성은 Azure CLI/PowerShell을 통해서만 지원됩니다.
  • 기본/보조 키 인증을 사용하지 않도록 설정하는 기능은 지원되지 않습니다. RBAC를 사용하도록 설정할 때 액세스를 방지하려면 키를 회전하는 것이 좋습니다.
  • Cosmos DB for Mongo DB RU에 대한 RBAC 정책은 복원 작업 후에 자동으로 복원되지 않습니다. 복원 프로세스가 완료된 후 이러한 정책을 다시 구성해야 합니다.

FAQ(질문과 대답)

Azure Portal에서 역할 정의 및 역할 할당을 관리할 수 있나요?

역할 관리에 대한 Azure Portal 지원은 사용할 수 없습니다. 그러나 RBAC는 Azure Portal의 기능 탭을 통해 사용하도록 설정할 수 있습니다.

사용자 암호를 변경하려면 어떻게 해야 하나요?

새 암호로 사용자 정의를 업데이트합니다.

RBAC(역할 기반 액세스 제어)를 지원하는 Cosmos DB for MongoDB 버전은 무엇인가요?

버전 3.6 이상은 RBAC를 지원합니다.

다음 단계