[Oracle Cloud] OCI Bastionサービスを使って、Windows端末からDBCSに社内Proxy経由で接続する


# はじめに

2021年5月にOCI Bastionサービスがリリースされました。

[リリース・ノート](https://docs.oracle.com/iaas/releasenotes/services/bastion/)
> Oracle Cloud Infrastructure Bastion provides restricted and time-limited access to target resources that don't have public endpoints.

OCIコンソール上「要塞」と訳されていますが、いわゆる「踏み台サーバ」のサービスです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/9bf3f406-bf61-22aa-7960-ac07c497a6d7.png)

このサービスを利用することで、プライベート・セグメントに配置しているComputeインスタンスなどに対して、インターネットからアクセスすることができるようになります。接続元IPアドレスの制限や、セッションの持続時間を指定でき(*)、必要な時に特定のIPからのみ接続できる構成にできるため、セキュアです。

<b>[そして、何より無料です！](https://www.oracle.com/jp/security/cloud-security/bastion/)</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/3ed888ec-29b2-5071-d704-a21f6955cd5b.png)

(*)ただし、現在はセッションの最大持続時間を30分から3時間の間で指定する必要があるため、3時間を超える作業を実施する場合には使いずらいかもしれません。


OCI Bastionサービスは、以下図の赤枠のように、SSHポートフォワードの機能も提供しているため、SSH以外のサービスへの接続にも利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/4a3818a5-2310-f073-3ff6-c9663c5de798.png)

https://docs.oracle.com/en-us/iaas/Content/Bastion/Concepts/bastionoverview.htm

ただし、社内LANからOCI Bastionを使ってアクセスしようとする場合、端末とBastionの間に社内Proxyが介在することが多いと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/799b3940-cf47-7167-a9fc-a4149faa8711.png)

そして、「要塞」サービスとセッションの作成後に接続用のコマンドを確認すると、下の画像のような画面がでてくるのですが、「あれ？Windowsだとどうすれば？社内Proxyの指定をどうすれば？」という疑問がわくと思います。私がそうでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/d0f05318-d538-2ca8-f83c-bd8837ba1b12.png)

がんばって試したところ、Tera Termを使ったやり方で成功したので参考情報として残しておきます。(Windows標準のsshを使用したやり方は、Proxyの指定方法がわからず挫折しました。。)

<b>※ 公式マニュアルに記載されているやり方ではありません。私個人の環境で試した結果であることにご留意ください。</b>

# 前提
OCI Bastionサービスのセッションには、「管理対象SSH」と「ポート転送」の2種類があります。この記事の対象としているのは、「ポート転送」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/c2798ad0-9063-aa09-43ae-d44619921e0f.png)

「管理対象SSH」を使用する場合、接続先のインスタンス上で、Oracle Cloud AgentのBastionプラグインが稼働している必要があります。そのため、接続対象がComputeでないと使えないと思われます。また、Bastionプラグインはデフォルトは無効化されているため、有効化する必要があります。
( なんでプラグインが必要なの？と思ったのですが、「管理対象SSH」の場合は、セッション作成時に登録した公開鍵を、接続先ホストのauthorized_keysにも登録しているようです。そのためのプラグイン？)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/257ac560-1adb-dddb-e5dd-b82b9fd2104d.png)

# 検証手順

## 「要塞」の作成
OCI Bastionサービスを使用する場合、「要塞」と「セッション」を作成します。

* [メニュー]⇒[アイデンティティとセキュリティ]⇒[要塞]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/cd9fd66c-4867-e497-0081-11bf9271308d.png)

* 「要塞の作成」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/f65ae876-759e-b29b-11e1-63ba41827082.png)

* 以下を入力します
 * 「要塞名」に、任意の識別名を入力します。
 * 「ネットワーキングの構成」で、BastionのプライベートIPが割り振られるサブネットを選択します
 * 「 CIDRブロック許可リスト」に接続を許可するネットワークアドレスを、CIDR形式で入力します。この記事では社内プロキシ経由のアクセスを想定しているため、社内プロキシの送信元グローバルIPアドレスのレンジを指定します。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/293220aa-0fee-b47b-6585-c0fe2648e6ad.png)

・「要塞」の作成完了後、要塞名のリンクを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/6b4214cd-25a4-89ca-8b9c-edbe245bdc09.png)

・プライベート・エンドポイント(割り振られたIPアドレス)の値を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/3845823e-2781-37de-ee51-03d878effb62.png)

⇒ <b>Bastion経由での接続では、接続元IPアドレスが、Bastionのプライベート・エンドポイントIPアドレスになります。そのため、接続先インスタンスのセキュリティ・リストまたはNSGなどにより、プライベート・エンドポイントからのアクセスを許可しておく必要があります。</b>

なお、同画面の「編集」ボタンから、アクセスを許可するCIDRのリストや最大セッション存続時間を編集できますが、最大セッション存続時間に3時間を超える値を設定できません。入力しようとするとエラーになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/b7da8b94-07d2-de9c-9f9c-096195a334be.png)

## 「セッション」の作成
続いて、「セッション」を作成します。セッションは最大3時間で破棄されてしまうため、接続のたびに作成する必要があります。

・「セッションの作成」ボタンを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/dceec2d2-5fbe-390d-e877-588b9f9a0c61.png)

* 以下を入力します。
 * 「セッション・タイプ」に"SSHポート転送セッション"を選択します
 * 「セッション名」に任意のセッション名を入力します
 * 「IPアドレス」に、ポート転送先のIPアドレスを入力します。# ここでは、DBCSのIPアドレスを指定しました。
 * 「ポート」に、転送先のポート番号を入力します。# ここでは、SSH接続したいので22と入力しています。
 * 「セッション」に接続する際に使用する鍵ペアを作成し、公開鍵をアップロードします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/e3730030-2044-c131-165b-c3d1f4234c97.png)

* セッションの作成後、セッションの右端のメニューを押下し、「SSHコマンドの表示」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/1bd73484-d1f5-4ddd-3b7f-7e72898491c1.png)

* 表示されたコマンドをメモします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/f83e1c44-a0cf-cf37-243c-b0a05677e69e.png)

## Tera Termを使用した接続

SSHトンネル用のセッションをと、SSHトンネルを使用してターゲットに接続するための2つのTera Termセッションを起動します

### SSHトンネル用のセッションの作成
Tera TermのGUIの画面から、Tera Termコマンドラインの/ssh-N相当の指定がどこでやるかわからなかったので、コマンドラインにしました。。
コマンドプロンプトを起動し、以下のコマンドを実行します。

```
C:\> SET TTERM_EXE=<Tera Termの実行ファイル(ttermpro.exe)のフル・パス>
C:\> SET KEYFILE_PATH=<セッション作成時に指定した鍵ペアの秘密鍵のフル・パス>
C:\> SET LOCAL_PORT=30000
     ※LOCAL_PORTは、1025以上の任意ポートです。
C:\> SET TARGET_IP=<接続先のIP>
C:\> SET TARGET_PORT=<接続先のポート>
C:\> SET BASTION_USER_OCID=<BASTIONホストのユーザ(OCID)>
C:\> SET BASTION_HOST=host.bastion.ap-tokyo-1.oci.oraclecloud.com
C:\> SET PROXY_IP=<社内プロキシのIP>
C:\> SET PROXY_PORT=<社内プロキシのポート>
C:\> %TTERM_EXE% /auth=publickey /keyfile=%KEYFILE_PATH% /ssh-N /ssh-L%LOCAL_PORT%:%TARGET_IP%:%TARGET_PORT% /user=%BASTION_USER_OCID% %BASTION_HOST%:22 -proxy=http://%PROXY_IP%:%PROXY_PORT%
```

下の図は、「SSHコマンドの表示」からコピーした接続文字列と、各変数に指定する値との対応です。
<b>※ 変数BASTION_USER_OCIDに設定する値は、要塞「セッション」の作成ごとに値が変化するので気を付けてください</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/594c7aad-85d8-9840-4fa9-866b2a2d7337.png)


これを実行すると、下の図のように、接続がハングしたようなTera Termの画面が起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/d7c41bef-81e8-1e0e-0af4-854bb7133d93.png)

Tera Termの画面起動後に、以下のコマンドを実行して、LOCAL_PORTで指定したポートがリッスン状態になっているかを確認します。指定したポートの状態がLISTENINGと表示されていたら成功です。

```
C:\> netstat -an |findstr %LOCAL_PORT%
  TCP         127.0.0.1:30000        0.0.0.0:0              LISTENING ★
  TCP         [::1]:30000            [::]:0                 LISTENING
```

### ターゲット接続用のセッションの作成

接続失敗したようなTera Termの画面はそのままにして、もう一つTera Termを起動します。
(ハングしたような状態のTera TermのSSHセッションを経由して、ローカル・ポートへの通信(パケット)をターゲットIPに転送するためです。)

* 接続先のIPに"localhost"、TCPポートに30000 (SSHトンネル作成時に指定した、LOCAL_PORTの値) を指定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/ea0c4ec0-d051-b052-f576-0581792aa48f.png)


* ターゲット接続用のユーザ名と秘密鍵のパスを指定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/d2fce848-446e-b71f-8f5d-0c57f8134b72.png)

* ログインできたら成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674918/0796f137-5249-e8aa-4065-a313d5ea8b16.png)