SAP HANA SSL for Copy Database/Move Database
SAP HANA SSL for Copy Database/Move Database
(このブログはCopy Database/Move Database on SAP HANAの説明中のSSL設定手順補完のために書かれています。)
複数のSAP HANA MDCインスタンス間でデータベースのコピー/移動を行う場合、インスタンス間でSSLによるセキュアな通信が確保される必要があります。この記事は、Copy database/Move Databaseを行う際に必要なSSLの設定に就て説明します。
証明書管理の方法
SSLを使用する場合、サーバーは証明書の管理を行う必要がありますが、SAP HANAは証明書管理の方法(PKI)を複数提供しています。
- PKI(Public Key Infrastructure)として何を使うか?
- systemPKI
-
SAP HANAが提供するPKIで、インストールと同時に設定されます。
サーバーのPrivate key、サーバー証明書は、$SECRDIR/sapsrv.pse内に保存されています。
-
- マニュアル設定
- OpenSSLなどを使ってユーザーが独自にPKIを管理する方法です。
- systemPKI
- PKIの管理をどこで行うか?
- ファイルシステムとして管理する
- PKIの管理をファイルシステム上で行います。デフォルトでは、$SECUDIRディレクトリ下に関連ファイルが配置されます。前述の通り、systemPKIのキー、証明書はこのディレクトリ下のsapsrv.pseに保存されています。
- SAP HANAのDBオブジェクトとして管理する
- キー、証明書をHANAのオブジェクトとして管理します。
- SAP HANAは、PKIをDBオブジェクトとして管理するためのSQL、System Viewなどを提供します。
- ファイルシステムとして管理する
この記事では、systemPKIをDBオブジェクトにより管理する方法で設定を説明します。
説明文中、コピー元ホストがhost1、コピー先ホストがhost2、HANAインスタンスのSIDは両方ともSR1です。
設定のための基礎知識
まず、PKI管理の対象となるものには以下があります。
- 秘密鍵(Private key)
- 自身のサーバー証明書を暗号化/復号化するための鍵です。Copy/Moveのために相手ホストが自分に接続しようとする時に、自分のサーバー証明書を提示しますが、これが正当なものかどうかを判断するのに使われます。
- 今回は、両ホストがそれぞれ自身の秘密鍵を保持します。
- サーバー証明書(Certificate)
- サーバーの正当性を証明する証明書です。
- 各ホストは、自己証明書として自身のサーバー証明書を保持すると同時に、自分に接続してくるホストのサーバー証明書も保持します。
- 今回は、host1/host2ともに、自己証明書としての自身の証明書を保持、それから接続認証用としてお互いに相手の証明書を持ち合います。
これらを管理するためのDBオブジェクトには以下のものがあります。
- CERTIFICATE
- 各種証明書から作成するDBオブジェクトです。証明書そのものと思って間違いありません。
- Base64でエンコードされたコンテンツを読み込みオブジェクトとして取り込みます。
- 各CERTIFICATEは、CERTIFICATE_IDという数値が割り当てられ、内部で識別されます。
- 関連SQL
- 今回は、サーバー証明書(Certificate)の項の説明通り、自身の証明書と相手の証明書を保持します。作成時のコンテンツは、$SECUDIR/sapsrv.pse内から取得します。(取得方法については、SAP Note 2175664を参照してください。)
- PSE(Personal Security Environment, aka.Certificate Collection)
- 自身のサーバー証明書、秘密鍵や相手ホストのサーバー証明書を保存するためのDBオブジェクトです。
- 自身の証明書、秘密鍵をPSEに保存する時は、SET OWN CERTIFICATE(関連SQL参照)を使用してBase64形式のコンテンツから取り込みます。
- 相手ホストの証明書は、一旦CERTIFICATEを作成後、ADD CERTIFICATE certificate_id(関連SQL参照)で取り込みます。
- 1つのPSEは1つのPurpose(目的)が設定されます。Purposeには何種類かありますが、Copy Database/Move Databaseに必要なのは以下の2つです。これは、PSEを2つ作る必要があることを示しています。
- SSL
- DATABASE REPLICATION
- 関連SQL
- 今回は、host1/host2ともに、pse_sslというSSL目的のPSEを作成し、その中に自身のサーバー証明書と秘密鍵、相手のサーバー証明書を保持します。
- また、host2には、pse_repというDATABASE REPLICATION目的のPSEを作成し、copy/moveの接続相手であるhost1のサーバー証明書を保持します。
以上を図で表すと以下のようになります。
ファイルシステムによるPKI管理からDBオブジェクトによるPKI管理への移行
SAP HANAが提供するPKIであるsystemPKIは、ファイルシステムベースの管理で提供されています。今回は、DBオブジェクトで管理しますので移行が必要です。
ここまでの説明でキーや証明書がBase64形式で存在すればPSEへの登録ができることはわかりました。しかし実際は、$SECUDIR/sapsrv.pseの内容を見ればわかりますが、バイナリー形式(多分、.DER形式)で提供されています。従いまして、前処理として、host1/host2それぞれのsapsrv.pseから秘密鍵とサーバー証明書を抽出する必要があります。
この辺りの情報と抽出のためのスクリプトを提供するのがSAP Note 2175664です。簡単にここで説明すると、提供されるextract_certificates.pyにsapsrv.pseを引数として与えて実行すると、Base64形式のコンテンツを伴ったALTER PSE … SET OWN CERTIFICATE文が得られる、ということです。詳細は、Noteをごらんください。
設定手順
- 秘密鍵、サーバー証明書をBase64形式で抽出する
- host1にsr1admでログイン
- cd $SECUDIR
- python extract_certificates.py -p sapsrv.pse
- ALTER PSE <name> SET OWN CERTIFICATE
- host1にsr1admでログイン
‘—–BEGIN RSA PRIVATE KEY—–Host1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost
1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1Pri
vateKeyHost1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1Private
KeyHost1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1PrivateKeyH
ost1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1
PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1Priv
ateKeyHost1PrivateKeyHost1PrivateK==
—–END RSA PRIVATE KEY—–
—–BEGIN CERTIFICATE—–Host1ServerCertificateHost1ServerCertificateHost1ServerCertifica
teHost1ServerCertificateHost1ServerCertificateHost1ServerCertifi
cateHost1ServerCertificateHost1ServerCertificateHost1ServerCerti
ficateHost1ServerCertificateHost1ServerCertificateHost1ServerCer
tificateHost1ServerCertificateHost1ServerCertificateHost1ServerC
ertificateHost1ServerCertificateHost1ServerCertificateHost1Serve
Host1ServerCertificaterCertificate==
—–END CERTIFICATE—–‘;
(PRIVATE KEYの部分を以降、host1秘密鍵と引用します。)
(CERTIFICATEの部分を以降、host1サーバ証明書と引用します。)
- host2にsr1admでログイン
- cd $SECUDIR
- python extract_certificates.py -p sapsrv.pse
ALTER PSE <name> SET OWN CERTIFICATE
‘—–BEGIN RSA PRIVATE KEY—–Host2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost
2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2Pri
vateKeyHost2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2Private
KeyHost2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2PrivateKeyH
ost2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2
PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2Priv
ateKeyHost2PrivateKeyHost2PrivateKey==
—–END RSA PRIVATE KEY—–
—–BEGIN CERTIFICATE—–Host2ServerCertificateServerCertificateServerCertificateServerCe
rtificateServerCertificateServerCertificateServerCertificateServ
erCertificateServerCertificateServerCertificateServerCertificate
ServerCertificateServerCertificateServerCertificateServerCertifi
erCertifiServerCertificateServerCertificateServerCertificateServ
cateHost2ServerCertificateHost2ServerCertificateHost2ServerCerti
ficateHost2ServerCertificateHost2Ce==
—–END CERTIFICATE—–‘;
(PRIVATE KEYの部分を以降、host2秘密鍵と引用します。)
(CERTIFICATEの部分を以降、host2サーバ証明書と引用します。)
- SR1(host1)にSSLのためのPSEを作成
- SR1(host1)のsystemdbに接続
- PSEを作成
- create pse pse_ssl;
- pse_sslにextract_certificates.pyで抽出したSQLを、<name>をpse_sslに変更して実行
- ALTER PSE pse_ssl SET OWN CERTIFICATE
‘—–BEGIN RSA PRIVATE KEY—–
Host1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost
1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1Pri
vateKeyHost1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1Private
KeyHost1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1PrivateKeyH
ost1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1
PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1PrivateKeyHost1Priv
ateKeyHost1PrivateKeyHost1PrivateK==
—–END RSA PRIVATE KEY—–
—–BEGIN CERTIFICATE—–
Host1ServerCertificateHost1ServerCertificateHost1ServerCertifica
teHost1ServerCertificateHost1ServerCertificateHost1ServerCertifi
cateHost1ServerCertificateHost1ServerCertificateHost1ServerCerti
ficateHost1ServerCertificateHost1ServerCertificateHost1ServerCer
tificateHost1ServerCertificateHost1ServerCertificateHost1ServerC
ertificateHost1ServerCertificateHost1ServerCertificateHost1Serve
Host1ServerCertificaterCertificate==
—–END CERTIFICATE—–‘;
- pse_sslの目的を’SSL’に設定
- set pse pse_ssl purpose SSL;
- 接続相手であるhost2のCERTIFICATEを作成
- create certificate from
‘—–BEGIN CERTIFICATE—–
Host2ServerCertificateServerCertificateServerCertificateServerCe
rtificateServerCertificateServerCertificateServerCertificateServ
erCertificateServerCertificateServerCertificateServerCertificate
ServerCertificateServerCertificateServerCertificateServerCertifi
erCertifiServerCertificateServerCertificateServerCertificateServ
cateHost2ServerCertificateHost2ServerCertificateHost2ServerCerti
ficateHost2ServerCertificateHost2Ce==
—–END CERTIFICATE—–‘;
- 作成したhost2 CERTIFICATEのcerticicate_idを確認
- select * from sys.certificates;
- host2 CERTIFICATEをpse_sslに登録
- alter pse pse_ssl add certificate <certificate-id>;
- (pse_sslの内容を確認
- select * from sys.pse_certificates;)
- SR1(host2)にSSLのためのPSEを作成
- SR1(host2)のsystemdbに接続
- PSEを作成
- create pse pse_ssl;
- pse_sslにextract_certificates.pyで抽出したSQLを、<name>をpse_sslに変更して実行
- ALTER PSE pse_ssl SET OWN CERTIFICATE
‘—–BEGIN RSA PRIVATE KEY—–
Host2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost
2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2Pri
vateKeyHost2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2Private
KeyHost2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2PrivateKeyH
ost2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2
PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2PrivateKeyHost2Priv
ateKeyHost2PrivateKeyHost2PrivateKey==
—–END RSA PRIVATE KEY—–
—–BEGIN CERTIFICATE—–
Host2ServerCertificateServerCertificateServerCertificateServerCe
rtificateServerCertificateServerCertificateServerCertificateServ
erCertificateServerCertificateServerCertificateServerCertificate
ServerCertificateServerCertificateServerCertificateServerCertifi
erCertifiServerCertificateServerCertificateServerCertificateServ
cateHost2ServerCertificateHost2ServerCertificateHost2ServerCerti
ficateHost2ServerCertificateHost2Ce==
—–END CERTIFICATE—–‘;
- pse_sslの目的を’SSL’に設定
- set pse pse_ssl purpose SSL;
- 接続相手であるhost1のCERTIFICATEを作成
- create certificate from ‘
—–BEGIN CERTIFICATE—–
Host1ServerCertificateHost1ServerCertificateHost1ServerCertifica
teHost1ServerCertificateHost1ServerCertificateHost1ServerCertifi
cateHost1ServerCertificateHost1ServerCertificateHost1ServerCerti
ficateHost1ServerCertificateHost1ServerCertificateHost1ServerCer
tificateHost1ServerCertificateHost1ServerCertificateHost1ServerC
ertificateHost1ServerCertificateHost1ServerCertificateHost1Serve
Host1ServerCertificaterCertificate==
- create certificate from ‘
—–END CERTIFICATE—–‘;
- 作成したhost1 CERTIFICATEのcerticicate_idを確認
- select * from sys.certificates;
- host1 CERTIFICATEをpse_sslに登録
- alter pse pse_ssl add certificate <certificate-id>;
- (pse_sslの内容を確認
- select * from sys.pse_certificates;)
- SR1(host2)にDATABASE REPLICATIONのためのPSEを作成
- SR1(host2)のsystemdbに接続
- PSEを作成
- create pse pse_rep;
- pse_sslの目的を’DATABASE REPLICATION’に設定
- set pse pse_rep purpose database replication;
- DATABASE REPLICATIONの相手であるhost1 CERTIFICATE(すでにDB内に取込み済み)をpse_repに登録
- alter pse pse_rep add certificate <certificate-id>;
- (pse_repの内容を確認
- select * from sys.pse_certificates;)
以上
2016年9月7日
花木敏久
SAPジャパン