Wersje indeksu w klastrach produkcyjnych MongoDB muszą być traktowane z najwyższą ostrożnością. Szczegółowo udokumentowaliśmy te problemy w jednym z naszych poprzednich postów na blogu – Niebezpieczeństwa związane z budowaniem indeksów w MongoDB.
W zależności od rozmiaru danych zarówno kompilacje pierwszego planu, jak i tła mogą obniżyć klaster. Jak więc uchronić użytkowników przed przypadkowym uruchomieniem kompilacji indeksu z interfejsu MongoDB CLI? Krótka odpowiedź brzmi, że nie możesz. Możesz jednak usunąć uprawnienie „CreateIndex” z większości użytkowników, aby nie mogli przypadkowo wywołać kompilacji indeksu z CLI. W twoim systemie powinno być bardzo niewielu użytkowników, którzy mają dostęp do zapisywania danych w bazie danych. Wśród tych użytkowników jeszcze mniej powinno mieć uprawnienia do budowania indeksów. Aby dowiedzieć się, jak korzystać z ról MongoDB, zapoznaj się z dokumentacją – Zarządzanie użytkownikami i rolami.
Najlepszą opcją do zaimplementowania tego jest utworzenie własnej niestandardowej roli i usunięcie uprawnienia „CreateIndex” dla użytkowników. Nie chcieliśmy jednak tworzyć listy uprawnień ręcznie, ponieważ będzie ona różna dla każdego kontekstu i prawdopodobnie wersji MongoDB. Stworzyliśmy ten mały skrypt, aby używać jednej z istniejących wbudowanych ról i usunęliśmy z tej roli uprawnienie „CreateIndex”. W tym przykładzie używamy wbudowanej roli „readWrite” i usuwamy uprawnienie „CreateIndex” z tej roli:
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:[]});
- Zapisz zawartość fragmentu kodu jako createRole.js.
- Uruchom skrypt, używając poniższej składni:
mongo -u <user> -p <password> <host>:27017/<db name> --authenticationDatabase admin createRole.js
Po utworzeniu roli możesz użyć tej roli do tworzenia przyszłych użytkowników.
|