MongoDB: Authentifizierung aktivieren

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“.

  1. Wechseln in die „admin“ Datenbank
  2. User anlegen mit db.createUser
  3. 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 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.