【Oracle Cloud】Bastionサービスを用いて、簡易的にSSH接続してみた

<h1>はじめに</h1>
Oracle Cloud Infrastructure(以下OCI)のBastionサービスとは、プライベート環境のリソースに対して、パブリック・エンドポイントを経由せずにセキュアに接続できるサービスです。

今回はBastionを使用したSSH接続についてご紹介したいと思います！

<h1>事前準備</h1>
Bastion作成前に以下の環境が必要となります。

```
・ VCN
・ プライベート・サブネット
・ プライベートに属するリソース(今回は「コンピュート・インスタンス」を使用)
・ SSH鍵
```

必要であれば、以下のポリシーも付与をしておきます。
(対象ユーザーがAdministrators権限を有している場合は、以下のポリシーの記述は不要です。)
```
Allow group SecurityAdmins to manage bastion-family 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
```
<h1>Bastionの作成</h1>

OCIコンソールにログイン後、左上のハンバーガーメニューから`アイデンティティとセキュリティ`→`要塞`をそれぞれ選択します。

![OCIコンソールでの選択画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/4f24c299-b85e-1b48-6a0d-36822291eecb.png)

Bastionサービスの一覧が表示され、`要塞の作成`を選択します。
この時、リージョンとコンパートメントが指定の場所にあるかどうかの確認を行いましょう。
![Bastionの作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/f63eb845-437b-767e-2a06-33d85ac5ac55.png)

以下の項目をそれぞれ入力後、`要塞の作成`を選択します。
```
・ 要塞名
・ ターゲット仮想クラウド・ネットワーク
・ ターゲット・サブネット(「プライベート・サブネット」を選択)
・ CIDRブロック許可リスト(今回はIPアドレスの制限を行わないので「0.0.0.0/0」と入力)
・ 最大セッション存続時間(TTL)(オプション)
※30分〜3時間まで任意の時間を設定できます。
```
![作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/55459886-3520-b220-aec5-adab6b7582f7.png)

作成後、状態が**アクティブ**になったら、作成が完了となります。

<h1>セッションの作成</h1>
続いて、Bastion内のセッションを作成します。

先ほど作成したBastionの詳細画面に移動し、`セッションの作成`を選択します。
![セッションの作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/33b2fa65-c37a-7630-9e79-973660b141f1.png)
セッションの作成時には以下の項目の入力が必須となります。
```
・ セッション・タイプ(今回は「SSHポート転送セッション」を使用)
・ セッション名
・ ターゲットのIPアドレス or ターゲットのインスタンス(今回は「ターゲットのインスタンス」を選択)
・ コンピュート・インスタンス
・ ポート(SSH接続なので「22」を入力)
・ SSH鍵(「公開鍵」「秘密鍵」両方)
```
以上の項目をそれぞれ入力後、`セッションの作成`を選択します。
![セッションの作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/dc7ca3cb-bf6f-7af8-e70a-e990abb3754e.png)

作成後、状態が**アクティブ**となったら、作成が完了となります。

<h1>セッションの登録</h1>

先ほど作成したセッションの`三点リーダーアイコン`→`SSHコマンドのコピー`をそれぞれ選択します。

![SSHコマンドのコピー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/a84e6906-d290-bdb0-100f-0a5ea1851339.png)

SSHコマンドは下記となりますので、**SSH秘密鍵のパス**、**ローカルポート**をそれぞれ指定の値に変更しておきます。

```
ssh -i <SSH秘密鍵のパス> -N -L <ローカルポート>:10.0.1.*:22 -p 22 ocid1.bastionsession.oc1.ap-tokyo-1.amaaaaaaured3paa2wwmx6isw3qu6goyn2blbohklqojndhc562xrnt7qiyq@host.bastion.ap-tokyo-1.oci.oraclecloud.com
```

変更後、ターミナルを新規で立ち上げて上記のコマンドを入力します。
コマンドを入力後、**プロンプトが表示されずに何も操作ができない状態となります。**
その場合はセッションが登録されて、SSH接続ができる状態となります。

なお接続時に
```
This private key will be ignored.
Load key "test.key": bad permissions
```
のようなエラーが出力された場合、秘密鍵の権限によって接続できない状態となりますので、下記の資料を参考に権限の変更をしておきましょう。

[SSH接続で"Permission Denied"と表示されたときの対処法](https://note.mokuzine.net/ssh-permission-denied/)


<h1>SSH接続</h1>
セッションが完了後、新たにターミナルを起動します。

この際に**必ずroot権限で入るようにしましょう。**

起動後に、下記のコマンドを入力します。

```
ssh -i <SSH秘密鍵のパス> -p <ローカルポート> opc@127.0.0.1
```

入力後に、SSH接続を行うかどうかの質問が出力されますので、`yes`を入力します。
```
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
```


以下のメッセージが出力された後に、対象のインスタンスにログインすることができます。
```
Warning: Permanently added '[localhost]:<ローカルポート>' (ED25519) to the list of known hosts.
Activate the web console with: systemctl enable --now cockpit.socket
```

以上でBastion経由を用いた、簡易的なSSH接続は完成となります。

<h2>参考資料</h2>

[Oracle公式ドキュメント](https://docs.oracle.com/ja-jp/iaas/Content/Bastion/Concepts/bastionoverview.htm)
[BastionサービスでパブリックIPを持たないリソースにアクセスする](https://oracle-japan.github.io/ocitutorials/intermediates/bastion/)