PostgreSQL на CentOS: безопасная установка и удаленный доступ
Дата публикации:
Обновлено:
Статьи > PostgreSQL на CentOS: безопасная установка и удаленный доступ
Статус 2026 и безопасное использование
Вывод: Установите поддерживаемую версию PostgreSQL, инициализируйте предполагаемый кластер, прослушивайте только необходимые интерфейсы и предоставьте доступ в pg_hba.conf к определенным базам данных, ролям и доверенным сетям. Используйте аутентификацию по паролю SCRAM и TLS, когда пароли передаются по сети.
Чему вы научитесь
- Как взаимодействуют источник пакета, каталог данных, инициализация, systemd, прослушивающие сокеты и аутентификация клиента.
- Почему
listen_addresses='*'плюсhost all all 0.0.0.0/0 md5предоставляет гораздо больше, чем требуется большинству приложений. - Как проверить правила доступа, не блокируя локальное администрирование.
Для кого: Администраторы, переносящие простой модуль Runbook CentOS/PostgreSQL в поддерживаемое сетевое развертывание.
Актуальность на 2026 год. Приведенное ниже общее правило MD5 сохраняется только как предостерегающий исторический пример. PostgreSQL документирует пароли, зашифрованные с помощью MD5, как устаревшие; предпочитайте scram-sha-256, узкие CIDR, роли с наименьшими привилегиями, элементы управления брандмауэром, TLS, резервное копирование и поддерживаемую основную версию.
Примечание по безопасности. Команды и примеры конфигурации из исходной статьи не проверялись повторно в современной производственной среде. Перед применением проверьте поддерживаемые версии, резервные копии, контроль доступа и процедуру отката в отдельной тестовой среде.
Официальные первоисточники
Обзор
Эта историческая процедура устанавливает и инициализирует PostgreSQL в CentOS 7, а затем настраивает запуск службы и сетевой доступ. Для нового сервера используйте поддерживаемую версию и адаптируйте команды к её документации.
Сетевая конфигурация требует особого внимания: ограничьте интерфейсы прослушивания, диапазоны CIDR, базы данных и разрешённые роли необходимым минимумом.
Версии следующие.
| Версия CentOS | 7.6 (1810) |
|---|---|
| Версия PostgreSQL | 9.2.24 |
Оглавление
1. Установка
В этом разделе описана процедура установки PostgreSQL.
1-1. Установка PostgreSQL
Выполните установку PostgreSQL с помощью команды yum. Выполните работу от имени пользователя root.
[username@hostname ~]$ su -
[root@hostname ~]# yum -y install postgresql-server
2. Детали настройки
В этом разделе описывается конфигурация вплоть до запуска PostgreSQL.
2-1. Создайте выделенного пользователя PostgreSQL.
Пакет обычно создаёт системную учётную запись "postgres" для администрирования экземпляра через psql. Проверьте её наличие, прежде чем создавать другую.
Попробуйте переключиться на пользователя с помощью следующей команды.
[root@hostname ~]# su - postgres
Поскольку некоторые люди, возможно, используют более старую версию PostgreSQL, следует упомянуть, что процедура установки переменных окружения путем изменения следующего ".bashrc" также больше не нужна.
export PGHOME=/var/lib/pgsql
export PGDATA=/var/lib/pgsql/data
export PGHOST=localhost
PGDATA по умолчанию для пользователей postgres теперь будет '/var/lib/pgsql/data'. По описанию он обращается к "/usr/lib/systemd/system/postgresql.service".
2-2. Подготовка данных PostgreSQL
Создайте данные PostgreSQL. Кодировка - UNICODE. Каталог "/var/lib/pgsql/data" был создан по умолчанию, но тем, кто этого не сделал, также предлагается создать папку.
-bash-4.2$ initdb --encoding=UNICODE
Поскольку "PGDATA=/var/lib/pgsql/data" установлен в "/usr/lib/systemd/system/postgresql.service", "initdb --encoding=UNICODE" создаст БД под "/var/lib/pgsql/ data/", БД собирается под "/var/lib/pgsql/data/".
2-3. Изменение конфигурационного файла
Разрешить IP-адресам доступ к PostgreSQL. Настройте систему так, чтобы она проходила аутентификацию по паролю для нелокального доступа.
[root@hostname ~]# vi /var/lib/pgsql/data/postgresql.conf
Измените файл 'postgresql.conf' следующим образом.
#------------------------------------------------------------------------------
# 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;
Значение "*" заставляет PostgreSQL слушать все доступные интерфейсы, но само по себе не предоставляет клиентам доступ. Если приложение использует известный интерфейс, укажите его адрес и не расширяйте поверхность доступа без необходимости.
Удалённое подключение, например из pgAdmin, требует адреса прослушивания, подходящего правила pg_hba.conf и разрешения межсетевого экрана. Локальное подключение psql может использовать localhost или Unix-сокет.
Это важный параметр безопасности, поэтому максимально сократите количество пользователей, которые могут получить к нему доступ.
Затем измените файл 'pg_hba.conf'.
[root@hostname ~]# vi /var/lib/pgsql/data/pg_hba.conf
Добавьте следующую информацию в конец документа.
#Проверка подлинности пароля извне.
host all all 0.0.0.0/0 md5
При включении этой настройки при подключении извне требуется пароль. Эти области могут быть серьезными дырами в безопасности, если они не настроены или настроены неправильно, поэтому, пожалуйста, настраивайте их с особой тщательностью.
2-4. проверка бутстрапа
Теперь, когда предварительная конфигурация завершена, проверьте запуск PostgreSQL. Поскольку БД была создана под пользователем postgres, перед началом работы переключитесь на пользователя postgres.
[root@hostname ~]# su - postgres
-bash-4.2$ pg_ctl start
После успешного запуска PostgreSQL проверьте, что команда psql работает без проблем. Выполните команду psql от имени пользователя 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)
Ничего страшного, если будут получены вышеуказанные результаты.
2-5. Настройка автоматического запуска
Хотя это не является обязательным, трудно запускать PostgreSQL при каждом перезапуске сервера, поэтому он настроен так, чтобы PostgreSQL запускался автоматически при запуске сервера. Он также регистрируется командой systemctl. Обратите внимание, что эта процедура предназначена для CentOS7, поэтому если вы используете что-то другое, кроме CentOS7, вам нужно будет использовать команду Service для решения этой проблемы.
Проверьте, существует ли '/usr/lib/systemd/system/postgresql.service'. Если нет, создайте 'postgresql.service' с помощью следующей процедуры. Запустите от имени пользователя root.
[root@hostname ~]# touch /etc/systemd/system/postgresql.service
[root@hostname ~]# vi /etc/systemd/system/postgresql.service
Предоставляется следующая информация.
[Unit]
#Описание.
Description=PostgreSQL
#Контроль до и после исполнения.
#Before=xxx.service
After=network.target
[Service]
#Назначение пользователей и групп
User=postgres
Group=postgres
#После активации установите статус Activated.
Type=oneshot
RemainAfterExit=yes
#Запуск, остановка и перезарядка.
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]
#Эквивалентные настройки Runlevel 3.
WantedBy=multi-user.target
Затем зарегистрируйтесь с помощью команды 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. Добавление административного пользователя в PostgreSQL
Создайте пользователя, который будет использоваться в приложении PostgreSQL, отдельно от пользователя, который работает с PostgreSQL из Linux. Это пользователь при работе с pgadmin и т.д. Я хочу изменить пароль пользователя postgres, который существует по умолчанию, и использовать его.
Выполните следующую команду от имени пользователя postgres.
-bash-4.2$ psql
postgres=# alter role postgres with password '(компьютерный) пароль';
postgres=# \q
Примечание: Введите пароль, который вы хотите установить, в поле 'Пароль'.
2-7. Сверление брандмауэров
Разрешите доступ к порту PostgreSQL, поскольку брандмауэр (iptables для CentOS6 и более ранних версий) по умолчанию разрешает только доступ по ssh на CentOS7. Добавьте также опцию 'permanent', чтобы сделать конфигурацию постоянной.
[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:
Если там написано 'ports: 5432/tcp', то все в порядке.
Доступ через pgadmin. Вы должны иметь возможность войти в систему как пользователь postgres с паролем, который вы только что установили.
3. резюме
Мы описали начальную конфигурацию, необходимую при установке PostgreSQL. Первоначальная сборка PostgreSQL может оказаться непростой задачей, поэтому обратитесь к этому разделу.
