PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak przeprowadzić audyt bazy danych PostgreSQL

Kontrola to dobry sposób na zapewnienie jak największego bezpieczeństwa danych i sprawdzenie, co dzieje się w Twoich bazach danych. Jest również wymagany w przypadku wielu przepisów lub standardów bezpieczeństwa, takich jak PCI - Payment Card Industry. To nie jest wyjątek dla twojej bazy danych PostgreSQL.

PostgreSQL zdobył silną reputację dzięki sprawdzonej architekturze, niezawodności, integralności danych, solidnemu zestawowi funkcji, rozszerzalności i zaangażowaniu społeczności open source stojącej za oprogramowaniem, aby konsekwentnie dostarczać wydajne i innowacyjne rozwiązania.

Mając to na uwadze, powinna to być opcja audytu bazy danych PostgreSQL, prawda? Cóż, odpowiedź brzmi tak. W tym blogu zobaczymy, czym jest rozszerzenie pgAudit oraz jak je zainstalować i używać w bazie danych PostgreSQL.

Co to jest pgAudit?

Rozszerzenie audytu PostgreSQL (pgAudit) zapewnia szczegółowe rejestrowanie audytu sesji i obiektów za pośrednictwem standardowego narzędzia rejestrowania PostgreSQL.

Podstawowe rejestrowanie instrukcji może być zapewnione przez standardowe narzędzie rejestrowania z log_statement =all. Jest to akceptowalne w przypadku monitorowania i innych podstawowych zastosowań, ale nie zapewnia poziomu szczegółowości zwykle wymaganego do audytu. Nie wystarczy mieć listę wszystkich operacji wykonywanych na bazie danych. Musi być również możliwe odnalezienie konkretnych stwierdzeń, które zainteresują biegłego rewidenta. Standardowa funkcja rejestrowania pokazuje, czego żądał użytkownik, podczas gdy pgAudit skupia się na szczegółach tego, co się stało, gdy baza danych spełniała żądanie.

Jak zainstalować pgAudit na PostgreSQL

W tym przykładzie użyjemy instalacji CentOS 7. W tym momencie przypuszczaliśmy, że masz zainstalowaną bazę danych PostgreSQL, w przeciwnym razie możesz śledzić ten wpis na blogu, aby w łatwy sposób uruchomić ją i uruchomić za pomocą ClusterControl.

Teraz powinieneś mieć repozytorium PostgreSQL w swoim systemie operacyjnym, coś takiego:

$ cat /etc/yum.repos.d/postgresql.repo

# PGDG Red Hat Enterprise Linux / CentOS stable common repository for all PostgreSQL versions

[pgdg-common]

name=PostgreSQL common for RHEL/CentOS $releasever - $basearch

baseurl=http://download.postgresql.org/pub/repos/yum/common/redhat/rhel-$releasever-$basearch

enabled=1

gpgcheck=0

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG

# PGDG Red Hat Enterprise Linux / CentOS stable repositories:

[pgdg]

name=PostgreSQL 12 $releasever - $basearch

#baseurl=http://yum.postgresql.org/12/redhat/rhel-$releasever-$basearch

baseurl=http://download.postgresql.org/pub/repos/yum/12/redhat/rhel-$releasever-$basearch/

enabled=1

gpgcheck=0

[pgdg-source]

name=PostgreSQL 12 $releasever - $basearch - Source

baseurl=http://yum.postgresql.org/srpms/12/redhat/rhel-$releasever-$basearch

enabled=0

gpgcheck=0

Jeśli sprawdzisz dostępne pakiety pgaudit, powinieneś mieć:

pgaudit14_12.x86_64 : PostgreSQL Audit Extension

Zainstalujmy go:

$ yum install pgaudit14_12

Teraz musisz dodać go do pliku konfiguracyjnego postgresql.conf, znajdującego się domyślnie w /var/lib/pgsql/12/data/postgresql.conf i ponownie uruchomić usługę PostgreSQL, aby zastosować zmiana.

shared_preload_libraries = 'pgaudit, pg_stat_statements'

Po ponownym uruchomieniu usługi bazy danych musisz utworzyć rozszerzenie:

postgres=# CREATE EXTENSION pgaudit;

CREATE EXTENSION

And now, you can run the following query to check the new extension created:

postgres=# SELECT * FROM pg_available_extensions WHERE name LIKE '%audit%';

  name   | default_version | installed_version |             comment

---------+-----------------+-------------------+---------------------------------

 pgaudit | 1.4.1           | 1.4.1             | provides auditing functionality

(1 row)

Konfiguracja pgAudit

Aktualną konfigurację można zweryfikować, uruchamiając następujące zapytanie:

postgres=# SELECT name,setting FROM pg_settings WHERE name LIKE 'pgaudit%';

            name            | setting

----------------------------+---------

 pgaudit.log                | none

 pgaudit.log_catalog        | on

 pgaudit.log_client         | off

 pgaudit.log_level          | log

 pgaudit.log_parameter      | off

 pgaudit.log_relation       | off

 pgaudit.log_statement_once | off

 pgaudit.role               |

(8 rows)

Zobaczmy te parametry jeden po drugim.

  • pgaudit.log :Określa, które klasy instrukcji będą rejestrowane przez rejestrowanie audytu sesji. Wartość domyślna to brak. Możliwe wartości to:
    • CZYTAJ:WYBIERZ i KOPIUJ, gdy źródłem jest relacja lub zapytanie.
    • WPISZ:WSTAW, AKTUALIZUJ, USUŃ, OTWIERAJ i KOPIUJ, gdy miejscem docelowym jest relacja.
    • FUNKCJA:Wywołania funkcji i bloki DO.
    • ROLE:Oświadczenia związane z rolami i uprawnieniami:GRANT, REVOKE, CREATE/ALTER/DROP ROLE.
    • DDL:Wszystkie DDL, które nie są zawarte w klasie ROLE.
    • MISC:Różne polecenia, np. ODRZUCENIE, POBIERZ, PUNKT KONTROLNY, ODKURZ, USTAW.
    • MISC_SET:Różne polecenia SET, np. USTAW ROLĘ.
    • WSZYSTKIE:Uwzględnij wszystkie powyższe.
  • pgaudit.log_catalog :Określa, że ​​rejestrowanie sesji powinno być włączone w przypadku, gdy wszystkie relacje w instrukcji znajdują się w pg_catalog. Wyłączenie tego ustawienia zmniejszy szum w dzienniku z narzędzi takich jak psql i PgAdmin, które intensywnie odpytują katalog. Domyślnie włączone.
  • pgaudit.log_client :Określa, czy komunikaty dziennika będą widoczne dla procesu klienta, takiego jak psql. To ustawienie należy ogólnie pozostawić wyłączone, ale może być przydatne do debugowania lub do innych celów. Domyślnie jest wyłączone.
  • pgaudit.log_level :Określa poziom dziennika, który będzie używany dla wpisów dziennika. To ustawienie jest używane do testowania regresji i może być również przydatne dla użytkowników końcowych do testowania lub do innych celów. Wartość domyślna to log.
  • pgaudit.log_parameter :określa, że ​​rejestrowanie inspekcji powinno zawierać parametry, które zostały przekazane wraz z instrukcją. Gdy parametry są obecne, zostaną one uwzględnione w formacie CSV po tekście instrukcji. Domyślnie jest wyłączone.
  • pgaudit.log_relation :Określa, czy rejestrowanie inspekcji sesji powinno tworzyć osobny wpis dziennika dla każdej relacji (TABLE, VIEW itp.), do której odwołuje się instrukcja SELECT lub DML. Jest to przydatny skrót do wyczerpującego rejestrowania bez korzystania z rejestrowania audytu obiektów. Domyślnie jest wyłączone.
  • pgaudit.log_statement_once :Określa, czy rejestrowanie będzie zawierało tekst instrukcji i parametry z pierwszym wpisem dziennika dla kombinacji instrukcji/podinstrukcji, czy z każdym wpisem. Wyłączenie tego ustawienia spowoduje mniej szczegółowe rejestrowanie, ale może utrudnić określenie instrukcji, która wygenerowała wpis dziennika, chociaż para instrukcja/podinstrukcja wraz z identyfikatorem procesu powinna wystarczyć do zidentyfikowania tekstu instrukcji zarejestrowanego z poprzednim wpisem. Domyślnie jest wyłączone.
  • pgaudit.role :Określa główną rolę, która ma być używana do rejestrowania kontroli obiektów. Wiele ról kontroli można zdefiniować, przypisując je do roli głównej. Dzięki temu wiele grup może być odpowiedzialnymi za różne aspekty rejestrowania audytu. Nie ma domyślnego.

pgAudit Użycie

Teraz sprawdziliśmy parametry konfiguracyjne, zobaczmy przykład, jak z niego korzystać w prawdziwym świecie.

Aby przeprowadzić kontrolę wszystkich odczytów, zapisów i zapytań DDL, uruchom:

test1=# set pgaudit.log = 'read,write,ddl';

SET

Następnie uruchom następujące zdania:

test1=# CREATE TABLE table1 (id int, name text);

CREATE TABLE

test1=# INSERT INTO table1 (id, name) values (1, 'name1');

INSERT 0 1

test1=# INSERT INTO table1 (id, name) values (2, 'name2');

INSERT 0 1

test1=# INSERT INTO table1 (id, name) values (3, 'name3');

INSERT 0 1

test1=# SELECT * FROM table1;

 id | name

----+-------

  1 | name1

  2 | name2

  3 | name3

(3 rows)

Jeśli sprawdzisz plik dziennika PostgreSQL, zobaczysz to:

2020-11-20 19:17:13.848 UTC [25142] LOG:  AUDIT: SESSION,3,1,DDL,CREATE TABLE,,,"CREATE TABLE table1 (id int, name text);",<not logged>

2020-11-20 19:18:45.334 UTC [25142] LOG:  AUDIT: SESSION,4,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (1, 'name1');",<not logged>

2020-11-20 19:18:52.332 UTC [25142] LOG:  AUDIT: SESSION,5,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (2, 'name2');",<not logged>

2020-11-20 19:18:58.103 UTC [25142] LOG:  AUDIT: SESSION,6,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (3, 'name3');",<not logged>

2020-11-20 19:19:07.261 UTC [25142] LOG:  AUDIT: SESSION,7,1,READ,SELECT,,,SELECT * FROM table1;,<not logged>

Oczywiście jest to podstawowy przykład. Możesz użyć parametrów konfiguracyjnych opisanych w poprzedniej sekcji, aby dopasować je do swojej firmy.

Włączanie pgAudit z ClusterControl

Zamiast instalować i włączać pgAudit ręcznie, inną opcją jest użycie ClusterControl CLI do wykonania zadania za Ciebie. W tym celu możesz uruchomić następujące polecenie z serwera ClusterControl:

$ s9s cluster --setup-audit-logging --cluster-id=ID

Gdzie ID jest identyfikatorem klastra PostgreSQL.

Gdy jest uruchomiony, możesz monitorować stan, sprawdzając zadanie ClusterControl. Najpierw potrzebujesz identyfikatora pracy, który możesz uzyskać z listy ofert:

$ s9s job --list

163  18 RUNNING  test_dba                     admins 19:41:45            90% Setup Audit Logging

Teraz sprawdź szczegóły oferty:

$ s9s job --log --job-id=163

Using SSH credentials from cluster.

Cluster ID is 18.

The username is 'root'.

10.10.10.129:5432: Configuring audit logging.

10.10.10.129:5432: Installing 'pgaudit14_12'.

10.10.10.129:5432: Setting pgaudit.log to ROLE,DDL,MISC.

Writing file '10.10.10.129:/var/lib/pgsql/12/data/postgresql.conf'.

10.10.10.129:5432: Restarting PostgreSQL node.

10.10.10.129: waiting for server to shut down.... done

server stopped

waiting for server to start....2020-11-20 19:41:52.069 UTC [25137] LOG:  pgaudit extension initialized

2020-11-20 19:41:52.069 UTC [25137] LOG:  starting PostgreSQL 12.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit

2020-11-20 19:41:52.069 UTC [25137] LOG:  listening on IPv4 address "0.0.0.0", port 5432

2020-11-20 19:41:52.069 UTC [25137] LOG:  listening on IPv6 address "::", port 5432

2020-11-20 19:41:52.080 UTC [25137] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"

2020-11-20 19:41:52.102 UTC [25137] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"

2020-11-20 19:41:52.130 UTC [25137] LOG:  redirecting log output to logging collector process

2020-11-20 19:41:52.130 UTC [25137] HINT:  Future log output will appear in directory "log".

 done

server started

10.10.10.129:5432: Waiting for node to be accessible.

10.10.10.129:5432: pgaudit 1.4.1 is enabled.

To działanie będzie wymagało ponownego uruchomienia usługi bazy danych, które zostanie wykonane przez ClusterControl w tym samym zadaniu. Po ponownym uruchomieniu rozszerzenie pgAudit jest włączone i gotowe do użycia:

postgres=# SELECT * FROM pg_available_extensions WHERE name LIKE '%audit%';

  name   | default_version | installed_version |             comment

---------+-----------------+-------------------+---------------------------------

 pgaudit | 1.4.1           | 1.4.1             | provides auditing functionality

(1 row)

To wszystko! Możesz teraz skonfigurować i używać pgAudit w taki sam sposób, jaki pokazaliśmy wcześniej.

Wnioski

Audyt jest wymagany w przypadku wielu przepisów bezpieczeństwa i jest również przydatny, jeśli chcesz wiedzieć, co się stało w Twojej bazie danych oraz kiedy i kto był za to odpowiedzialny.

W tym blogu mówiliśmy o rozszerzeniu pgAudit PostgreSQL jako dobrym sposobie audytu baz danych PostgreSQL, a także pokazaliśmy, jak zaimplementować je zarówno ręcznie, jak i przy użyciu ClusterControl CLI.

Pamiętaj, że w zależności od konfiguracji pgAudit może generować ogromne ilości danych. Dlatego powinieneś być ostrożny, aby określić, co i jak długo chcesz kontrolować.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Połącz się z bazą danych PostgreSQL w kontenerze Docker

  2. Jak zapisywać dane z tabel R do PostgreSQL za pomocą autoinkrementacji klucza podstawowego?

  3. Jak stworzyć tabelę Postgres z unikalnym połączonym kluczem podstawowym?

  4. Aktualizacja SQL pól jednej tabeli z pól innej

  5. Błąd upuszczenia Railsów + Postgres:baza danych jest używana przez innych użytkowników