INF.03 · Bazy danych i SQL

Uprawnienia: komu pozwolić na ile

W firmie księgowa może odczytywać i dodawać faktury, ale nie powinna usuwać całych tabel. Za to odpowiada administrator, który nadaje konta i dobiera dla nich dokładnie tyle uprawnień, ile trzeba. Na koncie root z XAMPP-a możesz wszystko, i właśnie dlatego nie powinna się na nim opierać żadna prawdziwa aplikacja.

  • około 35 minut
  • CREATE USER · GRANT · REVOKE
  • zasada najmniejszych uprawnień

Po tej lekcji: utworzysz konto, nadasz mu minimalne uprawnienia, odbierzesz jedno z nich i sprawdzisz skutek poleceniem SHOW GRANTS.

1 · Słownik

Co oznaczają uprawnienia w MySQL i MariaDB

Uprawnienie to zgoda na jeden rodzaj operacji. Można ją nadać na całą bazę, na jedną tabelę, a nawet na jedną kolumnę.

UprawnieniePozwalaKto zwykle go potrzebuje
SELECTodczytywać danekażdy, kto ogląda raporty
INSERTdodawać rekordysprzedawca dodający zamówienia
UPDATEzmieniać danepracownik poprawiający stany magazynowe
DELETEusuwać rekordyrzadko: administrator danych
CREATE, ALTERtworzyć i zmieniać strukturęprogramista, administrator
DROPusuwać tabele lub bazytylko administrator
ALL PRIVILEGESwszystko naraznikt „na wszelki wypadek”
Podstawowa zasada: każdemu tyle uprawnień, ile potrzebuje do pracy, i ani jednego więcej.

2 · Teraz Ty

Nadaj uprawnienia trzem kontom

Baza sklep_muzyczny i trzy role: czytelnik ogląda dane, sprzedawca ogląda produkty i dodaje zamówienia, raporty ma tylko odczyt wszystkiego. Zaznacz uprawnienia dla każdego konta (zakładki). Polecenia GRANT pojawiają się na bieżąco, a testy poniżej od razu pokazują, czy konto robi to, co powinno.

Ta interakcja wymaga włączonego JavaScriptu.

Uprawnienie na „całą bazę” działa też na każdą tabelę. Dlatego konto raporty z SELECT na całą bazę przechodzi testy bez osobnych wpisów dla tabel.

3 · Jak to zapisać

CREATE USER, GRANT i REVOKE

Konta tworzysz poleceniem CREATE USER, uprawnienia nadajesz przez GRANT, a odbierasz przez REVOKE. Zawsze sprawdź skutek poleceniem SHOW GRANTS.

uprawnienia.sqlsql
CREATE USER 'czytelnik'@'localhost' IDENTIFIED BY 'Test123!';
GRANT SELECT ON sklep_muzyczny.* TO 'czytelnik'@'localhost';

CREATE USER 'sprzedawca'@'localhost' IDENTIFIED BY 'Test123!';
GRANT SELECT ON sklep_muzyczny.Produkty TO 'sprzedawca'@'localhost';
GRANT SELECT, INSERT ON sklep_muzyczny.Zamowienia TO 'sprzedawca'@'localhost';

REVOKE INSERT ON sklep_muzyczny.Zamowienia FROM 'sprzedawca'@'localhost';
SHOW GRANTS FOR 'sprzedawca'@'localhost';

DROP USER 'czytelnik'@'localhost';
  1. sklep_muzyczny.* oznacza wszystkie tabele tej bazy. sklep_muzyczny.Produkty oznacza jedną tabelę.
  2. 'czytelnik'@'localhost' konto składa się z nazwy i miejsca, z którego wolno się łączyć.
  3. REVOKE odbiera pojedyncze uprawnienie. Pozostałe zostają.
  4. FLUSH PRIVILEGES; nie jest potrzebne po GRANT i REVOKE. Potrzebujesz go dopiero po ręcznej edycji tabel systemowych.
  5. Hasło Test123! to hasło testowe z ćwiczenia. W prawdziwym systemie hasło jest długie i tajne.
Grants for sprzedawca@localhost
GRANT USAGE ON *.* TO sprzedawca@localhost
GRANT SELECT ON sklep_muzyczny.produkty TO sprzedawca@localhost
GRANT SELECT ON sklep_muzyczny.zamowienia TO sprzedawca@localhost
Wynik SHOW GRANTS po REVOKE: sprzedawca ma tylko odczyt. Próba INSERT kończy się: ERROR 1142 (42000): INSERT command denied.

4 · Zanim się pomylisz

Trzy pomyłki w zarządzaniu kontami

Rozwiń każdą z nich.

Praca na koncie root
Tak nie
Aplikacja sklepu łączy się z bazą jako root.

Jeśli aplikacja ma lukę (na przykład SQL injection), atakujący dostaje pełne prawa do całego serwera.

Tak
Aplikacja używa konta z uprawnieniami SELECT, INSERT, UPDATE tylko na swoich tabelach.

Ograniczone konto ogranicza też skutki błędu.

ALL PRIVILEGES „na wszelki wypadek”
Tak nie
GRANT ALL PRIVILEGES ON sklep_muzyczny.* TO 'sprzedawca'@'localhost';

Sprzedawca może usunąć dane, a nawet całe tabele. Zwykle potrzebuje tylko odczytu i dodawania zamówień.

Tak
GRANT SELECT ON sklep_muzyczny.Produkty TO 'sprzedawca'@'localhost';
GRANT SELECT, INSERT ON sklep_muzyczny.Zamowienia TO 'sprzedawca'@'localhost';

Zasada najmniejszych uprawnień: tylko to, co potrzebne do pracy.

Zapomniane sprzątanie kont testowych
Tak nie
-- ćwiczenie skończone, konto zostaje
CREATE USER 'czytelnik'@'localhost' IDENTIFIED BY 'Test123!';

Konto z prostym hasłem zostaje na serwerze i staje się furtką.

Tak
DROP USER 'czytelnik'@'localhost';

Po ćwiczeniu usuń konta testowe.

5 · Sprawdź sam siebie

Zarządzanie kontami: lista kontrolna

Na egzaminie sprawdzane jest, czy umiesz utworzyć użytkownika i określić dla niego uprawnienia.

Podsumowanie

Co warto zapamiętać

  1. CREATE USER tworzy konto, GRANT nadaje uprawnienia, REVOKE je odbiera, SHOW GRANTS pokazuje stan.
  2. Uprawnienia można nadać na bazę, tabelę lub kolumnę.
  3. Zasada najmniejszych uprawnień: tylko to, co potrzebne.
  4. Nie pracuj na koncie root na co dzień.
  5. Zablokowana operacja kończy się błędem command denied.

Dalej na swoim koncie

Rozgrzewki, quiz i zadania są w biurku ucznia.

Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.

Zaloguj się →
Źródła i dalsza nauka