Одитирането е добър начин да запазите данните си възможно най-безопасни и да знаете какво се случва във вашите бази данни. Също така се изисква за много разпоредби или стандарти за сигурност, като PCI - индустрия за разплащателни карти. Това не е изключение за вашата PostgreSQL база данни.
PostgreSQL спечели силна репутация за своята доказана архитектура, надеждност, целостта на данните, стабилен набор от функции, разширяемост и отдадеността на общността с отворен код зад софтуера, за да предоставя последователно производителни и иновативни решения.
При това положение би трябвало да е опция за одит на PostgreSQL база данни, нали? Е, отговорът е да. В този блог ще видим какво представлява разширението pgAudit и как да го инсталирате и използвате във вашата PostgreSQL база данни.
Какво е pgAudit?
Разширението за одит на PostgreSQL (pgAudit) предоставя подробно регистриране на одит на сесии и обекти чрез стандартното средство за регистриране на PostgreSQL.
Регистрирането на основни изрази може да бъде предоставено от стандартното средство за регистриране с log_statement =all. Това е приемливо за наблюдение и други основни употреби, но не осигурява нивото на детайлност, обикновено необходимо за одит. Не е достатъчно да имате списък с всички операции, извършени срещу базата данни. Трябва също така да е възможно да се намерят конкретни изявления, които представляват интерес за одитор. Стандартното средство за регистриране показва какво е поискал потребителят, докато pgAudit се фокусира върху подробностите за случилото се, докато базата данни е удовлетворявала заявката.
Как да инсталирате pgAudit на PostgreSQL
За този пример ще използваме инсталация на CentOS 7. В този момент предположихме, че имате инсталирана база данни PostgreSQL, в противен случай можете да следвате тази публикация в блога, за да я стартирате и работи по лесен начин с помощта на ClusterControl.
Сега трябва да имате хранилището на PostgreSQL във вашата ОС, нещо като това:
$ 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
Ако проверите наличните пакети pgaudit, трябва да имате:
pgaudit14_12.x86_64 : PostgreSQL Audit Extension
И така, нека да го инсталираме:
$ yum install pgaudit14_12
Сега ще трябва да го добавите в конфигурационния файл postgresql.conf, разположен по подразбиране в /var/lib/pgsql/12/data/postgresql.conf, и рестартирате услугата PostgreSQL, за да приложите промяната.
shared_preload_libraries = 'pgaudit, pg_stat_statements'
След рестартиране на вашата услуга за база данни, трябва да създадете разширението:
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)
Конфигурация на pgAudit
Можете да проверите текущата конфигурация, като изпълните следната заявка:
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)
Нека видим тези параметри един по един.
- pgaudit.log :Указва кои класове изрази ще бъдат регистрирани чрез регистриране на одит на сесията. По подразбиране няма. Възможните стойности са:
- ЧЕТЕТЕ:ИЗБЕРЕТЕ и КОПИРАЙТЕ, когато източникът е релация или заявка.
- ЗАПИШЕТЕ:INSERT, UPDATE, DELETE, TRUNCATE и COPY, когато местоназначението е релация.
- ФУНКЦИЯ:Извиквания на функции и блокове на DO.
- ROLE:Изявления, свързани с роли и привилегии:GRANT, REVOKE, CREATE/ALTER/DROP ROLE.
- DDL:Всички DDL, които не са включени в класа ROLE.
- MISC:Разни команди, напр. ИЗХВЪРЛЯНЕ, ИЗВЛЕЧВАНЕ, КОНТРОЛНА ТОЧКА, ВАКУУМ, ЗАДАВАНЕ.
- MISC_SET:Разни SET команди, напр. ЗАДАДЕТЕ РОЛЯ.
- ВСИЧКИ:Включете всичко по-горе.
- pgaudit.log_catalog :Указва, че регистрирането на сесия трябва да бъде разрешено в случай, когато всички отношения в израз са в pg_catalog. Деактивирането на тази настройка ще намали шума в регистрационния файл от инструменти като psql и PgAdmin, които заявяват сериозно каталога. По подразбиране е включено.
- pgaudit.log_client :Указва дали съобщенията в журнала ще бъдат видими за клиентски процес, като psql. Тази настройка обикновено трябва да бъде оставена забранена, но може да бъде полезна за отстраняване на грешки или други цели. По подразбиране е изключено.
- pgaudit.log_level :Указва нивото на дневника, което ще се използва за записи в дневника. Тази настройка се използва за регресионно тестване и може да бъде полезна и за крайните потребители за тестване или други цели. По подразбиране е log.
- pgaudit.log_parameter :Указва, че регистрирането на одит трябва да включва параметрите, които са били предадени с израза. Когато присъстват параметри, те ще бъдат включени във формат CSV след текста на изявлението. По подразбиране е изключено.
- pgaudit.log_relation :Указва дали регистрирането на одита на сесията трябва да създаде отделен запис в дневника за всяка релация (ТАБЛИЦА, ИЗГЛЕД и т.н.), посочена в оператор SELECT или DML. Това е полезен пряк път за изчерпателно регистриране без използване на регистриране на одит на обекти. По подразбиране е изключено.
- pgaudit.log_statement_once :Указва дали записването ще включва текста и параметрите на оператора с първия запис в регистъра за комбинация от израз/подизявление или с всеки запис. Деактивирането на тази настройка ще доведе до по-малко подробно регистриране, но може да затрудни определянето на израза, който е генерирал запис в регистрационния файл, въпреки че двойката изявление/подизявление заедно с идентификатора на процеса трябва да са достатъчни, за да се идентифицира текстът на оператора, регистриран с предишен запис. По подразбиране е изключено.
- pgaudit.role :Указва главната роля, която да се използва за регистриране на одит на обекти. Множество роли за одит могат да бъдат дефинирани чрез предоставянето им на главната роля. Това позволява на множество групи да отговарят за различни аспекти на регистрирането на одит. Няма по подразбиране.
Използване на pgAudit
Сега прегледахме конфигурационните параметри, нека видим пример как да го използваме в реалния свят.
За да одитирате всички заявки за четене, запис и DDL, изпълнете:
test1=# set pgaudit.log = 'read,write,ddl';
SET
И след това изпълнете следните изречения:
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)
Ако проверите регистрационния файл на PostgreSQL, ще видите това:
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>
Разбира се, това е основен пример. Можете да използвате конфигурационните параметри, описани в предишния раздел, за да отговарят на вашия бизнес.
Активиране на pgAudit с ClusterControl
Вместо да инсталирате и активирате pgAudit ръчно, друга опция е да използвате ClusterControl CLI, за да свършите работата вместо вас. За това можете да изпълните следната команда от вашия ClusterControl сървър:
$ s9s cluster --setup-audit-logging --cluster-id=ID
Където ID е идентификаторът на PostgreSQL клъстера.
Докато работи, можете да наблюдавате състоянието, като проверите заданието на ClusterControl. Първо, ще ви трябва идентификационният номер на заданието, който можете да получите от списъка със задачи:
$ s9s job --list
163 18 RUNNING test_dba admins 19:41:45 90% Setup Audit Logging
Сега проверете подробностите за заданието:
$ 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.
Това действие ще изисква рестартиране на услугата за база данни, което ще бъде извършено от ClusterControl в същата задача. След рестартирането му разширението pgAudit е активирано и е готово за използване:
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)
Това е! Вече можете да конфигурирате и използвате pgAudit по същия начин, който показахме по-рано.
Заключение
Одитът е необходим за много разпоредби за сигурност и е полезен също, ако искате да знаете какво се е случило във вашата база данни и кога и кой е бил отговорен за това.
В този блог говорихме за разширението pgAudit PostgreSQL като добър начин за одит на вашите PostgreSQL бази данни и също така ви показахме как да го внедрите както ръчно, така и с помощта на ClusterControl CLI.
Имайте предвид, че в зависимост от конфигурацията е възможно pgAudit да генерира огромен обем данни. Така че трябва да внимавате да определите какво трябва да извършите одит и за колко време.