PostgreSQL na CentOS: bezpieczna instalacja i dostęp zdalny
Data publikacji:
Aktualizacja:
Artykuły > PostgreSQL na CentOS: bezpieczna instalacja i dostęp zdalny
Stan na rok 2026 i bezpieczne użytkowanie
Wniosek: zainstaluj obsługiwaną wersję PostgreSQL, zainicjuj zamierzony klaster, nasłuchuj tylko na wymaganych interfejsach i przyznaj dostęp w pg_hba.conf określonym bazom danych, rolom i zaufanym sieciom. Używaj uwierzytelniania hasłem SCRAM i TLS, gdy hasła przesyłane są przez sieć.
Czego się nauczysz
- Jak współdziałają źródło pakietu, katalog danych, inicjalizacja, systemd, gniazda nasłuchiwania i uwierzytelnianie klienta.
- Dlaczego
listen_addresses='*'plushost all all 0.0.0.0/0 md5ujawnia znacznie więcej, niż wymaga tego większość aplikacji. - Jak przetestować reguły dostępu bez blokowania lokalnej administracji.
Dla kogo: Administratorzy migrujący prosty element Runbook CentOS/PostgreSQL do obsługiwanego wdrożenia sieciowego.
Stanowisko na rok 2026: Ogólną zasadę MD5 przedstawioną poniżej zachowano jedynie jako historyczny przykład niosący ostrzeżenie. PostgreSQL dokumentuje hasła zaszyfrowane MD5 jako przestarzałe; preferuj scram-sha-256, wąskie CIDR, role o najniższych uprawnieniach, kontrolę zapory ogniowej, TLS, kopie zapasowe i obsługiwaną wersję główną.
Uwaga dotycząca bezpieczeństwa: polecenia i przykłady konfiguracji z pierwotnego artykułu nie zostały ponownie uruchomione we współczesnym środowisku produkcyjnym. Przed użyciem sprawdź wspierane wersje, kopie zapasowe, kontrolę dostępu i procedurę wycofania w oddzielnym środowisku testowym.
Oficjalne źródła pierwotne
Przegląd
Ta historyczna procedura instaluje i inicjalizuje PostgreSQL w systemie CentOS 7, a następnie konfiguruje uruchamianie usługi i dostęp sieciowy. Na nowym serwerze użyj nadal wspieranej wersji i dostosuj polecenia do jej dokumentacji.
Konfiguracja sieci wymaga szczególnej uwagi: ogranicz interfejsy nasłuchiwania, zakresy CIDR, bazy danych i uprawnione role do niezbędnego minimum.
Wersje są następujące.
| Wersja CentOS | 7.6 (1810) |
|---|---|
| Wersja PostgreSQL | 9.2.24 |
Spis treści
1. Instalacja
W tym rozdziale opisano procedurę instalacji PostgreSQL.
1-1. Instalacja PostgreSQL
Wykonaj instalację PostgreSQL za pomocą polecenia yum. Wykonaj pracę jako użytkownik root.
[username@hostname ~]$ su -
[root@hostname ~]# yum -y install postgresql-server
2. Szczegóły konfiguracji
W tym rozdziale opisano konfigurację aż do uruchomienia PostgreSQL.
2-1. Utwórz dedykowanego użytkownika PostgreSQL.
Pakiet zwykle tworzy konto systemowe "postgres", używane do administrowania instancją za pomocą psql. Sprawdź jego obecność przed utworzeniem kolejnego konta.
Spróbuj przełączyć się na użytkownika za pomocą następującego polecenia.
[root@hostname ~]# su - postgres
Ponieważ niektóre osoby mogą używać starszej wersji PostgreSQL, należy wspomnieć, że procedura ustawiania zmiennych środowiskowych poprzez zmianę pliku ".bashrc" również nie jest już konieczna.
export PGHOME=/var/lib/pgsql
export PGDATA=/var/lib/pgsql/data
export PGHOST=localhost
Domyślnym PGDATA dla użytkowników postgresa jest teraz '/var/lib/pgsql/data'. Jest on opisany jako odwołujący się do "/usr/lib/systemd/system/postgresql.service".
2-2. Przygotowanie danych PostgreSQL
Tworzenie danych PostgreSQL. Kodowanie to UNICODE. Katalog "/var/lib/pgsql/data" został utworzony domyślnie, ale osoby, które tego nie zrobiły, są również proszone o utworzenie katalogu.
-bash-4.2$ initdb --encoding=UNICODE
Ponieważ "PGDATA=/var/lib/pgsql/data" jest ustawione w "/usr/lib/systemd/system/postgresql.service", "initdb --encoding=UNICODE" utworzy DB w "/var/lib/pgsql/ data/", DB jest tworzony w katalogu "/var/lib/pgsql/data/".
2-3. Modyfikowanie pliku konfiguracyjnego
Zezwalaj adresom IP na dostęp do serwera PostgreSQL. Skonfiguruj system tak, aby był uwierzytelniany hasłem w przypadku dostępu nielokalnego.
[root@hostname ~]# vi /var/lib/pgsql/data/postgresql.conf
Zmodyfikuj plik 'postgresql.conf' w następujący sposób.
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
#listen_addresses = 'localhost' # what IP address(es) to listen on;
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
listen_addresses = '*' # what IP address(es) to listen on;
Wartość "*" powoduje nasłuchiwanie PostgreSQL na wszystkich dostępnych interfejsach, lecz sama nie przyznaje klientom dostępu. Jeśli aplikacja korzysta ze znanego interfejsu, podaj jego adres i uniknij zbędnej ekspozycji.
Połączenie zdalne, na przykład z pgAdmin, wymaga adresu nasłuchiwania, odpowiedniej reguły pg_hba.conf i zezwolenia zapory. Lokalne połączenie psql może używać localhost lub gniazda Unix.
Jest to ważne ustawienie zabezpieczeń, dlatego należy jak najbardziej ograniczyć liczbę użytkowników, którzy mogą uzyskać do niego dostęp.
Następnie należy zmodyfikować plik 'pg_hba.conf'.
[root@hostname ~]# vi /var/lib/pgsql/data/pg_hba.conf
Na końcu dokumentu należy dodać następujące informacje.
#Uwierzytelnianie hasłem z zewnątrz.
host all all 0.0.0.0/0 md5
Włączenie tego ustawienia powoduje, że podczas łączenia się z zewnątrz wymagane jest podanie hasła. Obszary te mogą stanowić poważne luki w zabezpieczeniach, jeśli nie zostaną skonfigurowane lub zostaną skonfigurowane niepoprawnie, dlatego należy je skonfigurować z należytą starannością.
2-4. kontrola bootstrapu
Po zakończeniu konfiguracji wstępnej sprawdź, czy PostgreSQL został uruchomiony. Ponieważ baza danych została zbudowana jako użytkownik postgres, przed rozpoczęciem należy przełączyć się na użytkownika postgres.
[root@hostname ~]# su - postgres
-bash-4.2$ pg_ctl start
Po pomyślnym uruchomieniu PostgreSQL sprawdź, czy polecenie psql działa bez problemów. Uruchom polecenie psql jako użytkownik postgres.
-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)
Jeśli zostaną zwrócone powyższe wyniki, jest to w porządku.
2-5. Ustawienie automatycznego rozruchu
Mimo że nie jest to obowiązkowe, trudno jest uruchamiać PostgreSQL przy każdym ponownym uruchomieniu serwera, dlatego jest on skonfigurowany w taki sposób, aby PostgreSQL był uruchamiany automatycznie przy starcie serwera. Rejestruje się również do polecenia systemctl. Należy pamiętać, że ta procedura dotyczy systemu CentOS7, więc jeśli używasz systemu innego niż CentOS7, będziesz musiał użyć polecenia Service, aby poradzić sobie z tym problemem.
Sprawdź, czy istnieje usługa '/usr/lib/systemd/system/postgresql.service'. Jeśli nie, utwórz "postgresql.service", korzystając z poniższej procedury. Uruchom jako użytkownik root.
[root@hostname ~]# touch /etc/systemd/system/postgresql.service
[root@hostname ~]# vi /etc/systemd/system/postgresql.service
Podane są następujące informacje.
[Unit]
#Opis.
Description=PostgreSQL
#Kontrola przed- i porealizacyjna.
#Before=xxx.service
After=network.target
[Service]
#Oznaczenie użytkownika i grupy
User=postgres
Group=postgres
#Po aktywacji należy ustawić status na Aktywny.
Type=oneshot
RemainAfterExit=yes
#Uruchomienie, zatrzymanie i przeładowanie.
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]
#Ustawienia równoważne Runlevel 3.
WantedBy=multi-user.target
Następnie należy zarejestrować się za pomocą polecenia systemctl.
[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. Dodawanie użytkownika administracyjnego do PostgreSQL
Utwórz użytkownika, który będzie używany w aplikacji PostgreSQL, oddzielnie od użytkownika, który obsługuje PostgreSQL z poziomu systemu Linux. Jest to użytkownik używany podczas pracy z programem pgadmin itp. Chciałbym zmienić hasło użytkownika postgres, który istnieje domyślnie, i użyć go.
Wykonaj następujące polecenie jako użytkownik postgres.
-bash-4.2$ psql
postgres=# alter role postgres with password '(komputer) hasło';
postgres=# \q
Uwaga: W polu "Hasło" wpisz hasło, które chcesz ustawić.
2-7. Wiercenie zapór ogniowych
Zezwól na dostęp do portu PostgreSQL, ponieważ zapora sieciowa (iptables w systemie CentOS6 i wcześniejszych) domyślnie zezwala na dostęp tylko przez ssh w systemie CentOS7. Dodaj także opcję "permanent", aby konfiguracja była trwała.
[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:
Jeśli widnieje na nim napis "ports: 5432/tcp", to znaczy, że wszystko jest w porządku.
Dostęp za pomocą programu pgadmin. Powinieneś być w stanie zalogować się jako użytkownik postgres z hasłem, które właśnie ustawiłeś.
3. streszczenie
Opisaliśmy wstępną konfigurację wymaganą podczas instalacji PostgreSQL. Początkowa konfiguracja PostgreSQL może być trudna, dlatego należy zapoznać się z tym rozdziałem.
