[MySQL] selektywne uprawnienia

0

Witam
Uczę się MySQLa + Delphi (ZEOSLib) i nie bardzo wiem, jak rozwiązać problem bezpieczeństwa. Poleceniem GRANT mogę ustawić uprawnienia do poziomu kolumny (nazwijmy je pionowe). Czy można ustawić uprawnienia "poziome"? Chodzi mi o to, że w moim programie, użytkownik ma dopisywać pewne informacje do bazy i - w zależności od poziomu uprawnień - odczytywać te informacje, modyfikować i powtórnie zapisywać: tylko swoje, pewnych grup lub całości.
Muszę więc każdemu nadać uprawnienia select, insert, update i delete. Oczywiście z poziomu aplikacji mogę odpowiednio używać klauzuli WHERE, która zapewni prawidłową funkcjonalność (po ID użytkownika lub poziomie uprawnień). Ale jeżeli ktoś użyje innego narzędzia, to mając SELECT wydostanie wszystkie rekordy.

  1. Czy istnieje jakaś warstwa pośrednia na serwerze (zakładam dostęp do bazy przez Internet, aplikacja kliencka w Delphi), która może sprawdzić legalność otrzymanego zapytania (czyli czy ten użytkownik może pytać o taki zestaw rekordów)?
    Jeżeli nie, to
  2. Czy silnik bazy danych, po zalogowaniu użytkownika może wygenerować po stronie serwera tabelę zawierającą tylko dopuszczane dla niego rekordy?
    Będę wdzięczny za wskazówki.
0

MySQL jest troche toporny jesli chodzi o ustawienia ale sie da cos zrobic popatrz na dokladny opis funkcji GRANT.

Natomiast jesli potrzebujesz aby user 1 mial rekordy od 0 do 100 user 2 od 300 do 444 to mozna takie informacje zapisac w bazie a userom udostepnic funkcje skladowana (i pytanie czy user loguje sie z wlasnym haslem - no bo tylko wtedy mozna mowic o takim rozwiazaniu - czy tez user w aplikacji ma wspolne haslo a dane dostaje po jakims tam ID ktore dostaje logujac sie drugi raz).

Generlanie dostep do bazy danych (poprzez aplikacje) powinien byc zapewniony przez cos co obudowywuje taka komunikacje.

0

Dzięki - mam już kierunek poszukiwań :)

0

Wracam niestety z dalszymi pytaniami. Funkcje składowanie teoretycznie mogły by posłużyć do filtrowania rekordów, ale pod jednym warunkiem - gdy zostaną wywołane!
Co jednak, gdy użytkownik użyje normalnej konsoli i otworzy bazę danych?
Podał swoje dane adresowe, więc powinien mieć dostęp do kartoteki klientów, aby swoje dane aktualizować, wyciągać itp., ale nie powinien mieć podglądu wszystkich klientów (o danych bardziej wrażliwych nie wspominając, typu dane karty kredytowej). Podobnie z kartoteką zamówień - musi mieć podgląd na listę np. zamówionych książek, ale nie może mieć dostępu do kartoteki całej firmy (z możliwością modyfikacji zresztą).
Pytam więc, czy istnieje mechanizm działający po stronie serwera bazy danych, który pozwala kontrolować, które rekordy tabeli mogą być legalnie udostępnione użytkownikowi o określonych uprawnieniach.

1

Zle podchodzisz do sparwy

W admin

mysql> use test;
Database changed
mysql> CREATE TABLE test (A INT, B INT);
Query OK, 0 rows affected (0.53 sec)
mysql> INSERT INTO test VALUES(2,4);
Query OK, 1 row affected (0.05 sec)
mysql> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
Query OK, 0 rows affected (0.13 sec)

logujemy sie na konto monty

mysql> use test;
ERROR 1044 (42000): Access denied for user 'monty'@'localhost' to database 'test

i nic nie mamy uprawnien bo nic mu nie dalismy

wchodzimy do admina

mysql> delimiter //
mysql>
mysql> CREATE PROCEDURE tylkoA ()
    -> BEGIN
    ->   SELECT A FROM test.test;
    -> END//
Query OK, 0 rows affected (0.08 sec)
mysql> delimiter ;

i potem do monty

mysql> CALL test.tylkoA();
ERROR 1370 (42000): execute command denied to user 'monty'@'localhost' for routi
ne 'test.tylkoA'

nie mamy dostepu
wchodzimy do admina

mysql> GRANT EXECUTE ON PROCEDURE test.tylkoA TO 'monty'@'localhost';
Query OK, 0 rows affected (0.23 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.06 sec)

i znow do monty

mysql> CALL test.tylkoA();
+------+
| A    |
+------+
| 2    |
+------+
1 row in set (0.02 sec)

Query OK, 0 rows affected (0.02 sec)

mysql> SELECT * FROM test.test;
ERROR 1142 (42000): SELECT command denied to user 'monty'@'localhost' for table
'test'

ma dostep tylko do select z A dalej mozna oczywiscie rozbudowywac ale tez zerknal bym na mysql.columns_priv. Procedury pozwalaja na nalozenie dodatkowych warunkow np w where i z current_user.

0

i tego mi właśnie brakowało - jesteśś genialny :) :) :)

0

I kolejne pytanie
Czy MySQL ma system uprawnień oparty o grupy? To było by zdecydowanie wygodniejsze, zamiast definiować każdemu kilkadziesiąt uprawnień do tabel i procedur, zrobić to raz dla grupy, a użytkownika tylko przydzielić do określonych grup

0

jest chyba tylko w obietnicach na razie

0

Kolejne pytania:

  1. czy po stronie serwera jest dostępna zmienna zawierająca nazwę zalogowanego użytkownika
  2. czy proces logowania może automatycznie wywoływać jakąś procedurę, która wprowadzi do zmiennej globalnej usr_ID. Triggery obsługują INSERT, UPDATE i DELETE, ale logowania nie znalazłem.
    Uzywam ZEOSLIB gdzie podaję w kontrolce user/pass/adres serwera, ale chodzi mi o procedurę po stronie serwera, która będzie ustali, komu udostępniamy dane.
0

odświeżam...

0
select user(), current_user();

A wystarczyłoby zapytać google zamiast odświeżać...
2. http://www.fromdual.com/sites/default/files/logon_trigger_wp.pdf też chwila z google.

0

generalnie slabo z czytaniem i szukaniem, bo odpowiedz padla w trakcie > current_user

0

oj słabo ;) dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1