OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

Vertica-クライアント間通信を暗号化(SSL/TLS)する方法(相互認証)

公開日:
更新日:
セキュリティ
#Verticaクライアント

はじめに

Verticaではクライアントとの通信をSSL/TLSを使用して暗号化することができます。認証の方式としては、サーバ認証と相互認証の2種類があり、こちらの記事では、相互認証を使用したSSL/TLS通信の設定方法をご紹介します。
相互認証を使用すると、クライアント証明書を保持しているクライアントのみが対象のDBユーザに接続できるようになり、クライアント‐サーバ間の接続をよりセキュアに保つことができます。

設定に必要なファイル

相互認証方式のSSL/TLS通信を行うには以下のファイルが必要となります。
・サーバ証明書(自己署名証明書でも可)
・ルート証明書
・サーバの秘密鍵
・クライアント証明書
・クライアントの秘密鍵

設定方法

構文

サーバ証明書、秘密鍵、ルート証明書の登録

OSのdbadminユーザから以下のコマンドにて、Verticaへサーバ証明書とサーバの秘密鍵、ルート証明書を登録します。

admintools -t set_ssl_params -d <データベース名> -p <パスワード> -k <サーバの秘密鍵> -c <サーバ証明書> -a <ルート証明書>

VerticaデータベースのSSL/TLS通信の有効化

Verticaデータベースへdbadminユーザにて接続した後、以下のSQLコマンドを実行します。

ALTER DATABASE <データベース名> SET EnableSSL = 1;

Verticaデータベースの相互認証モードの設定

Verticaデータベースへdbadminユーザにて接続した後、以下のSQLコマンドを実行します。

# 認証設定の作成
CREATE AUTHENTICATION <認証名> METHOD ‘tls’ HOST TLS ‘接続元IP CIDR’;

# DBユーザへの認証の付与
GRANT AUTHENTICATION <認証名> TO ;

注意点

クライアント証明書を作成するときは、Common Name(CN)に接続対象のDBユーザ名を必ず含めてください。

設定例

以下に自己署名証明書を使用した設定例を記載します。正規の証明書を保持している場合は手順「1. サーバ証明書(自己署名)の作成」と「5. クライアント証明書(自己署名)の作成」はスキップしてください。
なお、OSコマンドの詳細についてはマニュアル等でご確認ください。

サーバ証明書の設定

1. サーバ証明書(自己署名)の作成
#-- 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=CompanyName
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

2. サーバの秘密鍵とサーバ証明書の検証
#-- 2-1. 証明書とキーが一致していることを確認します。md5チェックサムが一致することを確認してください。
$ openssl x509 -noout -modulus -in ./server.crt | openssl md5
(stdin)= 7daaf458fa49da3628e34bb6067b7e34

$ openssl rsa -noout -modulus -in ./server.key | openssl md5
(stdin)= 7daaf458fa49da3628e34bb6067b7e34


#-- 2-2. 証明書の有効期限が切れていないことを確認します。
$ openssl x509 -noout -text -in ./server.crt | grep -e "Before" -e "After"
            Not Before: Aug 29 15:50:19 2021 GMT
            Not After : Aug 29 15:50:19 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 CA"
SSL server CA : Yes (WARNING code=3)       <== ★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<省略>i4m9ngAUmVOaoE+X1iNkD2IcNhYr8O3+Wfl6BDD6sw5OrTlEA6jh

※パスワードの入力を求められる場合は、手順に誤りがある可能性があります。手順に漏れがないか確認してください。
3. サーバ証明書と秘密鍵をVerticaに登録
#-- 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 verticadb -k ./server.key -c ./server.crt -a ./root.crt
SSL configuration parameters set successfully
4. VerticaのSSL接続を有効化
#-- 4-1. データベースに接続し、SSL接続を有効化します。
$ vsql -d verticadb -w password
dbadmin=> ALTER DATABASE verticadb SET EnableSSL = 1;
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', 'SSLCA');"
-[ 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 | SSLCA
current_value  | -----BEGIN CERTIFICATE-----MIIDJ<省略>c2kTrntOr/+ss-----END CERTIFICATE-----  <== ★登録されていること
default_value  |
-[ RECORD 3 ]--+-----------------------------------------------------------------------------
node_name      | v_verticadb_node0001
parameter_name | SSLCertificate
current_value  | -----BEGIN CERTIFICATE-----MIIDJ<省略>c2kTrntOr/+ss-----END CERTIFICATE-----  <== ★登録されていること
default_value  |
-[ RECORD 4 ]--+-----------------------------------------------------------------------------
node_name      | v_verticadb_node0001
parameter_name | SSLPrivateKey
current_value  | -----BEGIN RSA PRIVATE KEY-----MIIEo<省略>qjwWd-----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. クライアント証明書(自己署名)の作成

以下の実行例ではDBユーザ「testuser」に接続するための証明書、秘密鍵の生成を行っています。ファイル名はDBユーザ名にあわせて変更してください。

#-- 5-1. サーバの秘密鍵を生成します
$ openssl genrsa -out testuser.key
Generating RSA private key, 2048 bit long modulus
..........................................+++
.................+++
e is 65537 (0x10001)


#-- 5-2. 証明書署名要求を生成します。なお、Common NameはDBユーザ名に設定します。
$ openssl req -new -out testuser.csr -key testuser.key
<中略>
Common Name (eg, your name or your server’s hostname) []:testuser    <== ★DBユーザ名を入力
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


#-- 5-3. ユーザ証明書を作成します。
$ openssl x509 -CA root.crt -CAkey root.key -days 3650 -req -in testuser.csr -out testuser.crt
Signature ok
subject=/C=JP/L=Default City/O=Default Company Ltd/CN=testuser
Getting CA Private Key


※シリアル管理ファイル(root.srl)が不足している場合は、以下のコマンドで作成します。
$ openssl x509 -serial -noout -in root.crt | sed -e 's/.*=//' > root.srl
6. クライアント証明書の検証
#-- 6-1. 証明書がSSLクライアント証明書であることを確認します。
$ openssl x509 -noout -purpose -in testuser.crt  | grep "SSL client"
SSL client : Yes                           <== ★Yesであること
SSL client CA : No


#-- 6-2. 証明書のCommon Nameを表示し、DBユーザ名と一致することを確認します。
$ openssl x509 -noout -issuer -subject -dates -in testuser.crt
issuer= /C=JP/ST=Not Applicable/L=Not Applicable/O=CompanyName
subject= /C=JP/L=Default City/O=Default Company Ltd/CN=testuser  <== ★DBユーザ名と一致すること
notBefore=Aug 29 16:28:40 2021 GMT
notAfter=Aug 27 16:28:40 2031 GMT         <== ★ログインは左記の日付範囲内である必要があります


#-- 6-3. root.crtがクライアント証明書の署名に使用されていることを確認します。
$ openssl verify -CAfile root.crt testuser.crt
testuser.crt: OK
7. ユーザ証明書と秘密鍵の配置

※以下はvsqlを使用する際の設定方法です。JDBC、ODBCクライアントを使用した接続は参考情報の「Configuring TLS for JDBC and ODBC clients」を参照してください。

#-- 7-1. .vsqlディレクトリを作成します。
$ mkdir -p ~/.vsql

#-- 7-2. ユーザ証明書と秘密鍵を配置します。
$ cp testuser.crt ~/.vsql/client.crt
$ cp testuser.key ~/.vsql/client.key

#-- 7-3. ファイルのパーミッションを変更します。
$ chmod 600 ~/.vsql/client.key ~/.vsql/client.crt
8. 相互認証モードの構成
#-- 8-1. データベースにdbadminユーザで接続し、「SSLCert」という名称で認証設定を作成します。
$ vsql -d verticadb -w password
dbadmin=> CREATE AUTHENTICATION SSLCert METHOD 'tls' HOST TLS '0.0.0.0/0';
CREATE AUTHENTICATION

#-- 8-2. 対象のDBユーザに認証設定を付与します。
dbadmin=> GRANT AUTHENTICATION SSLCert to testuser;
GRANT AUTHENTICATION
9. 相互認証接続の確認
#-- 9-1. データベースに接続し、相互認証が有効であることを確認します。
$ vsql -h 10.1.1.1 -U testuser
SSL connection (cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, protocol: TLSv1.2)  <== ★SSL/TLS通信を行う旨のメッセージが表示されること

※適切なクライアント証明書を持たないクライアントから対象DBユーザに接続した場合、以下のエラーメッセージが表示されます。
vsql: FATAL 2248:  Authentication failed for username "testuser"

#-- 9-2. 認証状態を確認します。
dbadmin=> SELECT user, authentication_method, ssl_state FROM sessions WHERE session_id = current_session();
 current_user | authentication_method | ssl_state 
--------------+-----------------------+-----------
 testuser     | TLS                   | Mutual      <== ★Mutual(相互認証)であること

dbadmin=> \q

以上で設定は完了です。

参考情報

・Vertica-クライアント間通信を暗号化(SSL/TLS)する方法(サーバ認証)
https://www.ashisuto.co.jp/cm/analytics-database/ssl-tls_connection_servermode.html

・TLS Authentication
https://www.vertica.com/docs/10.1.x/HTML/Content/Authoring/Security/ClientAuth/ConfiguringTLSAuthentication.htm

・Implementing Client Self-Authentication
https://www.vertica.com/docs/10.1.x/HTML/Content/Authoring/Security/ClientAuth/ImplementingClientSelfAuthentication.htm

・Using Mutual Mode SSL Server Authentication with Vertica: Validating Your SSL Key and Certificate
https://www.vertica.com/kb/Using-Mutual-Mode-SSL-Server-Authentication-with-Vertica/Content/BestPractices/Using-Mutual-Mode-SSL-Server-Authentication-with-Vertica.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 本記事を公開