[Oracle Cloud] Bastionサービスを使ってみた (2021/05/31)


パブリック・エンドポイントを持たないターゲット・リソースへの制限付きおよび時間制限付きのアクセスを提供するBastionサービスを使って、プライベートサブネットにあるOracle LinuxインスタンスへのSSH接続とWindowsインスタンスへのリモートデスクトップ(RDP)接続してみた。

# 実施した構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/e4c11686-0d2a-d3b8-c9bf-ba802c710272.png)


## 事前準備

- [OCI チュートリアル](https://oracle-japan.github.io/ocitutorials/)を参考に
    - VCN/Public Subnet,Private Subnet/Service Gateway/ルート表/Security Listの[ネットワークリソースを作成](https://oracle-japan.github.io/ocitutorials/beginners/creating-vcn/)
        - Service Gatewayのサービス：「All <region> Services in Oracle Services Network」
        - ルート表：作成したService Gatewayへのルート・ルール
	- Seculity List：ソースPublic Subnet CIDR、宛先 TCP:3389ポートのイグレスルール
	- Seculity List：ソースPublic Subnet CIDR、宛先 TCP:22ポートのイグレスルール

    - Private Subnectに[Computeインスタンスを作成](https://oracle-japan.github.io/ocitutorials/beginners/creating-compute-instance)
        - Oracle Linuxのインスタンス
        - Windows Serverのインスタンス

- IAMポリシーの作成
    - Bastionサービスを使用するために必要な権限
	- Bastion、セッション、ネットワークの管理
	- ComputeインスタンスのRead
	- Computeインスタンス エージェント プラグインのRead
	- Work-Requestのinspect

ポリシーの例

```
Allow group SecurityAdmins to manage bastion in tenancy
Allow group SecurityAdmins to manage bastion-session in tenancy
Allow group SecurityAdmins to manage virtual-network-family in tenancy
Allow group SecurityAdmins to read instance-family in tenancy
Allow group SecurityAdmins to read instance-agent-plugins in tenancy
Allow group SecurityAdmins to inspect work-requests in tenancy
```

## Bastionの作成
Identity & Security > Bastion から Bastion(要塞)の作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/77293642-5358-5004-f39b-90c658374709.png)

名前、配置VCN・Public Subnet、CIDRブロック許可リスト（アクセス元）を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/c6bbca81-a350-755f-12a7-47952a101fce.png)


## 管理対象SSHセッションの作成
作成したBastionにセッションを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/98cd3d8d-3ddf-e576-b104-570937530c64.png)

- セッション・タイプ：管理対象SSHセッション
- セッション名：名前
- ユーザ名：ssh接続ユーザ名（Oracle提供Oracle Linuxイメージの場合「opc」）
- コンピュート・インスタンス：接続対象インスタンス
- SSHキーの追加：SSH公開キーの入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/96d3260f-eb12-b6ae-d8ee-2bd06b416460.png)


## SSHポート転送セッションの作成
作成したBastionにセッションを作成

- セッション・タイプ：SSHポート転送セッション
- セッション名：名前
- 次を使用してターゲット・ホストに接続します：インスタンス名
- コンピュート・インスタンス：接続対象インスタンス(Windows Serverインスタンス)
- ポート：3389
- SSHキーの追加：SSH公開キーの入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/ddb19a21-26f0-a978-b55e-d85e62abd69e.png)


## 管理対象SSHセッションへの接続
接続対象のセッションのメニューから「SSHコマンドのコピー」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/395d02ab-330b-6207-a394-c0c25f6927c1.png)

テキスト エディタを使用して、セッションの作成時に指定した SSH キー ペアの秘密キーへのパスで<private key>を置換

更新前例

```
ssh -i <privateKey> -o ProxyCommand="ssh -i <privateKey> -W %h:%p -p 22 ocid1.bastionsession.oc1.ao-tokyo-1.aaaaaa@host.bastion.ap-tokyo-1.oci.oraclecloud.com" -p 22 opc@10.0.1.2

```

更新前後

```
ssh -i id_rsa -o ProxyCommand="ssh -i id_rsa -W %h:%p -p 22 ocid1.bastionsession.oc1.ao-tokyo-1.aaaaaa@host.bastion.ap-tokyo-1.oci.oraclecloud.com" -p 22 opc@10.0.1.2

```


コマンド ラインを使用して、カスタマイズされた SSH コマンドを発行

```
>  ssh -i id_rsa -o ProxyCommand="ssh -i id_rsa -W %h:%p -p 22 ocid1.bastionsession.oc1.ap-tokyo-1.aaaaaa@host.bastion.ap-tokyo-1.oci.oraclecloud.com" -p 22 opc@10.0.1.2
The authenticity of host 'host.bastion.ap-tokyo-1.oci.oraclecloud.com (147.154.235.219)' can't be established.
RSA key fingerprint is SHA256:AAAAAAAAAAAA.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Warning: Permanently added 'host.bastion.ap-tokyo-1.oci.oraclecloud.com,147.154.235.219' (RSA) to the list of known hosts.
The authenticity of host '10.0.1.2 (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is SHA256:AAAAAAAAAAAA.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.1.2' (ECDSA) to the list of known hosts.
[opc@OracleLinux01 ~]$
```


## SSHポート転送SSHセッションを使用してWindowsインスタンスにRDP接続
接続対象のセッションのメニューから「SSHコマンドのコピー」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/49021923-d1c7-b335-14c3-5edf98b151ad.png)

テキスト エディタを使用して、セッションの作成時に指定した SSH キー ペアの秘密キーへのパスで<private key>を置換、<localPort>を置換

更新前例

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

```

更新前後

```
ssh -i id_rsa -N -L 3399:10.0.1.3:3389 -p 22 ocid1.bastionsession.oc1.ap-tokyo-1.aaaaaa@host.bastion.ap-tokyo-1.oci.oraclecloud.com

```

コマンド ラインを使用して、カスタマイズされた SSH コマンドを発行

```
> ssh -i id_rsa -v -N -L 3399:10.0.1.124:3389 -p 22 ocid1.bastionsession.oc1.ap-london-1.aaaaaa@host.bastion.ap-tokyo-1.oci.oraclecloud.com
OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2
debug1: Connecting to host.bastion.uk-london-1.oci.oraclecloud.com [147.154.235.219] port 22.
debug1: Connection established.

<略>

debug1: pledge: network
```

ターミナルを閉じないでください。
詳細出力 ( -v)を有効にした場合、接続が成功した後の最終メッセージは次のとおりです。
debug1: pledge: network


localhost:<localPort>  でリモートデスクトップ接続を開始

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/eaf4587f-22cd-07a4-7c7f-1b03179b45ee.png)


#### ポート転送の例
ATPへの接続
Oracle SQL Developer などのデータベース クライアントを起動し、localhost:<local port>127.0.0.1:<local port>  に接続
データベース上の既存のユーザーの名前とパスワードを入力します。

MYSQLデータベースへの接続
MySQL Workbench などのデータベース クライアントを起動し、localhost:<local port>127.0.0.1:<local port>  に接続
データベース上の既存のユーザーの名前とパスワードを入力します。


# おわりに
Bastionサービスを使い、Public IPアドレスを持たないインスタンスに接続することができた
( Internet Gateway も不要 ) 

## 参考

- [Bastionサービス](https://docs.oracle.com/en-us/iaas/Content/Bastion/home.htm)
- [Simplify secure access with OCI Bastion service](https://blogs.oracle.com/cloud-infrastructure/simplify-secure-access-with-oci-bastion-service)