【OCI_07】Bastionサービスでプライベートサブネットのインスタンス(Oracle Linux)へ接続する

AWSではセッションマネージャーを利用してブラウザからサーバへ接続するサービスがありました。
OCIでも同じようなサービスはないかと調べていたら「Bastion」というものがありました。「Bastion」を訳すと「要塞」です。OCIの中でも「要塞」という表示が出てきます。
ブラウザからではないですが、Bastion経由でサーバへログインできるとのことでしたので検証してみたいと思います。
Bastionのセッションは、一度終了すると「削除済(Deleted)」状態になり、二度と再利用はできません。
Bastion(要塞ホスト) は、「オンデマンドで作られる一時的なSSHトンネル(セッション)」 の仕組みです。
セッションごとに固有の一時的な認証トークンや通信ポートが割り当てられ、ログアウトやセッションタイムアウト後には完全に破棄されます。
今回もOCIの公式チュートリアルを参考に検証しています。
BastionサービスでパブリックIPを持たないリソースにアクセスする
https://oracle-japan.github.io/ocitutorials/intermediates/bastion/
プライベート・サブネットのWindows インスタンスへBastion経由で接続する手順も検証していますので参考にしていただければと思います。
目次
ポリシーの付与
Bastionサービスを使う際に権限が必要になります。
IAMポリシーでグループに対して「manage bastion」と「manage bastion-session」を付与します。
ただし、管理者や all resource ですべてのリソースを使用できる権限があれば、この設定は不要です。
今回の検証は、管理者で作業するため、以下権限は付与しておりません。
Allow group <グループ名> to manage bastion in tenancy/compartment<コンパートメント名>
Allow group <グループ名> to manage bastion-session in tenancy/compartment<コンパート名>
プライベート・サブネット内にOracle Linuxのインスタンスを作成
VCN関連のネットワークやインスタンスは、以下の記事を参考に作成しています。
インスタンスの基本的な作成方法以外にBastionに必要な作業は、以下となります。
インスタンス作成する際に「Oracle Cloud エージェント」設定の「要塞」にチェックを入れておきます。

該当インスタンスをクリックして「管理」タブを選択します。
Oracle Cloudエージェント > コンピュート・インスタンスのモニタリング の右側にあるトリコロンから有効化します。

サブネットは、プライベートサブネットを選択します。

プライベートサブネットにインスタンスが作成されました。パブリックIPアドレスは無く、今回のプライベートIPアドレスのみ(10.0.1.164)となります。
この状態では、インターネット越しに個人端末からはSSHで接続できません。

要塞(Bastion)の作成
OCIコンソールの左上のハンバーガーメニューを展開し、「アイデンティティとセキュリティ」を選択、「要塞」を選択します。

「要塞」の作成をクリックします。

要塞の作成画面で以下を入力、選択し、右下の「要塞の作成」をクリックします。
要塞名:任意名(英数字とあるが英数字にしたらAPIエラーとなったので英字だけにしました)
ターゲット仮想クラウド・ネットワークコンパートメント:事前作成したコンパートメント
ターゲット仮想クラウド・ネットワーク:事前作成したVCN
ターゲット・サブネットコンパートメント:事前作成したコンパートメント
ターゲット・サブネット:パブリック・サブネット
CIDRブロック許可リスト:0.0.0.0/0

管理対象SSHセッションでOracle Linuxインスタンスに接続
公式チュートリアルには、管理対象SSHセッションは、コンピュート・インスタンスに接続する場合のみ利用できるとあります。
現時点では、この文章の意味は理解できておりませんがとりあえず接続できるか進めてみたいと思います。
要塞の一覧ページから、作成した要塞の名前のリンクをクリックします。

「セッション」タブを選択し、「セッションの作成」をクリックします。

セッションの作成画面で以下を入力、選択します。
セッション・タイプ:管理対象SSHセッション
セッション名:任意名
ユーザー名:opc
コンピュート・インスタンスコンパートメント:事前作成したコンパートメント
コンピュートインスタンス:要塞経由で接続したいインスタンス

SSHキーの追加:ここではインスタンスを作成した際にダウンロードしておいたpubファイルをアップロードします
SSHキーがない場合は、SSHキー・ペアの生成 のボタンを押します。そして秘密鍵と公開鍵をダウンロードします。

状態が「アクティブ」になるまで待ちます。

次に、作成したセッションの一番右側のトリコロンをクリックして「SSHコマンドのコピー」を選択します。

「SSHコマンドのコピー」をテキストなどに貼り付けます。
テキストエディタでコマンド内の 2箇所の <PrivateKey> を秘密鍵の名前に変更します。
秘密鍵は、「セッションの作成」でアップロードした公開鍵と対になっている秘密鍵となります。
今回は、インスタンス作成時に秘密鍵、公開鍵をダウンロードしているのでそれらを利用しています。
ssh -i <privateKey> -o ProxyCommand=”ssh -i <privateKey> -W %h:%p -p 22 ocid1.bastionsession.oc1.ap-osaka-1.amaaaaaa5ekurxyakv2jcsycpvreovmp2coe454dmtzgm5tun4gfjn7syyba@host.bastion.ap-osaka-1.oci.oraclecloud.com” -p 22 opc@10.0.1.164
ここでは秘密鍵の名前を ssh-key-2025-10-06(1).key として記載するので以下のようになります。
ssh -i ssh-key-2025-10-06(1).key -o ProxyCommand=”ssh -i ssh-key-2025-10-06(1).key -W %h:%p -p 22 ocid1.bastionsession.oc1.ap-osaka-1.amaaaaaa5ekurxyakv2jcsycpvreovmp2coe454dmtzgm5tun4gfjn7syyba@host.bastion.ap-osaka-1.oci.oraclecloud.com” -p 22 opc@10.0.1.164
公式チュートリアルには「.ssh」ディレクトリに格納されている秘密鍵という表現があります。
私は最初理解できてなかったのですが、これは、Linux や macOS ではユーザーのホームディレクトリにある ~/.ssh ディレクトリが「SSH鍵を置く標準の場所」として慣習的に使われていたことを意味しているだけでした。
結局のところ、秘密鍵があるディレクトリ、フォルダまでコマンドプロンプトで移動して、sshコマンドを実行すれば問題ありません。
今回はダウンロードフォルダに秘密鍵がありますので、ダウンロードフォルダへ移動して sshコマンド を実行してみます。
接続できました!プロンプトが「opc@20251006-inst-pri」に変更されています。

hostnameやifconfigでも接続できていることが確認できます。

exit を入力することで抜けることができます。

冒頭にも記載しましたが、Bastionのセッションは、一度終了すると「削除済(Deleted)」状態になり、二度と再利用はできません。
インスタンスから exit でセッションを抜けましたので「状態」は「削除済」となり、セッションは利用できなくなりました。

まとめ
Bastionサービスを利用してプライベートサブネットのインスタンス(Oracle Linux)へ接続することができました。次の記事では、Windowsのインスタンスをプライベート・サブネットに作成し、Bastionサービスを利用してRDPで接続してみたいと思います。
以下、他の記事をまとめた一覧です。OCI以外にAWSもまとめています。