jakubszpil

Bezpieczeństwo baz danych

📆
/
5 minut czytania

Bezpieczeństwo bazy danych to podstawa ochrony danych osobowych, firmowych i finansowych. Nawet najlepsza baza jest podatna na ataki, błędy użytkowników czy awarie sprzętu, jeśli nie zadbamy o jej zabezpieczenie. Poznaj praktyczne zasady, narzędzia i realne przykłady, które pomogą Ci zabezpieczyć Twoją bazę!

>>Spis treści

  1. Dlaczego bezpieczeństwo baz danych jest ważne?
  2. Typowe zagrożenia
  3. Uprawnienia i zarządzanie użytkownikami
  4. Szyfrowanie danych
  5. Kopie zapasowe (backup) i odtwarzanie danych
  6. Audyt i monitorowanie
  7. Bezpieczne praktyki programistyczne
  8. Aktualizacje i zarządzanie podatnościami
  9. Bezpieczeństwo fizyczne i sieciowe
  10. Praktyczne zadania
  11. Podsumowanie

>>Dlaczego bezpieczeństwo baz danych jest ważne?


>>Typowe zagrożenia

>>>SQL Injection

Opis:
Najpopularniejszy atak na aplikacje korzystające z baz – polega na przesłaniu złośliwego fragmentu SQL np. przez formularz. Może prowadzić do kradzieży lub usunięcia danych, modyfikacji kont czy przejęcia kontroli nad bazą.

Przykład ataku:
Załóżmy, że użytkownik podaje login, a aplikacja wykonuje zapytanie (NIEBEZPIECZNE!):

query = "SELECT * FROM Uzytkownicy WHERE login = '" + login + "';"

Jeśli użytkownik wpisze admin' OR '1'='1, zapytanie stanie się:

SELECT * FROM Uzytkownicy WHERE login = 'admin' OR '1'='1';

Co zwróci wszystkich użytkowników!

Bezpieczna wersja (parametryzacja):

cursor.execute("SELECT * FROM Uzytkownicy WHERE login = %s;", (login,))

Dodatkowe przykłady:

Jak się bronić?


>>>Utrata danych


>>>Nieautoryzowany dostęp


>>>Wycieki i kradzież danych


>>>Ataki typu ransomware i DDoS


>>Uprawnienia i zarządzanie użytkownikami

>>>Przykłady nadawania uprawnień

>>>Zasada minimalnych uprawnień


>>Szyfrowanie danych

>>>Szyfrowanie "w spoczynku"

>>>Szyfrowanie "w tranzycie"

>>>Szyfrowanie wybranych pól (danych wrażliwych)


>>Kopie zapasowe (backup) i odtwarzanie danych

>>>Rodzaje backupów

>>>Bezpieczne przechowywanie backupów

Przykład backupu MySQL:

mysqldump -u user -p baza > baza_backup.sql

>>Audyt i monitorowanie

>>>Rejestrowanie operacji (logi)

>>>Przykłady alertów i monitoringu


>>Bezpieczne praktyki programistyczne

>>>Przykłady kodu bezpiecznego i podatnego

Podatny na SQL Injection:

login = input("Podaj login: ")
query = "SELECT * FROM Uzytkownicy WHERE login = '" + login + "';"
cursor.execute(query)

Bezpieczny:

login = input("Podaj login: ")
cursor.execute("SELECT * FROM Uzytkownicy WHERE login = %s;", (login,))

>>>Walidacja i sanityzacja danych


>>Aktualizacje i zarządzanie podatnościami


>>Bezpieczeństwo fizyczne i sieciowe


>>Praktyczne zadania

>>>Zadanie 1: SQL Injection

Zidentyfikuj i popraw podatny na SQL Injection fragment kodu:

# NIEBEZPIECZNE!
query = "SELECT * FROM Uzytkownicy WHERE login = '" + login + "';"
Pokaż rozwiązanie

Bezpieczne rozwiązanie (przykład w Pythonie z parametryzacją):

cursor.execute("SELECT * FROM Uzytkownicy WHERE login = %s;", (login,))

Wyjaśnienie:
Parametryzacja przekazuje dane osobno od zapytania – nawet jeśli użytkownik wpisze złośliwy kod, nie zostanie on wykonany jako SQL.


>>>Zadanie 2: Uprawnienia

Zaproponuj sposób nadania tylko niezbędnych uprawnień użytkownikowi aplikacyjnemu w MySQL.

Pokaż rozwiązanie
GRANT SELECT, INSERT, UPDATE ON baza.* TO 'app_user'@'localhost' IDENTIFIED BY 'silnehaslo';

Wyjaśnienie:
Użytkownik nie może kasować ani zmieniać struktury bazy – tylko podstawowe operacje.


>>>Zadanie 3: Backup i odtwarzanie

Wypisz polecenie do stworzenia backupu bazy "sklep" w MySQL oraz opisz, gdzie bezpiecznie go przechować.

Pokaż rozwiązanie
mysqldump -u user -p sklep > sklep_backup.sql

Wyjaśnienie:
Backup najlepiej przechowywać na zaszyfrowanym dysku w innej lokalizacji niż produkcyjny serwer.


>>>Zadanie 4: Audyt

Opisz, jakie informacje warto logować w bazie w celach bezpieczeństwa.

Pokaż rozwiązanie
  • Logi logowania i wylogowania użytkowników
  • Próby nieautoryzowanego dostępu
  • Operacje modyfikujące dane (INSERT, UPDATE, DELETE)
  • Zmiany uprawnień i konfiguracji Wyjaśnienie:
    Takie logi pozwalają wykryć ataki, nadużycia i szybciej reagować na incydenty.

>>>Zadanie 5: Szyfrowanie

Podaj dwa przykłady zastosowania szyfrowania w bazie danych.

Pokaż rozwiązanie
  • Szyfrowanie połączenia klient-serwer (SSL/TLS), np. mysql --ssl-mode=REQUIRED
  • Szyfrowanie danych na dysku (np. TDE – Transparent Data Encryption w MS SQL, MariaDB) Wyjaśnienie:
    Szyfrowanie chroni przed kradzieżą danych podczas transmisji i fizycznego dostępu do dysków.

>>>Zadanie 6: Przykład walidacji danych wejściowych

Podaj przykład sprawdzania poprawności adresu e-mail przed zapisaniem do bazy.

Pokaż rozwiązanie

W Pythonie:

import re
def valid_email(email):
    return re.match(r"^[^@]+@[^@]+\.[^@]+$", email)

Wyjaśnienie:
Akceptujemy tylko dane zgodne z ustalonym wzorcem – minimalizujemy ryzyko wstrzyknięcia niepożądanych znaków.


>>>Zadanie 7: Przykład ograniczenia dostępu sieciowego

Jak ograniczyć dostęp do bazy tylko z określonych adresów IP?

Pokaż rozwiązanie
  • W MySQL przy tworzeniu użytkownika określ w host: 'app_user'@'192.168.1.100'
  • Skonfiguruj firewall (iptables, security group w chmurze), by akceptował ruch tylko z zaufanych adresów. Wyjaśnienie:
    Tylko aplikacja działająca na wybranym serwerze może połączyć się z bazą, ataki z zewnątrz są blokowane.

>>Podsumowanie

Bezpieczeństwo baz danych wymaga ciągłej uwagi, aktualizacji i stosowania dobrych praktyk. Najlepsza ochrona to połączenie technologii, kontroli dostępu, backupów, szyfrowania, audytu oraz świadomych użytkowników i programistów. Nawet najprostsze rozwiązania mogą zapobiec poważnym konsekwencjom wycieku lub utraty danych!

Quiz: Bezpieczeństwo baz danych

Pytanie 1 z 5

Czym jest SQL Injection?

Widzisz jakiś błąd, bądź literówkę? Chcesz coś poprawić?✏️ Przejdź do edycji tego pliku