Standardmäßig ist bei MongoDB keine Authentifizierung aktiv was einigen Entwicklern bereits auf die Füße gefallen ist.
Schlecht gesicherte MongoDB-Datenbanken erneut im Visier von Ransomware | heise online
Deshalb empfiehlt es sich auch wenn die Datenbank nur auf localhost läuft immer die Authentifizierung einzuschalten, wer weiß wer morgen das umstellt und die DB im Netz steht :-/
Informationen von MongoDB findet Ihr hier: Authentication — MongoDB Manual und welche Standard Rollen es gibt finder Ihr hier: Built-In Roles — MongoDB Manual
Ihr müsst darauf achten welche Version Ihr im Einsatz habt, per Default wird bei Ubuntu 20.04 LTS z.B. Version 3.6.8 installiert. In den 2 Arikeln von MongoDB könnt Ihr links oben die Version wechseln zu der Version die Ihr installiert habt. Die Beschreibung bezieht sich auf die Default Version die mit Ubuntu 20.04 LTS kommt.
Hier die Zusammenfassung:
Erstellen eines Root Admins
Geht in die mongo Shell mit dem Befehl „mongo“.
- Wechseln in die „admin“ Datenbank
- User anlegen mit db.createUser
- Ergebnis überprüfen mit „show users“
root@django:~# mongo MongoDB shell version v3.6.8 connecting to: mongodb://127.0.0.1:27017 Implicit session: session { "id" : UUID("7573085e-08d6-496f-b7b1-1df270d99c1b") } MongoDB server version: 3.6.8 Welcome to the MongoDB shell. For interactive help, type "help". > use admin switched to db admin > db.createUser( { user: "root", pwd: "password", roles: [ "root" ] }) > show users { "_id" : "admin.root", "user" : "root", "db" : "admin", "roles" : [ { "role" : "root", "db" : "admin" } ] }
Erstellen einer Test DB und eines Users
> db.createUser({ user: "test", pwd: "supersecret", roles: [ { role:"readWrite", db: "test" } ] } ) Successfully added user: { "user" : "test", "roles" : [ { "role" : "readWrite", "db" : "test" } ] } > exit bye
Authentifizierung aktiveren in mongod.conf
nano /etc/mongod.conf
Die auskommentierte Zeile „auth = true“ aktivieren.
... # Turn on/off security. Off is currently the default #noauth = true auth = true ...
Anschließend den Service mongod neu starten.
service mongodb restart
Ergebnis testen
Erster Versuch: Anlegen eines Users
> use admin switched to db admin > db.createUser({user: "boo", pwd: "foobar", roles:[{role: "readWrite", db: "test"}]}) 2021-04-14T20:45:29.343+0200 E QUERY [thread1] Error: couldn't add user: there are no users authenticated : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype.createUser@src/mongo/shell/db.js:1437:15 @(shell):1:1
Wie zu erwarten hat das Anlegen eines Users nicht funktioniert, wir sind nicht authentifiziert mit einem berechtigten User.
Zweiter Versuch: Anzeigen der User
> show users 2021-04-14T20:45:51.653+0200 E QUERY [thread1] Error: there are no users authenticated : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype.getUsers@src/mongo/shell/db.js:1686:1 shellHelper.show@src/mongo/shell/utils.js:843:9 shellHelper@src/mongo/shell/utils.js:750:15 @(shellhelp2):1:1
Same here …
Dritter Versuch: Anzeigen der Datenbanken
> show dbs 2021-04-14T20:46:21.013+0200 E QUERY [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "there are no users authenticated", "code" : 13, "codeName" : "Unauthorized" } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 Mongo.prototype.getDBs@src/mongo/shell/mongo.js:67:1 shellHelper.show@src/mongo/shell/utils.js:860:19 shellHelper@src/mongo/shell/utils.js:750:15 @(shellhelp2):1:1
Same here …
Vierter Versuch: Anmelden mit testuser
> db.auth("test","supersecret") 1
Das Anmelden wird bestätigt mit einer „1“ => OK.
Fünfter Versuch: Mit test User Anzeige der Datenbanken
> show dbs 2021-04-14T20:48:25.944+0200 E QUERY [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0, lsid: { id: UUID(\"3cc6ec7e-5270-4a83-9a4b-8cbf42e0aab4\") }, $db: \"admin\" }", "code" : 13, "codeName" : "Unauthorized" } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 Mongo.prototype.getDBs@src/mongo/shell/mongo.js:67:1 shellHelper.show@src/mongo/shell/utils.js:860:19 shellHelper@src/mongo/shell/utils.js:750:15 @(shellhelp2):1:1
Der test User hat keine Berechtigung zum Anzeigen der Datenbanken.
Sechster Versuch: Anlegen einer Collection in der test DB
> use test > db.createCollection("testcoll") { "ok" : 1 }
Der test User darf in der DB test neue Collections anlegen da er „readWrite“ Rechte hier besitzt.
Siebter Versuch: Anlegen eines Record, lesen und löschen
> db.createCollection("testcoll") { "ok" : 1 } > db.testcoll.insert({"foo": "bar"}) WriteResult({ "nInserted" : 1 }) > db.testcoll.find() { "_id" : ObjectId("6077feb74ea6ed2ca4de2a46"), "foo" : "bar" } > db.testcoll.remove({"_id": ObjectId("6077feb74ea6ed2ca4de2a46")}) WriteResult({ "nRemoved" : 1 }) > db.testcoll.find() >
Gleiches gilt auch für das Anlegen, lesen und löschen.
Achter Versuch: Anlegen eines Records und Versuch den Record zu lesen ohne Authentifizierung
> db.testcoll.insert({"foo": "bar"}) WriteResult({ "nInserted" : 1 }) > exit bye root@django:~# mongo MongoDB shell version v3.6.8 connecting to: mongodb://127.0.0.1:27017 Implicit session: session { "id" : UUID("99ea67e6-5ac2-4771-9ae2-ec295153bfd1") } MongoDB server version: 3.6.8 > use test switched to db test > db.testcoll.find() Error: error: { "ok" : 0, "errmsg" : "there are no users authenticated", "code" : 13, "codeName" : "Unauthorized" } >
Als nicht authentifizierter User habe ich keine Rechte auf Daten innerhalb der test Datenbank zuzugreifen.
Falls Ihr mehr Infos haben wollt wie Ihr mit pymongo und Python mit einer MongoDB sprechen könnt => MongoDB und Python – LANbugs