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 mit Role-Based Zugriffskontrolle
Sie können den Zugriff auf die Aktionen einschränken, die Benutzer mit Datenbanken ausführen können, indem Sie rollenbasierte Zugriffskontrolle (RBAC) in Amazon DocumentDB (mit MongoDB-Kompatibilität). Bei RBAC werden einem Benutzer eine oder mehrere Rollen gewährt. Diese Rollen bestimmen die Operationen, die ein Benutzer mit Datenbankressourcen ausführen kann. Amazon DocumentDB unterstützt derzeit beide integrierten Rollen, die auf Datenbankebene beschränkt sind, wie z. B. read, readWrite, readAnyDatabase, clusterAdmin, und benutzerdefinierte Rollen, die bestimmten Aktionen und granularen Ressourcen wie Sammlungen zugewiesen werden können, die Ihren Anforderungen entsprechen.
Zu den häufigsten Anwendungsfällen von RBAC gehören die Durchsetzung der geringsten Rechte, indem Benutzer mit schreibgeschütztem Zugriff auf die Datenbanken oder Sammlungen in einem Cluster erstellt werden, und Anwendungsdesigns für mehrere Mandanten, 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-Benutzern finden Sie unter Verwaltung von Amazon DocumentDB-Benutzern.
-
Nutzer — 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 auszuführen.
-
Admin-Datenbank — Die Datenbank, in der Benutzer gespeichert und gegen die Benutzer autorisiert werden.
-
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 Benutzersample-userwird Leseberechtigungen haben insample-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 weglassen db Wenn Sie die Rolle angeben, 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 den integrierten RBAC-Rollen
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.
-
user1ist ein neuer Manager, der in der Lage sein muss, alle Datenbanken in einem Cluster anzuzeigen und darauf zuzugreifen. -
user2ist ein neuer Mitarbeiter, der Zugriff auf nur eine Datenbank,sample-database-1, in demselben Cluster benötigt. -
user3ist 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 mit Role-Based Zugriffskontrolle.
Anmerkung
In Amazon DocumentDB sind alle Benutzer- und Rollenoperationen (z. B. create, get, drop, grant, revoke, usw.) werden implizit in der ausgeführt admin Datenbank, ob Sie Befehle gegen die ausgeben oder nicht admin Datenbank.
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 werden zwei Benutzer sehen, serviceadmin und der Hauptbenutzer für den Cluster. Diese beiden Benutzer sind immer vorhanden und können nicht gelöscht werden. Weitere Informationen finden Sie unter Verwaltung von Amazon DocumentDB-Benutzern.
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 benutzerdefinierten RBAC-Rollen
Um Ihnen den Einstieg in benutzerdefinierte Rollen zu erleichtern, werden Sie in diesem Abschnitt durch ein Beispielszenario geführt, in dem Sie die geringsten Rechte erzwingen, indem Rollen für drei Benutzer mit unterschiedlichen Aufgabenbereichen erstellt werden.
In diesem Beispiel gilt Folgendes:
-
user1ist ein neuer Manager, der in der Lage sein muss, alle Datenbanken in einem Cluster anzuzeigen und darauf zuzugreifen. -
user2ist ein neuer Mitarbeiter, der nur die Aktion „Suchen“ für nur eine Datenbank benötigt,sample-database-1, in demselben Cluster. -
user3ist ein vorhandener Mitarbeiter, der eine bestimmte Sammlung, col2, in einer anderen Datenbank einsehen und darauf zugreifen muss,sample-database-2auf die sie zuvor keinen Zugriff hatten, im selben Cluster. -
Erstellen Sie für
user1eine 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" } ] }
Für user2, erstellen Sie eine Rolle mit Suchrechten für alle Sammlungen in der Datenbank sample-database-1 mit dem folgenden Befehl. 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 hängen Sie die kürzlich erstellte Rolle an findRole an den Benutzer.
db.createUser( { user: "user2", pwd: "abc123", roles: [] }) db.grantRolesToUser("user2",["findRole"])
Um das Szenario zu simulieren, dass user3 ist ein vorhandener Benutzer, erstellen Sie zuerst den Benutzer user3, und erstellen Sie dann eine neue Rolle namens CollectionRole, die wir im nächsten Schritt zuweisen werden user3.
Jetzt können Sie eine neue Rolle zuweisen user3. Diese neue Rolle wird es ermöglichen user3 um in der Lage zu sein, eine bestimmte Sammlung spol2 einzufügen, zu aktualisieren, zu löschen und Zugriff auf sie zu finden sample-database-2.
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":[ ] }
Nun, das ist der Benutzer user3 erstellt wurde, können Sie gewähren user3 die Rolle collectionFind.
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 gerade befinden, oder — mit anderen Worten — Befehle für die Sie Befehle ausgeben, verwenden Sie 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 gängige 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: Zuschuss read Rolle an einen bestehenden Benutzer in einer neuen Datenbank.
db.grantRolesToUser("readInFooBar", [{role: "read", db: "bar"}])
Beispiel 4: Aktualisiere 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 eingebaute 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öscht 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: Gewähren Sie einer benutzerdefinierten Rolle zusätzliche Rechte
db.grantPrivilegesToRole( "collectionRole", [ { resource: { db: "sample-database-1", collection: "col1" }, actions: ["find", "update", "insert", "remove"] } ] )
Beispiel 11: Privilegien aus einer benutzerdefinierten Rolle entfernen
db.revokePrivilegesFromRole( "collectionRole", [ { resource: { db: "sample-database-1", collection: "col2" }, actions: ["find", "update", "insert", "remove"] } ] )
Beispiel 12: Aktualisiere eine bestehende benutzerdefinierte Rolle
db.updateRole( "collectionRole", { privileges: [ { resource: {db: "sample-database-3", collection: "sample-collection-3"}, actions: ["find", "update", "insert", "remove"] }], roles: [] } )
Funktionale Unterschiede
In Amazon DocumentDB werden Benutzer- und Rollendefinitionen in der admin Datenbank und Benutzer werden anhand der authentifiziert admin Datenbank. 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 Die Aktion wird auf Clusterebene (d. h. auf alle Datenbanken) angewendet, und modifyChangeStreams Die Aktion kann auf Datenbank- und Clusterebene angewendet werden.
Einschränkungen
Die folgende Tabelle enthält die Grenzwerte für Role-Based Zugriffskontrolle in Amazon DocumentDB.
| Description | Limit |
|---|---|
| Anzahl Benutzer pro Cluster | 1000 |
| Anzahl der Rollen, die einem Benutzer zugeordnet sind | 1000 |
| Anzahl der benutzerdefinierten Rollen | 100 |
| Anzahl der Ressourcen, die einer Berechtigung zugeordnet sind | 100 |
Datenbankzugriff mit Role-Based 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 ist der ListCollection und ListDatabase Befehle können optional die verwenden authorizedCollections und authorizedDatabases Parameter, um die Sammlungen und Datenbanken aufzulisten, auf die der Benutzer zugreifen darf. Dazu benötigen Sie listCollections und listDatabase jeweils Rollen. Außerdem haben Benutzer jetzt die Möglichkeit, ihre eigenen Cursor zu beenden, ohne die KillCursor Rolle.