Oracle Cloud: Bastionで Port Forwarding して SSH多段接続など色々してみてみた

Oracle Cloud Infrastructure Bastionを使用すると、パブリック・エンドポイントがないターゲット・リソースに、制約と時間制限付きでアクセスできるようになります。
Bastions (要塞)では、認可されたユーザーが、Secure Shell (SSH)セッションを使用して特定のIPアドレスからターゲット・リソースに接続できます。接続したユーザーは、SSHでサポートされている任意のソフトウェアまたはプロトコルを使用してターゲット・リソースとやり取りできます。たとえば、リモート・デスクトップ・プロトコル(RDP)を使用してWindowsホストに接続したり、Oracle Net Servicesを使用してデータベースに接続します。
ということで、On-PremisesからBastion経由して、SSH, SSH多段接続, Remote Desktop (RDP), Enterprise Manager へ HTTPSブラウザ・アクセス等してみてみます。

# ■ 構成イメージ
![構成04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/a9ee0a3e-2bbf-666b-f31a-04d92ed30ea3.jpeg)




# ■ Bastion(要塞)作成
## ● 要塞作成
**1) OCIコンソール**
[アイデンティティとセキュリティ]> [要塞] をクリック
![01_Bastion作成01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/97aba0c2-82d9-d06f-ec88-dd5e03a9bd47.jpeg)



**2) 要塞の作成画面**
[リスト範囲]の[コンパートメント]リストで、要塞を作成するコンパートメントを選択し、[要塞の作成]をクリック

    ・要塞名: 任意の表示名
    ・仮想クラウド・ネットワーク: 関連付けるVCNを選択
    ・サブネット: Private Endpoint IPアドレスを配置するサブネットを選択
    ・CIDRブロック許可リスト: セッション接続を許可する1つ以上のアドレス範囲(CIDR表記)
    ・最大セッション存続時間（TTL）: 最小値は30分で、180分(3時間)を超えない値を指定

![01_Bastion作成03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/37ab62ff-51a4-1e7a-4000-f6ad6d09d138.jpeg)


**3）作成完了**

![01_Bastion作成04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/d141f977-5c0c-189a-aebf-e6f02f90eceb.jpeg)



# ■ ① Bastion: Linux-Server へ SSH接続
## ● セッションの作成
**1) Bastion画面**
[セッションの作成]をクリック
![02_ssh接続01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/80cc0d2e-e65d-af98-b720-3a5f0a3860be.jpeg)


    ・セッション・タイプ: [SSHポート転送セッション]を選択 ターゲット・リソースの特定ポートへのSSHトンネルを作成
    ・セッション名: 新規セッションの表示名を入力
    ・次を使用してターゲット・ホストに接続します:
    ・インスタンスの選択: ターゲット・コンピュートのインスタンス名を選択
    ・ポート: ターゲット・リソースで接続するポート番号を入力
    ・SSHキーの追加: セッションに使用するSSHキー・ペアの公開キー・ファイルを指定

## ● セッションへの接続
**1) セッション SSHコマンドのコピー**
セッションの「アクション」メニューで、「SSHコマンドのコピー」をクリック
![02_ssh接続03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/ce0ec76e-5b97-1383-39be-429cefd068a9.jpeg)


**2) SSHトンネル・コマンドのコピー確認**

```shell
ssh -i <privateKey> -N -L <localPort>:10.0.0.2:22 -p 22 ocid1.bastionsession.oc1.nrt.amaaaaaassl65iqatr5y4g6mv@host.bastion.ap-tokyo-1.oci.oraclecloud.com
```

**3) SSHコマンドの編集**
テキスト・エディタを使用して、<privateKey>を秘密キーへのパスに、<localPort>を要塞に接続するマシンのローカル・ポートに置き換えます。

```shell
ssh -i id_rsa -N -L 10022:10.0.0.2:22 -p 22 ocid1.bastionsession.oc1.nrt.amaaaaaassl65iqatr5y4g6mv@host.bastion.ap-tokyo-1.oci.oraclecloud.com
```

**4) 10022ポートへのSSHトンネルを作成**

```shell
[shirok@macbook ~]% ssh -i id_rsa -N -L 10022:10.0.0.2:22 -p 22 ocid1.bastionsession.oc1.nrt.amaaaaaassl65iqatr5y4g6mv@host.bastion.ap-tokyo-1.oci.oraclecloud.com

        Use of the Oracle network and applications is intended solely for Oracle's authorized users. The use of these resources by Oracle employees and contractors is subject to company policies, including the Code of Conduct, Acceptable Use Policy and Information Protection Policy; access may be monitored and logged, to the extent permitted by law, in accordance with Oracle policies. Unauthorized use may result in termination of your access, disciplinary action and/or civil and criminal penalties.
```

**5) Linux-ServerへSSH接続**
SSHクライアントを使用して、localhost (または127.0.0.1)および指定したローカル・ポート10022に接続します。

```shell
[shirok@macbook ~]% ssh -i id_rsa opc@localhost -p 10022

    The authenticity of host '[localhost]:10022 ([::1]:10022)' can't be established.
    ED25519 key fingerprint is SHA256:qFK/vL9MyWYEYBO5AmjJxRhufx8xkQEdJzL57OZAqD0.
    This key is not known by any other names
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    Warning: Permanently added '[localhost]:10022' (ED25519) to the list of known hosts.
    Activate the web console with: systemctl enable --now cockpit.socket

    Last login: Wed Apr 20 16:21:20 2022 from 10.0.255.2
```

**6) SSH接続確認**

```shell
[opc@Linux-Server ~]$ hostname
    Linux-Server
```



# ■ ② Bastion: SSH多段接続(Linux Server - Database Cloud Service )
Bastionを作成したVCN外のインスタンスと接続する場合、SSH多段接続で接続します。
VCN外のインスタンスに対して Bastion セッション 作成しようとすると次のようなエラーが出力されます

```
You provided an IP address or a compute instance with IP address that is not in the same virtual cloud network configured for the bastion.
```
![Bastion-Error.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/82d2f4a9-b819-7db4-fc3e-6141b6ff78d3.jpeg)
ということで多段接続です。

**1) 10022ポートへの SSHトンネルを作成**
① Bastion: SSH接続(Linux) で使用した 10022ポートへのSSHトンネルを使用

```shell
[shirok@macbook ~]% ssh -i id_rsa -N -L 10022:10.0.0.2:22 -p 22 ocid1.bastionsession.oc1.nrt.amaaaaaassl65iqatr5y4g6mv@host.bastion.ap-tokyo-1.oci.oraclecloud.com

        Use of the Oracle network and applications is intended solely for Oracle's authorized users. The use of these resources by Oracle employees and contractors is subject to company policies, including the Code of Conduct, Acceptable Use Policy and Information Protection Policy; access may be monitored and logged, to the extent permitted by law, in accordance with Oracle policies. Unauthorized use may result in termination of your access, disciplinary action and/or civil and criminal penalties.
```

**2) SSH多段接続**


```ssh:多段SSH構文
ssh -i <ssh-Key> opc@<踏み台IP> -p <踏み台Port番号> -t 'ssh -i <Linux-Serverに配置したssh-Key> opc@<2段目サーバIP>'
```


```ssh:実行
[shirok@macbook ~]% ssh -i id_rsa opc@localhost -p 10022 -t 'ssh -i id_rsa opc@10.0.10.10'

    Activate the web console with: systemctl enable --now cockpit.socket

    Last login: Wed Apr 20 15:01:26 2022 from 10.0.0.2
```

**3) SSH多段接続確認**
Database Cloud Service(DBCS)へ接続できたことを確認

```ssh
[opc@DBCS ~]$ hostname
    DBCS
```



# ■ ③ Bastion: Windows へ Remote Desktop接続
## ● セッションの作成
**1) Bastion画面**
[セッションの作成]をクリック


    ・セッション・タイプ: [SSHポート転送セッション]を選択 ターゲット・リソースの特定ポートへのSSHトンネルを作成
    ・セッション名: 新規セッションの表示名を入力
    ・次を使用してターゲット・ホストに接続します:
    ・インスタンスの選択: ターゲット・コンピュートのインスタンス名を選択
    ・ポート: Remote Desktop ポート番号 3389を入力
    ・SSHキーの追加: セッションに使用するSSHキー・ペアの公開キー・ファイルを指定


## ● 3389 SSHトンネル接続
**1) セッション SSHコマンドのコピー**
セッションの「アクション」メニューで、「SSHコマンドのコピー」をクリック


**2) SSHコマンドのコピー確認**

```shell
ssh -i <privateKey> -N -L <localPort>:10.0.0.3:3389 -p 22 ocid1.bastionsession.oc1.nrt.amaaaaaassl65iqatr5y4g6mv@host.bastion.ap-tokyo-1.oci.oraclecloud.com
```

**3) SSHコマンドの編集**
テキスト・エディタを使用して、<privateKey>を秘密キーへのパスに、<localPort>を要塞に接続するマシンのローカル・ポートに置き換えます。

```shell
ssh -i id_rsa -N -L 13389:10.0.0.3:3389 -p 22 ocid1.bastionsession.oc1.nrt.amaaaaaassl65iqatr5y4g6mv@host.bastion.ap-tokyo-1.oci.oraclecloud.com
```


## ● Remote Desktop接続
**1) Microsoft Remote Desktop実行**
<img width="400" alt="03_RDP接続03.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/68969291-7a07-4fcf-7b74-67cb6a4d0c84.jpeg">


**2) Remote Desktop画面**
Add PC をクリックし、localhost (または127.0.0.1)および指定したローカル・ポート<localPort> 13389 を設定
<img width="600" alt="03_RDP接続04.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/883c4fe8-c7f6-1563-c0e8-9f340eb193e7.jpeg">

**3) Remote Desktop接続**
![03_RDP接続05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/70e11a21-a293-a0fd-f438-c37a1a17335c.jpeg)




# ■ ④ Bastion: Enterprise Manager へ HTTPSブラウザ接続
## ● セッションの作成
**1) Bastion画面**
[セッションの作成]をクリック


    ・セッション・タイプ: [SSHポート転送セッション]を選択 ターゲット・リソースの特定ポートへのSSHトンネルを作成
    ・セッション名: 新規セッションの表示名を入力
    ・次を使用してターゲット・ホストに接続します:
    ・インスタンスの選択: ターゲット・コンピュートのインスタンス名を選択
    ・ポート: Enterprise-Manager ポート番号 7799を入力
    ・SSHキーの追加: セッションに使用するSSHキー・ペアの公開キー・ファイルを指定

![04_EM接続01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/ecdecf9e-7197-721c-7f8f-c7a1987d7953.jpeg)



## ● 7799 SSHトンネル接続
**1) セッション SSHコマンドのコピー**
セッションの「アクション」メニューで、「SSHコマンドのコピー」をクリック
![04_EM接続02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/084ff52f-968b-ad0f-d4af-75256f02c25b.jpeg)


**2) SSHトンネル・コマンドのコピー確認**

```shell
ssh -i <privateKey> -N -L <localPort>:10.0.0.4:7799 -p 22 ocid1.bastionsession.oc1.nrt.amaaaaaassl65iqatr5y4g6mv@host.bastion.ap-tokyo-1.oci.oraclecloud.com
```

**3) SSHトンネル・コマンド編集と実行**
テキスト・エディタを使用して、<privateKey>を秘密キーへのパスに、<localPort>を要塞に接続するマシンのローカル・ポート17799 に置き換えます。

```shell
[shirok@macbook ~]% ssh -i id_rsa -N -L 17799:10.0.0.4:7799 -p 22 ocid1.bastionsession.oc1.nrt.amaaaaaassl65iqatr5y4g6mv@host.bastion.ap-tokyo-1.oci.oraclecloud.com
 
    Use of the Oracle network and applications is intended solely for Oracle's authorized users. The use of these resources by Oracle employees and contractors is subject to company policies, including the Code of Conduct, Acceptable Use Policy and Information Protection Policy; access may be monitored and logged, to the extent permitted by law, in accordance with Oracle policies. Unauthorized use may result in termination of your access, disciplinary action and/or civil and criminal penalties.
```
## ● HTTPSブラウザ接続
1) ブラウザ接続
https://localhost:17799/em で接続
![04_EM接続03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/6ff8c47d-5967-0bae-ca2d-83e5414db9a1.jpeg)

# ■ Tips
## ● Proxy経由接続
Cisco Secure Client（Cisco AnyConnect) などの リモートアクセスVPN でクライアントが接続されている状態の場合、Proxy経由接続なります。
Proxy使用してInternet接続している場合、次のように SSHトンネル・コマンドに -o ProxyCommand オプションで Proxy URL を追加して接続します。

```shell:Mac, Linux, UNIX
  -o ProxyCommand='nc -X connect -x <Proxy-URI>:80 %h %p'
```
Windowsの場合、ncコマンドないため次を参考に Gitに含まれる connect.exe を使用します。

https://qiita.com/shirok/items/85a51ada2a5b014f2f9a

これで Proxy経由接続でも、これを使用して OCI Bastion Service を使用すれば、Microsoft リモート デスクトップの Remote Desktop Protocol(RDP)接続が可能になります。

# ■ 参考
・Oracle Cloud Infrastructure Bastion製品機能:[Oracle Bastion](https://www.oracle.com/jp/security/cloud-security/bastion/)
・Oracle Cloud Infrastructureドキュメント: [要塞ドキュメント](https://docs.oracle.com/ja-jp/iaas/Content/Bastion/home.htm)
・アーキテクチャ・センター: [Bastionサービスを使用したプライベート・サブネット内のリソースへのアクセス](https://docs.oracle.com/ja/solutions/use-bastion-service/index.html)
・FAQ: [Oracle Cloud Infrastructure Bastion Serviceに関するよくある質問](https://www.oracle.com/jp/security/cloud-security/bastion/faq/)
・[要塞のトラブルシューティング](https://docs.oracle.com/ja-jp/iaas/Content/Bastion/Tasks/troubleshooting_bastion.htm)
・[Oracle Cloud Infrastructureを使用したLinuxコンピュート・インスタンスへのアクセスおよび管理](https://docs.oracle.com/ja/learn/access-oci-linux-instance/index.html#introduction)