Auth v MongoDB Replica Setu

Pro jednu ze svých aplikací používám jak storage engine MongoDB. Abych o data nepřišel, jsou ukládána současně na 3 serverech v ReplicaSetu. V případě pádu jednoho ze serverů jsou data dostupná na některém dalším serveru. Redudance, vedle samotné dostupnosti dat, je dobrá i k tomu, když například potřebujete zhodit některý server, například kvůli instalaci nového jádra.

Ale aby bylo vše jak má, je krom samotné dostupnosti dat, potřeba zajistit i bezpečnost přístupu k nim, respektive samotnou autentifikaci v MongoDB na ůrovni Replica Setu.

Jak na to

1. start

Nastartovat mongod proces na jednom ze serverů na kterém poběží jedotlivé servery replica setu. Proces je potřeba spustit bez paramettu –auth. Měla by být specifikovaná cesta k datům skrze parametr –dbpah a samozřejmě –port 29002 na kterém server poběží.

2. vytvoření administrátorských účtů

Přihlásit se k nastatovanému MongoDB serveru:

mongo --port 29002

Vytvořit 2 účty:

use admin;
userAdmin = {
  user: 'admin,
  pwd: '123456', // nejake poradne heslo
  roles: [{ role: 'userAdminAnyDatabase', db: 'admin' }]
};
userRoot = {
  user: 'root',
  pwd: '123456', // nejake poradne heslo
  roles: [ { role: 'root', db: 'admin' } ]
};
db.createUser(userAdmin);
db.createUser(userRoot);

Hotovo. Vyskočit z mongo shellu.

3. zastavit běžící mongo server

ps aux | grep -v grep | grep mongod 
kill $PID_MONGO_SERVERU

4. vytvořit klíč společný pro všechny servery v replica setu

openssl rand -base64 741 > muj-momngo-klic
chmod 600 muj-mongo-klic

5. distribuce klíče na servery

Je potřeba bezpečně rozdistribuovat klíč na všechny servery v ReplicaSetu. Taky nastavit práva na 0600.

6. nastartování serverů replica setu

Na všech serverech v replica setu nastatovat mongod proces s parametry –keyFile a –replSet

mongod --keyFile /cesta/k/memu/klici/muj-mongo-klic --replSet "nazevRS"

7. připojit se k mongo serveru

Ale pouze k tomu, kde se vytvářeli uživatelské účty admin a root.

mongo --port 29002

A potom v mongo shellu

8. inicializace ReplicaSetu

rs.initiate();

9. ověření konigurace ReplicaSetu

V tom stejném mongo shellu bez nutnosti vyskakovat:

rs.conf();

Měli byste dostat objekt s jednim členem v members.

10. přidání ostatních členů ReplicaSetu

Opět v mongo shellu:

rs.add('v2:29002');
rs.add('v3:29002');

11. kontrola stavu ReplicaSetu

Stále v mongo shellu:

rs.status();

Výsledkem by měl být objekt, který už obsahuje info o všech serverech v ReplicaSetu.

12. vytvoření samotného účtu pro replikovanou databázi

Stále v mongo shellu:

use nazevMojiDatabaze;
u = {
  user: 'pepa', // nebo nejake prihlasovaci jmeno
  pwd: '123456', // nebo jine supertajne heslo
  roles: [{role: 'dbOwner', db: 'nazevMojiDatabaze'}]
};
db.createUser(u);

Hotovo!

Pak už se lze na ostatních serverech v ReplicaSetu přihlásit k dané databázi:

mongo --host v2 --port 29002

v mongo shellu pak

use nazevMojiDatabaze;
db.auth('pepa', '123456');

Zdroj