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 29002v mongo shellu pak
use nazevMojiDatabaze; db.auth('pepa', '123456');