Tworzenie kontroli dostępu opartej na rolach w MongoDB
MongoDB zapewnia użytkownikom dostęp za pomocą kontrolek opartych na rolach, w tym wielu wbudowanych ról, które można przypisać użytkownikom. Dwie najbardziej znane kontrolki to role odczytu i odczytu/zapisu, jednak czasami nie są one tak szczegółowe, jak byśmy chcieli.
Niedawno miałem okazję poznać role zdefiniowane przez użytkownika w wprowadzonej w MongoDB wersji 2.6. W tym artykule omówimy role zdefiniowane przez użytkownika MongoDB i zdefiniujemy niektóre role niestandardowe, które mogą okazać się przydatne.
-
Utwórz role w MongoDB
Tworzenie zdefiniowanej przez użytkownika roli w MongoDB jest dość proste. Możesz użyć polecenia createRole, aby utworzyć nową rolę, a ogólna składnia tworzenia ról jest następująca:
{ createRole: "<role name>", privileges: [{ resource: { <resource> }, actions: [ "<action>",] }, ], roles: [ { role: "<role>", db: "<database>" } | "<role>",], writeConcern: <write concern document> }
Przed uruchomieniem polecenia createRole upewnij się, że przełączasz się na bazę danych, w której chcesz utworzyć rolę, ponieważ zostaną one zdefiniowane tylko w bazie danych w które zostały stworzone. Jeśli chcesz utworzyć rolę, która zapewnia dostęp do więcej niż jednej bazy danych, musisz ją utworzyć w bazie danych administratora.
Omówmy główne elementy składni tworzenia ról.
-
Uprawnienia do ról
Utwórz uprawnienia dla roli zdefiniowanej przez użytkownika, dodając uprawnienia i definiując swoje działania i zasoby:
Działania związane z uprawnieniami
Akcje to zestaw operacji, które są zgrupowane razem, takie jak operacja wstawiania, która może wykonywać zarówno wstawianie, jak i tworzenie. Działania są tak szczegółowe, jak kontrola dostępu oparta na rolach MongoDB. Parametru przywileje można użyć do dodawania ról do akcji mongo, a przywilej stanowi akcje wraz z zasobem, którego dotyczy. Użyj poniższego, aby dodać akcje znajdowania, wstawiania i aktualizowania w bazie danych „mydb”.
privileges: [ {resource: {db: "mydb", collection: "" }, actions: [ “find”,”insert”,”update” ] } ]
Zasoby dotyczące uprawnień
Dokument zasobów określa zakres, w jakim będą stosowane działania związane z uprawnieniami, i można go ustawić na różnych poziomach szczegółowości w następujący sposób:
a. Kolekcja
Zasób można ustawić na zasób:
{db: "<db-name>", collection: "<collection name>" }
aby przyznać określone działania tylko tej konkretnej kolekcji.b. Baza danych
Zasób można ustawić na konkretną bazę danych, pozostawiając pusty parametr kolekcji. Zasób ciągu zasobów:
{db: "<db-name>", collection: "<collection name>" }
ustawia zakres na całą bazę danych.c. Pojedyncza kolekcja w bazach danych
Zasób można ustawić na konkretną kolekcję przy użyciu zasobu:
{db: ", collection: "<collection name>" }
nadania uprawnień do kolekcji we wszystkich bazach danych. To uprawnienie można dodać tylko do roli utworzonej w bazie danych administratora.d. Wiele kolekcji w bazach danych
Zasób można ustawić na wszystkie kolekcje (z wyjątkiem kolekcji systemowych) we wszystkich bazach danych, pozostawiając parametry db i kolekcji pusty. zasób:
{db: "", collection: "" }
. Ten zasób, podobnie jak ten powyżej, może być przyznany tylko dla roli utworzonej w bazie danych administratora.np. Zasób obejmujący cały klaster
Zasób obejmujący cały klaster można określić za pomocą zasobu:
{ cluster : true }
. Ten zasób obejmujący cały klaster jest używany do określania stanu systemu, takiego jak zamknięcie replSetReconfig, zamiast przyznawania uprawnień do konkretnego dokumentu.f. Wszystkie zasoby
Nie zaleca się używania tego zakresu w innych sytuacjach niż nadzwyczajne.
{anyResource: true }
może być użyty do ustawienia zakresu ustawionego na wszystkie zasoby. -
Role
Wbudowane role można również dodać do roli niestandardowej. Gdy wbudowana rola jest dodawana za pomocą parametru roles:[], dodaje uprawnienia wbudowanej roli do roli niestandardowej.
Oto przykład parametru roles:
roles: [{ role: "read", db: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;db name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;"}]
W tym przykładzie rola niestandardowa odziedziczyłaby wszystkie uprawnienia roli „odczyt” w zdefiniowanej bazie danych. Jeśli rola jest dziedziczona w bazie danych db1, rola niestandardowa może zostać utworzona w bazie danych db1 lub w bazie danych administratora.
Zastrzeżenia dotyczące zapisu
Zastrzeżenie dotyczące zapisu określa poziom potwierdzenia żądanego od MongoDB i może być używane do kontrolowania potwierdzeń zapisu z bazy danych. Należy zauważyć, że podczas tworzenia roli nie jest wymagana kwestia dotycząca zapisu. Problem dotyczący zapisu może zawierać pola w, j i wtimeout:
W - Problem z zapisem
Pole W może być użyte do określenia liczby instancji, do których zapis został propagowany.
J - Napisz problem
Pole J można ustawić, aby określić, czy zapis jest zapisywany w dzienniku.
Czas oczekiwania – Problem dotyczący zapisu
Służy do ustawienia czasu, w którym zapis musi osiągnąć problem z zapisem. Problem dotyczący zapisu może nadal zostać osiągnięty po zgłoszeniu błędu. Jeśli nie ustawiono limitu czasu Wtimeout i nie można spełnić problemu związanego z zapisem, zapis zostanie zablokowany na czas nieokreślony.
-
Przypisywanie ról
Niestandardowe role są specyficzne dla bazy danych i mogą być przypisane tylko do użytkownika w tej samej bazie danych.
Powiedzmy, że stworzyliśmy rolę „myrole” w bazie danych „db1”. Możemy utworzyć użytkownika w bazie danych za pomocą następujących poleceń:
Use db1 db.createUser({"user" : "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;user&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;",pwd: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;password&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;","roles" : [{"role" : "myrole", "db" : "db1"}]})
Więcej informacji na temat zarządzania użytkownikami można znaleźć w tym poście autorstwa Dharshana na temat zarządzania użytkownikami w MongoDB.
-
Niestandardowe role użytkownika
Omówmy kilka niestandardowych ról, które mogą być przydatne.
Pojedyncza baza danych — uprawnienia do odczytu, wstawiania i aktualizacji
Wbudowane role odczytu i odczytu i zapisu mogą czasami wydawać się zbyt wiele uprawnień lub za mało. Zobaczmy, jak możemy stworzyć niestandardową rolę, przyznając tylko uprawnienia do odczytu, wstawiania i zapisu.
Już wiemy, że potrzebujemy wszystkich uprawnień do odczytu, abyśmy mogli dodać wbudowaną rolę „odczyt” do naszej niestandardowej roli. Potrzebujemy też uprawnień do tworzenia i aktualizowania dokumentów, które można dodać, dodając uprawnienia do czynności wstawiania i aktualizowania. Jeśli chcielibyśmy dać użytkownikowi możliwość tworzenia indeksu i tworzenia kolekcji, możemy dodać uprawnienia akcji createIndex i createCollection.
Dla zakresu, załóżmy, że mam bazę danych o nazwie „db1”, na której ustawiłem powyższe uprawnienia. Polecenie tworzenia wyglądałoby mniej więcej tak:
Use db1. db.createRole( { createRole: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;role-name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;", privileges: [ { resource: { db: "db1", collection: "" }, actions: [ "insert","update","createIndex", "createCollection" ] } ], roles: [{ role: "read", db: "db1"}] })
Powyższe polecenie utworzy rolę z
<role-name>
w bazie danych db1. Użytkownik, któremu przyznano uprawnienia przez powyższą rolę, nie będzie miał akcji „usuń” uprawnienia. Pamiętaj też, że metod db.collection.findAndModify(), db.collection.mapReduce() i db.collection.aggregate() nie można uruchomić w pełni, ponieważ wymagają one uprawnienia do usuwania.Wszystkie bazy danych — uprawnienia do odczytu, wstawiania i aktualizacji
Możemy utworzyć rolę w bazie danych administratora podobną do powyższej, aby przyznać uprawnienia do odczytu, tworzenia i aktualizacji we wszystkich bazach danych. Ta rola powinna zostać utworzona w bazie danych administratora, a kolejny użytkownik powinien również zostać utworzony w bazie danych administratora.
W tej roli, zamiast używać standardowej roli odczytu, możemy dziedziczyć uprawnienia z roli readAnyDatabase. Tworzenie roli wyglądałoby mniej więcej tak:
Use admin. db.createRole( { createRole: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;role-name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;", privileges: [ { resource: { db: "", collection: "" }, actions: [ "insert","update","createIndex", "createCollection" ] } ], roles: [{ role: "readAnyDatabase", db: "admin"}] })
Role pisarza związane z zapisem
Jeśli masz scenariusz, w którym należy wymusić obawy związane z zapisem, oto jak można je dodać do roli. Dodanie problemu dotyczącego zapisu do roli wymusiłoby to na wszystkich użytkownikach przyznanych w ramach tej roli w bazie danych. Zdefiniujmy rolę z problemem zapisu, który wymusza większość zapisów:
Use admin. db.createRole( { createRole: "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;role-name&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;", privileges: [ ], roles: [{ role: "readWriteAnyDatabase", db: "admin"}], writeConcern: { w: “majority”, j: false, wtimeout: 300 } })