Amazon Web Services ブログ

AWS DMS を使った Oracle および PostgreSQL エンドポイントでの SSL 暗号化の設定



AWS Database Migration Service (DMS) は、データベースを AWS にセキュアな方法で移行するために役立ちます。AWS DMS は、Oracle から Amazon Aurora など、異なるデータベースプラットフォーム間での同種間および異種間移行をサポートしています。高可用性を維持しながら継続的なデータレプリケーションもサポートする AWS DMS は、設定が容易であることからデータベースの移行に幅広く採用されています。詳細については、「AWS Database Migration Service とは」を参照してください。

この記事では、ソース (Oracle) とターゲット (Aurora) のエンドポイントを暗号化して SSL を使用し、転送時のデータの暗号化を実装する方法をご紹介します。お客様の環境をシミュレートするため、この記事は Amazon EC2 インスタンス上の Oracle、Amazon Relational Database Service (RDS) 上の Oracle (ソースデータベース)、Amazon Aurora with PostgreSQL (ターゲットデータベース) に SSL を設定する手順を説明します。

ソリューションの概要

このソリューションの手順は次の通りです。

  1. ソース Oracle インスタンスで SSL を設定する。これには次の手順が含まれます。
    a.Oracle RDS インスタンスでの SSL の設定。
    b.Oracle EC2 インスタンスでの SSL の設定。
  2. AWS DMS コンソールで、ソース Oracle データベースのエンドポイントに SSL を設定する。
  3. AWS DMS で、ターゲット PostgreSQL Aurora データベースのエンドポイントに SSL を設定する。
  4. データレプリケーションを設定する。
  5. データを検証する。

この記事では、EC2 インスタンスで実行されている Oracle データベースと Oracle RDS インスタンスを使用します。また、ターゲット PostgreSQL インスタンスはすでに作成済みで、スキーマがあり、そのオブジェクトの構造が作成されています。AWS SCT を使って、既存のソースデータベーススキーマをひとつのデータベースエンジンから別のデータベースエンジンに変換できます。詳細については、「AWS Schema Conversion Tool とは」を参照してください。

その他の便利なドキュメントページには、「Amazon Aurora DB クラスターの作成」および「AWS Database Migration Service でのセキュリティ」があります。

Amazon RDS for Oracle インスタンスの SSL を設定する

Amazon RDS for Oracle は SSL をサポートします。SSL 設定はオプショングループを使って行われ、これは複数のデータベースと共有できます。SSL オプションを使用するように Amazon RDS for Oracle インスタンスを設定し、そのデジタル署名用証明書が含まれるクライアントウォレットを作成することができます。ローカルクライアントは、このウォレットを使って TCPS リスナーに接続します。ウォレットは AWS DMS にもアップロードされ、AWS DMS がインスタンスに接続できるようにします。

オンプレミス、または Amazon EC2 で実行されているソース Oracle インスタンスを使用している場合は、この手順を省略してください。

SSL をサポートするためのオプショングループを作成する

SSL をサポートするためのオプショングループを作成するには、以下の手順を完了してください。

  1. Amazon RDS コンソールの [オプショングループ] で、[グループの作成] を選択します。
  2. [名前] にはオプショングループの名前を入力します。
    この記事では、[OracleRDSSSLOptionGrp] と入力します。
  3. [説明] にはグループの説明を入力します。
  4. [エンジン] には [oracle-ee] を選択します。
  5. [メジャーエンジンのバージョン] には [1] を選択します。
  6. [作成] を選択します。
    次のスクリーンショットは、手順 1~6 を示しています。
  7. [オプショングループ] ページで、新しく作成したオプショングループ (OracleRDSSSLOptionGrp) を選択します。
  8. 以下のスクリーンショットプレビューにあるように、[オプションの追加] を選択します。
  9. [オプションの詳細] で、[オプション] に [SSL] を選択します。
  10. [ポート] に [2484] を選択します。
  11. [セキュリティグループ には [default] を選択します。
  12. [オプション設定] はデフォルトのままにしておきます。
    [オプション設定] には現在の SSL パラメータ値が表示されています。
  13. [オプションの追加] を選択します。
    次のスクリーンショットは、手順 9~13 を示しています。

SSL オプショングループを使用するように Oracle RDS インスタンスを変更する

Oracle RDS インスタンスを変更するには、以下の手順を完了してください。

  1. Amazon RDS コンソールで [データベース] を選択します。
  2. 目的のデータベースを選択します。
  3. [変更] を選択します。
  4. [データベースの選択肢] で、[オプショングループ] に新しいオプショングループを選択します。
    以下のスクリーンショットは、手順 1~4 を示しています。
  5. 以下のスクリーンショットプレビューにあるように、ページの一番下にスクロールダウンして、[続行] を選択します。

変更を確認するには、以下の手順を完了してください。

  1. [変更のスケジュール] には [すぐに適用] を選択します。
  2. 以下のスクリーンショットにあるように、[DB インスタンスの変更] を選択します。

ウォレットを作成する

任意の Linux マシンにある Oracle クライアントを使用して、RDS SSL 証明書への署名に使われる認証機関 (CA) 証明書が含まれたウォレットを作成できます。このウォレットは、AWS DMS にアップロードします。以下の手順を完了してください。

  1. 以下のコードを入力して ORACLE_HOME のシステム変数を設定し、ウォレットフォルダを作成します。
    export ORACLE_HOME=/home/user/app/user/product/12.1.0/dbhome_1
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib            
    mkdir $ORACLE_HOME/ssl_wallet            
  2. rds-ca-2019-root.pem RDS CA 証明書をダウンロードします。
  3. Oracle ウォレットを作成するには、以下のコマンドを入力します。
    orapki wallet create -wallet $ORACLE_HOME/ssl_wallet -auto_login_only
    orapki wallet add -wallet $ORACLE_HOME/ssl_wallet -trusted_cert –cert  $ORACLE_HOME/ssl_wallet/ca-cert.pem -auto_login_only   

Oracle EC2 インスタンスで SSL を設定する

Oracle EC2 インスタンス用の自己署名証明書を設定し、その署名証明書が含まれるクライアントウォレットを作成します。ローカルクライアントはこのウォレットを使って TCPS リスナーに接続し、インスタンスへの接続を許可するためにウォレットが AWS DMS にアップロードされます。

Amazon RDS for Oracle インスタンスを使用している場合は、この手順を省略してください。

EC2 Oracle インスタンスで Oracle SSL のための自己署名証明書を使ってウォレットを作成する

ウォレットを作成するには、以下の手順を完了してください。

  1. Oracle ユーザーとして Linux または UNIX マシンにログインします。環境は正しいデータベースと ORACLE_HOME 用に設定しておきます。
  2. 以下のコードを使って、自己署名証明書用のディレクトリとルートキーを作成します。
    mkdir -p /u01/app/oracle/self_signed_cert
    cd /u01/app/oracle/self_signed_cert
    openssl genrsa -out self-rootCA.key 2048
    openssl req -x509 -new -nodes -key self-rootCA.key -sha256 -days 3650 -out self-rootCA.pem
    
    Input parameters
    Country Name (2 letter code) [XX]:US
    State or Province Name (full name) []:Virginia
    Locality Name (eg, city) [Default City]:Reston
    Organization Name (eg, company) [Default Company Ltd]:AmazonWebService
    Organizational Unit Name (eg, section) []:ProServe
    Common Name (eg, your name or your server's hostname) []:aws
    Email Address []:<Leave Blank and press enter>
  3. 以下のコードを使用して、Oracle ウォレットディレクトリとウォレットを作成します。
    mkdir -p /u01/app/oracle/wallet
    orapki wallet create -wallet "/u01/app/oracle/wallet" -pwd oracle123 -auto_login_local
  4. 以下のコードを使用して、ウォレットにルート証明書を追加します。
    orapki wallet add -wallet "/u01/app/oracle/wallet" -pwd oracle123 -trusted_cert -cert /u01/app/oracle/self_signed_cert/self-rootCA.pem
  5. 証明書が正常に追加されたことを検証します。以下のコードを参照してください。
    orapki wallet display -wallet /u01/app/oracle/wallet -pwd oracle123
    
    Oracle PKI Tool : Version 12.2.0.1.0
    Copyright (c) 2004, 2016, Oracle and/or its affiliates.All rights reserved.
    
    Requested Certificates:
    Trusted Certificates:
    Subject:        CN=aws,OU=ProServe,O=AmazonWebService,L=Reston,ST=Virginia,C=US
  6. 以下のコードを使用して、証明書署名要求 (CSR) を生成します。
    orapki wallet add -wallet "/u01/app/oracle/wallet" -pwd oracle123 -dn "CN=aws" -keysize 2048 -sign_alg sha256
    
    openssl pkcs12 -in /u01/app/oracle/wallet/ewallet.p12 -nodes -out /u01/app/oracle/wallet/nonoracle_wallet.pem
  7. 以下のコードを使用して、「dms」をコモンネームとして設定します。
    openssl req -new -key /u01/app/oracle/wallet/nonoracle_wallet.pem -out certdms.csr
  8. 以下のコードを使用して、暗号化署名を取得します。
    openssl req -noout -text -in certdms.csr | grep -i signature

    この記事の署名キーは sha256WithRSAEncryption です。

  1. 以下のコマンドを実行して、証明書 (.crt) ファイルを生成します。
    openssl x509 -req -in certdms.csr -CA self-rootCA.pem -CAkey self-rootCA.key -CAcreateserial -out certdms.crt -days 365 -sha256
  1. 以下のコードを使用して、Oracle ウォレットに証明書を追加します。
    orapki wallet add -wallet /u01/app/oracle/wallet -pwd oracle123 -user_cert -cert certdms.crt
  1. ウォレットを表示します。これには 2 つのエントリがあるはずです。以下のコードを参照してください。
    orapki wallet display -wallet /u01/app/oracle/wallet -pwd oracle123
  1. sqlnet.ora ファイルを変更します。以下のコードを参照してください。
    cd $ORACLE_HOME/network/admin
    mv sqlnet.ora sqlnet.ora.nonssl
    
    # sqlnet.ora Network Configuration File: /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/sqlnet.ora
    # Generated by Oracle configuration tools.
    WALLET_LOCATION =
       (SOURCE =
         (METHOD = FILE)
         (METHOD_DATA =
           (DIRECTORY = /u01/app/oracle/wallet)
         )
       )
    
    SQLNET.AUTHENTICATION_SERVICES = (NONE)
    SSL_VERSION = 1.0
    SSL_CLIENT_AUTHENTICATION = FALSE
    SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA)
    SQLNET.INBOUND_CONNECT_TIMEOUT=0
  1. listener.ora ファイルを変更します (ウォレットの場所と、プロトコルを TCPS とした SSL ポートを追加)。以下のコードを参照してください。
    lsnrctl stop LISTENER
    cp listener.ora listener.ora.nonssl
    
    # listener.ora Network Configuration File: /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/listener.ora
    # Generated by Oracle configuration tools.
    SSL_CLIENT_AUTHENTICATION = FALSE
    WALLET_LOCATION =
      (SOURCE =
        (METHOD = FILE)
        (METHOD_DATA =
          (DIRECTORY = /u01/app/oracle/wallet)
        )
      )
    SID_LIST_LISTENER =
     (SID_LIST =
      (SID_DESC =
       (GLOBAL_DBNAME = ORCL)
       (ORACLE_HOME = /u01/app/oracle/product/12.2.0/dbhome_1)
       (SID_NAME = orcl)
      )
     )
    
    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.0.126)(PORT = 1521))
          (ADDRESS = (PROTOCOL = TCPS)(HOST = 10.1.0.126)(PORT = 1522))
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
        )
      )
  1. tnsnames.ora ファイルを変更し、SSL を使用してローカル接続をテストします。以下のコードを参照してください。
    ORCLSSL =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCPS)(HOST = 10.1.0.126)(PORT = 1522))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = orcl.ec2.internal)
        )
      )
    
    lsnrctl start LISTENER
  1. SQLPLUS を使用してローカル接続をテストし、それが SSL 接続 sqlplus system@orclssl を使用していることを確認します。以下のコードを参照してください。
    SQL*Plus: Release 12.2.0.1.0 Production on Wed Feb 20 20:31:51 2019
    
    Copyright (c) 1982, 2016, Oracle. All rights reserved.
    
    Enter password:
    Last Successful login time: Wed Feb 20 2019 17:19:03 +00:00
    
    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
    
    SQL> SELECT SYS_CONTEXT('USERENV', 'network_protocol') FROM DUAL;
    
    SYS_CONTEXT('USERENV','NETWORK_PROTOCOL')
    --------------------------------------------------------------------------------
    tcps
  1. 以下のコードを使用して、AWS DMS 用のクライアントウォレットを作成します。
    cd /u01/app/oracle/self_signed_cert
    orapki wallet create -wallet ./ -auto_login_only
    orapki wallet add -wallet ./ -trusted_cert -cert self-rootCA.pem -auto_login_only
    orapki wallet display -wallet ./
  1. ローカルデスクトップに cwallet.sso 証明書をダウンロードして、それを AWS DMS ツールにインポートします。

AWS DMS コンソールを使用してソース Oracle データベースのエンドポイントを設定する

最初の手順で、Amazon RDS for Oracle または EC2 インスタンスで実行される Oracle 用の証明書を生成しました。この記事では、Amazon RDS を Oracle SSL 証明書のソースとして使用します。

データベースのエンドポイントを設定するには、まず AWS DMS コンソール経由でレプリケーションインスタンスを作成します。

証明書をインポートする

証明書をインポートするには、以下の手順を完了してください。

  1. AWS DMS コンソールで [証明書] を選択します。
  2. 以下のスクリーンショットにあるように、[証明書のインポート] を選択します。
  3. [証明書の識別子] には [RDSSSLCERT を入力します。
  4. [証明書ファイルのインポート] で [Choose File] を選択します。
  5. cwallet.sso を見つけます。
  6. 以下のあるように、[新しい CA 証明書の追加] を選択します。
    証明書が正常にインポートされたら、証明書が ARN と共にリストされているのがわかります。次のスクリーンショットを参照してください。

ソースエンドポイントを設定する

SSL モードが verify-ca として有効化されているソースエンドポイントを設定するには、以下の手順を完了してください。

  1. AWS DMS コンソールで [エンドポイント] を選択します。
  2. 以下にあるように、[エンドポイントの作成] を選択します。
  3. エンドポイントタイプには、[ソースエンドポイント] を選択します。
  4. [RDS DB インスタンスの選択] チェックボックスにチェックを入れます。
  5. [RDS インスタンス] には [orcl – oracle-ee] を選択します。
  6. [エンドポイント識別子] に名前を入力します。
    この記事では、orcl-source という名前を入力します。
  7. [ソースエンジン] には [oracle] を選択します。
  8. [サーバー名] には Oracle RDS instance endpoint と入力します。
  9. [ポート] には、SSL ポート 2484 を入力します。
  10. [SSL モード] には [verify-ca] を選択します。
  11. [CA 証明書] には、インポートした証明書 [RDSSSLCERT] を選択します。
  12. [ユーザー名] には Oracle RDS ユーザーを入力します。
  13. [パスワード] にはユーザーパスワードを入力します。
  14. [テストの実行] を選択します。
    次のスクリーンショットは、手順 3~14 を示しています。
  15. テストが正常に実行されたら、[エンドポイントの作成] を選択します。

AWS DMS 接続が SSL を使用していることを確認する

AWS DMS 接続が SSL を使用していることを確認するには、以下の手順を完了してください。

  1. Amazon RDS コンソールで [データベース] を選択します。
  2. データベースの識別子を選択します。
  3. 以下のスクリーンショットにあるように、[設定] の [CloudWatch ログ] で [リスナー] を選択します。
  4. Oracle listener.log を検証して、AWS DMS からの接続が TCPS プロトコルを使用していることを確認します。これは、確立された接続が SSL であることを示しています。
    ソースとして EC2 インスタンスの Oracle の SSL 証明書を使用した場合は、Oracle サーバーの listener.log を検証して、AWS DMS からの接続が TCPS であることを確認します。以下のスクリーンショットは、listener.log の出力を示しています。

ターゲット PostgreSQL Aurora データベースのエンドポイントを設定する

ターゲットのエンドポイントを設定するには、以下の手順を完了してください。

  1. AWS DMS コンソールで [エンドポイント] を選択します。
  2. 以下のスクリーンショットにあるように、[エンドポイントの作成] を選択します。
  3. エンドポイントタイプには、[ターゲットエンドポイント] を選択します。
  4. [RDS DB インスタンスの選択] チェックボックスにチェックを入れます。
  5. [RDS インスタンス] には、Aurora PostgreSQL インスタンスの識別子 auroradb – aurora-postgresql を選択します。
  6. [<t1>エンドポイント識別子</t1>] には <t2>auroradb-target</t2> を入力します。
  7. [ターゲットエンジン] には [aurora-postgresql] を選択します。
  8. [サーバー名] には Aurora PostgreSQL endpoint と入力します。
  9. [ポート] には、SSL ポート 5432 を入力します。
  10. [SSL モード] には [require] を選択します。
  11. [ユーザー名] には Aurora PostgreSQL ユーザーを入力します。
  12. [パスワード] にはユーザーパスワードを入力します。
    次のスクリーンショットは、手順 3~12 を示しています。
  13. [エンドポイントの作成] を選択します。
    [エンドポイント] ページで、ターゲットエンドポイントを選択します。
  14. 以下にあるように、[接続のテスト] を選択します。
  15. 以下にあるように、[テストの実行] を選択します。

データレプリケーションを設定する

データレプリケーションを設定するには、以下の手順を完了してください。

  1. レプリケーションを有効化する前に、ソース Oracle データベースにログインしてテーブル行数を取得します。次のコマンドを参照してください。
    [[select count(*) from repltest;]

    以下のスクリーンショットは、出力のプレビューを示しています。

  2. ターゲット Aurora PostgreSQL データベースにログインして、テーブルが空であることを確認します。次のコマンドを参照してください。
    [[select count(*) from replssltest.repltest;]]

    以下のスクリーンショットは、出力のプレビューを示しています。

  3. AWS DMS コンソールで [データベース移行タスク] を選択します。
  4. [タスクの作成] を選択します。
  5. [タスクの変更] で、[タスク名] に [repltest] と入力します。
  6. 他の値はすべてデフォルトのままにしておきます。
    以下のスクリーンショットは、手順 5 および 6 を示しています。
    次のステップは、選択ルールと変換ルールの作成です。
  7. JSON エディタで、以下のコード例を入力します (REPLSSLTEST をお使いのスキーマ名に置き換えてください)。
    {
      "rules": [
        {
          "rule-type": "transformation",
          "rule-id": "1",
          "rule-name": "1",
          "rule-target": "column",
          "object-locator": {
            "schema-name": "REPLSSLTEST",
            "table-name": "%",
            "column-name": "%"
          },
          "rule-action": "convert-lowercase",
          "value": null,
          "old-value": null
        },
        {
          "rule-type": "transformation",
          "rule-id": "2",
          "rule-name": "2",
          "rule-target": "table",
          "object-locator": {
            "schema-name": "REPLSSLTEST",
            "table-name": "%"
          },
          "rule-action": "convert-lowercase",
          "value": null,
          "old-value": null
        },
        {
          "rule-type": "transformation",
          "rule-id": "3",
          "rule-name": "3",
          "rule-target": "schema",
          "object-locator": {
            "schema-name": "REPLSSLTEST",
            "table-name": "%"
          },
          "rule-action": "convert-lowercase",
          "value": null,
          "old-value": null
        },
        {
          "rule-type": "selection",
          "rule-id": "4",
          "rule-name": "4",
          "object-locator": {
            "schema-name": "REPLSSLTEST",
            "table-name": "%"
          },
          "rule-action": "include",
          "filters": []
        }
      ]
    }
  8. [保存] を選択します。以下のスクリーンショットは、手順 7 および 8 を示しています。
  9. [テーブルマッピング] で [ガイド付き] を選択します。
  10. 以下のスクリーンショットにあるように、情報を確認してから [タスクの作成] を選択します。
  11. タスクが正常に開始され、実行されていることを確認します。
    以下のスクリーンショットは、repltest タスクのステータスが開始中から実行中に変わっているのを示しています。

ソースおよびターゲットデータベースの接続をチェックする

ソースおよびターゲットデータベースをチェックして、接続が SSL を使用していることを確認します。以下の手順を完了してください。

  1. SQL*PLUS または SQL 開発者ツールを使用して、Amazon RDS for Oracle ソースデータベースに接続し、以下の SQL クエリを入力します。
    select a.username,a.program,a.logon_time,a.machine,a.status,a.osuser 
    from v$session a,v$session_connect_info b 
    where a.sid=b.sid and a.serial#=b.serial#
    and b.NETWORK_SERVICE_BANNER is null;

    このクエリは、AWS DMS レプリケーションインスタンスからの接続をすべてリストします。以下のスクリーンショットは、その出力を示しています。

  2. psql ツールを使って Aurora ターゲットインスタンスに接続し、以下の SQL クエリを入力します。
    select * from pg_stat_ssl;

    このクエリは、DMS レプリケーションインスタンスからの接続をすべてリストします。以下のスクリーンショットは、その出力を示しています。

  3. Amazon RDS コンソールで [データベース] を選択します。
  4. データベースの識別子を選択します。
  5. [設定] にある [CloudWatch ログ] で [] を選択します。
    listener.log は、TCPS プロトコル接続をリストします。次のスクリーンショットを参照してください。

データを検証する

データがソースからターゲットにレプリケートされたことを検証するには、以下の手順を完了してください。

  1. AWS DMS コンソールで [データベース移行タスク] を選択します。
  2. AWS DMS タスクのステータスをチェックして、それが正常に完了していることを確認します。
    以下のスクリーンショットは、タスクのステータスを示しています。
  3. ターゲット Aurora PostgreSQL データベースにログインします。
  4. すべての行がターゲットデータベースにロードされたことを確認します。
    以下のスクリーンショットは、その出力を示しています。

まとめ

この記事では、AWS DMS のために SSL 暗号化を設定する方法を説明しました。SSL 暗号化を設定することによって、データベースのデータがオンプレミスから Amazon RDS に転送されるときに、転送時のデータがセキュア化されます。また、組織のセキュリティポリシーとガイドラインとのよりよいコンプライアンスと整合性も確実にします。

お使いの環境でこのアプローチをぜひお試しください。ご質問またはご意見などがありましたら、いつでもコメントからお送りください。

 


著者について

 

Bhavesh Rathod は Oracle Database クラウドアーキテクトで、アマゾン ウェブ サービスのプロフェッショナルサービスチームに所属しています。データベース移行のスペシャリストとして、Bhavesh はAmazon のお客様によるオンプレミスデータベース環境から AWS クラウドデータベースソリューションへの移行を支援しています。

 

 

 

Jeevith Anumalla は Oracle Database クラウドアーキテクトで、アマゾン ウェブ サービスのプロフェッショナルサービスチームに所属しています。データベース移行スペシャリストとして、Jeevith は社内外の Amazon のお客様がオンプレミスのデータベース環境を AWS データストアに移行するお手伝いをしています。