OCIの要塞サービス(Bastion)を利用して、IGWや専用線/VPNなしでコンピュートインスタンスを運用する。

# 初めに
インターネットアクセスが不可なプライベートサブネットへ配置したインスタンスへのアクセスが困ることってないでしょうか。
3-Tierアーキテクチャを見ても、インターネットアクセスが可能なのはプレゼンテーション層のみであり、アプリケーション/データベースレイヤはプライベートサブネット配置です。
この場合、運用保守目的でプライベートサブネットのインスタンスへアクセスするには、別途パブリックサブネットに踏み台環境を構築する等準備が必要です。

私はAutonomous Databaseをコンソールからでなく、ターミナルからコンピュートインスタンス経由で操作したかったのですが、踏み台サーバ構築に抵抗がありました。この課題に対して、OCIでは「要塞（Bastion）」サービスは1つの解となりそうだったので、使ってみました。

# 要塞(Bastion）サービスとは
要塞サービスの特徴をまとめてみました。
・ **パブリックIPが付与されていないターゲット**へインターネット経由アクセスが可能。
・ 接続はSSHの「管理対象SSHセッション」とRDPの「SSHポート転送セッション」の2種。
・ 指定時間のみ有効な（TTL指定）ワンタイムのセッションを確立する。
・ セッションは**「接続元IP」**や**「利用ポート」**等でアクセス制限が可能
・ 有効な（作られた）SSHセッションを一覧で確認できる
・ <font color="Blue">無料（大事！）</font>

#構築してみる
##構築環境概要図
以前別記事で投稿したAutonomous Database環境へ、ネットワークリソースおよびコンピュートインスタンスを追加構築（ここは省略）して、要塞(Bastion）経由で接続してみる。
[Autonomsou Databaseの環境構築の過去記事はこちらを参照ください
](https://qiita.com/tokidesu/items/bf8e595f0e723b884ce6#3-iam%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/0806a4a4-3554-b9ae-f3fc-c37ed279633b.png)

##構築手順

**前提条件**
- アクセス先のVPN、サブネット、コンピュートインスタンスが存在すること。
- 要塞およびアクセス先リソースのIAMポリシーが割り当てられていること
- セキュリティリスト、ネットワークセキュリティグループでアクセスが許可されていること
- アクセス先の**Oracle Cloudエージェントの「要塞」プラグインが有効**になっていること
- Oracle CloudエージェントがOracleサービスへ接続できること

**手順概要**
本記事ではSSH接続を実施する「管理対象SSHセッション」の手順を説明します。
1. 要塞の構築
2. セッションの作成
3. 要塞を経由した接続

###1. 要塞の構築
まずは要塞を構築します。これはインスタンスアクセスに利用するセッションを管理する大本のリソースとなり、この中でインスタンスアクセス毎にSSHセッションを作成/管理します。
1-1. 「アイデンティティとセキュリティ」→「要塞」を選択
1-2. 「要塞の作成」を選択。要塞経由で接続するVCNおよびサブネットを指定
1-3. 「CIDRブロック許可リスト」許可するアクセス元のIPを記載
　　　 ＊特に要件ない場合は0.0.0.0/0指定
　　　（SSHセッション情報、秘密鍵が必要でTTLもあるのでセキュリティはある程度担保）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/ff5cfa2a-8c42-a984-747c-8ec8376e63b4.png)
1-4. オプションでTTLの最大値を指定。
　　＊ここで設定した値以上のTTLを持つセッションを作成できなくなる
1-5. 内容確認して問題なかった場合は「要塞の作成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/265e16fe-4b34-24ce-85e0-2f9ad87ae131.png)

###2. セッションの作成
要塞を構築できたので、プライベートサブネット内のインスタンスへ接続するためのセッションを作成します。
2-1. 作成した要塞を選択。要塞のコンソール画面から「セッションの作成」を選択
2-2. セッションタイプを選択。今回はSSH接続なので「管理対象SSHセッション」を選択
2-3. 接続先のインスタンス、および有効なユーザ名を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/4c8b067c-32d6-ed4d-2e2b-b8bde2fc9023.png)

2-4. 「SSHキーの追加」で既存公開鍵を登録するか、新規キーペアを生成して秘密鍵を保存
　　　＊接続先のインスタンスと異なるキーで問題ありません
2-5. 1-4で指定した時間いないでセッションの有効時間（TTL）を指定します。
2-6. 必要に応じて、ターゲットインスタンス接続で利用するポート/IPを指定。
2-7. 内容確認して問題なかった場合は「セッションの作成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/75a436d2-3dae-5311-14a2-155b9ef00422.png)

###3. 要塞を経由した接続
3-1. 作成したセッションの右の「：」からメニューを開き「SSHコマンドのコピー」を選択
3-2. コピーしたコマンドをメモ等に貼り付け、＜＞の部分を実際の秘密鍵へ変更
　　＊コマンドを見るとProxyCommandで要塞を踏み台に多段SSHで接続しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/8b542c5a-fe91-9f29-0eb1-8a52583e7989.png)
3-3. コマンドを自身のPCのターミナルやterattermから実行
3-4. プライベートサブネット内のインスタンスへ接続完了

#実際に構築/運用してみた所感
**セキュリティ**
個人的には安心感持って利用しています。
・ コンソールからセッション確立の必要があるのでコンソールアクセス不可＝浸入不可。
・ 万が一SSHセッション情報が流出しても鍵情報がないとアクセス不可。TTLで削除。
・ アクセス履歴/利用状況を確認できる。

**ユーザビリティ**
・ 都度作成が手間かと思いましたが、作成に1分も掛からないので思ったより楽。

**運用**
・ 踏み台サーバ周りの構築不要なので、ランニングコストを削減できる。
・ 運用時のみパブリックサブネットの踏み台起動といった運用ケースもあ流が
　 踏み台停止漏れのリスクやセキュリティ管理が手間なので、TTLでの自動セッション削除や
　 要塞経由の利用状況が一覧で見れるのはかなりより。

# Tips
###Oracle Cloudエージェント
Oracle Cloudエージェントは、コンピュートインスタンスで実行されているプラグイン管理プロセスです。コンピュートのインスタンス画面から設定が可能です。
また、インスタンス作成時に最下部の拡張オプションより、プラグインの有効化が可能です。

Oracle Cloudエージェントプラグインは、エージェントがOracleサービスへ接続できないと有効化されません。有効化されない時はGWやルーティング設定も見直してみて下さい。
詳細は下記公式ドキュメントをご参考ください。
>Oracle Cloud エージェントに関するトラブルシュート
https://docs.oracle.com/ja-jp/iaas/Content/Compute/Tasks/manage-plugins-troubleshooting.htm#troubleshoot

###Cloud Shellからの接続
要塞を利用した接続は、CloudShell経由でも可能です。
CloudShellを経由してアクセスすることで、httpsでのアクセスしか許可されていない環境でも
ターゲットインスタンスへアクセス可能です。
(Cloud Shellで直接ターゲットインスタンスへ入ることもできますが、要塞経由だとopcユーザで入れる等いいことが多い）

**アクセスパス**
ユーザPC → (SSH) →　要塞 →（SSH) → ターゲットインスタンス
ユーザPC → (https) → Cloudshell → (SSH)→　要塞 →（SSH) → ターゲットインスタンス

## 終わりに
Autonomous Databaseをコンピュートインスタンスから操作しようといった思いつきから、要塞サービスを構築、利用してみましたが管理の手間がないのは思った以上によかったです。
開発環境等、複数開発者が操作する環境では利用者管理含めいいのではと思ってます。