タスク8 - NGINXリバース・プロキシの構成

GoldenGateのリバース・プロキシ機能を使用すると、Oracle GoldenGateデプロイメントに関連付けられたすべてのOracle GoldenGate Microservicesに対応する単一のアクセス先を使用できます。

リバース・プロキシを使用しないと、Oracle GoldenGateデプロイメント・マイクロサービスは、ホスト名またはIPアドレスと個別のポート番号で構成されるサービスごとに1つずつのURLを使用してアクセスされます。

たとえば、サービス・マネージャにアクセスするためにhttp://gghub.example.com:9100を使用し、管理サーバーにはhttp://gghub.example.com:9101、2番目のサービス・マネージャにはhttp://gghub.example.com:9110を使用してアクセスするようになります。

Grid Infrastructure Agent (XAG)を使用してOracle Exadata Database Serviceで高可用性(HA)構成のOracle GoldenGateを実行する場合、GoldenGateサービス・マネージャでは複数のデプロイメントを管理できないとう制限があります。この制限のため、サービス・マネージャとデプロイメントのペアごとに、個別の仮想IPアドレス(VIP)を作成するようにお薦めします。このようにすると、VIPを使用してマイクロサービスに直接アクセスできます。

リバース・プロキシにより、ポート番号はデプロイメント名とホスト名のVIPに置き換えられるため、マイクロサービスに接続するためのポート番号は不要になります。たとえば、Webブラウザでコンソールに接続するには、次のURLを使用します。

サービス URL
サービス・マネージャ https://localhost:localPort
管理サーバー https://localhost:localPort/instance_name/adminsrvr
分散サーバー https://localhost:localPort/instance_name/distsrvr
パフォーマンス・メトリック・サーバー https://localhost:localPort/instance_name/pmsrvr
レシーバ・サーバー https://localhost:localPort/instance_name/recvsrvr

ノート:

OCIでOracle GoldenGateに接続する場合は、要塞とSSHポート転送セッションを作成する必要があります(ステップ6.1を参照)。その後で、https://locahost:<localPort>を使用すると、Oracle GoldenGateサービスに接続できます。

リバース・プロキシは、マイクロサービスに簡単にアクセスし、セキュリティと管理性を強化するために必須です。

手順に従って、SSL接続のNGINXリバース・プロキシをインストールおよび構成し、すべての外部通信をセキュアにします。

ノート:

NGINXでCA署名付き証明書を使用する場合は、NGINX ssl_certificateパラメータが、CA署名付き証明書、中間証明書、ルート証明書という正しい順序で証明書が含まれている証明書ファイルを指していることを確認します。

このタスクを完了するには、次のステップを実行します。

  • ステップ8.1 - NGINXのインストール
  • ステップ8.2 - NGINXリバース・プロキシの構成
  • ステップ8.3 - GoldenGate Microservicesの保護によるセキュアでない直接アクセスの制限
  • ステップ8.4 - NGINXを管理するClusterwareリソースの作成

ステップ8.1 - NGINXリバース・プロキシ・サーバーのインストール

  1. すべてのノードでroot OSユーザーとして、次の内容でファイル/etc/yum.repos.d/nginx.repoを作成することでYUMリポジトリを設定します。
    [opc@exadb-node1 ~]$ sudo su -
    [root@exadb-node1 ~]# cat > /etc/yum.repos.d/nginx.repo <<EOF
    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/rhel/7/\$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    EOF
  2. root OSユーザーとして、次のコマンドを実行して、NGINXをインストール、有効化および起動します。
    [root@exadb-node1 ~]# yum install -y python-requests python-urllib3 nginx
    [root@exadb-node1 ~]# systemctl enable nginx 
  3. root OSユーザーとして、ソフトウェアのインストール後に、NGINXリポジトリを無効にします。
    [root@exadb-node1 ~]# yum-config-manager --disable nginx-stable

ステップ8.2 - NGINXリバース・プロキシの構成

Oracle GoldenGateホームごとに、個別のリバース・プロキシ構成が必要です。

複数のサービス・マネージャを実行する場合は、次の手順によって、サービス・マネージャごとに個別のVIPを使用する構成を用意します。NGINXは、VIPを使用してHTTPS接続リクエストのルーティング先になるサービス・マネージャを決定します。

SSL証明書は、クライアントがNGINX経由で接続するサーバーを認証するために必要です。続行する前に、システム管理者に連絡して、会社の標準に従ってサーバー証明書を作成または取得してください。VIPとサービス・マネージャのペアごとに、個別の証明書が必要です。

ノート:

CA署名付き証明書の共通名は、NGINXで使用されるターゲット・ホスト名/VIPと一致している必要があります。

次のサブステップを実行して、このステップを完了します。

  • ステップ8.2.1 - NGINX構成ファイルの作成
  • ステップ8.2.2 - NGINX構成ファイルの変更
  • ステップ8.2.3 - NGINXのサーバー証明書のインストール
  • ステップ8.2.4 - NGINX構成ファイルのインストール
  • ステップ8.2.5 - 新しいNGINX構成のテスト
  • ステップ8.2.6 - NGINXと新しい構成のリロード
  • ステップ8.2.7 - GoldenGate Microservicesの接続のテスト
  • ステップ8.2.8 - GoldenGate NGINX構成ファイルの配布

ステップ8.2.1 - NGINX構成ファイルの作成

Oracle GoldenGate Microservices Architectureは、リバース・プロキスを使用するように構成できます。Oracle GoldenGate Microservices Architectureには、ReverseProxySettingsというスクリプトが含まれています。このスクリプトによって、NGINXリバース・プロキシ・サーバーのみの構成ファイルを作成します。

このスクリプトには次のパラメータが必要です。

  • --userパラメータは、初期デプロイメントの作成で指定したGoldenGate管理者アカウントの写しにする必要があります。
  • GoldenGate管理者パスワードの入力が求められます。
  • --portパラメータで指定したリバース・プロキシ・ポート番号は、デフォルトのHTTPSポート番号(443)にする必要があります。ただし、同じ--hostを使用して複数のGoldenGateサービス・マネージャを実行している場合を除きます。その場合は、前のサービス・マネージャ・リバース・プロキシ構成と競合しないHTTPSポート番号を指定します。

    たとえば、同じホスト名/VIPを使用して2つのサービス・マネージャを実行する場合、最初のリバース・プロキシ構成は--port 443 --host hostvip01で作成し、2番目は--port 444 --host hostvip01で作成します。

    個別のホスト名/VIPを使用する場合は、--port 443 --host hostvip01--port 443 --host hostvip02を使用して、2つのサービス・マネージャ・リバース・プロキシ構成を作成します。

  • 最後に、HTTPポート番号(9100)は、デプロイメントの作成時に指定したサービス・マネージャのポート番号と一致する必要があります。

このステップは、追加のGoldenGateサービス・マネージャごとに繰り返します。

oracle OSユーザーとして、次のコマンドを使用して、Oracle GoldenGate NGINX構成ファイルを作成します。

[opc@exadb-node1 ~]$ sudo su - oracle
[oracle@exadb-node1 ~]$ export OGG_HOME=/u02/app/oracle/goldengate/gg21c
[oracle@exadb-node1 ~]$ export PATH=$PATH:$OGG_HOME/bin
[oracle@exadb-node1 ~]$ cd /u02/app_acfs/goldengate
[oracle@exadb-node1 ~]$ $OGG_HOME/lib/utl/reverseproxy/ReverseProxySettings
 --user oggadmin --port 443 --output ogg_<instance_name>.conf http://localhost:9100
 --host <VIP hostname/IP>
Password: <oggadmin_password>

ステップ8.2.2 - NGINX構成ファイルの変更

複数のGoldenGateサービス・マネージャが同じHTTPS 443ポートのIP/VIPを使用するように構成されている場合は、前のステップで生成したNGINXリバース・プロキシ構成ファイルに小さな変更が必要です。

同じポート番号を共有するすべてのサービス・マネージャは、--hostパラメータで指定したそれぞれのVIP/IPを使用して個別にアクセスされます。

  1. oracle OSユーザーとして、このサービス・マネージャによって管理されるデプロイメント名を調べます。まだわからない場合、デプロイメント名はリバース・プロキシ構成ファイルにリストされています。
    [opc@exadb-node1 ~]$ sudo su - oracle
    [oracle@exadb-node1 ~]$ cd /u02/app_acfs/goldengate
    [oracle@exadb-node1 ~]$ grep "Upstream Servers" ogg_<instance_name>.conf
    ## Upstream Servers for Deployment '<instance_name>'

    この例では、デプロイメントはSOURCEと呼ばれます。

  2. oracle OSユーザーとして、アンダースコアの前にデプロイメント名を追加することで、_ServiceManagerのすべての出現箇所を変更します。
    $ sed -i 's/_ServiceManager/<instance_name>_ServiceManager/'
            ogg_<instance_name>.conf 

ステップ8.2.3 - NGINXのサーバー証明書のインストール

  1. root OSユーザーとして、ファイル権限400 (-r--------)のrootが所有する/etc/nginx/sslディレクトリでサーバー証明書とキー・ファイルをコピーします。
    [opc@exadb-node1 ~]$ sudo su -
    [root@exadb-node1 ~]# mkdir /etc/nginx/ssl
    [root@exadb-node1 ~]# chmod 400 /etc/nginx/ssl
  2. root OSユーザーとして、ステップ8.2.1で生成したリバース・プロキシ構成ファイルごとに、証明書とキー・ファイルの正しいファイル名を設定します。
    [oracle@exadb-node1 ~]$ vi /u02/app_acfs/goldengate/ogg_<instance_name>.conf
    
    # Before
        ssl_certificate         /etc/nginx/ogg.pem;
        ssl_certificate_key     /etc/nginx/ogg.pem;
    
    # After
        ssl_certificate         /etc/nginx/ssl/server.chained.crt;
        ssl_certificate_key     /etc/nginx/ssl/server.key;

CA署名付き証明書を使用する場合、ssl_certificate NGINXパラメータで指定した証明書には、1) CA署名付き証明書、2)中間証明書および3)ルート証明書を単一ファイルに含める必要があります。この順序は重要です。そうしていないと、NGINXの起動は失敗して、エラー・メッセージが表示されます。

(SSL: error:0B080074:x509 certificate routines: X509_check_private_key:key values mismatch)

ルート証明書と中間証明書は、CA署名付き証明書プロバイダからダウンロードできます。

SSL証明書の単一ファイルは、次のコマンド例を使用して生成できます。

[root@exadb-node1 ~]# cat
 CA_signed_cert.crt intermediate.crt root.crt > server.chained.crt

ssl_certificate_keyファイルは、CA署名付き証明書をリクエストする際に必要になる証明書署名リクエスト(CSR)の作成時に生成されます。

ステップ8.2.4 - NGINX構成ファイルのインストール

root OSユーザーとして、デプロイメント構成ファイル(ステップ8.2.1で複数のファイルを作成した場合はそれらのファイル)を/etc/nginx/conf.dディレクトリにコピーします。

[root@exadb-node1 ~]# mv /u02/app_acfs/goldengate/ogg_<instance_name>.conf
 /etc/nginx/conf.d

ステップ8.2.5 - 新しいNGINX構成のテスト

root OSユーザーとして、NGINX構成ファイルを検証します。

ファイルにエラーがある場合は、次のコマンドでエラーが報告されます。

[root@exadb-node1 ~]# nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginxconf test is successful

ステップ8.2.6 - NGINXと新しい構成のリロード

root OSユーザーとして、新しい構成をロードするためにNGINXを再起動します。

[root@exadb-node1 ~]# systemctl restart nginx
ステップ8.2.7 - GoldenGate Microservicesの接続のテスト
  1. root OSユーザーとして、デプロイメントのユーザー名とパスワードが含まれるcurl構成ファイル(access.cfg)を作成します。
    [root@exadb-node1 ~]# vi access.cfg
    user = "oggadmin:<password>"
  2. root OSユーザーとして、次のコマンドを使用してデプロイメントのヘルスを問い合せます。
    [root@exadb-node1 ~]# curl -svf
     -K access.cfg https://<VIP hostname/IP>:<port#>/services/v2/config/health
     -XGET && echo -e "\n*** Success"

    サンプル出力:

    {"$schema":"api:standardResponse","links":
    [{"rel":"canonical","href":"https://gg-prmy-vip1/services/v2/config/health",
    "mediaType":"application/json"},
    {"rel":"self","href":"https://gg-prmy-vip1/services/v2/config/health",
    "mediaType":"application/json"},{"rel":"describedby",
    "href":"https://gg-prmy-vip1/services/ServiceManager/v2/metadata-catalog/health",
    "mediaType":"application/schema+json"}],"messages":[],
    "response":{"$schema":"ogg:health","deploymentName":"ServiceManager",
    "serviceName":"ServiceManager","started":"2021-12-09T23:33:03.425Z","healthy":true,
    "criticalResources":[{"deploymentName":"SOURCE","name":"adminsrvr","type":"service",
    "status":"running","healthy":true},{"deploymentName":"SOURCE","name":"distsrvr",
    "type":"service","status":"running","healthy":true},
    {"deploymentName":"SOURCE","name":"recvsrvr","type":"service","status":"running",
    "healthy":true}]}}
    *** Success ***
  3. root OSユーザーとして、デプロイメントのユーザー名とパスワードが含まれるcurl構成ファイル(access.cfg)を削除します。
    [root@exadb-node1 ~]# rm access.cfg
    rm: remove regular file ‘access.cfg’? y
ステップ8.2.8 - GoldenGate NGINX構成ファイルの配布

GoldenGateサービス・マネージャ用のすべてのリバース・プロキシ構成ファイルを作成した後に、そのファイルをすべてのデータベース・ノードにコピーする必要があります。

  1. opc OSユーザーとして、すべてのデータベース・ノードにNGINX構成ファイルを配布します。
    [opc@exadb-node1 ~]$ sudo tar fczP nginx_conf.tar
     /etc/nginx/conf.d/ /etc/nginx/ssl/
    [opc@exadb-node1 ~]$ /usr/local/bin/dcli -g ~/dbs_group -l opc -d /tmp
     -f nginx_conf.tar
    [opc@exadb-node1 ~]$ /usr/local/bin/dcli -g ~/dbs_group -l opc sudo tar fxzP
     /tmp/nginx_conf.tar
  2. opc OSユーザーとして、新しい構成ファイルのコピー先にしたすべてのノードで新しいNGINX構成をテストします。
    [opc@exadb-node1 ~]$ /usr/local/bin/dcli -g ~/dbs_group -l opc sudo nginx -t
    
    exadb-node1: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    exadb-node1: nginx: configuration file /etc/nginx/nginx.conf test is successful
    exadb-node2: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    exadb-node2: nginx: configuration file /etc/nginx/nginx.conf test is successful
  3. opc OSユーザーとして、新しい構成をロードするために、すべてのノードでNGINXを再起動します。
    [opc@exadb-node1 ~]$ /usr/local/bin/dcli -g ~/dbs_group -l opc sudo systemctl
     restart nginx

ステップ8.3 - GoldenGate Microservicesの保護によるセキュアでない直接アクセスの制限

セキュアでないOracle GoldenGate MicroservicesデプロイメントにNGINXリバース・プロキシを構成していると、そのマイクロサービスは構成したマイクロサービスのポート番号を使用してHTTP (非セキュア)のアクセスができる状態が続きます。

たとえば、セキュアでないURLのhttp://<vip-name>:9101を使用して管理サーバーにアクセスできます。

Oracle GoldenGate Microservicesの各サーバー(サービス・マネージャ、adminserverpmsrvrdistsrvrおよびrecsrvr)に対するデフォルトの動作では、構成されたポート番号を使用してすべてのネットワーク・インタフェースでリスニングします。これは、マイクロサービスへのHTTPを使用した直接アクセスを無効にして、NGINX HTTPSを使用したアクセスのみ許可する必要がある、よりセキュアなインストールには望ましくありません。

次のコマンドを使用して、localhostアドレスのみを使用するようにサービス・マネージャとデプロイメント・サービスのリスナー・アドレスを変更します。Oracle GoldenGate Microservicesへのアクセスはlocalhostからのみ許可されるようになり、localhost外部のアクセスはNGINX HTTPSポートを使用してのみ成功するようになります。

ステップ8.3.1 - サービス・マネージャの停止

grid OSユーザーとして、サービス・マネージャを停止します。

[opc@exadb-node1 ~]$ sudo su - grid
[grid@exadb-node1 ~]$ agctl stop goldengate <instance_name>
[grid@exadb-node1 ~]$ agctl status goldengate
Goldengate  instance '<instance_name>' is not running

ステップ8.3.2 - サービス・マネージャ・リスナー・アドレスの変更

oracle OSユーザーとして、次のコマンドでリスナー・アドレスを変更します。

変更するサービス・マネージャに、適切なポート番号を使用してください。サーバーの起動に失敗しますが、エラーを無視して次のステップに進みます。

[opc@exadb-node1 ~]$ sudo su - oracle
[oracle@exadb-node1 ~]$ export OGG_HOME=/u02/app/oracle/goldengate/gg21c
[oracle@exadb-node1 ~]$ export
 OGG_VAR_HOME=<acfs or dbfs mount point>/deployments/ggsm01/var
[oracle@exadb-node1 ~]$ export OGG_ETC_HOME=<acfs or
 dbfs mount point>/deployments/ggsm01/etc
[oracle@exadb-node1 ~]$ $OGG_HOME/bin/ServiceManager
 --prop=/config/network/serviceListeningPort
 --value='{"port":9100,"address":"127.0.0.1"}'
 --type=array --persist --exit
[oracle@exadb-node1 ~]$

ステップ8.3.3 - サービス・マネージャとデプロイメントの再起動

grid OSユーザーとして、サービス・マネージャとデプロイメントを再起動します。

[opc@exadb-node1 ~]$ sudo su - grid
[grid@exadb-node1 ~]$ agctl start goldengate <instance_name>
[grid@exadb-node1 ~]$ agctl status goldengate
Goldengate  instance '<instance_name>' is running on exadb-node1

ステップ8.3.4 - GoldenGate Microservicesリスナー・アドレスの変更

oracle OSユーザーとして、次のコマンドを使用して、サービス・マネージャによって管理されるデプロイメントのすべてのGoldenGateマイクロサービス(adminsrvrpmsrvrdistsrvrrecvsrvr)のリスニング・アドレスをlocalhostに変更します。

[opc@exadb-node1 ~]$ sudo su - oracle
[oracle@exadb-node1 ~]$ cd /u02/app_acfs/goldengate
[oracle@exadb-node1 ~]$ chmod u+x secureServices.py
[oracle@exadb-node1 ~]$ ./secureServices.py http://localhost:9100 --user oggadmin
Password for 'oggadmin': <oggadmin_password>

*** Securing deployment - ogg_deployment

Current value of "/network/serviceListeningPort" for "<instance_name>/adminsrvr" is
{
    "address": "127.0.0.1",
    "port": 9101
}
Current value of "/network/serviceListeningPort" for "<instance_name>/distsrvr" is
{
    "address": "127.0.0.1",
    "port": 9102
}
Current value of "/network/serviceListeningPort" for "<instance_name>/pmsrvr" is
{
    "address": "127.0.0.1",
    "port": 9104
}
Current value of "/network/serviceListeningPort" for "<instance_name>/recvsrvr" is
{
    "address": "127.0.0.1",
    "port": 9103
}

ノート:

単一のデプロイメント(adminsrvrpmsrvrdistsrvrrecvsrvr)を変更する場合は、フラグ--deployment instance_nameを追加します

ステップ8.3.5 - NGINX default.conf構成ファイルの削除

opc OSユーザーとして、/etc/nginx/conf.dに作成されたデフォルト構成ファイル(default.conf)を削除します。

[opc@exadb-node1 ~]$ /usr/local/bin/dcli -g ~/dbs_group -l opc sudo rm
 -f /etc/nginx/conf.d/default.conf
[opc@exadb-node1 ~]$ /usr/local/bin/dcli -g ~/dbs_group -l opc sudo nginx -s reload
ステップ8.4 - NGINXを管理するClusterwareリソースの作成

Oracle Clusterwareは、NGINXリバース・プロキシの起動を制御して、Oracle GoldenGateデプロイメントの起動前に自動的にリバース・プロキシを起動できるようにする必要があります。

  1. grid OSユーザーとして、次のコマンドを使用して、基盤となるネットワークCRSリソースに依存するNGINXリソースの作成に必要なネットワークCRSリソース名を取得します。
    [opc@exadb-node1 ~]$ sudo su - grid
    [grid@exadb-node1 ~]$ crsctl stat res -w "TYPE == ora.network.type"|grep NAME
    
    NAME=ora.net1.network
  2. root OSユーザーとして、次のサンプル・コマンドを使用して、NGINXを管理するClusterwareリソースを作成します。HOSTING_MEMBERSおよびCARDINALITYは環境に合致するように置き換えます。
    [opc@exadb-node1 ~]$ sudo su -
    
    [root@exadb-node1 ~]# $(grep ^crs_home /etc/oracle/olr.loc | cut -d= -f2)/bin/crsctl
     add resource nginx -type generic_application -attr
     "ACL='owner:root:rwx,pgrp:root:rwx,other::r--,group:oinstall:r-x,user:oracle:rwx',
    EXECUTABLE_NAMES=nginx,START_PROGRAM='/bin/systemctl start
     -f nginx',STOP_PROGRAM='/bin/systemctl stop
     -f nginx',CHECK_PROGRAMS='/bin/systemctl status nginx'
     ,START_DEPENDENCIES='hard(ora.net1.network) pullup(ora.net1.network)',
     STOP_DEPENDENCIES='hard(intermediate:ora.net1.network)',
     RESTART_ATTEMPTS=0, HOSTING_MEMBERS='<exadb-node1, exadb-node2>', CARDINALITY=2"

    この例で作成したNGINXリソースは、指定のデータベース・ノード(HOSTING_MEMBERSで指定)で同時に実行されます。これは、複数のGoldenGateサービス・マネージャのデプロイメントが構成されていて、それらがデータベース・ノード間で独立して移動できる場合にお薦めします。

    NGINX Clusterwareリソースの作成後には、GoldenGateデプロイメントの起動前にNGINXを起動するように、GoldenGate XAGリソースを変更する必要があります。

  3. root OSユーザーとして、次のコマンド例を使用してXAGリソースを変更します。
    # Determine the current --filesystems parameter:
    [opc@exadb-node1 ~]$ sudo su - grid
    [grid@exadb-node1 ~]$ agctl config goldengate <instance_name> |grep "File System"
    File System resources needed: <file_system_resource_name>
    
    # Modify the --filesystems parameter:
    [opc@exadb-node1 ~]$ sudo su -
    [root@exadb-node1 ~]# /u01/app/grid/xag/bin/agctl modify goldengate <instance_name>
     --filesystems <file_system_resource_name>,nginx
  4. NGINXに依存するXAG GoldenGateの登録ごとに、前述のコマンドを繰り返します。