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)として何を使うか?
    1. systemPKI
      • SAP HANAが提供するPKIで、インストールと同時に設定されます。

        サーバーのPrivate key、サーバー証明書は、$SECRDIR/sapsrv.pse内に保存されています。

    2. マニュアル設定
      • OpenSSLなどを使ってユーザーが独自にPKIを管理する方法です。
  • PKIの管理をどこで行うか?
    1. ファイルシステムとして管理する
      • PKIの管理をファイルシステム上で行います。デフォルトでは、$SECUDIRディレクトリ下に関連ファイルが配置されます。前述の通り、systemPKIのキー、証明書はこのディレクトリ下のsapsrv.pseに保存されています。
    2. 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のサーバー証明書を保持します。


以上を図で表すと以下のようになります。

/wp-content/uploads/2016/09/ssl4cp_mv_darabase_1031408.png



ファイルシステムによる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

‘—–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==

—–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日

花木敏久

toshihisa.hanaki@sap.com

SAPジャパン

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply