Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Datenbankzugriff mithilfe der rollenbasierten Zugriffskontrolle
Sie können den Zugriff auf die Aktionen einschränken, die Benutzer an Datenbanken ausführen können, indem Sie die rollenbasierte Zugriffskontrolle (RBAC) in Amazon DocumentDB (mit MongoDB-Kompatibilität) verwenden. RBACfunktioniert, indem einem Benutzer eine oder mehrere Rollen zugewiesen werden. Diese Rollen bestimmen die Operationen, die ein Benutzer mit Datenbankressourcen ausführen kann. Amazon DocumentDB unterstützt derzeit sowohl integrierte Rollen, die auf Datenbankebene beschränkt sind, wie z. B.,,,,,,,read
,,,readWrite
,readAnyDatabase
,clusterAdmin
, als auch benutzerdefinierte Rollen, die auf bestimmte Aktionen beschränkt werden können, und granulare Ressourcen wie Sammlungen, die auf Ihre Anforderungen zugeschnitten sind.
Zu den häufigsten Anwendungsfällen für RBAC gehören die Durchsetzung geringster Rechte durch die Erstellung von Benutzern mit schreibgeschütztem Zugriff auf die Datenbanken oder Sammlungen in einem Cluster sowie mandantenfähige Anwendungsdesigns, die es einem einzelnen Benutzer ermöglichen, auf eine bestimmte Datenbank oder Sammlung in einem Cluster zuzugreifen.
Anmerkung
Allen neuen Benutzern, die vor dem 26. März 2020 erstellt wurden, wurden die dbAdminAnyDatabase
-, readWriteAnyDatabase
- und clusterAdmin
-Rollen erteilt. Es wird empfohlen, alle vorhandenen Benutzer neu zu bewerten und die Rollen nach Bedarf zu ändern, um die geringstmöglichen Berechtigungen für Ihre Cluster zu erzwingen.
Themen
RBAC-Konzepte
Im Folgenden finden Sie wichtige Begriffe und Konzepte zur rollenbasierten Zugriffssteuerung. Weitere Informationen zu Amazon DocumentDB DocumentDB-Benutzern finden Sie unterAmazon DocumentDB DocumentDB-Benutzer verwalten.
-
Benutzer — Eine einzelne Entität, die sich bei der Datenbank authentifizieren und Operationen ausführen kann.
-
Passwort — Ein Geheimnis, das zur Authentifizierung des Benutzers verwendet wird.
-
Rolle — Autorisiert einen Benutzer, Aktionen an einer oder mehreren Datenbanken durchzuführen.
-
Admin-Datenbank — Die Datenbank, in der Benutzer gespeichert sind und für die sie autorisiert sind.
-
Datenbank (
db
) — Der Namespace innerhalb von Clustern, der Sammlungen zum Speichern von Dokumenten enthält.
Der folgende Befehl erstellt einen Benutzer mit Namen sample-user
.
db.createUser({user: "sample-user", pwd: "abc123", roles: [{role: "read", db: "sample-database"}]})
In diesem Beispiel:
-
user: "sample-user"
— Gibt den Benutzernamen an. -
pwd: "abc123"
— Zeigt das Benutzerkennwort an. -
role: "read", "db: "sample-database"
— Zeigt an, dass der Benutzer Leseberechtigungen für habensample-user
wirdsample-database
.
Das folgende Beispiel zeigt die Ausgabe, nachdem Sie den Benutzer sample-user
mit db.getUser(sample-user)
erhalten. In diesem Beispiel befindet sich der Benutzer sample-user
in der Datenbank admin
, besitzt jedoch die „read“-Rolle für die Datenbank sample-database
.
Wenn Sie beim Erstellen von Benutzern das db
Feld bei der Angabe der Rolle weglassen, ordnet Amazon DocumentDB die Rolle implizit der Datenbank zu, für die die Verbindung hergestellt wird. Wenn Ihre Verbindung beispielsweise für die Datenbank sample-database
hergestellt wird und Sie den folgenden Befehl ausführen, wird der Benutzer sample-user
in der Datenbank admin
erstellt und verfügt über readWrite
-Berechtigungen für die Datenbank sample-database
.
db.createUser({user: "sample-user", pwd: "abc123", roles: ["readWrite"]})
Die Ausgabe dieser Operation sieht in etwa folgendermaßen aus.
{
"user":"sample-user",
"roles":[
{
"db":"sample-database",
"role":"readWrite"
}
]
}
Wenn Sie Benutzer mit Rollen erstellen, die über alle Datenbanken hinweg erfasst sind (z. B. readAnyDatabase
), müssen Sie sich beim Erstellen des Benutzers entweder im Kontext der Datenbank admin
befinden oder beim Erstellen des Benutzers explizit die Datenbank für die Rolle angeben. Um Befehle für die Datenbank admin
auszugeben, können Sie den Befehl use admin
verwenden. Weitere Informationen finden Sie unter Allgemeine Befehle.
Erste Schritte mit integrierten Rollen RBAC
Um Ihnen den Einstieg in die rollenbasierte Zugriffssteuerung zu erleichtern, führen Sie in diesem Abschnitt ein Beispielszenario zum Erzwingen der geringstmöglichen Berechtigungen durch das Erstellen von Rollen für drei Benutzer mit unterschiedlichen Auftragsfunktionen durch.
-
user1
ist ein neuer Manager, der in der Lage sein muss, alle Datenbanken in einem Cluster anzuzeigen und darauf zuzugreifen. -
user2
ist ein neuer Mitarbeiter, der Zugriff auf nur eine Datenbank,sample-database-1
, in demselben Cluster benötigt. -
user3
ist ein vorhandener Mitarbeiter, der im selben Cluster eine andere Datenbank,sample-database-2
, anzeigen und darauf zugreifen muss, auf die er vorher keinen Zugriff hatten.
Zu einem späteren Zeitpunkt verlassen sowohl user1
als auch user2
das Unternehmen, so dass ihr Zugang widerrufen werden muss.
Um Benutzer zu erstellen und Rollen zu erteilen, muss der Benutzer, mit dem Sie sich beim Cluster authentifizieren, über eine zugeordnete Rolle verfügen, die Aktionen für createUser
und grantRole
ausführen kann. Zum Beispiel können die Rollen admin
und userAdminAnyDatabase
beide solche Fähigkeiten gewähren. Informationen zu Aktionen pro Rolle finden Sie unter Datenbankzugriff mithilfe der rollenbasierten Zugriffskontrolle.
Anmerkung
In Amazon DocumentDB werden alle Benutzer- und Rollenoperationen (z. B.create
,get
,drop
, grant
revoke
, usw.) implizit in der admin
Datenbank ausgeführt, unabhängig davon, ob Sie Befehle für die admin
Datenbank ausgeben oder nicht.
Um zunächst zu verstehen, was die aktuellen Benutzer und Rollen im Cluster sind, können Sie den Befehl show users
ausführen, wie im folgenden Beispiel. Sie sehen zwei Benutzer serviceadmin
und den Hauptbenutzer für den Cluster. Diese beiden Benutzer sind immer vorhanden und können nicht gelöscht werden. Weitere Informationen finden Sie unter Amazon DocumentDB DocumentDB-Benutzer verwalten.
show users
Erstellen Sie für user1
eine Rolle mit Lese- und Schreibzugriff auf alle Datenbanken im gesamten Cluster mit dem folgenden Befehl.
db.createUser({user: "user1", pwd: "abc123", roles: [{role: "readWriteAnyDatabase", db: "admin"}]})
Die Ausgabe dieser Operation sieht in etwa folgendermaßen aus.
{
"user":"user1",
"roles":[
{
"role":"readWriteAnyDatabase",
"db":"admin"
}
]
}
Erstellen Sie für user2
eine Rolle mit schreibgeschütztem Zugriff auf die Datenbank sample-database-1
mit dem folgenden Befehl.
db.createUser({user: "user2", pwd: "abc123", roles: [{role: "read", db: "sample-database-1"}]})
Die Ausgabe dieser Operation sieht in etwa folgendermaßen aus.
{
"user":"user2",
"roles":[
{
"role":"read",
"db":"sample-database-1"
}
]
}
Um das Szenario zu simulieren, dass user3
ein vorhandener Benutzer ist, erstellen Sie zuerst den Benutzer user3
und weisen Sie dann user3
eine neue Rolle zu.
db.createUser({user: "user3", pwd: "abc123", roles: [{role: "readWrite", db: "sample-database-1"}]})
Die Ausgabe dieser Operation sieht in etwa folgendermaßen aus.
{ "user":"user3", "roles":[ { "role":"readWrite", "db":"sample-database-1" } ] }
Nachdem der Benutzer user3
erstellt wurde, weisen Sie user3
die read
-Rolle für sample-database-2
zu.
db.grantRolesToUser("user3", [{role: "read", db: "sample-database-2"}])
Schließlich verlassen sowohl user1
als auch user2
das Unternehmen und ihr Zugriff auf den Cluster muss widerrufen werden. Sie können dies tun, indem Sie die Benutzer wie folgt löschen.
db.dropUser("user1") db.dropUser("user2")
Um sicherzustellen, dass alle Benutzer über die entsprechenden Rollen verfügen, können Sie alle Benutzer mit dem folgenden Befehl auflisten.
show users
Die Ausgabe dieser Operation sieht in etwa folgendermaßen aus.
{
"_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"
}
]
}
Erste Schritte mit RBAC benutzerdefinierten Rollen
Um Ihnen die ersten Schritte mit benutzerdefinierten Rollen zu erleichtern, führt Sie dieser Abschnitt durch ein Beispielszenario zur Durchsetzung der geringsten Rechte durch die Erstellung von Rollen für drei Benutzer mit unterschiedlichen Aufgabenfunktionen.
In diesem Beispiel gilt Folgendes:
-
user1
ist ein neuer Manager, der in der Lage sein muss, alle Datenbanken in einem Cluster anzuzeigen und darauf zuzugreifen. -
user2
ist ein neuer Mitarbeiter, der nur die Aktion „Suchen“ für nur eine Datenbank im selben Cluster benötigt.sample-database-1
-
user3
ist ein vorhandener Mitarbeiter, der eine bestimmte Sammlung (Spalte 2) in einer anderen Datenbank, aufsample-database-2
die er zuvor keinen Zugriff hatte, im selben Cluster anzeigen und darauf zugreifen muss. -
Erstellen Sie für
user1
eine Rolle mit Lese- und Schreibzugriff auf alle Datenbanken im gesamten Cluster mit dem folgenden Befehl.
db.createUser( { user: "user1", pwd: "abc123", roles: [{role: "readWriteAnyDatabase", db: "admin"}] } )
Die Ausgabe dieser Operation sieht in etwa folgendermaßen aus.
{ "user":"user1", "roles":[ { "role":"readWriteAnyDatabase", "db":"admin" } ] }
Erstellen Sie für user2
mit dem folgenden Befehl eine Rolle mit Find-Rechten für alle Sammlungen in der Datenbanksample-database-1
. Beachten Sie, dass diese Rolle sicherstellen würde, dass alle zugehörigen Benutzer nur Suchabfragen ausführen können.
db.createRole( { role: "findRole", privileges: [ { resource: {db: "sample-database-1", collection: ""}, actions: ["find"] }], roles: [] } )
Die Ausgabe dieser Operation sieht in etwa folgendermaßen aus.
{ "role":"findRole", "privileges":[ { "resource":{ "db":"sample-database-1", "collection":"" }, "actions":[ "find" ] } ], "roles":[ ] }
Erstellen Sie als Nächstes den Benutzer (user2
) und fügen Sie dem Benutzer die kürzlich erstellte Rolle findRole
hinzu.
db.createUser( { user: "user2", pwd: "abc123", roles: [] }) db.grantRolesToUser("user2",["findRole"])
Um das user3
Szenario eines vorhandenen Benutzers zu simulieren, erstellen Sie zuerst den Benutzer user3
und dann eine neue Rolle mit collectionRole dem Namen, der wir im nächsten Schritt zuweisen werdenuser3
.
Jetzt können Sie eine neue Rolle zuweisenuser3
. Diese neue Rolle ermöglicht es Ihnenuser3
, eine bestimmte Sammlung einzufügen, zu aktualisieren, zu löschen und Zugriff darauf zu finden, in sample-database-2
der Spalte 2 enthalten ist.
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: [] } )
Die Ausgabe dieser Operation sieht in etwa folgendermaßen aus.
{ "role":"collectionRole", "privileges":[ { "resource":{ "db":"sample-database-2", "collection":"col2" }, "actions":[ "find", "update", "insert", "remove" ] } ], "roles":[ ] }
Nachdem der Benutzer erstellt user3
wurde, können Sie ihm user3
die Rolle collectionFind
zuweisen.
db.grantRolesToUser("user3",["collectionRole"])
Schließlich verlassen sowohl user1
als auch user2
das Unternehmen und ihr Zugriff auf den Cluster muss widerrufen werden. Sie können dies tun, indem Sie die Benutzer wie folgt löschen.
db.dropUser("user1") db.dropUser("user2")
Um sicherzustellen, dass alle Benutzer über die entsprechenden Rollen verfügen, können Sie alle Benutzer mit dem folgenden Befehl auflisten.
show users
Die Ausgabe dieser Operation sieht in etwa folgendermaßen aus.
{ "_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" } ] }
Als Benutzer eine Verbindung zu Amazon DocumentDB herstellen
Wenn Sie eine Verbindung zu einem Amazon DocumentDB-Cluster herstellen, stellen Sie eine Verbindung im Kontext einer bestimmten Datenbank her. Wenn Sie in der Verbindungszeichenfolge keine Datenbank angeben, werden Sie standardmäßig automatisch im Kontext der Datenbank test
mit dem Cluster verbunden. Alle Befehle auf Sammlungsebene wie insert
und find
werden für Sammlungen in der Datenbank test
ausgegeben.
Um die Datenbank zu sehen, in der Sie sich befinden, oder — mit anderen Worten — Befehle für die Sie ausführen, verwenden Sie den db
Befehl in der Mongo-Shell wie folgt.
Abfrage:
db
Ausgabe:
test
Obwohl sich die Standardverbindung möglicherweise im Kontext der Datenbank test
befindet, bedeutet dies nicht unbedingt, dass der Benutzer, der der Verbindung zugeordnet ist, berechtigt ist, Aktionen für die Datenbank test
auszuführen. Wenn Sie sich im vorangegangenen Beispielszenario als Benutzer user3
authentifizieren, der die readWrite
-Rolle für die Datenbank sample-database-1
besitzt, ist der Standardkontext Ihrer Verbindung die Datenbank test
. Wenn Sie jedoch versuchen, ein Dokument in eine Sammlung in der Datenbank test
einzufügen, erhalten Sie die Fehlermeldung Autorisierungsfehler. Dies liegt daran, dass dieser Benutzer nicht berechtigt ist, diesen Befehl in dieser Datenbank auszuführen, wie unten gezeigt.
Abfrage:
db
Ausgabe:
test
Abfrage:
db.col.insert({x:1})
Ausgabe:
WriteCommandError({ "ok" : 0, "code" : 13, "errmsg" : "Authorization failure" })
Wenn Sie den Kontext Ihrer Verbindung zur Datenbank sample-database-1
ändern, können Sie in die Sammlung schreiben, für die der Benutzer die Berechtigung dazu hat.
Abfrage:
use sample-database-1
Ausgabe:
switched to db sample-database-1
Abfrage:
db.col.insert({x:1})
Ausgabe:
WriteResult({ "nInserted" : 1})
Wenn Sie sich bei einem Cluster mit einem bestimmten Benutzer authentifizieren, können Sie die Datenbank auch in der Verbindungszeichenfolge angeben. Dadurch entfällt die Notwendigkeit, den Befehl use
auszuführen, nachdem der Benutzer in der Datenbank admin
authentifiziert wurde.
Die folgende Verbindungszeichenfolge authentifiziert den Benutzer für die Datenbank admin
, aber der Kontext der Verbindung wird für die Datenbank sample-database-1
verwendet.
mongo "mongodb://user3:abc123@sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/sample-database-2"
Allgemeine Befehle
Dieser Abschnitt enthält Beispiele für häufig verwendete Befehle, die die rollenbasierte Zugriffskontrolle in Amazon DocumentDB verwenden. Sie müssen sich im Kontext der Datenbank admin
befinden, um Benutzer und Rollen zu erstellen und zu ändern. Sie können den Befehl use admin
verwenden, um zur Datenbank admin
zu wechseln.
Anmerkung
Änderungen an den Benutzern und Rollen erfolgen implizit in der Datenbank admin
. Wenn Sie Benutzer mit Rollen erstellen, die über alle Datenbanken hinweg erfasst sind (z. B. readAnyDatabase
), müssen Sie sich beim Erstellen des Benutzers entweder im Kontext der Datenbank admin
befinden (d. h. use
admin
) oder beim Erstellen des Benutzers explizit die Datenbank für die Rolle angeben (wie in Beispiel 2 in diesem Abschnitt gezeigt).
Beispiel 1: Erstellen Sie einen Benutzer mit read
Rolle für die Datenbank. foo
db.createUser({user: "readInFooBar", pwd: "abc123", roles: [{role: "read", db: "foo"}]})
Die Ausgabe dieser Operation sieht in etwa folgendermaßen aus.
{
"user":"readInFooBar",
"roles":[
{
"role":"read",
"db":"foo"
}
]
}
Beispiel 2: Erstellen Sie einen Benutzer mit Lesezugriff auf alle Datenbanken.
db.createUser({user: "readAllDBs", pwd: "abc123", roles: [{role: "readAnyDatabase", db: "admin"}]})
Die Ausgabe dieser Operation sieht in etwa folgendermaßen aus.
{
"user":"readAllDBs",
"roles":[
{
"role":"readAnyDatabase",
"db":"admin"
}
]
}
Beispiel 3: Erteilen Sie einem vorhandenen Benutzer eine read
Rolle in einer neuen Datenbank.
db.grantRolesToUser("readInFooBar", [{role: "read", db: "bar"}])
Beispiel 4: Aktualisieren Sie die Rolle eines Benutzers.
db.updateUser("readInFooBar", {roles: [{role: "read", db: "foo"}, {role: "read", db: "baz"}]})
Beispiel 5: Widerrufen Sie einem Benutzer den Zugriff auf eine Datenbank.
db.revokeRolesFromUser("readInFooBar", [{role: "read", db: "baz"}])
Beispiel 6: Beschreiben Sie eine integrierte Rolle.
db.getRole("read", {showPrivileges:true})
Die Ausgabe dieser Operation sieht in etwa folgendermaßen aus.
{
"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"
]
}
}
Beispiel 7: Löschen Sie einen Benutzer aus dem Cluster.
db.dropUser("readInFooBar")
Die Ausgabe dieser Operation sieht in etwa folgendermaßen aus.
true
Beispiel 8: Erstellen Sie eine Rolle mit Lese- und Schreibzugriff auf eine bestimmte Sammlung
db.createRole( { role: "collectionRole", privileges: [ { resource: {db: "sample-database-2", collection: "col2"}, actions: ["find", "update", "insert", "remove"] }], roles: [] } )
Die Ausgabe dieser Operation sieht in etwa folgendermaßen aus.
{ "role":"collectionRole", "privileges":[ { "resource":{ "db":"sample-database-2", "collection":"col2" }, "actions":[ "find", "update", "insert", "remove" ] } ], "roles":[ ] }
Beispiel 9: Erstellen Sie einen Benutzer und weisen Sie ihm eine benutzerdefinierte Rolle zu
db.createUser( { user: "user3", pwd: "abc123", roles: [] }) db.grantRolesToUser("user3",["collectionRole"])
Beispiel 10: Erteilen Sie einer benutzerdefinierten Rolle zusätzliche Rechte
db.grantPrivilegesToRole( "collectionRole", [ { resource: { db: "sample-database-1", collection: "col1" }, actions: ["find", "update", "insert", "remove"] } ] )
Beispiel 11: Entfernen Sie Rechte aus einer benutzerdefinierten Rolle
db.revokePrivilegesFromRole( "collectionRole", [ { resource: { db: "sample-database-1", collection: "col2" }, actions: ["find", "update", "insert", "remove"] } ] )
Beispiel 12: Aktualisieren Sie eine bestehende benutzerdefinierte Rolle
db.updateRole( "collectionRole", { privileges: [ { resource: {db: "sample-database-3", collection: "sample-collection-3"}, actions: ["find", "update", "insert", "remove"] }], roles: [] } )
Funktionelle Unterschiede
In Amazon DocumentDB werden Benutzer- und Rollendefinitionen in der admin
Datenbank gespeichert und Benutzer werden anhand der admin
Datenbank authentifiziert. Diese Funktionalität unterscheidet sich von der MongoDB Community Edition, ist aber konsistent mit MongoDB Atlas.
Amazon DocumentDB unterstützt auch Change-Streams, die eine zeitlich geordnete Abfolge von Änderungsereignissen bereitstellen, die in den Sammlungen Ihres Clusters auftreten. Die listChangeStreams
Aktion wird auf Clusterebene (d. h. auf alle Datenbanken) angewendet, und die modifyChangeStreams
Aktion kann auf Datenbank- und Clusterebene angewendet werden.
Einschränkungen
Die folgende Tabelle enthält die Grenzwerte für die rollenbasierte Zugriffskontrolle in Amazon DocumentDB.
Beschreibung | Limit |
---|---|
Anzahl Benutzer pro Cluster | 1000 |
Anzahl der Rollen, die einem Benutzer zugeordnet sind | 1000 |
Anzahl der benutzerdefinierten Rollen | 100 |
Anzahl der Ressourcen, die mit einer Berechtigung verknüpft sind | 100 |
Datenbankzugriff mithilfe der rollenbasierten Zugriffskontrolle
Mit der rollenbasierten Zugriffssteuerung können Sie einen Benutzer erstellen und ihm eine oder mehrere Rollen erteilen, um zu bestimmen, welche Operationen der Benutzer in einer Datenbank oder einem Cluster ausführen kann.
Im Folgenden finden Sie eine Liste der integrierten Rollen, die derzeit in Amazon DocumentDB unterstützt werden.
Anmerkung
In Amazon DocumentDB 4.0 und 5.0 können die ListDatabase
Befehle ListCollection
und optional die authorizedDatabases
Parameter authorizedCollections
und verwenden, um die Sammlungen und Datenbanken aufzulisten, auf die der Benutzer zugreifen darf, wobei er die jeweiligen listDatabase
Rollen listCollections
und benötigt. Außerdem haben Benutzer jetzt die Möglichkeit, ihre eigenen Cursor zu beenden, ohne die KillCursor
Rolle zu benötigen.