OCI「プライベートエンドポイントアクセスのみ」で作成したAutonomous Databaseにインターネット経由で接続する方法（Bastionサーバ経由でADBに接続）

## はじめに
こんにちは。NTTデータ先端技術の@EumJinmanです。
本記事は、Oracle Cloud Infrastructure（OCI）「プライベートエンドポイントアクセスのみ」で作成したAutonomous Database（ADB）にインターネット経由で接続する方法の１つとして<b>方法その3 : Bastion（要塞）サーバ経由でADBに接続</b>を紹介します。

その他接続方法や、全体の概要については以下のリンクをご確認ください。

全体の概要：[全体の概要](https://qiita.com/EumJinman/items/e9e63b5804e8634e0543)

方法その1：[コンピュートインスタンス経由でADBに接続](https://qiita.com/EumJinman/items/b35ffe06776d82cfe255)

方法その2：[ネットワークロードバランサー（NLB）経由でADBに接続](https://qiita.com/EumJinman/items/905bfab0551eac91c560)

## 目次
1. 概要及び、構成
2. 環境情報
3. 前提条件
4. Bastion及び、セッションの作成
    4-1. Bastionの作成
    4-2. セッションの作成
    4-3. SSHコマンドのコピー
5. クライアント環境での設定及び、接続確認
    5-1. ホストファイルの編集
    5-2. SSHトンネルの作成
    5-3. SQL DeveloperでADBに接続
6. まとめ

## 1. 概要及び、構成
![構成図bastion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/8aae7d86-269c-4d10-98a2-ced0cceaee28.png)
OCIのBastionサーバを利用し、SSHトンネル経由でADBに接続する方法です。<b>SSHトンネル経由でセキュアな接続が可能ですが、接続のために都度セッションとSSHトンネルを作成する必要があります。（持続的な接続には向かない）</b>
※Bastion自体の使用料金は発生しない。

## 2. 環境情報
#### クライアント環境
OS：Windows 10
接続ツール：SQL Developer 24.3.1

#### OCI環境
リージョン：ap-northeast-1（アジアパシフィック (東京)）

#### ADBの情報
ワークロード・タイプ：Oracle Autonomous JSON Databases
データベースのバージョン：19c
アクセスタイプ：プライベートエンドポイント

## 3. 前提条件
#### クライアント環境
①SQL Developerがインストールされていること
②クライアント環境からBastionサーバが作成されているパブリックサブネットに接続できること

#### OCI環境
①ADBが作成されていること
②パブリックサブネットのセキュリティリストにクライアント環境から接続するための適切なイングレスルールが設定されていること。（例:ADBポート1522など）
③プライベートサブネットのセキュリティリストにBastionサーバから接続するための適切なイングレスルールが設定されていること。（例:ADBポート1522など）
④クライアント環境の任意の場所にWalletがダウンロードされていること

## 4. Bastion及び、セッションの作成

### 4-1. Bastionの作成
クライアント環境からADBへ接続する際に使用するBastionサーバを作成します。

OCIコンソールページ左上から「ナビゲーション・メニュー」→「アイデンティティとセキュリティ」→「要塞」→「要塞の作成」をクリックします。
<b>※Bastionは英語表現で要塞は日本語表現になります。</b>添付のイメージが日本語表示になっているため、合わせて日本語で表記します。
![スクリーンショット (33).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/f72902ab-22c4-4e46-8ba5-9c0ecc499e07.png)

要塞の作成ページから以下の情報を入力し、「要塞の作成」をクリックします。

・要塞名：要塞の名前
・ターゲット仮想クラウド・ネットワーク：ADBが配置されているVCNを選択
・ターゲット・サブネット：ADBが配置されているプライベートサブネットを選択
・CIDRブロック許可リスト：接続を許可するCIDRブラック（0.0.0.0/0）

※今回は検証のため、CIDRブロック許可リストとして0.0.0.0/0設定していますが、<b>要件や、状況に応じて接続元の範囲を絞って設定</b>してください。
※「拡張オプションの表示」をクリックするとBastionで作成するセッションの最大存続時間を設定することが可能です。（デフォルトでは180分）

![スクリーンショット (34).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/9943eee4-5839-4bcc-a2a8-c64e414d7bd1.png)

### 4-2. セッションの作成
クラウド環境からADBへのSSHトンネルを作成するために必要なセッションを作成します。

4-1で作成した要塞ページに移動し、「セッションの作成」をクリックします。
![スクリーンショット (35).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/6a4373c8-ce8d-4a68-9a6d-4901e31e5c43.png)

セッションの作成ページから以下の情報を入力し、「セッションの作成」をクリックします。

・セッション・タイプ：SSHポート転送セッション
・セッション名：セッションの名前
・次を使用してターゲット・ホストに接続します：IPアドレス
・IPアドレス：ADBのプライベート・エンドポイントIPアドレス
・ポート：1522
・SSHキーの追加：SSHキー・ファイルの選択（SSH公開キー(.pub)をアップロード）

※<b>追加するSSHキーはクライアント環境から要塞への接続に使用される鍵です。</b>
※今回は既存のSSHキーを使用するため、「SSHキー・ファイルの選択」をしていますが、要件や、状況に応じてSSHキーの追加方法を選択してください。
※「拡張オプションの表示」をクリックするとセッションの最大存続時間を設定することが可能です。（デフォルトでは180分）
※<b>セッションの最大存続時間はBastionで設定した最大存続時間を超えることができないので注意が必要です。</b>

![スクリーンショット (36).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/806e0bf7-d81b-4040-a610-276d5b0a1ae4.png)

### 4-3. SSHコマンドのコピー
クライアント環境からSSHトンネルを作成する際に使用するSSHコマンドをOCIコンソールからコピーします。

4-2で作成したセッションページに移動し、対象のセッション右側の「三点リーダーメニュー」→「SSHコマンドのコピー」をクリックし、SSHコマンドをコピーします。
<b>※コピーしたSSHコマンドは5-2で使用するため、控えておいてください。</b>
![スクリーンショット (88).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/04fa5789-3bc7-4c54-9145-38323a5917c0.png)


## 5. クライアント環境での設定及び、接続確認

### 5-1. ホストファイルの編集
#### 5-1-1. ホストファイルを編集する理由
SQL DeveloperはWalletのtnsnames.oraの中に記載されているADBのホスト名を参照し、ADBに接続します。しかし、プライベートエンドポイントのADBはインタネットから直接接続できないプライベートネットワークに配置されているため、クライアント環境から正しく名前解決できず、接続失敗することになります。

クライアント環境のホストファイルを編集し、ADBのホスト名をクライアント環境のローカルIPアドレス（127.0.0.1）にマッピングすることでクライアント環境から正しく名前解決できるようになります。

#### 5-1-2. ホストファイルの編集
クライアント環境のホストファイルにADBのホスト名をクライアント環境のローカルIPアドレスにマッピングする設定を追加します。

ホストファイル：C:\Windows\System32\drivers\etc\hosts
追加する設定：< クライアント環境のローカルIPアドレス > < ADBプライベート・エンドポイントURL >
<b>※追加する設定の例：127.0.0.1 xxxxx.adb.ap-tokyo-1.oraclecloud.com</b>

### 5-2. SSHトンネルの作成
クライアント環境のWindowsPowerShellからSSHトンネルを作成します。

PowerShellでsshコマンドを実行するためにはOpenSSHクライアントがインストールされている必要があります。以下のコマンドでOpenSSHクライアントがインストールされていることを確認します。

```:実行コマンド
ssh -V
```

```:コマンド実行結果
OpenSSH_for_Windows_9.5p1, LibreSSL 3.8.2
```

上記、ssh -Vコマンドの実行結果でSSHのバージョン情報が表示されない場合は、OpenSSHクライアントがインストールされてない状況のため、以下のコマンドでインストールします。

```:実行コマンド
Add-WindowsCapability -Online Name OpenSSH.Client~~~~0.0.1.0
```

4-3でコピーしたSSHコマンドの以下項目を編集します。

privateKey：BastionサーバのSSH機密鍵の場所
localPort：1522

※その他情報は、OCI側から自動作成されるため、編集不要です。
※SSH機密鍵をアクセス権限が広い場所に格納してしまうとSSHのセキュリティ問題が原因でエラーが発生します。<b>SSH秘密鍵は、他のユーザーからアクセスできないように適切な場所に格納する必要</b>があります。

```:編集前 SSHコマンド例：
ssh -i <privateKey> -N -L <localPort>:10.0.1.110:1522 -p 22 ocid1.bastionsession.oc1.ap-tokyo-1xxx@xxxxxxxxxxxxxxxxxxx
```

```:編集後 SSHコマンド例：
ssh -i C:\Users\jinman.eum\.ssh\ssh-key-2025-02-14.key -N -L 1522:10.0.1.110:1522 -p 22 ocid1.bastionsession.oc1.ap-tokyo-1xxx@xxxxxxxxxxxxxxxxxxx
```

※上記コマンドが成功し、SSHトンネルが作成された場合、PowerShellのコマンドプロンプトは返ってこないです。

### 5-3. SQL DeveloperでADBに接続
SQL Developerメイン画面から左上の「+」→「新規データベース接続」をクリックし、データベース接続の作成/選択画面に移動します。
![スクリーンショット (46).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/8349e579-60ad-4a12-86cf-b27d7604e886.png)

データベース接続の作成/選択画面から以下の情報を入力し、「テスト」をクリックします。

Name：接続名
ユーザー名：admin
パスワード：adminのパスワード
接続タイプ：クラウド・ウォレット
構成ファイル：Walletファイル（.zip）
サービス：接続文字列

※構成ファイルはダウンロード済みのWalletファイルをzipファイルのまま選択します。
※サービスは任意の接続文字列を選択します。（例：<小文字のADB名>_high、<小文字のADB名>_low、<小文字のADB名>_mediumなど)

![スクリーンショット (48).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/aa678e2f-cc1e-4a4f-a33d-e05ba3d874e4.png)

テスト完了し、ステータスが成功になった場合、「接続」をクリックし、対象のADBに接続します。
![スクリーンショット (50).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821879/d1c060e6-ae12-4e9c-a38d-6215991375bc.png)


## 6. まとめ
今回は、「プライベートエンドポイントアクセスのみ」で作成したADBにBastionサーバ経由ででインタネットから接続する方法について紹介しました。

OCIのBastionサーバを利用し、SSHトンネル経由でADBに接続する方法は、SSHトンネル経由でセキュアな接続が可能ですが、接続のために都度セッションとSSHトンネルを作成する必要があることに注意してください。