Tcp/ip无法连接到Postgresql 数据库,SSL关闭状态

1. Postgres客户端链接异常

FATAL: no pg_hba.conf entry for host “39.64.198.83”, user “test”, database “testdb”, SSL off
QPSQL: Unable to connect

  1. 此处两个异常错误
    1. 39.64.198.83 ip登陆验证用户test数据库testdb时客户端验证不通过
      改正: 修改对pg_hba.conf对ip限制即可
    2. SSL OFF 未启用


2. 启用客户端验证

Postgresql 的客户端验证有一个名为 pg_hda.conf 的配置文件控制。 hda的意思是[基于主机的验证](host-based authentication)

pg_hda.conf 文件的格式, 具体参数可以参考官方文档

# TYPE  DATABASE     USER     ADDRESS      METHOD   [auth-options]
  • type 参数可选:

    • local

      This record matches connection attempts using Unix-domain sockets. Without a record of this type, Unix-domain socket connections are disallowed.

      这个记录匹配通过unix套接字的进行的连接请求。没有这种类型的记录,unix套接字连接将会被禁止

    • host

      This record matches connection attempts made using TCP/IP. host records match either SSL or non-SSL connection attempts.

      这个记录匹配通过TCP/IP的进行的连接请求。host记录匹配SSL或者非SSL的连接 注意:除非服务器带着合适的 listen_addresses 配置参数值启动,否则远程的TCP/IP将不能连接。因为缺省只监听本地回环地址localhost的TCP/IP连接。

    • hostssl

      This record matches connection attempts made using TCP/IP, but only when the connection is made with SSL encryption.

      To make use of this option the server must be built with SSL support. Furthermore, SSL must be enabled at server start time by setting the ssl configuration parameter (see Section 17.9 for more information).

      这个记录匹配通过TCP/IP进行的连接请求,但是只能使用SSL加密进行连接。要用这个选项,服务器必须要支持SSL。此外,当服务器启动的时候必须通过设置将SSL启用

    • hostnossl

      This record type has the opposite behavior of hostssl; it only matches connection attempts made over TCP/IP that do not use SSL.

      这个记录刚好与hostssl的逻辑相反;它只能匹配用TCP/IP但是不用SSL的连接。

  • Database

    Specifies which database name(s) this record matches. The value all specifies that it matches all databases. The value sameuser specifies that the record matches if the requested database has the same name as the requested user. The value samerole specifies that the requested user must be a member of the role with the same name as the requested database.

    指定记录匹配的数据库名。值all将匹配所有的数据库。值sameuser表示如果请求连接的数据库名和用户名相同,则匹配。值samegroup表示请求的用户必须是与数据库同名的组中的成员。值replication表示如果一个replication的连接被请求,则匹配

  • user

    Specifies which database user name(s) this record matches. The value all specifies that it matches all users. Otherwise, this is either the name of a specific database user, or a group name preceded by +.

    为这条记录声明所匹配的PostgreSQL用户。值all表示匹配所有用户。否则,它就是特定的数据库用户的名字,组名字可以通过用 + 做组名字前缀来声明

  • address

    Specifies the client machine address(es) that this record matches. This field can contain either a host name, an IP address range, or one of the special key words mentioned below.

    声明这条记录匹配的客户端机器的地址。这个字段可以包含一个主机名、一个IP地址范围或者下面提到的特殊关键字

  • METHOD

    • trust

      无条件的允许连接。这个方法允许任何人用任意一个PostgreSQL用户登录到PostgreSQL数据库。

    • reject

      无条件的拒绝连接。这对于过滤一个组中的某些主机非常有用,例如,一个reject的行能够阻止一个指定的主机连接。而允许特定的网络中其他主机的连接。

    • md5

      要求客户端提供一个MD5加密的口令进行认证。请查阅Section 19.3节获取详细的信息。

    • password

      要求客户提供一个未加密的密码进行身份验证。因为口令是以明文形式在网络上传递的,所以我们不应该在不安全的网络上使用这个方式。请参阅 Section 19.2.2 获取详细信息。

    • krb5

      使用Kerberos V5来进行认证用户。这只对TCP/IP连接有效。请参阅Section 19.3.5获取详细信息。

    • ident

      获取客户端的操作系统的用户名,然后联系客户端上的ident服务器并检查是否和要求的数据库用户名匹配。Ident认证只对TCP/IP连接有效。如果是本地连接,将会被peer认证方法替换。请参阅Section 19.3.6获取详细信息。

    • peer

      从操作系统获取操作系统的用户名,然后检查它是否和请求的数据库名相匹配。这只对本地连接有效。请参阅Section 19.3.7获取详细信息。

    • ldap

      用LDAP服务器进行认证,请参阅Section 19.3.8获取详细信息。

    • radius

      用RADIUS服务器进行认证。

    • cert

      用SSL客户端证书进行认证,请参阅Section 19.3.10获取详细信息。

    • pam

      使用操作系统提供的可插入的认证模块服务(Authenticate using the Pluggable Authentication Modules)(PAM)。


3.启用Tcp/Ip 链接

postgresql.conf 配置文件掌管是否允许Tcp/Ip链接


listen_addresses = '*' #what ip address to listen on;
                       # comma-separated list of addresses;
                       # defaults to 'localhost'; use '*' for all


4. SSL加密

Postgresql 本机支持使用ssl链接对客户端/服务器通讯协议进行加密,以增强安全性

  1. 缺省, Postgresql不会执行任何服务器证书验证,这意味着可以在客户端没有察觉的情况下骗过服务认证(修改DNS记录,接管服务ip地址)

    同样位于postgresql.conf配置文件下:
    ssl = true
    ssl_cert_file = ‘xxx.pem’
    ssl_key_file = ‘xxx.key’

    官方文档

    创建自签名证书

欣赏此文? 求鼓励,求支持!