はじめに
2021年5月にOCI Bastionサービスがリリースされました。
Oracle Cloud Infrastructure Bastion provides restricted and time-limited access to target resources that don't have public endpoints.
OCIコンソール上「要塞」と訳されていますが、いわゆる「踏み台サーバ」のサービスです

このサービスを利用することで、プライベート・セグメントに配置しているComputeインスタンスなどに対して、インターネットからアクセスすることができるようになります。接続元IPアドレスの制限や、セッションの持続時間を指定でき(*)、必要な時に特定のIPからのみ接続できる構成にできるため、セキュアです。
(*)ただし、現在はセッションの最大持続時間を30分から3時間の間で指定する必要があるため、3時間を超える作業を実施する場合には使いずらいかもしれません。
OCI Bastionサービスは、以下図の赤枠のように、SSHポートフォワードの機能も提供しているため、SSH以外のサービスへの接続にも利用できます。
ただし、社内LANからOCI Bastionを使ってアクセスしようとする場合、端末とBastionの間に社内Proxyが介在することが多いと思います。
そして、「要塞」サービスとセッションの作成後に接続用のコマンドを確認すると、下の画像のような画面がでてくるのですが、「あれ?Windowsだとどうすれば?社内Proxyの指定をどうすれば?」という疑問がわくと思います。私がそうでした。
がんばって試したところ、Tera Termを使ったやり方で成功したので参考情報として残しておきます。(Windows標準のsshを使用したやり方は、Proxyの指定方法がわからず挫折しました。。)
※ 公式マニュアルに記載されているやり方ではありません。私個人の環境で試した結果であることにご留意ください。
前提
OCI Bastionサービスのセッションには、「管理対象SSH」と「ポート転送」の2種類があります。この記事の対象としているのは、「ポート転送」です。
「管理対象SSH」を使用する場合、接続先のインスタンス上で、Oracle Cloud AgentのBastionプラグインが稼働している必要があります。そのため、接続対象がComputeでないと使えないと思われます。また、Bastionプラグインはデフォルトは無効化されているため、有効化する必要があります。
( なんでプラグインが必要なの?と思ったのですが、「管理対象SSH」の場合は、セッション作成時に登録した公開鍵を、接続先ホストのauthorized_keysにも登録しているようです。そのためのプラグイン?)
検証手順
「要塞」の作成
OCI Bastionサービスを使用する場合、「要塞」と「セッション」を作成します。
-
以下を入力します
-
「要塞名」に、任意の識別名を入力します。
-
「ネットワーキングの構成」で、BastionのプライベートIPが割り振られるサブネットを選択します
-
「 CIDRブロック許可リスト」に接続を許可するネットワークアドレスを、CIDR形式で入力します。この記事では社内プロキシ経由のアクセスを想定しているため、社内プロキシの送信元グローバルIPアドレスのレンジを指定します。
・プライベート・エンドポイント(割り振られたIPアドレス)の値を確認します。

⇒ Bastion経由での接続では、接続元IPアドレスが、Bastionのプライベート・エンドポイントIPアドレスになります。そのため、接続先インスタンスのセキュリティ・リストまたはNSGなどにより、プライベート・エンドポイントからのアクセスを許可しておく必要があります。
なお、同画面の「編集」ボタンから、アクセスを許可するCIDRのリストや最大セッション存続時間を編集できますが、最大セッション存続時間に3時間を超える値を設定できません。入力しようとするとエラーになりました。
「セッション」の作成
続いて、「セッション」を作成します。セッションは最大3時間で破棄されてしまうため、接続のたびに作成する必要があります。
- 以下を入力します。
- 「セッション・タイプ」に"SSHポート転送セッション"を選択します
- 「セッション名」に任意のセッション名を入力します
- 「IPアドレス」に、ポート転送先のIPアドレスを入力します。# ここでは、DBCSのIPアドレスを指定しました。
- 「ポート」に、転送先のポート番号を入力します。# ここでは、SSH接続したいので22と入力しています。
- 「セッション」に接続する際に使用する鍵ペアを作成し、公開鍵をアップロードします
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コマンドの表示」からコピーした接続文字列と、各変数に指定する値との対応です。
※ 変数BASTION_USER_OCIDに設定する値は、要塞「セッション」の作成ごとに値が変化するので気を付けてください

これを実行すると、下の図のように、接続がハングしたようなTera Termの画面が起動します。

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に転送するためです。)

















