PostgreSQL — pg_hba.conf jako tabela

Tomasz Gintowt
3 min readJun 12, 2021

--

TL;TR W tym artykule znajdziesz informacje jak zarządzać plikiem pg_hba.conf jako tabela w PostgreSQL.

Witaj, skoro tu trafiłeś, wierzę, że masz już podstawową wiedzę z PostgreSQL. Często jako administratorzy baz danych szukamy pomysły jak zarządzać konfiguracją, dodawać i kasować reguły oraz dbać o spójność pomiędzy różnymi maszynami.

Dziś chciałbym pokazać Ci, jak możesz zarządzać plikiem konfiguracyjnym pg_hba.conf. Stworzymy tabele, w której będziemy zapisywali reguły. Dlaczego warto wykorzystać takie rozwiązanie?

  • Mamy dostęp bezpośrednio z psql
  • W przypadku replikacji możemy łatwiej zadbać o spójność pomiędzy master i slave
  • Łatwiesza automatyzacja,można dodać nową regułę przez INSERT

Przypomnę tylko, że w pliku pg_hba.conf znajdują się reguły, które pozwalają na dostęp do danej instancji PostgreSQL, podajemy tam adresy IP, nazwę bazy, username oraz metodę uwierzytelniania.

Zaczynamy!

Sprawdźmy, gdzie jest nasz plik pg_hba.conf

postgres=# select setting from pg_settings where name like '%hba%';
setting
--------------------------------------
/var/lib/postgresql/data/pg_hba.conf
(1 row)

Stwórzmy tabele, w której będziemy zapisywać reguły, które obecnie są w pliku pg_hba.conf

postgres=# create table hba ( lines text ); 
CREATE TABLE

Skopiujmy całą zawartość pliku pg_hba.conf do tabeli.

postgres=# copy hba from '/var/lib/postgresql/data/pg_hba.conf';
COPY 99

Zobaczmy jak to wygląda, pomijając wszystkie zahaszowane linie

postgres=# select * from hba where lines !~ '^#' and lines !~ '^$';
lines
-----------------------------------------------------------------------
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
host all all all md5
(7 rows)

Dodajmy nową regułę i ponownie wyświetlmy zawartość tabeli.

postgres=# insert into hba (lines) values ('host  all mydb  ::1/128                 trust');
INSERT 0 1
postgres=# select * from hba where lines !~ '^#' and lines !~ '^$';
lines
-----------------------------------------------------------------------
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
host all all all md5
host all mydb ::1/128 trust
(8 rows)

Jest, reguła dla mydb została dodana. Potrzebujemy jeszcze dodatkowego kroku, który skopiuje zawartość tabeli do pliku pg_hba.conf na dysku.

postgres=# copy hba to '/var/lib/postgresql/data/pg_hba.conf';
COPY 100

Jeżeli chcecie wyświetlić cała zawartość pliku, to możemy użyć polecenia

postgres=# select pg_read_file('pg_hba.conf');

Oczywiście musimy jeszcze, przeładować i zaczytać nową konfigurację, wywołujemy komendę

postgres=# select pg_reload_conf();
pg_reload_conf
----------------
t
(1 row)

Kasowanie danej reguły:

postgres=# select * from hba where lines like '# IPv4 local connections:';
lines
---------------------------
# IPv4 local connections:
(1 row)
postgres=# delete from hba where lines like '# IPv4 local connections:';
DELETE 1
postgres=# select * from hba where lines like '# IPv4 local connections:';
lines
-------
(0 rows)

Już, takie proste :)

Tomasz Gintowt jest Architektem/DevOps/DBA/Trenerem, głównie skupiony na dostarczaniu rozwiązań składowania i przetwarzania danych. Nie są mu obce wszelkiej maści bazy danych, systemy real-time data i streamingu. Obecnie pracuje z Apache Kafka, RabbitMQ, Elastic Stack i PostgreSQL. Organizator spotkań DataOps Poland.

https://www.linkedin.com/in/tomasz-gintowt/

https://dataops-academy.pl — kursy i szkolenia.

--

--

Tomasz Gintowt
Tomasz Gintowt

Written by Tomasz Gintowt

Architect, DevOps, SysOps, and DBA. Currently, I’m an IT Systems Engineer working with Apache Kafka, RabbitMQ, PostgreSQL, Elastic Stack in Real-Time Data Team.

No responses yet