Le build di indici sui cluster di produzione MongoDB devono essere gestite con la massima cura. Abbiamo documentato i problemi in dettaglio in uno dei nostri post precedenti sul blog:The Perils of Building Indexes on MongoDB.
A seconda delle dimensioni dei tuoi dati, sia le build in primo piano che quelle in background possono ridurre il tuo cluster. Quindi, come impedire ai tuoi utenti di attivare accidentalmente build di indici dalla CLI MongoDB? La risposta breve è che non puoi. Tuttavia, ciò che puoi fare è rimuovere il privilegio "CreateIndex" dalla maggior parte dei tuoi utenti in modo che non possano attivare accidentalmente una build dell'indice dalla CLI. Ci dovrebbero essere pochissimi utenti nel tuo sistema che hanno accesso per scrivere dati nel database. Tra questi utenti, ancora meno dovrebbero avere l'autorizzazione per creare indici. Per informazioni su come utilizzare i ruoli MongoDB, fare riferimento alla documentazione – Gestisci utenti e ruoli.
L'opzione migliore per implementarlo è creare il tuo ruolo personalizzato e rimuovere il privilegio "CreateIndex" per i tuoi utenti. Tuttavia, non volevamo creare manualmente l'elenco delle autorizzazioni poiché sarà diverso per ogni contesto e possibilmente per la versione di MongoDB. Abbiamo messo insieme questo piccolo script per utilizzare uno dei ruoli predefiniti esistenti e abbiamo rimosso il privilegio "CreateIndex" da questo ruolo. In questo esempio, stiamo utilizzando il ruolo "readWrite" integrato e rimuovendo il privilegio "CreateIndex" da questo ruolo:
var privs = db.getRole('readWrite',{ showPrivileges: true }); privs.privileges.forEach(function (item, index) { var index = item.actions.indexOf("createIndex"); if (index !== -1) item.actions.splice(index, 1); }); db.createRole({role:"readWriteNoIndex",privileges:privs.privileges,roles:[]});
- Salva il contenuto del frammento di codice come createRole.js.
- Esegui lo script utilizzando la sintassi seguente:
mongo -u <user> -p <password> <host>:27017/<db name> --authenticationDatabase admin createRole.js
Una volta creato il ruolo, puoi utilizzare questo ruolo per creare utenti in futuro.
|