はじめに
Verticaではクライアントとの通信をSSL/TLSを使用して暗号化することができます。認証の方式としては、サーバ認証と相互認証の2種類があり、こちらの記事では、サーバ認証を使用したSSL/TLS通信の設定方法をご紹介します。設定に必要なファイル
サーバ認証方式のSSL/TLS通信を行うには以下のファイルが必要となります。・サーバ証明書(自己署名証明書でも可)
・サーバの秘密鍵
設定方法
構文
サーバの秘密鍵とサーバ証明書の登録
OSのdbadminユーザから以下のコマンドにて、Verticaへサーバ証明書とサーバの秘密鍵を登録します。
admintools -t set_ssl_params -d <データベース名> -p <パスワード> -k <サーバの秘密鍵> -c <サーバ証明書>
VerticaデータベースのSSL/TLS通信の有効化
Verticaデータベースへdbadminユーザにて接続した後、以下のSQLコマンドを実行します。
ALTER DATABASE <データベース名> SET EnableSSL = 1;
設定例
以下に自己署名証明書を使用した設定例を記載します。正規の証明書を保持している場合は手順「2. サーバの秘密鍵とサーバ証明書の検証」から参照してください。なお、OSコマンドの詳細についてはマニュアル等でご確認ください。
1. サーバ証明書(自己署名)の作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#-- 1-1. サーバの秘密鍵を生成します $ openssl genrsa -out server.key Generating RSA private key, 2048 bit long modulus .....................................+++ ........+++ e is 65537 (0x10001) #-- 1-2. 証明書署名要求を生成します。 $ openssl req -new -nodes -key ./server.key -out ./server.csr -config ./openssl.cnf -batch ※事前にopenssl.cnf(opensslの設定ファイル)を用意しておく必要があります。 #-- 1-3. 自己署名証明書を作成します。 $ openssl x509 -req -days 365 -in ./server.csr -signkey ./server.key -out ./server.crt Signature ok subject=/C=JP/ST=Not Applicable/L=Not Applicable/O=K.K.Ashisuto Getting Private key |
## openssl.cnfのサンプル
######################################################################
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
######################################################################
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = JP
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Not Applicable
localityName = Locality Name (eg, city)
localityName_default = Not Applicable
0.organizationName = Organization Name (eg, company)
0.organizationName_default = CompanyName
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default =
commonName = Common Name (eg, your website’s domain name)
commonName_max = 64
######################################################################
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
######################################################################
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = JP
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Not Applicable
localityName = Locality Name (eg, city)
localityName_default = Not Applicable
0.organizationName = Organization Name (eg, company)
0.organizationName_default = CompanyName
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default =
commonName = Common Name (eg, your website’s domain name)
commonName_max = 64
2. サーバの秘密鍵とサーバ証明書の検証
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#-- 2-1. 証明書とキーが一致していることを確認します。md5チェックサムが一致することを確認してください。 $ openssl x509 -noout -modulus -in ./server.crt | openssl md5 (stdin)= c7f8028a9a49ff3adef6cb12205d0807 $ openssl rsa -noout -modulus -in ./server.key | openssl md5 (stdin)= c7f8028a9a49ff3adef6cb12205d0807 #-- 2-2. 証明書の有効期限が切れていないことを確認します。 $ openssl x509 -noout -text -in ./server.crt | grep -e "Before" -e "After" Not Before: Mar 31 06:08:54 2021 GMT Not After : Mar 31 06:08:54 2022 GMT #-- 2-3. サーバ証明書が有効であることを確認します。 $ openssl verify -verbose -CAfile ./root.crt ./server.crt ./server.crt: OK ※自己署名証明書を使用する場合は、事前に"cp -p ./server.crt ./root.crt"を実行して証明書を複製します。 #-- 2-4. サーバ証明書がSSLサーバで許可されていることを確認します。 $ openssl x509 -noout -purpose -in ./server.crt | grep "SSL server" SSL server : Yes <== ★Yesであること SSL server CA : Yes (WARNING code=3) Netscape SSL server : Yes Netscape SSL server CA : Yes (WARNING code=3) #-- 2-5. ルート認証局(CA)がSSLサーバCA証明書であることを確認します。 $ openssl x509 -noout -purpose -in ./root.crt | grep "SSL server" SSL server : Yes SSL server CA : Yes (WARNING code=3) <== ★Yesであること Netscape SSL server : Yes Netscape SSL server CA : Yes (WARNING code=3) #-- 2-6. 秘密鍵のパーミッションを変更します。 $ chmod 600 ./server.key #-- 2-7. 秘密鍵にパスワードが必要ないことを確認します。 $ ssh-keygen -y -f ./server.key ssh-rsa AAAAB3<省略>/avkHzZQ4pAK7atv38pOyAkbDd4Ti/zDQSa4usJvABtq44QKdd/ ※パスワードの入力を求められる場合は、手順に誤りがある可能性があります。手順に漏れがないか確認してください。 |
3. サーバ証明書と秘密鍵をVerticaに登録
1 2 3 4 5 6 7 8 |
#-- 3-1. サーバ証明書とサーバの秘密鍵の所有者と権限を設定します。 $ chown dbadmin:verticadba ./server.key ./server.crt $ chmod 600 ./server.key ./server.crt #-- 3-2. admintoolsを使用してサーバ証明書と秘密鍵を登録します。 $ admintools -t set_ssl_params -d verticadb -p password -k ./server.key -c ./server.crt SSL configuration parameters set successfully |
4. VerticaのSSL接続を有効化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#-- 4-1. データベースに接続し、SSL接続を有効化します。 $ vsql -d verticadb -w password dbadmin=> ALTER DATABASE verticadb SET EnableSSL = 1; INFO 6403: SSLCA config parameter is not set; client certificates will not be requested or verified ALTER DATABASE #-- 4-2. 設定変更後の確認を行います。 dbadmin=> \x Expanded display is on. dbadmin=> SELECT node_name, parameter_name, current_value, default_value FROM vs_configuration_parameters dbadmin-> WHERE parameter_name in ('EnableSSL', 'SSLCertificate', 'SSLPrivateKey'); -[ RECORD 1 ]--+----------------------------------------------------------------------------- node_name | v_verticadb_node0001 parameter_name | EnableSSL current_value | 1 <==★1であること default_value | 0 -[ RECORD 2 ]--+----------------------------------------------------------------------------- node_name | v_verticadb_node0001 parameter_name | SSLCertificate current_value | -----BEGIN CERTIFICATE-----MIIDK<省略>fo9AE=-----END CERTIFICATE----- <== ★登録されていること default_value | -[ RECORD 3 ]--+----------------------------------------------------------------------------- node_name | v_verticadb_node0001 parameter_name | SSLPrivateKey current_value | -----BEGIN RSA PRIVATE KEY-----MIIEo<省略>To5IV-----END RSA PRIVATE KEY----- <== ★登録されていること default_value | ※複数ノードで構成されている場合、ノードごとに出力されます。 dbadmin=> \q #-- 4-3. データベースを再起動します。 $ admintools -t stop_db -d verticadb -p password -F Database verticadb stopped successfully $ admintools -t start_db -d verticadb -p password -i Starting nodes: v_verticadb_node0001 (10.1.1.1) Starting Vertica on all nodes. Please wait, databases with a large catalog may take a while to initialize. Node Status: v_verticadb_node0001: (DOWN) Node Status: v_verticadb_node0001: (DOWN) Node Status: v_verticadb_node0001: (UP) Database verticadb: Startup Succeeded. All Nodes are UP |
5. SSL/TLS通信の確認
1 2 3 4 5 |
#-- 5-1. データベースに接続し、自動的にSSL/TLS通信になることを確認します。 $ vsql -d verticadb -w password SSL connection (cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, protocol: TLSv1.2) <== ★SSL/TLS通信を行う旨のメッセージが表示されること dbadmin=> \q |
以上で設定は完了です。
※JDBC、ODBCクライアントを使用した接続は参考情報の「Configuring TLS for JDBC and ODBC clients」を参照してください。
参考情報
・Vertica-クライアント間通信を暗号化(SSL/TLS)する方法(相互認証)http://vertica-tech.ashisuto.co.jp/ssl-tls_connection_mutualmode/
・TLS Authentication
https://www.vertica.com/docs/10.1.x/HTML/Content/Authoring/Security/ClientAuth/ConfiguringTLSAuthentication.htm
・Using SSL Server Authentication with Vertica: Validating Your SSL Key and Certificate
https://www.vertica.com/kb/Using-SSL-Server-Authentication-with-Vertica-Validating-Your-SSL/Content/BestPractices/Using-SSL-Server-Authentication-with-Vertica-Validating-Your-SSL.htm
・Configuring TLS for JDBC and ODBC clients
https://www.vertica.com/docs/10.1.x/HTML/Content/Authoring/Security/TLS/ConfiguringTLS.htm
検証バージョンについて
この記事の内容はVertica 10.1で確認しています。更新履歴
2021/08/30 参考情報を更新(リンク追加、無効リンクの削除)、誤字修正2021/04/01 本記事を公開