DVDからSSHトンネルを介してAutonomous Databaseに接続する方法

## はじめに

Oracle Autonomous Data warehouse（ADW）インスタンスに接続する場合は1522ポートへのアクセスが許可されている必要がありますが（ADWインスタンスへの接続に使用するポートは1522で固定、2019/9時点）、セキュリティの観点で外部へのアクセスを一部のポートに限っているケースがあります。

そのような場合においてOracle Data Visualization Desktop（DVD）からADWにアクセスするために、そのための手段の一つであるSSHトンネルを介した接続方法を記載します。

ちなみに、以下はOracle Data Visualization Desktopを例に記載してますが、他のクライアントツールを利用する場合も同様です。

## 事前準備

ここではADWインスタンスは作成済みであり、またOracle Cloud Infrastructure（OCI）のComputeインスタンスも作成済みで、ここにSSHサーバを配置することを前提にしています。


### ■ SSHクライアントのインストール

DVDを使用するクライアントPC（Windows）にSSHクライアントをインストールします。
ここでは、[Git Bash](https://git-scm.com/)をインストールしSSHクライアントとします。

Git Bashのインストールは非常に簡単です。[公式サイト](https://git-scm.com/)からパッケージをダウンロードし、数回クリックするだけでインストールできます。

Git Bashをインストールしたら、[スタート]メニューの[Git Bash]アイコンをクリックして、Git Bashの使用を開始できます。 その後、bashターミナルが開き、次のコマンドを実行してbashとSSHクライアントのバージョンを確認できます。

```bash
$ bash --version
$ ssh -V
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/54eb76f3-46b8-622c-e87a-4845598c5837.png)

### ■ OCI コンピュート・インスタンスへの接続確認

このコンピュート・インスタンスは、クライアントからトラフィックを受信し、すべてのトラフィックをターゲットADWインスタンスに転送するSSHサーバーとして機能します。

以下は、コンピュート・インスタンスに接続する際に必要な情報を用意してください

- パブリックIPアドレス：OCIのWebコンソール画面を参照し取得します
- ユーザ名：デフォルトはOPC
- SSH公開鍵：インスタンス作成時に登録した秘密鍵のペアとなる公開鍵


## 事前の動作確認

まずポートの制限がかかっていないケースと、ポート制限があるがSSHトンネルを構成していないケースで、それぞれどのような挙動になるかチェックしてみます。

### ▼ ネットワークが制限されていない場合

ネットワークが制限されていない場合、ADWインスタンスへの接続は問題なく作成できるはずです。

[Connection]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/e03036cc-a38c-7d6b-2ecb-d633a7a82281.png)

[Oracle Autonomous Data Warehouse Cloud]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/e03036cc-a38c-7d6b-2ecb-d633a7a82281.png)

[Oracle Autonomous Data Warehouse Cloud]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/e41e16e4-5101-31d5-b8fc-a0287d79c5f0.png)

必要な情報を入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/ce1b14a5-d794-9b41-d389-982f8efe8a66.png)

[Client Credentials]は、ADW Webコンソールからダウンロードできるウォレットファイルです。 以下のスクリーンショットを参照してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/62ecdacf-3b3a-e98f-2fc4-284be9f41713.png)

[Username]は、ADWへの接続に使用するユーザーです。 ここでは、デフォルトのユーザー「admin」を使用します。


[Service Name] は、接続するデータベースサービスです。 選択方針は[ここ](https://docs.oracle.com/en/cloud/paas/autonomous-data-warehouse-cloud/user/connect-predefined.html#GUID-9747539B-FD46-44F1-8FF8-F5AC650F15BE)にご参照ください。

接続が正常に作成されました。これは予想される動作です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/7a936e7e-79af-7349-e4b8-9c4315feb90c.png)


### ▼ SSHポート22のみが開いている場合

テスト目的で、DVDに使用しているクライアントマシンは、Windows 2012 R2を備えたOCIのコンピュート・インスタンスであり、東京レジョンに配置されています。 ADWインスタンスはAshburnレジョンに配置されています。

セキュリティリストのエグレス・ルールを次のように変更して、ポート22を経由する以外のすべての送信トラフィックをブロックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/7c01b0aa-d35e-c053-fe2b-257184c39bb2.png)

もう一度DVDで接続を作成すると、予想どおり、「Failed to save the connection」というエラーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/6834c176-8420-915d-e599-dc9bbe723d3f.png)

ADWインスタンスへの接続のホストとポートは、ウォレットファイルに含まれている `tnsnames.ora`ファイルで指定されているため、これは驚くことではありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/41ed6bb2-d859-5339-e9b6-20a70358c60f.png)

設定したエグレス・ルールに従って、ポート22への送信トラフィックのみが許可されます。 ADWインスタンスへの接続を作成しようとすると、クライアント（DVD）は `tnsnames.ora`ファイルに指定されたホストとポートにクエリーを送信します。ポート1522へのリクエストがブロックされるため、明らかに失敗します。


## SSHトンネルの作成し接続

それではSSHトンネルを設定してアクセスしてみましょう

### ■ SSHトンネルの作成

SSHトンネルはGit Bashターミナルを開き、以下のコマンドを実行するだけで開始できます。 


```bash
$ ssh -i path-to-the-private-key -N -L local-port:target-host:target-port user@SSH-server-IP
```

上記コマンドを見ると、まだわからずらいですね。下の画像はこのコマンドの各オプションの意味を説明しています。★
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/1f9fe423-172b-a787-4c2c-9e3186c662c4.png)

以下は私が実行したコマンドです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/47f01d01-1406-1b4b-0f39-328a65dd5115.png)

* `adb.us-ashburn-1.oraclecloud.com:1522` はターゲットホストとターゲットポートです。 すべてのトラフィックがホスト（adb.us-ashburn-1.oraclecloud.com）のポート（1522）に転送されるようにします。

* `opc@SSH-server-IP` の部分は、ログオンするSSHサーバーです。

* `11522`はクライアントPC（Windows）上の空ポートです。ここではポート番号`11522`を使用することにしました。


これで、SSHトンネルの準備が整いました！

クライアントPCで、localhost（127.0.0.1）のポート11522へのトラフィックがSSHサーバーに送信され、サーバーはすべてのトラフィックをターゲットホストに転送します。

尚、このコマンドを実行すると、プロンプトは返らず（ターミナルがハングしているようになる）他のコマンドを発行できなくなりますが、これは正常動作です。SSHトンネルが構築され、今すぐ使用できることを意味します。 
尚、オプション `-f`を使用してトンネルをバックグラウンドに置くことも可能です。


### ■ SSHトンネルを介したDVDの接続の作成

`tnsnames.ora`をついて、以下の赤枠で示したように`host`と`port`を`127.0.0.1`と`11522`に更新し、クライアントPCのポート11522に対して接続するように記載します。（tnsnames.oraを編集し終わったら、再びzipでフォルダを圧縮します）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/fd98332a-bd3d-d1a8-952c-a2f1c5ea2ae7.png)


DVDの接続の作成をクリックし、先ほどZip圧縮したフォルダを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/0b79d53e-e91c-3ca2-315d-7c0cccd72532.png)

接続できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/700716c4-83f2-e8af-b38d-57ce88ad1358.png)



## SSHトンネルを終了するには

`Ctrl + C`を押すか、Git Bashターミナルウィンドウで` X`をクリックします。


## 参考資料

- [Oracle Data Visualization Desktop](https://www.oracle.com/middleware/technologies/oracle-data-visualization-desktop.html)
- [Git Bash](https://git-scm.com)
- [Explain Shell](https://explainshell.com/explain?cmd=ssh+-i+path-to-the-private-key+-N+-L+local-port%3Atarget-host%3Atarget-port+user%40SSH-server-IP)