暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL之SSL

1712

1PostgreSqlSSL ?

PostgreSQL支持使用SSL连接加密客户端/服务器通信,以提高链路安全性。这要求在客户端和服务器系统上都安装OpenSSL,并且在构建时启用PostgreSQL中的ssl支持(使用源码安装时的--with-openssl参数)。

2、什么是OpenSSL

OpenSSL是一个工具包,用于Transport Layer Security(TLS)和Secure Sockets Layer(SSL)协议。它也是一个通用的密码学库。

OpenSSL工具包包括:

  • libssl:是TLSv1.3以下所有TLS协议版本的实现。

  • Libcrypto:是一个通用密码库。它构成了TLS实现的基础,也可以单独使用。

  • openssl:openssl的命令行工具。

官网:https://www.openssl.org/

源码:https://gitee.com/mirrors/openssl

3PG开启SSL?

在PG当前稳定版本(13.0)与ssl相关的参数有如下这些:

    ssl = on
    ssl_ca_file = ''
    ssl_cert_file = 'server.crt'
    ssl_crl_file = ''
    ssl_key_file = 'server.key'
    ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
    ssl_prefer_server_ciphers = on
    ssl_ecdh_curve = 'prime256v1'
    ssl_min_protocol_version = 'TLSv1.2'
    ssl_max_protocol_version = ''
    ssl_dh_params_file = ''
    ssl_passphrase_command = ''
    ssl_passphrase_command_supports_reload = off

    见:https://www.postgresql.org/docs/13/runtime-config-connection.html

    我们一般会配置ssl、ssl_cert_file、ssl_key_file这三个,其他的一般维持默认值。这是三个参数分别的含义如下:

    • ssl: 是否支持SSL连接。默认是关闭的。

    • ssl_cert_file:指定包含SSL服务器证书的文件的名称。默认是server.crt。相对路径相对于数据目录。

    • ssl_key_file:指定包含SSL服务器私钥的文件的名称。默认是server.key。相对路径相对于数据目录。

    ssl设置为on,即表示打开sslSSL打开后,此时服务器将侦听同一TCP端口上的正常连接和SSL连接,并与任何连接客户机协商是否使用SSL。

    注意:

    1. 要在SSL模式下启动,必须包含服务器证书和私钥的文件。默认情况下,这些文件将被命名为server.crt和server.key。但是可以使用配置参数ssl_cert_file和ssl_key_file指定其他名称和位置。

    2. 配置了SSL=on并不代表会确保所有客户端总是通过SSL连接, 它只是表示允许使用SSL。如果想要确保所有连接都是用ssl, 还需要结合pg_hba.conf进行配置。比如添加类似“hostssl   all all 0.0.0.0/0 md5 \n hostnossl all all 0.0.0.0/0 reject” 这样的配置。

    4、怎么生成server.crt和server.key?

    上面我们提到开启ssl需要配置服务端证书和服务端私钥,即server.crt和server.key。那么怎么生成这两个文件呢?

    首先是服务端证书类型来说,证书可以分为三类:

    • 自签名证书:自签名证书是没有由证书颁发机构(CA)签名的安全证书。

    • 建立本地根CA、再由根CA签发服务器证书:这种类型需要将本地根证书root.crt部署在客户端,PG客户不依赖操作系统的证书,需要自行制定根证书的存放地方。

    • 公共CA签署的证书:一般用在有域名的服务器上。此类型需要客户端配置公共的root.crt。

    下面我说一下前两种类型怎么做。

    A、自签名证书

    我们使用自签名证书进行测试创建自签名证书,需要借助openssl工具,命令:

      openssl req -new -x509 -days 365 -nodes -text -out server.crt -keyout server.key -subj "/CN=dbhost.yourdomain.com"

      该命令会输出一个server.crt和一个server.key文件,证书有效期为365天。

      B、建立本地根CA、再由根CA签发服务器证书。

      我们可以用自签名证书做简单的测试。但是,要创建一个客户端可以验证其身份和来源的服务器证书,首先要创建一个证书签名请求和一个公钥/私钥文件:

        openssl req -new -nodes -text -out root.csr -keyout root.key -subj "/CN=your-hostname.com"

        生成root.crt。

          openssl x509 -req -in root.csr -text -days 365 -extfile etc/pki/tls/openssl.cnf -extensions v3_ca -signkey root.key -out root.crt

          使用这个新的root.crt创建服务端证书。

            openssl req -new -nodes -text -out server.csr -keyout server.key -subj "/CN=your-hostname.com"

            种方法需要将root.crt配置在客户端,以便客户端可以验证服务器的证书是否由证书颁发结构签名。

            5、PostgreSQL支持的SSL模式?

            1. disable: 只尝试非SSL连接。

            2. allow:首先尝试非SSL连接,若失败再尝试SSL连接。

            3. prefer (default):首先尝试SSL连接,若失败再尝试非SSL连接。

            4. require:只尝试SSL连接,若有根证书存在,等同于verify-ca。

            5. verify-ca:只尝试SSL连接,并用根证书验证服务器证书是不是根CA签发的。

            6. verify-full:只尝试SSL连接,并用根证书验证服务器证书是不是根CA签发的,且主题必须匹配连接域名或IP地址。

            PG如何指定要使用的模式?

            比如使用verify-ca:

              psql "dbname=test host=10.xx.3.xx user=postgres password=1234 sslmode=verify-ca"

              6、其他?

              其实pg的ssl认证分为两部分,一是服务端ssl的认证,即客户端去验证服务端证书,这一种也是我们上面谈到的。二是客户端的ssl认证,即服务端去验证客户端的证书。这里就不展开说了。

              7、扩展:什么是x509证书?

              X509一般是指X.509。X.509是密码学里公钥证书的格式标准, 规定了数字证书的格式

              X.509证书含有公钥和标识(主机名、组织或个人),并由证书颁发机构(CA)签名(或自签名)。对于一份经由可信的证书签发机构签名(或者可以通过其它方式验证)的证书,证书的拥有者就可以用证书及相应的私钥来创建安全的通信,以及对文档进行数字签名。

              更多信息见:https://blog.51cto.com/u_9843231/2466504

              如果你注意到的话,上面我们在使用openssl申请证书时,就使用了x509。


              参考:

              https://www.postgresql.org/docs/current/ssl-tcp.html

              https://blog.51cto.com/u_9843231/2466504

              文章转载自PostgreSQL运维技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论