踏み台サーバを使ってプライベートのOracle Base DB と Autonomous DBインスタンスに接続する方法

本ブログは、[オラクル・クラウドの個人ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)の1つです。

# 初めに
オンプレミス環境からOCI（Oracle Cloud Infrastructure）プライベートサブネット内の<strong>Oracle Base DB / Autonomous DB</strong>インスタンスに接続する方法はいくつかあります。その中でも、踏み台サーバを経由する方法は最も一般的です。接続方法としては、主に以下の2つのパターンがあります。

- [方法-1. 二段階のログイン](#方法-1-二段階のログイン)
- [方法-2. SSHポート転送](#方法-2-sshポート転送)
  - [2-1. コマンドラインツールを使用](#2-1-コマンドラインツールを使用)
  - [2-2. SQL Developerを使用](#2-2-sql-developerを使用)

# 方法-1. 二段階のログイン
- 踏み台サーバは<strong>Linux</strong>の場合：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/881a0aee-8fc4-6505-9c7a-c25db7dd102b.png)
- 踏み台サーバは<strong>Windows</strong>の場合：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/a9d6da39-ae9c-0dcc-a71a-3938e3dc9423.png)

メリット：
✅ 非常にシンプル。
✅ 踏み台サーバーへのログインが必要な作業に適している。

デメリット：
- ２回のログインが必要で、<strong>手間</strong>がかかる。
- <strong>3389</strong>番ポートなどをパブリックに公開する必要がある。
- 接続先の秘密鍵（或いはADBのウォレット）を踏み台サーバに配置する必要がある。

## NSGの関連設定
| 紐づいているインスタンス | 方向 | ソース・宛先CIDR | プロトコル |宛先ポート|説明|
|:-:|:-:|:-|:-:|:-:|:--|
| 踏み台<br>(Linux)  |Ingress|ソース: Client Public IP|TCP|22|接続端末から踏み台へのSSHを許可|
| 踏み台<br>(Linux)  |Egress|宛先: 接続先のPrivate IP|TCP|22<br>1521<br>443<br>1522|踏み台から接続先へのアクセスを許可|
| 踏み台<br>(Windows)  |Ingress|ソース: Client Public IP|TCP|3389|踏み台から接続先へのアクセスを許可|
| 踏み台<br>(Windows)  |Egress|宛先: 接続先のPrivate IP|TCP|22<br>1521<br>443<br>1522|踏み台から接続先へのアクセスを許可|
| ターゲット(Base DB)|Ingress|ソース: 踏み台のPrivate IP|TCP|22<br>1521|踏み台からのアクセス(SSH,SQL)を許可|
| ターゲット<br>(ADB)|Ingress|ソース: 踏み台のPrivate IP|TCP|443<br>1522|踏み台からADBへのアクセスを許可|

:::note
- Base DBと異なり、ADBインスタンスにSSHログインはできませんので、ご注意ください。
- ADBにはAPEXが実装されています。APEXを利用する場合は、<strong>443</strong>番ポートを許可する必要があります。SQLのみを利用する場合は、<strong>1522</strong>番ポートを許可するだけで問題ありません。
:::

# 方法-2. SSHポート転送
踏み台サーバは<strong> Linux </strong>の場合、SSHポート転送の手段もあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/46e4592d-d8f5-68c7-213b-d813044e5d54.png)

メリット：
✅ 二段階のログインが不要になり、作業の手間を軽減できる。
✅ 公開する必要があるポートは<font color=blue>22</font>番のみで済むため、よりセキュアな接続が可能
✅ 接続先がLinuxの場合、秘密鍵を踏み台サーバに配置する必要がない。
✅ 踏み台サーバをLinuxで構築すれば、Windowsサーバを使用するよりコストを抑えられる。

## 2-1. コマンドラインツールを使用
### a) Base DBにSSHログインする場合
- Step-1) 踏み台サーバとBase DBの秘密鍵を<strong>ローカル端末</strong>に保存する。
※、Base DBの秘密鍵を<strong>踏み台サーバに保存しない</strong>ことを推奨する。
- Step-2) 踏み台サーバにSSHログインする。
```bat
ssh -L 22:<basedb_private_ip>:22 opc@<bastion_public_ip> -i C:\Users\<username>\.ssh\<bastion_private_key>
```
 - Step-3) 上記のステップが成功したら、別のセッションを開いて、次のコマンドでターゲットに接続する。
```bat
ssh localhost -l opc -i C:\Users\<username>\.ssh\<target_private_key>
```

### b) Base DBにSQL Plusで接続する場合
- Step-1) 踏み台サーバの秘密鍵をローカル端末に保存する。
- Step-2) 踏み台サーバにSSHログインする。
```bat
ssh -L 1521:<basedb_private_ip>:1521 opc@<bastion_public_ip> -i C:\Users\<username>\.ssh\<bastion_private_key>
```
 - Step-3) 上記のステップが成功したら、別のセッションを開いて、次のコマンドでターゲットDBに接続する。
```sql
sqlplus <username>/<password>@localhost:1521/<db_service_name>
```

※、ローカルポート番号22や1521が既に使われている場合、次のように8222や11521の番号に置き換えてください。
  - step-2) `ssh -L  11521:<basedb_private_ip>:1521 opc@<bastion_public_ip> -i C:\Users\<username>\.ssh\<bastion_private_key>`
  - step-3) `sqlplus <username>/<password>@localhost:11521/<db_service_name>`

## 2-2. SQL Developerを使用

- Step-1) 踏み台サーバとBase DBの秘密鍵をローカル端末に保存する。
- Step-2) 踏み台サーバにSSHログインする（ここまでは上記の`2-1-a)`と同様）。
```bat
ssh -L 22:<basedb_private_ip>:22 opc@<bastion_public_ip> -i C:\Users\<username>\.ssh\<bastion_private_key>
```
- Step-3) ローカル端末でSQL Developerを起動し、以下のように接続設定を行う。
ホスト名の欄には `localhost` を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/cdfe10c6-ecff-41aa-8eb8-05b57a730df6.png)

※、ADBにSQL Plusで接続する場合、上記の手順と同様ですが、ポート番号のところを<font color=blue>1522</font>に変更してください。

:::note
ウォレットを利用してADBに接続するのは一般的な方法です。アクセス・タイプがパブリック（VCNに所属しない）の場合、ウォレットは必須です。一方、ADBがVCN内に配置されている場合（今回のケース）は、ウォレットを使用せずに接続することも可能です。
:::

## NSGの関連設定
| 紐づいているインスタンス | 方向 | ソース・宛先CIDR | プロトコル |宛先ポート|用途|
|:-:|:-:|:-|:-:|:-:|:--|
| 踏み台  |Ingress|ソース: Client Public IP|TCP|22|接続端末から踏み台へのSSHを許可|
| 踏み台  |Egress|宛先: Private Subnet CIDR|TCP|22<br>1521<br>443<br>1522|踏み台から接続先へのアクセスを許可|
|ターゲット<br>(Base DB)|Ingress|ソース: 踏み台のPrivate IP|TCP|22<br>1521|踏み台からBase DBへのアクセスを許可|
|ターゲット(ADB)|Ingress|ソース: 踏み台のPrivate IP|TCP|1522|踏み台からADBへのアクセスを許可|
|ターゲット(ADB)|Ingress|ソース: 踏み台のPrivate IP|TCP|443|踏み台からAPEXへのアクセスを許可(オプション)|

:::note
踏み台サーバを経由する方法以外にも、さまざまな手段があります（OCI Bastionサービス、ロード・バランサ、Cloud Shellなど）。詳細については、次の記事をご参照ください。
[プライベート・サブネット内のOracle Base DB と ADBインスタンスに接続する方法のまとめ](https://qiita.com/letian/items/077b4cfc74eab90339cc)
:::

以上

----
__関連記事__
[踏み台サーバを使ってOCIプライベートComputeインスタンスに接続する方法](https://qiita.com/letian/items/91fe87319d8a2b275b94)