使用 TLS 进行客户端身份验证

获授tls身份验证记录的数据库用户或角色可以使用 TLS 证书向 Vertica 验证身份。

先决条件

必须将 Vertica 配置为使用相互模式客户端-服务器 TLS

在相互模式下,客户端和服务器在连接之前必须验证彼此的身份。在此模式下,Vertica 可验证客户端的身份,且可以通过其证书对客户端进行身份验证。

配置 TLS 身份验证

以下部分将为客户端生成一个私钥和证书。为简单起见,该示例使用以下自签名 CA 证书 SSCA_cert 对客户端证书进行签名(在该示例的上下文中,该自签名证书还对 Vertica 数据库的服务器证书进行签名)。

=> CREATE KEY SSCA_key TYPE 'RSA' LENGTH 2048;
=> CREATE CA CERTIFICATE SSCA_cert
SUBJECT '/C=US/ST=Massachusetts/L=Cambridge/O=Micro Focus/OU=Vertica/CN=Vertica Root CA'
VALID FOR 3650
EXTENSIONS 'nsComment' = 'Self-signed root CA cert'
KEY SSCA_key;

而在生产环境中,则应该使用来自受信任证书颁发机构的 CA 证书。

以下示例将 Vertica 配置为使用包含方法 tls 的身份验证记录来对数据库用户 Bob 进行身份验证:

  1. 生成客户端的私钥:

    => CREATE KEY client_key_bob TYPE 'RSA' LENGTH 2048;
    
  2. 生成客户端的证书,同时为常用名 (CN) 字段指定数据库用户。此示例为数据库用户 Bob 创建了一个证书:

    => CREATE CERTIFICATE client_cert_bob
    SUBJECT '/C=US/ST=Massachusetts/L=Cambridge/O=Micro Focus/OU=Vertica/CN=Bob/emailAddress=bob@example.com'
    SIGNED BY SSCA_cert
    EXTENSIONS 'nsComment' = 'Vertica client cert', 'extendedKeyUsage' = 'clientAuth'
    KEY client_key_bob;
    
  3. 导出客户端的私钥和证书:

    $ vsql -At -c "SELECT key FROM cryptographic_keys WHERE name = 'client_key_bob';" -o client_key_bob.key
    $ vsql -At -c "SELECT certificate_text FROM certificates WHERE name = 'client_cert_bob';" -o client_cert_bob.crt
    
  4. 将证书复制或移动到客户端认可的位置。此示例适用于 vsql

    $ mkdir -p ~/.vsql
    $ cp client_cert_bob.crt ~/.vsql/client.crt
    $ cp client_key_bob.key ~/.vsql/client.key
    $ chmod 600 ~/.vsql/client.key ~/.vsql/client.crt
    $ chown -R bob ~/.vsql ~/.vsql/client.key ~/.vsql/client.crt
    
  5. 创建 tls 身份验证记录:

    => CREATE AUTHENTICATION v_tls_auth METHOD 'tls' HOST TLS '0.0.0.0/0';
    
  6. 将身份验证记录授予 Bob 或其默认角色之一

    => GRANT AUTHENTICATION v_tls_auth TO Bob;
    

拒绝明文连接

您可以创建拒绝来自指定 IP 范围的远程连接的身份验证记录。

例如,要拒绝所有纯文本的客户端连接,按如下所示指定 reject 身份验证方法和 HOST NO TLS 访问方法:

=> CREATE AUTHENTICATION RejectNoSSL METHOD 'reject' HOST NO TLS '0.0.0.0/0';  --IPv4
=> CREATE AUTHENTICATION RejectNoSSL METHOD 'reject' HOST NO TLS '::/0';       --IPv6