0Pricing
SQL Academy · Lekcja

Uprawnienia na poziomie kolumn

Ukrywaj poufne kolumny

Uprawnienia na poziomie kolumn to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Dlaczego uprawnienia na poziomie kolumn mają znaczenie

Nie każdy użytkownik powinien widzieć każdą kolumnę w tabeli. Kolumna salary, password_hash lub credit_card_number może znajdować się w tej samej tabeli co całkowicie publiczne dane, takie jak nazwa użytkownika lub adres e-mail.

Uprawnienia na poziomie kolumn pozwalają przyznawać dostęp do konkretnych kolumn zamiast do całej tabeli, dzięki czemu poufne dane pozostają ukryte przed użytkownikami, którzy nie mają uzasadnionej potrzeby ich przeglądania.

GRANT dla całej tabeli

Domyślnie GRANT SELECT ON table pozwala roli odczytywać wszystkie kolumny. To rozwiązanie sprawdza się w przypadku publicznych danych, ale staje się problematyczne, gdy tabela zawiera zarówno kolumny poufne, jak i niepoufne.

Poniższe zapytanie zapewnia roli analyst pełny dostęp do odczytu tabeli employees — w tym do kolumn salary i SSN.

GRANT SELECT ON employees TO analyst;

Składnia GRANT na poziomie kolumn

PostgreSQL (podobnie jak standard SQL) pozwala wymieniać konkretne nazwy kolumn wewnątrz instrukcji GRANT. Składnia wygląda następująco:

GRANT privilege (col1, col2) ON table TO role;

Poniższy przykład przyznaje roli analyst uprawnienie do odczytu wyłącznie kolumn id, name i department — ale NIE kolumn salary ani ssn.

GRANT SELECT (id, name, department) ON employees TO analyst;

Weryfikowanie uprawnień do kolumn

Uprawnienia na poziomie kolumn w PostgreSQL można sprawdzać, wykonując zapytanie do widoku information_schema.column_privileges. Widok ten pokazuje, który odbiorca uprawnień ma jakie uprawnienie do której kolumny.

SELECT grantee, table_name, column_name, privilege_type
FROM information_schema.column_privileges
WHERE table_name = 'employees'
ORDER BY grantee, column_name;

Co się dzieje bez odpowiednich uprawnień do kolumn

Jeśli rola próbuje odczytać kolumnę, do której nie przyznano jej dostępu, baza danych zwraca błąd permission denied. Powodzeniem zakończy się tylko odwołanie do dozwolonych kolumn.

Zakładając, że roli analyst przyznano dostęp wyłącznie do kolumn id, name i department, pierwsze z poniższych zapytań zakończy się błędem, a drugie powiedzie się.

-- This will fail for analyst (no permission on salary):
-- SELECT id, name, salary FROM employees;

-- This succeeds:
SELECT id, name, department FROM employees;

Uprawnienie UPDATE na poziomie kolumn

Ograniczenia na poziomie kolumn dotyczą również polecenia UPDATE. Można zezwolić roli na aktualizowanie tylko określonych kolumn — na przykład umożliwić roli helpdesk aktualizowanie kolumny status użytkownika bez możliwości zmiany jego email lub password_hash.

GRANT UPDATE (status) ON users TO helpdesk;

-- helpdesk can now run:
UPDATE users SET status = 'suspended' WHERE id = 42;

Ukrywanie kolumn za pomocą widoków

Innym często stosowanym rozwiązaniem jest utworzenie widoku, który udostępnia wyłącznie bezpieczne kolumny, a następnie przyznanie dostępu do widoku zamiast do tabeli bazowej. Działa to we wszystkich bazach danych, nie tylko w tych, które obsługują GRANT na poziomie kolumn.

CREATE VIEW public_employees AS
SELECT id, name, department, hire_date
FROM employees;

GRANT SELECT ON public_employees TO analyst;

Cofanie dostępu na poziomie kolumn

Podobnie jak w przypadku GRANT, można użyć REVOKE wraz z listą kolumn, aby usunąć dostęp do określonych kolumn. Jeśli rola miała szeroki dostęp na poziomie tabeli, może być konieczne całkowite cofnięcie tego dostępu przed przyznaniem ograniczonego dostępu na poziomie kolumn.

-- Remove all SELECT on the table first
REVOKE SELECT ON employees FROM analyst;

-- Then grant only safe columns
GRANT SELECT (id, name, department) ON employees TO analyst;

Uprawnienia do kolumn i bezpieczeństwo na poziomie wierszy razem

Uprawnienia na poziomie kolumn i bezpieczeństwo na poziomie wierszy (RLS) uzupełniają się. RLS kontroluje, które wiersze użytkownik może widzieć, a uprawnienia na poziomie kolumn kontrolują, które kolumny tych wierszy są widoczne.

Razem tworzą potężny, dwuwymiarowy mechanizm kontroli dostępu: ograniczają zbiór wierszy ORAZ ukrywają poufne pola w każdym wierszu.

-- RLS policy: employees can see only their own row
CREATE POLICY own_row ON employees
  FOR SELECT
  USING (user_id = current_user_id());

-- Column grant: hide salary even for own row
GRANT SELECT (id, name, department) ON employees TO employee_role;

Używanie funkcji SECURITY DEFINER

Gdy potrzebna jest szczegółowa logika wykraczająca poza proste listy kolumn, funkcja SECURITY DEFINER może pełnić funkcję pośredniczącą. Funkcja działa z uprawnieniami swojego właściciela (który ma pełny dostęp do kolumn) i zwraca tylko te dane, które zdecyduje się udostępnić, niezależnie od tego, kto ją wywołuje.

CREATE OR REPLACE FUNCTION get_employee_summary(emp_id INT)
RETURNS TABLE(id INT, name TEXT, department TEXT)
SECURITY DEFINER
LANGUAGE sql AS
$$
  SELECT id, name, department
  FROM employees
  WHERE id = emp_id;
$$;

GRANT EXECUTE ON FUNCTION get_employee_summary(INT) TO analyst;

Praktyczny projekt: wielowarstwowe zabezpieczenie kolumn

Sprawdzony wzorzec produkcyjny łączy trzy warstwy:

  1. Własność tabeli — tylko konto usługi aplikacji jest właścicielem tabeli bazowej.
  2. Widoki lub instrukcje GRANT dla kolumn — role odczytu otrzymują dostęp wyłącznie do kolumn niepoufnych.
  3. Kolumny audytowe — za pomocą triggerów rejestruje się użytkownika i znacznik czasu operacji na poufnych danych.

Dzięki temu nawet jeśli rola otrzyma przypadkowo zbyt szerokie uprawnienia w jednej warstwie, pozostałe warstwy nadal chronią dane.

-- Layer 1: revoke public access
REVOKE ALL ON employees FROM PUBLIC;

-- Layer 2: expose safe columns via view
CREATE VIEW employee_public AS
SELECT id, name, department, hire_date FROM employees;

GRANT SELECT ON employee_public TO reporting_role;

-- Layer 3: audit trigger logs sensitive field reads (pseudocode)
-- CREATE TRIGGER audit_salary AFTER SELECT ON employees ...

Szybkie sprawdzenie

Która instrukcja SQL poprawnie przyznaje roli hr_viewer możliwość odczytu wyłącznie kolumn name i department tabeli employees?

Podsumowanie: uprawnienia na poziomie kolumn

Uprawnienia na poziomie kolumn pozwalają ograniczyć dostęp do pojedynczych pól zamiast do całych tabel, dzięki czemu poufne dane, takie jak wynagrodzenia, numery SSN i hashe haseł, pozostają ukryte przed rolami bez odpowiednich uprawnień.

Najważniejsze informacje:

  • Używaj GRANT SELECT (col1, col2) ON table TO role, aby ograniczyć kolumny dostępne do odczytu.
  • Używaj REVOKE wraz z listą kolumn, aby usunąć dostęp do określonych kolumn.
  • Widoki są przenośną alternatywą działającą we wszystkich bazach danych.
  • Łącz uprawnienia na poziomie kolumn z RLS, aby uzyskać dwuwymiarową kontrolę dostępu.
  • Funkcje SECURITY DEFINER zapewniają programowe filtrowanie kolumn z użyciem dodatkowej logiki.

Konsekwentnie stosowane zabezpieczenia na poziomie kolumn są jednym z najprostszych i najskuteczniejszych sposobów egzekwowania zasady najmniejszych uprawnień na poziomie danych.

Często zadawane pytania

Czy lekcja „Uprawnienia na poziomie kolumn” jest bezpłatna?

Tak — pełny tekst „Uprawnienia na poziomie kolumn” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Uprawnienia na poziomie kolumn”?

Ukrywaj poufne kolumny Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Uprawnienia na poziomie kolumn”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Role i uprawnienia
  2. Zasady bezpieczeństwa na poziomie wierszy
  3. Uprawnienia na poziomie kolumn
  4. Audytowanie dostępu
← Powrót do SQL Academy