PostgreSQL CentOS sistemoje: saugus diegimas ir nuotolinis prisijungimas


Paskelbimo data:

Atnaujinta:


Techniniai straipsniai > PostgreSQL CentOS sistemoje: saugus diegimas ir nuotolinis prisijungimas

2026 m. būsena ir saugus naudojimas

Išvada: įdiekite palaikomą „PostgreSQL“ leidimą, inicijuokite numatytą klasterį, klausykite tik būtinose sąsajose, o faile pg_hba.conf suteikite prieigą tik konkrečioms duomenų bazėms, vaidmenims ir patikimiems tinklams. Kai slaptažodžiai perduodami tinklu, naudokite SCRAM autentifikavimą ir TLS.

Ką išmoksite

  • Kaip tarpusavyje siejasi paketo šaltinis, duomenų katalogas, inicijavimas, systemd, klausymosi lizdai ir kliento autentifikavimas.
  • Kodėl listen_addresses='*' ir host all all 0.0.0.0/0 md5 atskleidžia daug daugiau, nei reikalauja dauguma programų.
  • Kaip išbandyti prieigos taisykles neužrakinant vietinio administravimo.

Kam tai skirta: administratoriams, perkeliantiems paprastą „CentOS“ ir „PostgreSQL“ diegimo aprašą į palaikomą, tinklu pasiekiamą aplinką.

2026 m. kontekstas: toliau pateikta plati MD5 taisyklė palikta tik kaip nesaugaus istorinio pavyzdžio aptarimas. „PostgreSQL“ MD5 slaptažodžių autentifikavimą žymi kaip nebenaudotiną; rinkitės scram-sha-256, siaurus CIDR diapazonus, mažiausių teisių vaidmenis, ugniasienės apribojimus, TLS, patikrintas atsargines kopijas ir palaikomą pagrindinę versiją.

Saugos pastaba: pradiniame straipsnyje pateiktos komandos ir konfigūracijos pavyzdžiai nebuvo pakartotinai vykdomi dabartinėje gamybos aplinkoje. Prieš taikydami, patikrinkite palaikomas versijas, atsargines kopijas, prieigos valdiklius ir atšaukimo veiksmus atskiroje bandymo aplinkoje.

Pagrindiniai oficialūs šaltiniai

Apžvalga

Šiame straipsnyje aprašyta istorinė „PostgreSQL“ diegimo ir paleidimo procedūra „CentOS 7“ sistemoje. Nuotolinės prieigos pavyzdys yra pernelyg platus gamybai, todėl greta paaiškinama, kaip jį apriboti.

„PostgreSQL“ yra brandi atvirojo kodo reliacinė duomenų bazių sistema. Našumą lemia konkreti užklausa, schema, indeksai, duomenys, konfigūracija ir aparatinė įranga, todėl bendras teiginys, kad senos versijos buvo lėtos, nėra naudingas vertinimo kriterijus.

Pradiniame pavyzdyje naudotos šios versijos:

CentOS versija7.6 (1810)
"PostgreSQL" versija9.2.24

Turinys

  1. Diegimas
  2. Sąrankos informacija
  3. Santrauka

1. Diegimas

Šiame skyriuje „PostgreSQL“ serverio paketas įdiegiamas iš „CentOS 7“ saugyklos.

1-1. „PostgreSQL“ diegimas

Įdiekite „PostgreSQL“ naudodami yum. Komandai reikia root teisių. Ši saugyklos versija šiandien nebepalaikoma, todėl naujam serveriui rinkitės palaikomą leidimą.

[username@hostname ~]$ su -
[root@hostname ~]# yum -y install postgresql-server

2. Sąrankos informacija

Šiame skyriuje inicijuojamas duomenų bazės klasteris, nustatoma prieiga ir patikrinamas serverio paleidimas.

2-1. Sistemos naudotojo patikrinimas

Paketas automatiškai sukuria postgres sistemos naudotoją, kurio teisėmis veikia serveris ir atliekamos administravimo komandos. Rankiniu būdu jo kurti nereikia.

Persijunkite į šį naudotoją:

[root@hostname ~]# su - postgres

Šiame paketiniame diegime .bashrc keisti nereikia. Toliau parodytos senesniuose aprašuose sutinkamos reikšmės tik palyginimui:

.bashrc


export PGHOME=/var/lib/pgsql
export PGDATA=/var/lib/pgsql/data
export PGHOST=localhost

PGDATA reikšmė /var/lib/pgsql/data nustatyta paketo systemd vienete /usr/lib/systemd/system/postgresql.service. Tiekėjo vieneto failo tiesiogiai nekeiskite; vietiniams pakeitimams naudokite systemd override.

2-2. Duomenų bazės klasterio inicijavimas

Inicializuokite naują duomenų bazės klasterį UTF-8 koduote. Paketas paruošia /var/lib/pgsql/data vietą; katalogo savininkas ir teisės turi priklausyti postgres paslaugai.

-bash-4.2$ initdb --encoding=UNICODE

Kadangi PGDATA nustatyta į /var/lib/pgsql/data, initdb šiame kataloge sukuria klasterio konfigūraciją ir pradines duomenų bazes.

2-3. Konfigūracijos failo keitimas

Nuotolinei prieigai reikia suderinti du atskirus dalykus: serverio klausymosi adresus postgresql.conf faile ir klientų autentifikavimo taisykles pg_hba.conf faile.

[root@hostname ~]# vi /var/lib/pgsql/data/postgresql.conf

Pakeiskite 'postgresql.conf' taip.

postgresql.conf【Prieš pakeitimą】


#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

#listen_addresses = 'localhost'         # what IP address(es) to listen on;

postgresql.conf【po pakeitimo】


#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = '*'         # what IP address(es) to listen on;

Reikšmė * liepia serveriui klausytis visose turimose IP sąsajose, tačiau pati prieigos nesuteikia. Jei klientai jungiasi tik per vieną privatų tinklą, saugiau nurodyti konkretų serverio adresą.

Nuotolinio klausymosi reikia tokiam klientui kaip pgAdmin, veikiančiam kitame kompiuteryje. Jei psql naudojamas tame pačiame serveryje, paprastai pakanka vietinio lizdo arba localhost.

Klausymosi adresą, pg_hba.conf taisykles ir ugniasienę apribokite iki mažiausios būtinos apimties.

Tada pakeiskite "pg_hba.conf".

[root@hostname ~]# vi /var/lib/pgsql/data/pg_hba.conf

Istoriniame pavyzdyje failo pabaigoje pridėta ši taisyklė:

pg_hba.conf


#Slaptažodžio autentiškumo patvirtinimas iš išorės.
host    all             all             0.0.0.0/0            md5

Ši taisyklė reikalauja slaptažodžio, bet leidžia bet kuriam vaidmeniui bandyti jungtis prie bet kurios duomenų bazės iš bet kurio IPv4 adreso. Gamyboje jos nenaudokite: nurodykite konkrečią duomenų bazę, mažiausių teisių vaidmenį ir patikimo tinklo CIDR, o palaikomoje versijoje rinkitės SCRAM bei TLS.

2-4. Paleidimo patikrinimas

Baigę pradinę konfigūraciją patikrinkite, ar „PostgreSQL“ paleidžiamas. Kadangi klasteris priklauso postgres naudotojui, šiame istoriniame pavyzdyje serveris paleidžiamas jo teisėmis.

[root@hostname ~]# su - postgres
-bash-4.2$ pg_ctl start

Paleidę serverį, postgres naudotojo teisėmis vykdykite psql ir išvardykite duomenų bazes.

-bash-4.2$ psql -l
                                         Database List
   Name    |  Owner   | Encoding         |  Collation Order   | Ctype(conversion operator) |      Access rights
-----------+----------+------------------+--------------------+----------------------------+-----------------------
 postgres  | postgres | UTF8             | ja_JP.UTF-8        | ja_JP.UTF-8                |
 template0 | postgres | UTF8             | ja_JP.UTF-8        | ja_JP.UTF-8                | =c/postgres          +
           |          |                  |                    |                            | postgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8        | ja_JP.UTF-8                | =c/postgres          +
           |          |                  |                    |                            | postgres=CTc/postgres
(3 lines)

Jei rodomos postgres, template0 ir template1 duomenų bazės, vietinis prisijungimas veikia.

2-5. Automatinio paleidimo nustatymas

Kad „PostgreSQL“ būtų paleistas kartu su sistema, įjunkite paketo pateiktą systemd paslaugą. Toliau pateikta procedūra skirta „CentOS 7“.

Pirmiausia patikrinkite, ar yra /usr/lib/systemd/system/postgresql.service. Jei paketas vieneto nepateikė, istoriniame pavyzdyje sukuriamas /etc/systemd/system/postgresql.service. Naujam diegimui geriau naudoti konkrečios „PostgreSQL“ distribucijos pateiktą ir prižiūrimą vienetą.

[root@hostname ~]# touch /etc/systemd/system/postgresql.service
[root@hostname ~]# vi /etc/systemd/system/postgresql.service

Istoriniame faile įrašyta ši konfigūracija:

postgresql.service


[Unit]
#Aprašymas.
Description=PostgreSQL
#kontrolė prieš vykdymą ir po jo.
#Before=xxx.service
After=network.target

[Service]
#Vartotojo ir grupės paskyrimas
User=postgres
Group=postgres
#Suaktyvinus būseną, nustatykite būseną Aktyvuota.
Type=oneshot
RemainAfterExit=yes
#Paleiskite, sustabdykite ir perkraukite.
Environment=PGDATA=/var/lib/pgsql/data
ExecStart=/usr/bin/pg_ctl start -D /var/lib/pgsql/data
ExecStop=/usr/bin/pg_ctl stop
ExecReload=/usr/bin/pg_ctl reload

[Install]
#3 lygmens lygiaverčiai nustatymai.
WantedBy=multi-user.target

Išsaugoję vienetą, įjunkite jį per systemctl. Jei vieneto failas buvo ką tik sukurtas ar pakeistas, daemon-reload paprastai vykdomas prieš enable arba start.

[root@hostname ~]# systemctl enable postgresql
[root@hostname ~]# systemctl is-enabled postgresql
enabled
[root@hostname ~]# systemctl list-unit-files --type=service | grep postgresql
postgresql.service                                enabled
[root@hostname ~]# systemctl daemon-reload

2-6. Administravimo vaidmens slaptažodis

„PostgreSQL“ vaidmuo nėra tas pats, kas „Linux“ sistemos naudotojas. Istoriniame pavyzdyje nustatomas supernaudotojo postgres slaptažodis, kad būtų galima jungtis per pgAdmin. Gamybinei programai sukurkite atskirą mažiausių teisių vaidmenį ir nenaudokite postgres kasdienėms užduotims.

Šią komandą vykdykite kaip postgres sistemos naudotojas.

-bash-4.2$ psql
postgres=# alter role postgres with password '(kompiuterio) slaptažodis';
postgres=# \q

Vietoje pavyzdinio teksto įveskite ilgą, unikalų slaptažodį ir saugokite jį patikimoje paslapčių saugykloje.

2-7. Ugniasienės nustatymas

Nuotoliniam klientui ugniasienėje reikia leisti „PostgreSQL“ 5432/TCP prievadą. Toliau pateikta taisyklė atveria prievadą visai public zonai, todėl gamyboje geriau naudokite šaltinio adresu apribotą rich rule arba atskirą patikimą zoną. Parinktis --permanent išsaugo taisyklę po sistemos paleidimo iš naujo.

[root@hostname ~]# firewall-cmd --permanent --zone=public --add-port=5432/tcp
[root@hostname ~]# firewall-cmd --reload
[root@hostname ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client http https ssh
  ports: 8080/tcp 5432/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Jei „ports“ eilutėje rodoma 5432/tcp, taisyklė pritaikyta. Taip pat patikrinkite, kad ji būtų pasiekiama tik iš numatytų klientų tinklo.

Tada pgAdmin programoje patikrinkite prisijungimą. Istoriniame pavyzdyje naudojamas postgres vaidmuo ir ką tik nustatytas slaptažodis; gamyboje rinkitės atskirą administravimo vaidmenį ir šifruotą ryšį.

pgAdmin valdymo skydas su postgres duomenų baze centos_test serveryje

3. Santrauka

Istorinėje procedūroje įdiegiamas „PostgreSQL“ paketas, inicijuojamas klasteris, nustatomas nuotolinis klausymasis ir autentifikavimas, įjungiama paslauga bei ugniasienės prievadas.

Naujam diegimui nesinaudokite plačia 0.0.0.0/0 MD5 taisykle: apribokite adresus, duomenų bazę ir vaidmenį, naudokite SCRAM bei TLS, o programai suteikite tik būtinas teises.