MikoAndras.hu

Mikó András

MySQL jogosultság-szervezés

Weben elérhető szolgáltatás esetén sokszor előkerülhet a probléma, miként garantáljuk, hogy az Ügyfeleink ne keveredjenek mások adatai közé, illetve ugyanezt megfordítva, mivel biztosíthatjuk Őket, hogy más sem téved az Övékbe?

Az egyik megoldás bonyolult rekord-szintű ellenőrzéseket végrehajtani az adattáblákon, viszont ezeket felépíteni, fenntartani és módosítás esetén tesztelni szintén bonyolult.

Alternatív megoldásként saját adatbázist nyitunk minden Ügyfélnek, és olyan felhasználóval kapcsolódunk az adatbázishoz, amelyik csak azt az egyet képes olvasni/módosítani.

A felépítés lépései

Back-end oldalon

A tényleges megvalósítás lépéseiben fel kell vennünk egy adatbázist, ami az ügyféladatbázisok neveit és a hozzáféréseket tartalmazza.

CREATE DATABASE mester;
CREATE TABLE hozzaferesek (
  hf_adatbazis VARCHAR(30) NOT NULL PRIMARY KEY comment 'jsz_ elotag szukseges',
  hf_felhasznalo VARCHAR(15) NOT NULL,
  hf_jelszo VARCHAR(15) NOT NULL
);
GRANT ALL ON mester.* TO 'hfmester' IDENTIFIED BY 'hfmester';

Egyúttal létrehoztunk egy felhasználót is, aki majd az adatokat fogja tudni karbantartani.

Egy új ügyfél felvétele esetén az alábbi lépéseket kell tehát végrehajtani:

Új alapadatbázis létrehozása

Az új adatbázis létrehozásánál figyelni kell az előtag használatára, erre később fogok még utalni.

CREATE DATABASE jsz_ujugyfel;

Majd ezután kódból létrehozva, vagy mentésből betöltve létrehozzuk a táblákat is. (Ennek részletezése a téma szempontjából szükségtelen.)

Mester-táblában bejegyzés létrehozása

Egyelőre semmi mást nem csinálunk, mint feljegyezzük, hogy a jsz_ujugyfel adatbázis is elérhető, a mellékelt névvel és jelszóval (ezek mysql elérési adatok, nem a webfelületen használatosak!).

INSERT INTO mester.hozzaferesek (hf_adatbazis, hf_felhasznalo, hf_jelszo)
  VALUES ('jsz_ujugyfel', 'ujugyfelnev', 'ujugyfeljelszo');

Ahhoz, hogy el is tudjuk érni az új adatbázist, létre kell hoznunk a megfelelő felhasználót, aki az új adatbázisra van korlátozva.

Az új felhasználónak jogosultságot adni

Az újonnan létrejött adatbázishoz az alábbi módon tudunk jogot adni:

GRANT ALL ON jsz_ujugyfel.* TO 'ujugyfelnev' IDENTIFIED BY 'ujugyfeljelszo';

Ezzel azonban két probléma is van.

Az első, hogy ezt csak a root – vagy vele egyenrangú – felhasználóval tudjuk kiadni.

Mivel én nem szeretek root felhasználóval tevékenykedni, illetve más adatbázisok is helyet kaphatnak a szerveren, nem csak ehhez a rendszerhez tartozóak, ezért ki kell neveznünk egy felhasználót, akinek elég széles körű jogosultsága van, hogy az új adatbázisokhoz delegálni tudjon.

Itt lesz hasznos, hogy az ügyfelek adatbázisai előtagot kapnak.

A delegáló felhasználónk egyszerre kaphat az összes előtaggal rendelkező – és egyben a jövőben ilyen módon létrehozott – adatbázisunkhoz.

GRANT ALL ON `jsz\_%`.* TO 'hfdelegalo' IDENTIFIED BY 'hfdelegalo' WITH GRANT OPTION;

Ilyen módon megadtunk minden jogosultságot a hfdelegalo felhasználónknak a jsz_ előtaggal rendelkező adatbázisokhoz. A with grant option rész pedig engedélyezi, hogy a meglévő jogait másra átruházza.

Az utasítás elején szereplő `jsz\_%` pedig rögtön a – korábban említett – második hibát javítja. Ennek a lényege, hogy a '_' karakter mysql-ben speciális jel az ‘egy bármilyen karakter’ értelemmel bír. Éppen ezért a korábbi utasítással az ujugyfelnev nevű felhasználónk nem csak a jsz_ujugyfel adatbázishoz kapott volna hozzáférést, hanem a jsz1ujugyfel, jsz2ujugyfel, jszAujugyfel, … adatbázisokhoz is.

Ennek kivédésére körülírt formában kell megadnunk, hogy a '_' esetében a tényleges karakterre szeretnénk szorítkozni, nem pedig a speciális értelmében használni azt.

Ezek után pedig az újonnan létrejött delegáló-felhasználónk már képes lesz a szándékaink szerinti korlátozott hozzáférést megadni az ügyfél-adatbázishoz.

GRANT ALL ON `jsz\_ujugyfel`.* TO 'ujugyfelnev' IDENTIFIED BY 'ujugyfeljelszo';

Ő már nem delegálhatja tovább a jogait, és jelen formában csak az egy megjelölt adatbázishoz fér hozzá.

Front oldalon

Értelemszerűen kell, hogy legyen egy adatbázis-felhasználónk a központi adatbázis olvasására is, aki azt sem írni, sem más adatbázishoz hozzáférni nem tud.

GRANT SELECT ON mester.hozzaferesek TO 'hfolvaso' IDENTIFIED BY 'hfolvaso';

Használat

A futtatás során az alábbi lépéseknek követik egymást:

  • az alkalmazás belép a hfolvaso felhasználóval a mester adatbázisba, és lekérdezi az alkalmazást indító ügyfélhez tartozó adatokat (adatbázis, név, jelszó)
  • ezután átvált az újonnan megszerzett ismeretek által meghatározott adatbázisra
  • az alkalmazás teljes mellszélességgel garázdálkodik a megjelölt adatok között, a legkisebb esélye nélkül, hogy más ügyfél adataiban kárt lenne képes tenni

Összefoglalás

A kicsit kusza ismertető után röviden és tömören az elkészítés lépései, az utasításblokkok elején megjelölve, hogy melyik felhasználóval és mikor kell végrehajtani.

mysql-root – egyszer az alkalmazás telepítésénél

CREATE DATABASE mester;
CREATE TABLE hozzaferesek (
  hf_adatbazis VARCHAR(30) NOT NULL PRIMARY KEY comment 'jsz_ elotag szukseges',
  hf_felhasznalo VARCHAR(15) NOT NULL,
  hf_jelszo VARCHAR(15) NOT NULL
);
 
GRANT ALL ON mester.* TO 'hfmester' IDENTIFIED BY 'hfmester';
GRANT SELECT ON mester.hozzaferesek TO 'hfolvaso' IDENTIFIED BY 'hfolvaso';
 
GRANT ALL ON `jsz\_%`.* TO 'hfdelegalo' IDENTIFIED BY 'hfdelegalo' WITH GRANT OPTION;

hfmester – minden új ügyfél felvételekor

INSERT INTO mester.hozzaferesek (hf_adatbazis, hf_felhasznalo, hf_jelszo)
  VALUES ('jsz_ujugyfel', 'ujugyfelnev', 'ujugyfeljelszo');

hfdelegalo – minden új ügyfél felvételekor

CREATE DATABASE `jsz\_ujugyfel`;
GRANT ALL ON `jsz\_ujugyfel`.* TO 'ujugyfelnev' IDENTIFIED BY 'ujugyfeljelszo';

Itt értelemszerűen az aktuálisan létrehozott ügyfélhez tartozó adatokat adjuk meg, ahogy az előbbi insert esetében is.

Ügyfél végleges törlése esetén – a megfelelő mentések elkészítése után – az utolsó három utasítást kell érvényteleníteni.

hfdelegalo – ügyfél törlése esetén

REVOKE ALL ON `jsz\_ujugyfel`.* FROM 'ujugyfelnev';
DROP DATABASE `jsz\_ujugyfel`;

hfmester – ügyfél törlése esetén

DELETE FROM mester.hozzaferesek  WHERE hf_adatbazis = 'jsz_ujugyfel';

De ez igazából már csak kiegészítés.

,

Comments are currently closed.