Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Accesso al database tramite Role-Based Access Control
Puoi limitare l'accesso alle azioni che gli utenti possono eseguire sui database utilizzando il controllo degli accessi basato sui ruoli (RBAC) in Amazon DocumentDB (con compatibilità con MongoDB). RBACfunziona concedendo uno o più ruoli a un utente. Questi ruoli determinano le operazioni che un utente può eseguire sulle risorse del database. Amazon DocumentDB attualmente supporta sia ruoli integrati con ambito a livello di database, come,,,, read
readWrite
readAnyDatabase
clusterAdmin
, sia ruoli definiti dall'utente che possono essere limitati ad azioni specifiche e risorse granulari come raccolte basate sui requisiti dell'utente.
I casi d'uso più comuni RBAC includono l'applicazione dei privilegi minimi mediante la creazione di utenti con accesso in sola lettura ai database o alle raccolte in un cluster e progetti di applicazioni multi-tenant che consentono a un singolo utente di accedere a un determinato database o raccolta in un cluster.
Nota
Tutti i nuovi utenti creati prima del 26 marzo 2020 hanno ottenuto i ruoli dbAdminAnyDatabase
, readWriteAnyDatabase
e clusterAdmin
. Ti consigliamo di rivalutare tutti gli utenti esistenti e modificare i ruoli in base alle necessità per applicare i privilegi minimi per i cluster.
Argomenti
RBACconcetti
Di seguito sono riportati termini e concetti importanti relativi al controllo accessi basato sui ruoli. Per ulteriori informazioni sugli utenti di Amazon DocumentDB, consulta. Gestione degli utenti di Amazon DocumentDB
-
Utente: una singola entità che può autenticarsi nel database ed eseguire operazioni.
-
Password: un segreto utilizzato per autenticare l'utente.
-
Ruolo: autorizza un utente a eseguire azioni su uno o più database.
-
Database di amministrazione: il database in cui gli utenti sono archiviati e su cui sono autorizzati.
-
Database (
db
): lo spazio dei nomi all'interno dei cluster che contiene le raccolte per l'archiviazione dei documenti.
Il comando seguente crea un utente denominato sample-user
.
db.createUser({user: "sample-user", pwd: "abc123", roles: [{role: "read", db: "sample-database"}]})
In questo esempio:
-
user: "sample-user"
— Indica il nome utente. -
pwd: "abc123"
— Indica la password dell'utente. -
role: "read", "db: "sample-database"
— Indica che l'utentesample-user
avrà i permessi di lettura insample-database
.
L'esempio seguente mostra l'output dopo aver ottenuto l'utente sample-user
con db.getUser(sample-user)
. In questo esempio, l'utente sample-user
risiede nel database admin
ma ha il ruolo di lettura per il database sample-database
.
Durante la creazione di utenti, se si omette il db
campo quando si specifica il ruolo, Amazon DocumentDB attribuirà implicitamente il ruolo al database in cui viene emessa la connessione. Ad esempio, se la connessione viene emessa in relazione al database sample-database
ed esegui il comando seguente, l'utente sample-user
verrà creato nel database admin
e avrà le autorizzazioni readWrite
per il database sample-database
.
db.createUser({user: "sample-user", pwd: "abc123", roles: ["readWrite"]})
L'aspetto dell'output di questa operazione è simile al seguente.
{
"user":"sample-user",
"roles":[
{
"db":"sample-database",
"role":"readWrite"
}
]
}
La creazione di utenti con ruoli con ambito in tutti i database (ad esempio, readAnyDatabase
) richiede che tu sia nell’ambito del database admin
durante la creazione dell'utente oppure devi specificare esplicitamente il database per il ruolo durante la creazione dell'utente. Per emettere comandi sul database admin
, puoi utilizzare il comando use admin
. Per ulteriori informazioni, consulta Comandi comuni.
Guida introduttiva ai ruoli integrati RBAC
Per aiutarti a iniziare a utilizzare il controllo accessi basato sui ruoli, questa sezione illustra uno scenario di esempio per l'applicazione dei privilegi minimi creando ruoli per tre utenti con funzioni di lavoro diverse.
-
user1
è un nuovo manager che deve essere in grado di visualizzare e accedere a tutti i database in un cluster. -
user2
è un nuovo dipendente che ha bisogno di accedere a un solo databasesample-database-1
, nello stesso cluster. -
user3
è un dipendente esistente che deve visualizzare e accedere a un database diverso,sample-database-2
a cui non aveva accesso prima, nello stesso cluster.
Successivamente, sia user1
che user2
lasciano la società e quindi il loro accesso deve essere revocato.
Per creare utenti e concedere ruoli, l'utente per il quale esegui l'autenticazione nel cluster deve disporre di un ruolo associato in grado di eseguire operazioni per createUser
e grantRole
. Ad esempio, i ruoli admin
e userAdminAnyDatabase
possono entrambi concedere tali capacità, per esempio. Per le operazioni per ruolo, consulta Accesso al database tramite Role-Based Access Control.
Nota
In Amazon DocumentDB, tutte le operazioni relative agli utenti e ai ruoli (ad esempiocreate
,get
,drop
,grant
,revoke
, ecc.) vengono eseguite implicitamente nel admin
database indipendentemente dal fatto che tu stia emettendo comandi sul database o meno. admin
Innanzitutto, per capire quali sono gli utenti e i ruoli correnti nel cluster, puoi eseguire il comando show users
, come nell'esempio seguente. Vedrai due utenti serviceadmin
e l'utente principale del cluster. Questi due utenti sono sempre presenti e non possono essere eliminati. Per ulteriori informazioni, consulta Gestione degli utenti di Amazon DocumentDB.
show users
Per user1
, crea un ruolo con accesso in lettura e scrittura a tutti i database dell'intero cluster con il comando seguente.
db.createUser({user: "user1", pwd: "abc123", roles: [{role: "readWriteAnyDatabase", db: "admin"}]})
L'aspetto dell'output di questa operazione è simile al seguente.
{
"user":"user1",
"roles":[
{
"role":"readWriteAnyDatabase",
"db":"admin"
}
]
}
Per user2
, crea un ruolo con accesso di sola lettura al database sample-database-1
con il comando seguente.
db.createUser({user: "user2", pwd: "abc123", roles: [{role: "read", db: "sample-database-1"}]})
L'aspetto dell'output di questa operazione è simile al seguente.
{
"user":"user2",
"roles":[
{
"role":"read",
"db":"sample-database-1"
}
]
}
Per simulare lo scenario nel quale user3
è un utente esistente, crea innanzitutto l'utente user3
e quindi assegna un nuovo ruolo a user3
.
db.createUser({user: "user3", pwd: "abc123", roles: [{role: "readWrite", db: "sample-database-1"}]})
L'aspetto dell'output di questa operazione è simile al seguente.
{ "user":"user3", "roles":[ { "role":"readWrite", "db":"sample-database-1" } ] }
Ora che l'utente user3
è stato creato, assegna a user3
il ruolo read
su sample-database-2
.
db.grantRolesToUser("user3", [{role: "read", db: "sample-database-2"}])
Infine, user1
e user2
lasciano l'azienda ed è necessario che il loro accesso al cluster venga revocato. Puoi farlo rilasciando gli utenti, come segue.
db.dropUser("user1") db.dropUser("user2")
Per garantire che tutti gli utenti dispongano dei ruoli appropriati, puoi elencare tutti gli utenti con il comando seguente.
show users
L'aspetto dell'output di questa operazione è simile al seguente.
{
"_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"
}
]
}
Guida introduttiva ai ruoli RBAC definiti dall'utente
Per aiutarti a iniziare con i ruoli definiti dall'utente, questa sezione illustra uno scenario di esempio di applicazione del privilegio minimo mediante la creazione di ruoli per tre utenti con funzioni lavorative diverse.
In questo esempio, vale quanto segue:
-
user1
è un nuovo manager che deve essere in grado di visualizzare e accedere a tutti i database in un cluster. -
user2
è un nuovo dipendente che necessita solo dell'azione 'find' per un solo databasesample-database-1
, nello stesso cluster. -
user3
è un dipendente esistente che deve visualizzare e accedere a una raccolta specifica, col2 in un database diverso, asample-database-2
cui non aveva accesso prima, nello stesso cluster. -
Per
user1
, crea un ruolo con accesso in lettura e scrittura a tutti i database dell'intero cluster con il comando seguente.
db.createUser( { user: "user1", pwd: "abc123", roles: [{role: "readWriteAnyDatabase", db: "admin"}] } )
L'aspetto dell'output di questa operazione è simile al seguente.
{ "user":"user1", "roles":[ { "role":"readWriteAnyDatabase", "db":"admin" } ] }
Peruser2
, crea un ruolo con privilegi di 'find' per tutte le raccolte nel database sample-database-1
con il seguente comando. Tieni presente che questo ruolo garantirebbe che tutti gli utenti associati possano eseguire solo query di ricerca.
db.createRole( { role: "findRole", privileges: [ { resource: {db: "sample-database-1", collection: ""}, actions: ["find"] }], roles: [] } )
L'aspetto dell'output di questa operazione è simile al seguente.
{ "role":"findRole", "privileges":[ { "resource":{ "db":"sample-database-1", "collection":"" }, "actions":[ "find" ] } ], "roles":[ ] }
Quindi, crea l'utente (user2
) e associa all'utente il ruolo creato findRole
di recente.
db.createUser( { user: "user2", pwd: "abc123", roles: [] }) db.grantRolesToUser("user2",["findRole"])
Per simulare lo scenario in cui user3
si tratta di un utente esistenteuser3
, crea prima l'utente, quindi crea un nuovo ruolo chiamato a collectionRole cui verrà assegnato nel passaggio successivo. user3
Ora puoi assegnare un nuovo ruolo a. user3
Questo nuovo ruolo permetterà di user3
poter inserire, aggiornare, eliminare e trovare l'accesso a una specifica raccolta col2 in. 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: [] } )
L'aspetto dell'output di questa operazione è simile al seguente.
{ "role":"collectionRole", "privileges":[ { "resource":{ "db":"sample-database-2", "collection":"col2" }, "actions":[ "find", "update", "insert", "remove" ] } ], "roles":[ ] }
Ora che l'utente user3
è stato creato, puoi concedere user3
il ruolocollectionFind
.
db.grantRolesToUser("user3",["collectionRole"])
Infine, user1
e user2
lasciano l'azienda ed è necessario che il loro accesso al cluster venga revocato. Puoi farlo rilasciando gli utenti, come segue.
db.dropUser("user1") db.dropUser("user2")
Per garantire che tutti gli utenti dispongano dei ruoli appropriati, puoi elencare tutti gli utenti con il comando seguente.
show users
L'aspetto dell'output di questa operazione è simile al seguente.
{ "_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" } ] }
Connessione ad Amazon DocumentDB come utente
Quando ti connetti a un cluster Amazon DocumentDB, ti connetti nel contesto di un particolare database. Per impostazione predefinita, se non specifichi un database nella stringa di connessione, ti connetti automaticamente al cluster nell’ambito del database test
. Tutti i comandi a livello di raccolta come insert
e find
sono emessi in relazione alle raccolte nel database test
.
Per vedere il database in cui ti trovi o, in altre parole, per impartire comandi, usa il db
comando nella shell mongo, come segue.
Query:
db
Output:
test
Sebbene la connessione predefinita possa trovarsi nell’ambito del database test
, ciò non significa necessariamente che l'utente associato alla connessione sia autorizzato a eseguire operazioni sul database test
. Nello scenario di esempio precedente, se esegui l'autenticazione come utente user3
, che ha il ruolo readWrite
per il database sample-database-1
, l’ambito predefinito della connessione è il database test
. Tuttavia, se tenti di inserire un documento in una raccolta nel databasetest
, visualizzerai un messaggio di errore di autorizzazione. Questo perché tale utente non è autorizzato a eseguire tale comando su tale database, come illustrato di seguito.
Query:
db
Output:
test
Query:
db.col.insert({x:1})
Output:
WriteCommandError({ "ok" : 0, "code" : 13, "errmsg" : "Authorization failure" })
Se modifichi l’ambito della connessione al database sample-database-1
, puoi scrivere nella raccolta per la quale l'utente dispone della relativa autorizzazione.
Query:
use sample-database-1
Output:
switched to db sample-database-1
Query:
db.col.insert({x:1})
Output:
WriteResult({ "nInserted" : 1})
Quando esegui l'autenticazione in un cluster con un determinato utente, puoi anche specificare il database nella stringa di connessione. In questo modo viene rimossa la necessità di eseguire il comando use
dopo che l'utente è stato autenticato nel database admin
.
La seguente stringa di connessione autentica l'utente in relazione al database admin
, ma l’ambito della connessione sarà relativo al database sample-database-1
.
mongo "mongodb://user3:abc123@sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/sample-database-2"
Comandi comuni
Questa sezione fornisce esempi di comandi comuni che utilizzano il controllo degli accessi basato sui ruoli in Amazon DocumentDB. Devi trovarti nell’ambito del database admin
per creare e modificare utenti e ruoli. Puoi utilizzare il comando use admin
per passare al database admin
.
Nota
Modifiche a utenti e ruoli si verificheranno implicitamente nel database admin
. La creazione di utenti con ruoli con ambito in tutti i database (ad esempio, readAnyDatabase
) richiede che tu sia nell’ambito del database admin
(ovvero, use
admin
) durante la creazione dell'utente, oppure devi specificare esplicitamente il database per il ruolo durante la creazione dell'utente (come illustrato nell'esempio 2 in questa sezione).
Esempio 1: creare un utente con read
ruolo per il database. foo
db.createUser({user: "readInFooBar", pwd: "abc123", roles: [{role: "read", db: "foo"}]})
L'aspetto dell'output di questa operazione è simile al seguente.
{
"user":"readInFooBar",
"roles":[
{
"role":"read",
"db":"foo"
}
]
}
Esempio 2: creare un utente con accesso in lettura su tutti i database.
db.createUser({user: "readAllDBs", pwd: "abc123", roles: [{role: "readAnyDatabase", db: "admin"}]})
L'aspetto dell'output di questa operazione è simile al seguente.
{
"user":"readAllDBs",
"roles":[
{
"role":"readAnyDatabase",
"db":"admin"
}
]
}
Esempio 3: concedere read
il ruolo a un utente esistente su un nuovo database.
db.grantRolesToUser("readInFooBar", [{role: "read", db: "bar"}])
Esempio 4: Aggiornare il ruolo di un utente.
db.updateUser("readInFooBar", {roles: [{role: "read", db: "foo"}, {role: "read", db: "baz"}]})
Esempio 5: revoca dell'accesso a un database per un utente.
db.revokeRolesFromUser("readInFooBar", [{role: "read", db: "baz"}])
Esempio 6: descrivi un ruolo integrato.
db.getRole("read", {showPrivileges:true})
L'aspetto dell'output di questa operazione è simile al seguente.
{
"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"
]
}
}
Esempio 7: Eliminare un utente dal cluster.
db.dropUser("readInFooBar")
L'aspetto dell'output di questa operazione è simile al seguente.
true
Esempio 8: creazione di un ruolo con accesso in lettura e scrittura a una raccolta specifica
db.createRole( { role: "collectionRole", privileges: [ { resource: {db: "sample-database-2", collection: "col2"}, actions: ["find", "update", "insert", "remove"] }], roles: [] } )
L'aspetto dell'output di questa operazione è simile al seguente.
{ "role":"collectionRole", "privileges":[ { "resource":{ "db":"sample-database-2", "collection":"col2" }, "actions":[ "find", "update", "insert", "remove" ] } ], "roles":[ ] }
Esempio 9: creazione di un utente e assegnazione di un ruolo definito dall'utente
db.createUser( { user: "user3", pwd: "abc123", roles: [] }) db.grantRolesToUser("user3",["collectionRole"])
Esempio 10: concedere privilegi aggiuntivi a un ruolo definito dall'utente
db.grantPrivilegesToRole( "collectionRole", [ { resource: { db: "sample-database-1", collection: "col1" }, actions: ["find", "update", "insert", "remove"] } ] )
Esempio 11: rimuovere i privilegi da un ruolo definito dall'utente
db.revokePrivilegesFromRole( "collectionRole", [ { resource: { db: "sample-database-1", collection: "col2" }, actions: ["find", "update", "insert", "remove"] } ] )
Esempio 12: aggiornamento di un ruolo definito dall'utente esistente
db.updateRole( "collectionRole", { privileges: [ { resource: {db: "sample-database-3", collection: "sample-collection-3"}, actions: ["find", "update", "insert", "remove"] }], roles: [] } )
Differenze funzionali
In Amazon DocumentDB, le definizioni degli utenti e dei ruoli vengono archiviate nel admin
database e gli utenti vengono autenticati tramite il database. admin
Questa funzionalità differisce da MongoDB Community Edition, ma è coerente con MongoDB Atlas.
Amazon DocumentDB supporta anche i flussi di modifica, che forniscono una sequenza ordinata nel tempo di eventi di modifica che si verificano all'interno delle raccolte del cluster. L'listChangeStreams
azione viene applicata a livello di cluster (ovvero su tutti i database) e può essere applicata a livello di database e cluster. modifyChangeStreams
Limiti
La tabella seguente contiene i limiti per il controllo degli accessi basato sui ruoli in Amazon DocumentDB.
Descrizione | Limite |
---|---|
Numero di utenti per cluster | 1000 |
Numero di ruoli associati a un utente | 1000 |
Numero di ruoli definiti dall'utente | 100 |
Numero di risorse associate a un privilegio | 100 |
Accesso al database tramite Role-Based Access Control
Con il controllo accessi basato sui ruoli, puoi creare un utente e concedere uno o più ruoli per determinare le operazioni che l'utente può eseguire in un database o in un cluster.
Di seguito è riportato un elenco di ruoli integrati attualmente supportati in Amazon DocumentDB.
Nota
In Amazon DocumentDB 4.0 e 5.0, i ListDatabase
comandi ListCollection
and possono utilizzare facoltativamente i authorizedDatabases
parametri authorizedCollections
e per elencare le raccolte e i database a cui l'utente è autorizzato ad accedere richiedendo rispettivamente i listDatabase
ruoli listCollections
and. Inoltre, gli utenti ora hanno la possibilità di eliminare i propri cursori senza richiedere il ruolo. KillCursor