使用 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
进行身份验证:
-
生成客户端的私钥:
=> CREATE KEY client_key_bob TYPE 'RSA' LENGTH 2048;
-
生成客户端的证书,同时为常用名 (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;
-
导出客户端的私钥和证书:
$ 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
-
将证书复制或移动到客户端认可的位置。此示例适用于
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
-
创建
tls
身份验证记录:=> CREATE AUTHENTICATION v_tls_auth METHOD 'tls' HOST TLS '0.0.0.0/0';
-
=> 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