[Autonomous Database]プライベート・エンドポイント・アクセス

ADBではVCN内のプライベート・エンドポイントを使用するように指定することができます。
プライベート・エンドポイント・アクセスをおこなうには、事前に```NSG```を作成する必要があります。

# 検証環境情報

| リソース|| 名前||
|:--|:--|:--|:--|
|VCN||k-vcn-osaka-1|10.0.0.0/16|
|サブネット|パブリック|k-sub-pub-1|10.0.0.0/24|
|サブネット|プライベート|k-sub-pri-1|10.0.1.0/24|
|サブネット|パブリック|k-sub-pub-2|10.0.2.0/24|
|サブネット|プライベート|k-sub-pri-2|10.0.3.0/24|

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/bbf34a1d-2654-ac5c-378c-db914d33c8c0.png)

今回は、パブリックサブネット上のBastion VMを経由しプライベートサブネットのVMにログインし、そこからプライベートサブネット上のADBにログインしました。

# 前提
## 検証用のCompute VMを作成
* 事前に次のようなCompute VMを作成しています
    * パブリックサブネット（k-sub-pub-1）上のVM
        * 名前：```Bastion-VM```：140.83.55.3（パブリックIP）
    * プライベートサブネット（k-sub-pri-1）上のVM
        * 名前：```Private-VM```：10.0.1.169（プライベートIP）

## Private-VMにOracle Instant Clientをインストール
* 事前にPrivate-VMにOracle Instant Clientをインストールします
    * 最新が21.5.0.0.0なので、これをwgetします
    * [Oracle Instant Client](https://www.oracle.com/jp/database/technologies/instant-client/linux-x86-64-downloads.html)

* Cloud ShellからPrivate-VMにログイン
    * Cloud ShellからポートフォワードでPrivate-VMへの接続を確認
```bash
ssh -i id_rsa -o ProxyCommand="ssh -i <秘密鍵の名前> -W %h:%p -p 22 opc@<パブリックVMのパブリックIP>" -p 22 opc@<プライベートVMのプライベートIP>
```
例
```bash
ssh -i id_rsa -o ProxyCommand="ssh -i id_rsa -W %h:%p -p 22 opc@140.83.55.3" -p 22 opc@10.0.1.169
```
```bash
[opc@private-vm ~]$ 
```

* 作業用ディレクトリを作成
```bash
mkdir -p ~/network/admin
mkdir oracle
cd oracle
```
```bash
[opc@private-vm oracle]$ pwd
/home/opc/oracle
```

* Instant Client Basicパッケージ（ZIP）のダウンロード
```bash
wget https://download.oracle.com/otn_software/linux/instantclient/215000/instantclient-basic-linux.x64-21.5.0.0.0dbru.zip
```
* Instant Client SQL*Plusパッケージ（ZIP）のダウンロード
```bash
wget https://download.oracle.com/otn_software/linux/instantclient/215000/instantclient-sqlplus-linux.x64-21.5.0.0.0dbru.zip
```
* ダウンロードできたか確認
```bash
[opc@private-vm oracle]$ ll
total 77708
-rw-rw-r--. 1 opc opc 78633249 Jan 24 10:42 instantclient-basic-linux.x64-21.5.0.0.0dbru.zip
-rw-rw-r--. 1 opc opc   936445 Jan 24 10:42 instantclient-sqlplus-linux.x64-21.5.0.0.0dbru.zip
```

* ダウンロードしたものを解凍
```bash
unzip instantclient-basic-linux.x64-21.5.0.0.0dbru.zip
unzip instantclient-sqlplus-linux.x64-21.5.0.0.0dbru.zip
```

```bash
[opc@private-vm oracle]$ ll -a
total 77712
drwxrwxr-x. 3 opc opc      146 Apr  1 09:44 .
drwx------. 5 opc opc      124 Apr  1 09:42 ..
drwxrwxr-x. 3 opc opc     4096 Apr  1 09:44 instantclient_21_5
-rw-rw-r--. 1 opc opc 78633249 Jan 24 10:42 instantclient-basic-linux.x64-21.5.0.0.0dbru.zip
-rw-rw-r--. 1 opc opc   936445 Jan 24 10:42 instantclient-sqlplus-linux.x64-21.5.0.0.0dbru.zip
```

* ORACLE環境変数設定
```.bash_profile```に環境変数を記載
```bash
cp -p ~/.bash_profile ~/.bash_profile.ora
ll -a ~/ | grep .bash_profile
vi ~/.bash_profile
```
```bash
export ORACLE_BASE=$HOME/oracle
export ORACLE_HOME=$HOME/oracle/instantclient_21_5
export PATH=$PATH:$ORACLE_HOME
export LD_LIBRARY_PATH=$ORACLE_HOME
export NLS_LANG=Japanese_Japan.AL32UTF8
export TNS_ADMIN=$HOME/network/admin
```
環境変数を反映
```bash
source ~/.bash_profile
```
```bash
[opc@private-vm oracle]$ env | egrep 'ORA|LANG|PATH|TNS_ADMIN'
LD_LIBRARY_PATH=/home/opc/oracle/instantclient_21_5
ORACLE_BASE=/home/opc/oracle
LANG=en_US.UTF-8
ORACLE_HOME=/home/opc/oracle/instantclient_21_5
NLS_LANG=Japanese_Japan.AL32UTF8
TNS_ADMIN=/home/opc/network/admin
PATH=/home/opc/.local/bin:/home/opc/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/opc/oracle/instantclient_21_5:/home/opc/oracle/instantclient_21_5
```
* sqlplusの確認
```bash
sqlplus /nolog
```
```bash
[opc@private-vm oracle]$ sqlplus /nolog

SQL*Plus: Release 21.0.0.0.0 - Production on 金 4月 1 09:54:35 2022
Version 21.5.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.

SQL> exit
[opc@private-vm oracle]$ 

```

# 手順
## １）事前設定
### NSG（ネットワーク・セキュリティ・グループ）を作成
* セキュリティ・リストとNSGは```OR条件```（どちらかにセキュリティルールを書けば、そのルールは有効）です。
* そのため、今回ADBを配置するサブネットのセキュリティリストにはセキュリティルールを何も記述しません。

![p9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/d82c3066-211b-ca77-4cea-d0a55d529cef.png)

* NSGを作成します
* ネットワーキング → 仮想クラウド・ネットワーク → 仮想クラウド・ネットワークの詳細 → ネットワーク・セキュリティ・グループ → ```ネットワーク・セキュリティ・グループの作成```

![p4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/3ffaac81-8bc3-128a-c7c1-4b8789d1acb8.png)

* 作成するNSGの名前を指定
    * 例：k-nsg-1
* コンパートメントを指定

![p5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/f9823686-6d19-9dae-2876-1f27c0bfc8fc.png)

* NSGのルールを設定します
    * 今回の例
        * 方向：イングレス
        * ソース・タイプ：CIDR
        * ソース：```10.0.1.0/24```
        * IPプロトコル：TCP
        * 宛先ポート範囲：```1522```
        * 説明：k-sub-pri-1
* 補足
    * NSGは```ステートレス／ステートフル```を選択できますが、どちらでも接続できるため今回は```ステートフル```で作成しています

![p6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/4008ad55-e7a8-0077-08d3-65ebbc1346ec.png)

このような形で作成されます

![p8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/4927ec15-3cd1-b68b-23e9-50bfa226009c.png)

※NSGのセキュリティ・ルールで、パブリック・サブネットからのアクセスを許可すれば、Bastion VMから直接ADBへのアクセスも可能です。

## ２）ADBの設定
「ADB作成時（a）」、「ADB作成後（b）」または「ADBクローン時」にプライベート・エンドポイント・アクセスに設定できます。

### a）ADB作成時に指定する場合
* ネットワーク・アクセスの選択で以下を設定
    * ```プライベート・エンドポイント・アクセスのみ```を選択
    * ```VCN```
    * ```サブネット```：プライベートサブネットを選択
    * ```NSG（ネットワーク・セキュリティ・グループ```：先程作成したものを選択

![p1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/8bc77127-866e-7b23-9496-87f54e8415ec.png)

### b） ADB作成後に変更する場合
* Autonomous Databaseの詳細　→　他のアクション　→ ```ネットワーク。アクセスの更新```

![p2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/ea335656-b7ce-de5f-1c33-456df8990fb3.png)

* ネットワーク・アクセスの選択で以下を設定
    * ```プライベート・エンドポイント・アクセスのみ```を選択
    * ```VCN```
    * ```サブネット```：プライベートサブネットを選択
    * ```NSG（ネットワーク・セキュリティ・グループ```：先程作成したものを選択

![p3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/df5a8b3c-3cb0-ee4b-7258-3005f0f9aa91.png)

* 確認画面がでてくるので、対象ADB名を入力し更新します
    * 注意：新しいウォレットをダウンロードし、DBへの接続を再確立する必要があります
![p10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/39dfe48f-c505-947e-e539-d3d14d9352d0.png)

* ADBが更新中になります。ネットワークの箇所も変更されています。

![p11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/6406d3a1-340d-2544-61ea-aa3126d6fe9a.png)

* 数分で```使用可能```のステータスになります

![p12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/cd78175c-e553-86b4-7f3b-1fbfc4bbf87c.png)

## ３）接続確認
### ADBウォレットの配置
Cloud ShellからポートフォワードでPrivate-VMへウォレット（Wallet_kadw.zip）を転送
```bash
scp -i id_rsa -o ProxyCommand="ssh -i id_rsa -W %h:%p -p 22 opc@140.83.55.3" -p 22 Wallet_kadw.zip opc@10.0.1.169:~
```
Cloud ShellからPrivate-VMへログインしファイルが転送されたか確認
```bash
ssh -i id_rsa -o ProxyCommand="ssh -i id_rsa -W %h:%p -p 22 opc@140.83.55.3" -p 22 opc@10.0.1.169
```
転送されていました
```bash
[opc@private-vm ~]$ ls -l
total 24
-rw-r--r--. 1 opc opc 21612 Apr  1 09:01 Wallet_kadw.zip
```
事前に作成していたウォレット用のディレクトリ（$HOME/network/admin）にウォレットを配置し、解凍
```bash
mv Wallet_kadw.zip ~/network/admin
cd ~/network/admin
unzip Wallet_kadw.zip
```
次のようなファイルが生成されます
```bash
[opc@private-vm admin]$ ll
total 64
-rw-rw-r--. 1 opc opc  6701 Apr  1 09:01 cwallet.sso
-rw-rw-r--. 1 opc opc  6656 Apr  1 09:01 ewallet.p12
-rw-rw-r--. 1 opc opc  3192 Apr  1 09:01 keystore.jks
-rw-rw-r--. 1 opc opc   691 Apr  1 09:01 ojdbc.properties
-rw-rw-r--. 1 opc opc  3072 Apr  1 09:01 README
-rw-rw-r--. 1 opc opc   114 Apr  1 09:01 sqlnet.ora
-rw-rw-r--. 1 opc opc  1104 Apr  1 09:01 tnsnames.ora
-rw-rw-r--. 1 opc opc  3378 Apr  1 09:01 truststore.jks
-rw-r--r--. 1 opc opc 21612 Apr  1 09:01 Wallet_kadw.zip
```
sqlnet.ora の次の行を編集し、ウォレットの保存先を置き換えます。

```bash
cp -p sqlnet.ora sqlnet.ora.org
vi sqlnet.ora 
```
sqlnet.oraの編集***前***（「DIRECTORY=」の箇所が「```?/network/admin```」）
```bash
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="?/network/admin")))
SSL_SERVER_DN_MATCH=yes
```
sqlnet.oraの編集***後***（「DIRECTORY=」の箇所を「```$TNS_ADMIN```」に変更）
```bash
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="$TNS_ADMIN")))
SSL_SERVER_DN_MATCH=yes
```

### SQL*PLUSでADBに接続
* Adminユーザで接続
```bash
sqlplus admin/Welcome#1Welcome#1@kadw_low
```
* 接続できたか確認
```sql
sho user
```
```sql
SQL> sho user
ユーザーは"ADMIN"です。
```

# 補足
## セキュリティ・リストとNSGの違いについて

||セキュリティリスト(SL)|ネットワークセキュリティグループ(NSG)|
|:--|:--|:--|
|割当先|サブネット|インスタンス（NIC）やサービスリソース|
|ルールで使用できるソース・宛先|CIDR、サービス|CIDR、サービス、NSG|
|ステートレス/ステートフル|選択可能|選択可能|
|ルールの適用先|NIC|NIC|

※NSGのサービス制限については[こちら](https://docs.oracle.com/ja-jp/iaas/Content/General/Concepts/servicelimits.htm)

## ステートレス/ステートフルの違いについて
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/57c26a73-4277-3526-454a-6fc5ca4e5a79.png)
※出典：OCI活用資料集-[VCN概要 Level 100](https://oracle-japan.github.io/ocidocs/services/networking/virtual-cloud-network-100/)
※参考：マニュアル-[ステートフル・ルールとステートレス・ルール](https://docs.oracle.com/ja-jp/iaas/Content/Network/Concepts/securityrules.htm#stateful)

## tnsname.ora の記述について
プライベート・アクセス可能なADBの場合、 **host** の記述が次のようになる（下記、プライベート・エンドポイントURLはOCIコンソールからも確認可能）
```bash
host=<xxxx>.adb.ap-osaka-1.oraclecloud.com
```
パブリック・アクセス可能なADBの場合の **host** の記述（パブリック・エンドポイント）は以下。
```bash
host=adb.ap-osaka-1.oraclecloud.com
```
※同一プライベートサブネット上に別のADBを作成した場合でも、上記の **「host=xxxx」** 部分の記述が変わるため、プライベート・エンドポイントURLは異なる値となる。


* パブリック・アクセス可能なADWのtnsnames.oraの例
```bash
kadw_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ap-osaka-1.oraclecloud.com))(connect_data=(service_name=<****>_kadw_high.adb.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adb.ap-osaka-1.oraclecloud.com, OU=Oracle ADB OSAKA, O=Oracle Corporation, L=Redwood City, ST=California, C=US")))
```

* プライベート・アクセス可能なADWのtnsnames.oraの例
```bash
kadw_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=<xxxx>.adb.ap-osaka-1.oraclecloud.com))(connect_data=(service_name=<****>_kadw_high.adb.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adb.ap-osaka-1.oraclecloud.com, OU=Oracle ADB OSAKA, O=Oracle Corporation, L=Redwood City, ST=California, C=US")))
```

# 参考
* 共有Exadataインフラストラクチャ上のOracle Autonomous Databaseの使用
  * [プライベート・エンドポイントの概要](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/adbsa/security-restrict-private-endpoint.html#GUID-D12F124A-9B71-4B83-B157-63F1057072FF)
  * [30 アクセス制御ルール(ACL)およびプライベート・エンドポイントを使用したネットワーク・アクセスの構成](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/adbsa/autonomous-network-access.html#GUID-D2D468C3-CA2D-411E-92BC-E122F795A413)
* [共有Exadataインフラストラクチャ上のプライベート・エンドポイントを持つAutonomous Database](https://docs.oracle.com/ja-jp/iaas/Content/Database/Concepts/adbsprivateaccess.htm#ConnectingtoanAutonomousDatabasewithaPrivateEndpoint)
* [Autonomous Database で Private IP Address(Private Endpoints)がリリースされたので、早速接続してみる。](https://qiita.com/ora_gonsuke777/items/6e5ea42c9b82296309d9)

# オンプレからの接続方法については下記
* データセンターからADBへの接続について
    * マニュアル：[例: データ・センターからAutonomous Databaseへの接続](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/adbsa/network-private-endpoint-examples.html#GUID-9F6401C4-6306-4212-88FD-95E536B730B1)
    * OCI活用資料集：VCNレベル200-[ハイブリッドDNS構成](https://oracle-japan.github.io/ocidocs/services/networking/virtual-cloud-network-200/)
    * GitHub：[Hybrid DNS Configuration](https://github.com/terraform-providers/terraform-provider-oci/blob/255817f83956f1f9a3ab903e11465e8b4dde1957/docs/examples/networking/hybrid_dns/Hybrid-DNS-configuration-using-DNS-VM-in-VCN.md)