Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
Former Member
0 Kudos

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のサーバー証明書を保持します。


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



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