AWS Verified AccessのTCP接続をOneLoginのOIDCを使って実装してみた

# AWS Verified Accessとは
VPNレスで、社内システムなどの接続できるサービスで、ポリシーなどを活用してデバイス準拠状況に応じてどのシステムに対してアクセスが可能という設定が可能なサービスです。
もともとはHTTPSとHTTPのみでしたが、2024年12月TCPプロトコルサポートがGAされました。
下記がアーキテクチャ図になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/44336e99-0901-4f4d-9c87-8d138d5c1cd0.png)

OIDCのTCPでの事例があまりなかったので設定してみたいと思います。

## 実現すること
1. AWS Verified Accessを使ってEC2に接続できることを確認する
2. OneLoginのOIDCを使って認証できることを確認する

# AWS Verified Accessを使ってEC2に接続できることを確認する
※この手順にはIAM Identity Centerが必要になります。制限されていて使えない場合は、
「OneLoginのOIDCを使って認証・・・」のほうの手順を参考にしてください。
　また接続確認にしようするEC2はPrivateSubnetに構築済みの前提となっております。

### まずはマネージメントコンソールからVPCを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/1d6ba40a-f4a6-473a-98dd-b1e320cd101b.png)

### 左側メニューの下の方に下記Verified Accessの項目があるのでここから操作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/d1344474-d505-4981-b5e4-cfff54e94547.png)

### Verified Access 信頼プロバイダーを作成します。
信頼プロバイダータイプは今回はユーザを選択します。デバイスはCrowdStrikeやJamfと連携する場合に選択します。ユーザの信頼プロバイダタイムはまずはIAM Identity Centerを選択して作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/ae462554-0999-46cf-a227-902ecabfc600.png)

### Verified Access インスタンスを作成します。
先ほど作成した信頼プロバイダーを指定して作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/10add324-537e-4d2a-89af-a43fa7b864e8.png)

### Verified Access グループを作成します。
Verified Access インスタンスは先ほど作成したものを選択しポリシーはまずはすべてを許可するポリシーを設定します。
```
permit(principal,action,resource) when {true};
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/dbcb6be1-f7a4-4cc1-8869-4a381edf61d1.png)

### Verified Access エンドポイントを作成します。
Verified Access グループは先ほど作成したものを選択。そのほかは事前に作成してあるEC2を選択してください。
ポートが「22 - 22」という形式で例とは異なりますので注意してください。
ポリシーに関しては今回は空白ですが、エンドポイント単位に条件を分けたい場合はここに設定することで、エンドポイント単位にポリシーを分けることが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/a1a62e4d-0f35-4969-b5ff-890a9de3ae17.png)

エンドポイントの作成に20分程度かかりますのでこの間に補足説明をしたいと思います。

### 補足
設定できるエンドポイントは下記があり、RDSなどは使いやすいかなと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/49469905-4ccf-4802-a32f-f81690358914.png)

セキュリテイぃグループもさらっと流しましたが、今回の場合だと22番ポートのアウトバウンドルールを作成してそのセキュリティグループからの22番ポートのアクセス許可をEC2に設定してもらえれば大丈夫です。

接続料金についてはTCP接続の場合は下記になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/42ac47f7-2872-4243-9ec6-d11004fe1466.png)
わかりにくいので解説すると、エンドポイントが起動している分は固定で課金されます。今回の構成を1ヶ月使った場合は、187.2USDが固定でかかり、接続したユーザ数×時間分がかかり、仮に1人が平日(20日間)で毎日8時間接続すると、0.16時間となります。エンドポイントが増えると料金が高くなる傾向になるので注意してください。
先ほどのネットワークCIDRを使うとエンドポイントの集約もできそうですので、別途検証しようと思います。

AWS Client VPNと比較すると、ユーザ単位の接続料金が安いので接続ユーザが多い場合にコストメリットが出ると思います。

## 接続確認
Verified Access インスタンスから設定ファイルをダンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/2b811777-73cb-4330-b3f8-53b6f6cf8261.png)

下記から接続するツールをダウンロードしてインストールしてください。
https://aws.amazon.com/jp/verified-access/connectivity-client-download/

ダウンロードしたファイルを下記に配置してください。
Mac
```
/Library/Application\ Support/Connectivity\ Client
```
Windows
```
C:\ProgramData\Connectivity Client
```
※注意
ファイル名は変更しない方がトラブルが少ないですが、変更する場合はClientConfig-から始まる名前にするように注意してください。また、ClientConfig-から始まるファイルが複数ある場合はブラウザに遷移しなくなるので注意してください。

インストールしたアプリケーションを起動するとブラウザが起動しログインを求められますのでログインしてください。
※ログイン後初回だけ、AWS Verified Accessにアクセス許可が求められますので許可を押してください。

下記画面になれば接続完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/a75e5218-dd6f-454f-bfef-40b758293ffe.png)

Verified Access エンドポイントに詳細タグにエンドポイントドメインがあるのでそれを使って接続できれば接続完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/6a7a8ce1-14f9-4a22-a1a7-7afe876d7973.png)

## OneLoginのOIDCを使って認証できることを確認する
OneLoginでOIDCアプリケーションを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/9c8b525f-cb16-4a6c-802f-bf9467be814c.png)

表示名を入力していただいてSaveボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/e19d01be-d657-4c1f-9bef-e86d731321f3.png)

作成されるとSSOがメニューに表示されるのでそれをクリックし、ClientIDとClientSecretをissuerURLをコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/3cc09aa2-24aa-401e-8e41-2152b541c43d.png)

コピーしたissuerURLにブラウザからアクセスとJSONが表示されますので下記項目をコピーしてください。
issuer
authorization_endpoint
jwks_uri
token_endpoint
userinfo_endpoint

作成した情報をもとにVerified Access 信頼プロバイダーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/d52e45cf-c719-4ff5-af0a-efc3041dfaee.png)

他の項目は先ほどと同じ設定で問題ありません。

Onlogin側に追加設定します。Configureを開いて、エンドポイントのURLとhttp://localhost8000を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/407c4aee-158d-4737-9c76-6c01ec48aacc.png)

Verified Access インスタンスから設定ファイルをダンロードし、先ほどと同じところに格納します。先ほどのファイルは削除することを忘れないでください。削除しない場合はログイン画面に遷移しません。

アプリケーションを起動してログインできるか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/d98d4c39-ee40-4393-86cf-57bd718e99d1.png)

ログインできたのでEC2に接続確認をしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80475/da9e7bf9-db5b-43b3-ac1a-607d55843972.png)/

接続できましたね。

# まとめ
AWS Client VPNに加えて新しい選択肢が増えました。デバイスの状態を確認してから接続許可を行えるなどゼロトラストに近い方法ですし、利用方法によってはコスト低減になるかもしれません。
誰かのお力になれば幸いです