タスク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署名付き証明書を使用する場合は、NGINXssl_certificateパラメータが、CA署名付き証明書、中間証明書、ルート証明書という正しい順序で証明書が含まれている証明書ファイルを指していることを確認します。
このタスクを完了するには、次のステップを実行します。
- ステップ8.1 - NGINXのインストール
- ステップ8.2 - NGINXリバース・プロキシの構成
- ステップ8.3 - GoldenGate Microservicesの保護によるセキュアでない直接アクセスの制限
- ステップ8.4 - NGINXを管理するClusterwareリソースの作成
ステップ8.1 - NGINXリバース・プロキシ・サーバーのインストール
- すべてのノードで
rootOSユーザーとして、次の内容でファイル/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 rootOSユーザーとして、次のコマンドを実行して、NGINXをインストール、有効化および起動します。[root@exadb-node1 ~]# yum install -y python-requests python-urllib3 nginx [root@exadb-node1 ~]# systemctl enable nginxrootOSユーザーとして、ソフトウェアのインストール後に、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を使用して個別にアクセスされます。
oracleOSユーザーとして、このサービス・マネージャによって管理されるデプロイメント名を調べます。まだわからない場合、デプロイメント名はリバース・プロキシ構成ファイルにリストされています。[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と呼ばれます。oracleOSユーザーとして、アンダースコアの前にデプロイメント名を追加することで、_ServiceManagerのすべての出現箇所を変更します。$ sed -i 's/_ServiceManager/<instance_name>_ServiceManager/' ogg_<instance_name>.conf
ステップ8.2.3 - NGINXのサーバー証明書のインストール
rootOSユーザーとして、ファイル権限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/sslrootOSユーザーとして、ステップ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.crtssl_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の接続のテストrootOSユーザーとして、デプロイメントのユーザー名とパスワードが含まれるcurl構成ファイル(access.cfg)を作成します。[root@exadb-node1 ~]# vi access.cfg user = "oggadmin:<password>"rootOSユーザーとして、次のコマンドを使用してデプロイメントのヘルスを問い合せます。[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 ***rootOSユーザーとして、デプロイメントのユーザー名とパスワードが含まれるcurl構成ファイル(access.cfg)を削除します。[root@exadb-node1 ~]# rm access.cfg rm: remove regular file ‘access.cfg’? y
GoldenGateサービス・マネージャ用のすべてのリバース・プロキシ構成ファイルを作成した後に、そのファイルをすべてのデータベース・ノードにコピーする必要があります。
opcOSユーザーとして、すべてのデータベース・ノードに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.taropcOSユーザーとして、新しい構成ファイルのコピー先にしたすべてのノードで新しい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 successfulopcOSユーザーとして、新しい構成をロードするために、すべてのノードで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の各サーバー(サービス・マネージャ、adminserver、pmsrvr、distsrvrおよび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マイクロサービス(adminsrvr、pmsrvr、distsrvr、recvsrvr)のリスニング・アドレスを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
}ノート:
単一のデプロイメント(adminsrvr、pmsrvr、distsrvr、recvsrvr)を変更する場合は、フラグ--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デプロイメントの起動前に自動的にリバース・プロキシを起動できるようにする必要があります。
gridOSユーザーとして、次のコマンドを使用して、基盤となるネットワーク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.networkrootOSユーザーとして、次のサンプル・コマンドを使用して、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リソースを変更する必要があります。
rootOSユーザーとして、次のコマンド例を使用して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- NGINXに依存するXAG GoldenGateの登録ごとに、前述のコマンドを繰り返します。