在 CentOS 上安全安装 PostgreSQL 并配置远程访问


出版日期:

更新:


技术文章 > 在 CentOS 上安全安装 PostgreSQL 并配置远程访问

2026 状态和安全使用

结论:安装受支持的 PostgreSQL 版本,初始化目标集群,仅侦听所需的接口,并在 pg_hba.conf 中授予对特定数据库、角色和受信任网络的访问权限。当密码跨越网络时,使用 SCRAM 密码身份验证和 TLS。

你将学到什么

  • 包源、数据目录、初始化、systemd、侦听套接字和客户端身份验证如何交互。
  • 为什么 listen_addresses='*' 加上 host all all 0.0.0.0/0 md5 公开的内容远远超出大多数应用程序的要求。
  • 如何在不锁定本地管理的情况下测试访问规则。

适用人群:管理员将简单的 CentOS/PostgreSQL Runbook 迁移到受支持的网络部署。

2026 年立场:下面的广泛 MD5 规则仅作为带有警告的历史示例而保留。 PostgreSQL 将 MD5 加密密码记录为已弃用;更喜欢 scram-sha-256、窄 CIDR、最低权限角色、防火墙控制、TLS、备份和受支持的主要版本。

安全注意事项:原始文章中的命令和配置示例尚未在当前生产环境中重新运行。应用之前,请在单独的测试环境中验证支持的版本、备份、访问控制和回滚步骤。

官方主要来源

概述。

这是在CentOS上安装和启动PostgreSQL所需的初始配置程序。 这些信息是基于使用CentOS7的假设。 关于安全的部分也包括在内。

推荐使用PostgreSQL,因为它是免费的,而且功能很强。 我听说PostgreSQL的函数过去很慢,但最近的函数有了改进,速度更快。

版本如下。

CentOS版本7.6 (1810)
PostgreSQL的版本9.2.24

目录

  1. 安装
  2. 设置细节
  3. 摘要

1. 安装

本节描述了安装PostgreSQL的过程。

1-1. 安装PostgreSQL

通过yum命令进行PostgreSQL的安装。 以根用户身份开展工作。

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

2. 设置细节

本节描述了启动PostgreSQL之前的配置。

2-1. 创建一个专门的PostgreSQL用户。

PostgreSQL 软件包已创建用于运行 psql 的专用系统账号,因此无需重复创建。

尝试用以下命令切换到一个用户。

[root@hostname ~]# su - postgres

由于有些人可能使用的是旧版本的PostgreSQL,应该提到的是,通过改变以下".bashrc "来设置环境变量的程序也不再需要了。

.bashrc


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

postgres用户的默认PGDATA现在看来是'/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

由于"/usr/lib/systemd/system/postgresql.service "中设置了 "PGDATA=/var/lib/pgsql/data","initdb --encoding=UNICODE "将在"/var/lib/pgsql/"下构建一个数据库。 data/",DB被建立在"/var/lib/pgsql/data/"。

2-3. 修改配置文件

允许 IP 地址访问 PostgreSQL。 设置系统,使其对非本地访问进行密码认证。

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

修改'postgresql.conf'如下。

postgresql.conf【改变之前】


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

# - Connection Settings -

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

postgresql.conf【变化后】


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

# - Connection Settings -

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

补充一点,因为这是安全的一个重要部分,如果你把这个设置放进去,你将能够从任何IP访问网站。 如果要访问的IP是固定的,请说明固定IP。

当从安装PostgreSQL的服务器以外的服务器登录时,这个设置是必要的,例如pgadmin。 如果你登录到服务器并运行psql命令,这个设置就没有必要。 (因为该连接来自他自己(localhost))

这是一个重要的安全设置,所以要尽可能地减少可以访问它的用户数量。

然后修改'pg_hba.conf'。

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

在文件的末尾添加以下信息。

pg_hba.conf


#来自外部的密码认证。
host    all             all             0.0.0.0/0            md5

通过包括这一设置,从外部连接时需要一个密码。 这些区域如果没有设置或设置不正确,会成为严重的安全漏洞,所以请以最谨慎的态度设置这些区域。

2-4. 引导性检查

现在预配置已经完成,检查PostgreSQL是否启动。 由于DB是以postgres用户的身份建立的,所以在开始之前切换到postgres用户。

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

在PostgreSQL成功启动后,检查psql命令的工作是否没有问题。 以postgres用户身份运行psql命令。

-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@hostname ~]# touch /etc/systemd/system/postgresql.service
[root@hostname ~]# vi /etc/systemd/system/postgresql.service

以下是提供的信息。

postgresql.service


[Unit]
#描述。
Description=PostgreSQL
#执行前和执行后的控制。
#Before=xxx.service
After=network.target

[Service]
#用户和组的指定
User=postgres
Group=postgres
#一旦激活,将状态设为已激活。
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]
#运行级别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添加一个管理用户

应用程序使用的数据库账号应与 Linux 服务账号分离。该历史示例修改现有 postgres 用户的密码。

以postgres用户身份运行以下命令。

-bash-4.2$ psql
postgres=# alter role postgres with password '(密码';
postgres=# \q

注意:在 "密码 "栏中输入你想设置的密码。

2-7. 防火墙的钻探

允许访问PostgreSQL端口,因为防火墙(CentOS6及以前的iptables)在CentOS7上默认只允许ssh访问。 还可以添加 "永久 "选项,使配置永久化。

[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:

如果它显示 "端口:5432/tcp",那就可以了。

通过pgadmin访问。 你应该可以用刚才设置的密码以postgres用户的身份登录。

pgAdmin 控制台中 centos_test 服务器上的 postgres 数据库

3. 摘要

我们已经描述了安装PostgreSQL时需要的初始配置。 最初建立PostgreSQL可能会很费劲,所以请参考本节。

■技术文章

查看全部技术文章。


■作者简介

查看作者简介。


■联系我们

就本文内容联系我们。