本記事は、Oracle Cloud Infrastructure Advent Calendar 2022の Day 8 として書いています。
こんにちは。a.nakamuraです。
今回はBastion(要塞)を利用し、プライベート環境のリソース(Linuxインスタンス、Windowsインスタンス、BaseDB、ADB)にアクセスをする手順をまとめました。
目次
参考
[チュートリアル]
BastionサービスでパブリックIPを持たないリソースにアクセスする
[公式ドキュメント]
Bastion(要塞)とは
踏み台なしでプライベート環境のリソースに接続可能
セッション
作成時に設定したSSHキーで接続する
接続元は許可したCIDRからのみ接続が可能
最大3時間有効
ターゲット・リソース
VCNに紐付ける
ターゲット・ホスト
コンピュート・インスタンス、DBシステム
制限
Bastionはデフォルトで5つまで作成可能、SRで制限解除が可能
無料で利用可能
設定内容
Bastionを作成する。
ターゲット・ホストのFWにルールを追加する。
セッションを作成する。
プライベート環境のターゲット・ホストに接続する。

Bastionの作成
1.左上のハンバーガーアイコン → [アイデンティティとセキュリティ] → [要塞] → [要塞の作成]を選択する。
2.[要塞の作成]で各項目を入力する。各項目入力後、[要塞の作成]を選択してBastionを作成する。
※()内は参考画像で設定した内容。
要塞名:名前を入力する
ターゲット仮想クラウド:ターゲット・ホストがあるVCNを選択する
ターゲット・サブネット:Bastionが作成されるサブネットを選択する
CIDRブロック許可リスト:セッションに接続を許可するCIDRを入力する
(拡張オプション)最大セッション存続時間最大セッション存続時間(TTL):30〜180分でセッション接続可能時間を入力する

ネットワークFW設定
ターゲット・ホストのネットワークFWに作成したBastionからの接続を許可するルールを追加します。
今回は[NSG_Bastion]というネットワーク・セキュリティ・グループにルールを追加し各ターゲット・ホストに紐付けます。既存のセキュリティ・リストやネットワーク・セキュリティ・グループにルールを追加することも可能です。
1.作成したBastionの詳細画面で[プライベート・エンドポイントIPアドレス]を確認する。

2.ネットワーク・セキュリティ・グループの詳細画面に移動し、[ルールの追加]を選択する。
3.[ルールの追加]でソースCIDRに要塞のプライベートIPアドレスを指定してルールを追加する。
ソースCIDR:10.0.1.194/32


4.[NSG_Bastion]を各ターゲット・ホストに紐付ける。
リソースの詳細画面 → ネットワーク・セキュリティ・グループの[編集] → 対象を選択 (既存があるが場合は[+別のネットワーク・セキュリティ・グループ])→ [変更の保存]で紐付ける。

セッション作成
ターゲット・ホスト毎にセッションを作成します。
1.Bastionの詳細画面に移動し、[セッションの作成]を選択する。
2.[セッションの作成]で各項目入力後、[セッションの作成]を選択してセッションを作成する。
セッション・タイプ:SSHポート転送セッション ※詳細はドキュメント参照
IPアドレス:ホストのIPアドレス
ポート:22 (SSH)、3389(RDP)、1521(DB)※mTLS接続の場合は1522
SSHキーの追加:既存のSSHキーを追加するか生成するかを選択


Linuxインスタンスに接続
Bastionのセッションを経由してプライベートのLinuxインスタンスにSSH接続します。
※ホストIPにLinuxインスタンスのプライベートIPアドレス、ポートに22を指定したセッションを作成していること。
1.Bastionの詳細画面に移動し、作成したセッションの三点リーダーアイコン → [SSHコマンドのコピー]でコマンドをコピーする。
<コピーしたコマンド例>
# ssh -i <privateKey> -N -L <localPort>:10.0.3.34:22 -p 22 ocid1.bastionsession.oc1.ap-tokyo-1.amaaaaaa7swuj4yavvoi76bqdled7c4qgk6os4qs7p5b5j5if72tl5dnvcwq@host.bastion.ap-tokyo-1.oci.oraclecloud.com
2.コピーしたコマンドの<privateKey>と<localPort>を指定して実行してトンネルを作成する。ウィンドウを残しておく。

3.新しいコマンドウィンドウを開いて以下のコマンドを実行すると接続できる。
<コマンド例>
# ssh -p <localPort> -i <instanceのprivateKey> opc@localhost

Windowsインスタンスに接続
Bastionのセッションを経由してプライベートのWindowsインスタンスにRDP接続します。
※ホストIPにWindowsインスタンスのプライベートIPアドレス、ポートに3389を指定したセッションを作成していること。
1.Bastionの詳細画面に移動し、作成したセッションの三点リーダーアイコン → [SSHコマンドのコピー]でコマンドをコピーする。
<コピーしたコマンド例>
# ssh -i <privateKey> -N -L <localPort>:10.0.4.227:3389 -p 22 ocid1.bastionsession.oc1.ap-tokyo-1.amaaaaaa7swuj4yagygn7cvy5k4mbejoxgig2yrxqs53yuej7jripgcwfpga@host.bastion.ap-tokyo-1.oci.oraclecloud.com
2.コピーしたコマンドの<privateKey>と<localPort>を指定して実行してトンネルを作成する。ウィンドウを残しておく。

3.RDPクライアントの接続で各項目を入力する。各項目を入力し、接続する。
※RDPクライアントはPrallels Clientを使用しています。
ホスト名:localhost
ポート:トンネル作成時に指定したポート
ユーザー名:Windowsインスタンスのユーザー名
パスワード:Windowsインスタンスのパスワード

Base DBに接続
Bastionのセッションを経由してプライベートのBaseDBにSQL Developerで接続します。
※ホストIPにBaseDBのプライベートIPアドレス、ポートに1521を指定したセッションを作成していること。
1.Bastionの詳細画面に移動し、作成したセッションの三点リーダーアイコン → [SSHコマンドのコピー]でコマンドをコピーする。
<コピーしたコマンド例>
ssh -i <privateKey> -N -L <localPort>:10.0.5.138:1521 -p 22 ocid1.bastionsession.oc1.ap-tokyo-1.amaaaaaa7swuj4ya5zgw7uf6odzkknn6vp2zf6ufo4gi2gppza4rowxphwqq@host.bastion.ap-tokyo-1.oci.oraclecloud.com
2.コピーしたコマンドの<privateKey>と<localPort>を指定して実行してトンネルを作成する。ウィンドウを残しておく。

3.SQL Developerを開き、[新規データベース接続]を選択する。
4.[データベース接続の作成/選択]で各項目を入力する。各項目を入力し、[テスト]で接続できるかを確認する。
ユーザー名:BaseDBのユーザー名
パスワード:BaseDBのパスワード
接続タイプ:基本
ホスト名:localhost
ポート:トンネル作成時に指定したポート
サービス名:BaseDBの[一意のデータベース名].[ホスト・ドメイン名]

ADBに接続
Bastionのセッションを経由してプライベートのADBにSQL Developerで接続します。
※ホストIPにADBのプライベートIPアドレス、ポートに1521を指定したセッションを作成していること。
※TLSで接続します。相互TLSの接続方法はこちらを参照してください。
1.ADBの詳細画面から[データベース接続] → 接続文字列でTLSを選択 → 文字列一覧からコピーする。
(port=1521)をトンネル作成時に指定するポートに変更する。
(host=プライベート・エンドポイントURL)をlocalhostに変更する。

<接続文字列の例>
変更前
(description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1521)(host=atuqesac.adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=k7kps3ipbch4luw_atp_medium.adb.oraclecloud.com))(security=(ssl_server_dn_match=yes)))
変更後
(description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1521)(host=localhost))(connect_data=(service_name=k7kps3ipbch4luw_atp_medium.adb.oraclecloud.com))(security=(ssl_server_dn_match=yes)))
2.Bastionの詳細画面に移動し、作成したセッションの三点リーダーアイコン → [SSHコマンドのコピー]でコマンドをコピーする。
<コピーしたコマンド例>
ssh -i <privateKey> -N -L <localPort>:10.0.6.189:1521 -p 22 ocid1.bastionsession.oc1.ap-tokyo-1.amaaaaaa7swuj4ya7z7ozajlkpr2vu7sww43u7rze7pw7iuraqx5d7clnksa@host.bastion.ap-tokyo-1.oci.oraclecloud.com
3.コピーしたコマンドの<privateKey>と<localPort>を指定して実行しトンネルを作成する。ウィンドウを残しておく。

4.SQL Developerを開き、[新規データベース接続]を選択する。
5.[データベース接続の作成/選択]で各項目を入力する。各項目を入力し、[テスト]で接続できるかを確認する。
ユーザー名:ADBのユーザー名
パスワード:ADBのパスワード
接続タイプ:カスタムJDBC
カスタムJDBC URL:<jdbc:oracle:thin:@>の後に接続文字列を入力する。
<カスタムJDBC URLの例>
jdbc:oracle:thin:@(description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1521)(host=localhost))(connect_data=(service_name=k7kps3ipbch4luw_atp_medium.adb.oraclecloud.com))(security=(ssl_server_dn_match=yes)))

おわりに
いろいろなリソースに接続する方法をまとめました。
サービスが出てから時間が経っていますが、Basion経由でインスタンスやDBに接続する機会がなかったので今更ですが色々と触れて楽しかったです!個人的にADBに接続するのに手こずりました。。
今度はAWSのSession Managerサービスとの比較もしてみます!(セッション時間などに違いがあるみたいですね)
本記事がお役に立てば幸いです。