AWS Verified Access で非 HTTP 通信を行う

# はじめに

AWS Verified Access は VPN なしで組織内のアプリケーションやリソースにリモートアクセスできるサービスです。リモートアクセスで利便性も提供しながら、ユーザーの認証情報に基づいて、アクセスの可否をきめ細やかに管理ができ、セキュリティ体制を強化できます。

構成図でいうとこんな感じです。

- 接続元端末に [Connectivity Client をインストール](https://aws.amazon.com/jp/verified-access/connectivity-client-download/)する
- 接続元端末で、SAML ベースの Identity Provider と連携して認証
- 事前に設定したセキュリティルールに基づいて、VPC 上のリソースにリモートアクセスが可能

![image-20250503113345879.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6ce05aba-180e-46c5-8da0-eb39c7d70f05.png)



Client VPN でも似たようなことが出来ますが、AWS Verified Access は細やかなアクセスポリシーを定義できるので、柔軟にセキュリティを向上できます。また、料金も Client VPN と比べて安価です。

- Client VPN : 1 時間当たりの接続料金が USD 0.05
- AWS Verified Access : 1 時間当たりの接続料金が USD 0.001 (1 個のエンドポイントあたり、100 回の無償枠も存在)



また、AWS Verified Access で TCP 接続をサポートしたので、より利用の範囲が広がりました。今回の記事では、TCP 接続の構築手順を確認します。







# Verified Access Instance

Verified Access Instance を作成します。Identity Provider や Logging などの管理を行うための概念です。

![image-20250306185540836.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2554c383-4139-4b36-a44a-25b226703c98.png)



適当に名前などを入れて、Create を押します。

![image-20250306185735571.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3f49c454-c3a4-473b-a5a3-b9a45ca86bd5.png)



こんな感じで Verified Access Instance を作成できました。

![image-20250306185910473.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fa1dfb17-1f39-4524-bd1f-e979bc3ad5be.png)



# Verified trust provider

Verified trust provider を設定していきます。Identity Provider との連携を行う設定です。

以下のような Identity Provider と連携可能です。今回は、AWS 内で実現するために、IAM Identity Center を利用します。

- IAM Identity Center
- Entra ID
- Google Workspace
- Okta
- Crowdstrike

![image-20250306202908819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/91ae3e07-9ae2-4702-bbb5-cefab0a3c27d.png)



IAM Identity Center を選択します。

![image-20250306202957269.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d38dd824-1071-4804-89c5-69befc58c73c.png)



作成されました

![image-20250306203037616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0d1ab93c-3bf9-4442-94e3-a0e8b8e17ce3.png)



Verified Access Instance と紐づけをします。

![image-20250306203949856.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d90a2469-5f17-4704-9c39-887d8256ee58.png)



Attach

![image-20250306204010292.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c434084a-5356-40d2-abd3-f50c292961ee.png)





# Verified Access group

Verified Access group を設定します。これは、[誰がアクセスできるのかを定義するポリシー設定](https://docs.aws.amazon.com/ja_jp/verified-access/latest/ug/trust-data-iam-add-pol.html)です。[ポリシーの例を参考](https://docs.aws.amazon.com/ja_jp/verified-access/latest/ug/trust-data-iam-add-pol.html)にしながら設定しましょう。

![image-20250306202106416.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/cc12c267-6b3b-4d0f-8b18-7a670408cd44.png)



今回は、手順をシンプルにするため、AWS Identity Center で認証したユーザーはすべて許可します。

![image-20250306202645421.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0b3651fc-10bb-4d1d-a52c-363408716c4c.png)



指定した文字列

```
permit(principal,action,resource)
when {
    true
}; 
```



# Verified Access endpoint

Verified Access endpoint を作成します。名前を指定します。

![image-20250306212044999.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/04b23b30-8535-4cc9-8d28-829fb516d962.png)



Endpoint は、4 つの Type から選択できます。今回は特定の EC2 へ SSH 接続をしたいので、Network interface としますが、Network CIDR も便利そうです。

- Load Balancer : ALB や NLB から選択
- Network interface : 既存の ENI から選択
- Network CIDR : VPC 内に存在する CIDR を指定して、幅広に接続を提供 
- Amazon RDS : RDS へ接続

![image-20250306212210808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/43db7930-4b3b-4e4b-9d26-d4d9146cffde.png)



Endpoint を作成しました。

![image-20250306212248273.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/598a5a5a-5830-4cf1-82fb-7ca14399760e.png)



# Connectivity Client を接続元にインストール

Connectivity Client を接続元にインストールします。Windows と Mac が提供されています。以下の URL からインストーラーをダウンロードできます。

https://docs.aws.amazon.com/verified-access/latest/ug/connectivity-client.html

![image-20250306212915496.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d801457f-00a9-4093-8ec2-af48af7747b5.png)



# Verified Access Instance から設定ファイルを Export

作成した Endpoint のステータスが Active になったあとに、その Endpoint に接続するための設定を Export します。

![image-20250306213123876.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9df5eea1-574c-49f2-bee0-f00422de00f9.png)



`ClientConfig-vai-0d25a84f343f84fe3.json` という名前の JSON ファイルがダウンロードされました。

```json
{
  "Version": "1.0",
  "VerifiedAccessInstanceId": "vai-0d25a84f343f84fe3",
  "Region": "ap-northeast-1",
  "DeviceTrustProviders": [],
  "UserTrustProvider": {
    "Type": "iam-identity-center",
    "Scopes": "verified_access:application:connect",
    "Issuer": "https://identitycenter.amazonaws.com/ssoins-77580b0c9ef863cb",
    "PkceEnabled": true
  },
  "OpenVpnConfigurations": [
    {
      "Config": "Y2xpZW50CmRldiB0dW4K secret BuYW1l",
      "Routes": [
        {
          "Cidr": "2406:da14:1428:900::/57"
        }
      ]
    }
  ]
}
```



Windows の場合は以下のディレクトリに JSON ファイルを格納します。

C:\ProgramData\Connectivity Client

に配置

![image-20250306224812719.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8d3213b0-3998-4028-b0eb-32d703d15e58.png)

# 前提ソフトのインストール
以下の AWS Document に記載されている WebView2 をインストールします。  
https://docs.aws.amazon.com/verified-access/latest/ug/connectivity-client.html  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/eb59e650-b4de-4249-85d2-3487b7e1c74c.png)


# Connectivity Client から接続

Connectivity Client から接続をします。

![image-20250306224833183.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ed7b9f8d-f322-460b-99bd-dc4253e40ea8.png)



サインインを押します。

![image-20250306224903379.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/08a2f237-21b7-4f6e-8f2e-c4c477224404.png)



ブラウザが立ち上がり、Identity Center の画面からログインをします。

![image-20250306224914286.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/cf4f2760-dcac-4e78-b031-2e9280b2d91b.png)



パスワードを入れます。

![image-20250306224926821.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5dc4c3d8-190a-43ac-9401-aea4ad213739.png)



Allow access を押します。

![image-20250306224944537.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/11e26f66-f6e8-4a0c-8c57-64acf174f466.png)

ログインに成功しました。

![image-20250306224948291.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7bf40bd1-9aef-4518-8f93-4a59f87ede12.png)





Status が接続中になっています。

![image-20250306224957554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/72f7000a-c5df-4b84-8e24-56306ce85b48.png)



接続済みに変わりました。

![image-20250306225249821.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ae923bcc-86a8-4bcb-aa40-e2cfc9fec2d8.png)



# SSH 接続テスト

Verified Access で作成した Endpoint の詳細画面を開き、Endpoint domain を確認します。

```
itismydomain.vai-0d25a84f343f84fe3.prod.verified-access.ap-northeast-1.amazonaws.com
```

![image-20250306225629324.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f942c1fe-a394-4e8d-992a-165cea79e302.png)



このドメインは、dig コマンドで名前解決をすると IPv6 アドレスで解決されている様子が確認できます。 

> 2406:da14:1428:900::40dc:b8d9

```
> dig itismydomain.vai-0d25a84f343f84fe3.prod.verified-access.ap-northeast-1.amazonaws.com AAAA

; <<>> DiG 9.18.33 <<>> itismydomain.vai-0d25a84f343f84fe3.prod.verified-access.ap-northeast-1.amazonaws.com AAAA
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33841
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;itismydomain.vai-0d25a84f343f84fe3.prod.verified-access.ap-northeast-1.amazonaws.com. IN AAAA

;; ANSWER SECTION:
itismydomain.vai-0d25a84f343f84fe3.prod.verified-access.ap-northeast-1.amazonaws.com. 237 IN AAAA 2406:da14:1428:900::40dc:b8d9

;; Query time: 0 msec
;; SERVER: 10.0.0.2#53(10.0.0.2) (UDP)
;; WHEN: Thu Mar 06 13:56:45 UTC 2025
;; MSG SIZE  rcvd: 141
```



IPv4 は名前解決されていません。

```
> dig itismydomain.vai-0d25a84f343f84fe3.prod.verified-access.ap-northeast-1.amazonaws.com A

; <<>> DiG 9.18.33 <<>> itismydomain.vai-0d25a84f343f84fe3.prod.verified-access.ap-northeast-1.amazonaws.com A
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45411
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;itismydomain.vai-0d25a84f343f84fe3.prod.verified-access.ap-northeast-1.amazonaws.com. IN A

;; AUTHORITY SECTION:
prod.verified-access.ap-northeast-1.amazonaws.com. 900 IN SOA ns-251.awsdns-31.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400

;; Query time: 0 msec
;; SERVER: 10.0.0.2#53(10.0.0.2) (UDP)
;; WHEN: Thu Mar 06 13:57:05 UTC 2025
;; MSG SIZE  rcvd: 246
```



接続元の Windows 端末で、Verified Access 用の Interface が自動的に作成されています。

```
>ipconfig /all

省略

Unknown adapter AWS Verified Access TAP-Windows Adapter #4434:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : AWS Verified Access TAP-Windows Adapter V9 for VPN
   Physical Address. . . . . . . . . : 00-FF-6D-5F-03-C1
   DHCP Enabled. . . . . . . . . . . : Yes
   Autoconfiguration Enabled . . . . : Yes
   IPv6 Address. . . . . . . . . . . : 2406:da14:1428:980::5002(Preferred)
   Link-local IPv6 Address . . . . . : fe80::8480:1598:3308:f348%72(Preferred)
   Autoconfiguration IPv4 Address. . : 169.254.12.76(Tentative)
   Subnet Mask . . . . . . . . . . . : 255.255.0.0
   Default Gateway . . . . . . . . . :
   DHCPv6 IAID . . . . . . . . . . . : 1208024941
   DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-2E-01-77-B3-60-18-95-03-56-E2
   DNS Servers . . . . . . . . . . . : fec0:0:0:ffff::1%1
                                       fec0:0:0:ffff::2%1
                                       fec0:0:0:ffff::3%1
   NetBIOS over Tcpip. . . . . . . . : Enabled
```



ROUTE PRINT 6 で IPv6 のルートを確認してみます。

1. Verified Access の Endpoint Domain は、`2406:da14:1428:900::40dc:b8d9` に名前解決されている
2. `2406:da14:1428:900::40dc:b8d9` はルートテーブル上、`2406:da14:1428:900::/57` のネットワーク範囲に含まれる
3. `2406:da14:1428:900::40dc:b8d9`  宛の通信は、インターフェース (AWS Verified Access TAP-Windows Adapter) を通ってリンクローカルアドレス `fe80::8` をネクストホップとして転送される
4. `fe80::8` は VPN 接続が確立された時にのみ到達可能なアドレスで、VPNトンネルを通じてトラフィックを転送するための「入り口」として機能します。

```
>ROUTE PRINT -6
IPv6 Route Table
===========================================================================
Active Routes:
 If Metric Network Destination      Gateway
  1    331 ::1/128                  On-link
 72    281 2406:da14:1428:900::/57  fe80::8
 72     25 2406:da14:1428:980::5000/116
                                    fe80::8
 72    281 2406:da14:1428:980::5002/128
                                    On-link
 11    281 fe80::/64                On-link
 27    281 fe80::/64                On-link
 63    271 fe80::/64                On-link
 72    281 fe80::/64                On-link
  1    331 ff00::/8                 On-link
 11    281 ff00::/8                 On-link
 27    281 ff00::/8                 On-link
 63    271 ff00::/8                 On-link
 72    281 ff00::/8                 On-link
===========================================================================
```



では実際に SSH を行ってみます。宛先を Verified Access の Endpoint Domain を指定します。

```
ssh ec2-user@itismydomain.vai-0d25a84f343f84fe3.prod.verified-access.ap-northeast-1.amazonaws.com
```



すると、元々の EC2 インスタンスに無事に SSH 接続できました。

```
>ssh ec2-user@itismydomain.vai-0d25a84f343f84fe3.prod.verified-access.ap-northeast-1.amazonaws.com
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
Last login: Thu Mar  6 14:09:00 2025 from 10.0.2.116
Reverting to default Node version
Now using node v18.18.2 (npm v10.9.0)
Linux stepbox2023 6.1.129-138.220.amzn2023.x86_64 x86_64
 14:09:41 up  4:03,  2 users,  load average: 0.00, 0.00, 0.00
 ec2-user@stepbox2023  ~
```



# 付録 : ログ出力

Verified Access でログを出力する設定ができます。

![image-20250306231208321.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fd06e487-d086-43a1-9a1f-8acf94d6bf78.png)



CloudWatch Logs に出力してみます。

![image-20250306231306492.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d2faecaf-0dc5-4ddd-90c1-9f285b865c90.png)



こんな感じのログでした。

- どのユーザーが、どの宛先に通信したのかがわかります

```json
{
    "activity_id": "1",
    "activity_name": "Assign Privileges",
    "category_name": "Audit Activity",
    "category_uid": "3",
    "class_name": "Authorization",
    "class_uid": "3003",
    "data": {
        "endpoint_type": "network-interface",
        "protocol": "tcp",
        "access_path": "public",
        "idp": {
            "name": "IdentityCenter",
            "uid": "vatp-0268c7f307ace7590"
        },
        "authorizations": [
            {
                "decision": "Allow",
                "policy": {
                    "name": "inline"
                }
            }
        ]
    },
    "device": {
        "ip": "xxx.xxx.xxx.xxx", (接続元の Global IP)
        "port": 64683,
        "type": "Unknown",
        "type_id": 0
    },
    "duration": "1739529712491",
    "end_time": "1741270983250",
    "time": "1741270983250",
    "metadata": {
        "logged_time": 1741270983250,
        "version": "1.0.0-rc.2",
        "product": {
            "name": "Verified Access",
            "vendor_name": "AWS"
        }
    },
    "severity": "Informational",
    "severity_id": "1",
    "start_time": "1741270759",
    "status_code": "200",
    "status_id": "1",
    "status": "Success",
    "type_uid": "300301",
    "type_name": "Authorization: Assign Privileges",
    "count": 1,
    "dst_endpoint": {
        "ip": "10.0.2.35",
        "port": 22
    },
    "privileges": [
        "vae-0818a4b1cbed80b83"
    ],
    "user": {
        "email_addr": "masked address",
        "name": "ssouser01",
        "uid": "95671c316d-7a6a2ff4-4eb0-414a-9447-a1decc0c7c1e"
    }
}
```







# 検証を通じてわかったこと

- AWS Verified Access の非 HTTPS を利用するクライアント側では、Connectivity Client のインストールが必要となる。
- Windows と Mac 向けに提供されている。
- Connectivity Client の前提条件として、クライアント側で IPv6 の有効化が必要となっている。クライアントが接続しているネットワークとしては IPv4 でも問題ないが、クライアントの OS 内部として IPv6 を扱う必要がある。なお、Windows Vista 以降、Mac OS X 10.3 Panther 以降ではデフォルトで IPv6 が有効化されているらしいので、基本的には問題はないはず。
  - https://docs.aws.amazon.com/verified-access/latest/ug/connectivity-client.html#connectivity-client-prerequisites



- Endpoint は、4 つの Type が存在する
  - Load Balancer
    - VPC Internal の NLB か ALB を選択
  - Network interface
    - 特定の ENI を指定することで、その ENI に対して Verified Access を利用した接続を許可する
  - Network CIDR
    - VPC 内の指定した CIDR に対して接続を許可
  - Amazon RDS

![image-20250306211848072.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3df865b1-a783-442b-8aaf-890cecc5ab01.png)



# 参考 URL

https://speakerdeck.com/duelist2020jp/tcppurotokorunidui-suruaws-verified-accessjie-sok-sapotoji-neng-nogoshao-jie