はじめに
AWS Verified Access は VPN なしで組織内のアプリケーションやリソースにリモートアクセスできるサービスです。リモートアクセスで利便性も提供しながら、ユーザーの認証情報に基づいて、アクセスの可否をきめ細やかに管理ができ、セキュリティ体制を強化できます。
構成図でいうとこんな感じです。
- 接続元端末に Connectivity Client をインストールする
- 接続元端末で、SAML ベースの Identity Provider と連携して認証
- 事前に設定したセキュリティルールに基づいて、VPC 上のリソースにリモートアクセスが可能
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 などの管理を行うための概念です。
適当に名前などを入れて、Create を押します。
こんな感じで Verified Access Instance を作成できました。
Verified trust provider
Verified trust provider を設定していきます。Identity Provider との連携を行う設定です。
以下のような Identity Provider と連携可能です。今回は、AWS 内で実現するために、IAM Identity Center を利用します。
- IAM Identity Center
- Entra ID
- Google Workspace
- Okta
- Crowdstrike
IAM Identity Center を選択します。
作成されました
Verified Access Instance と紐づけをします。
Attach
Verified Access group
Verified Access group を設定します。これは、誰がアクセスできるのかを定義するポリシー設定です。ポリシーの例を参考にしながら設定しましょう。
今回は、手順をシンプルにするため、AWS Identity Center で認証したユーザーはすべて許可します。
指定した文字列
permit(principal,action,resource)
when {
true
};
Verified Access endpoint
Verified Access endpoint を作成します。名前を指定します。
Endpoint は、4 つの Type から選択できます。今回は特定の EC2 へ SSH 接続をしたいので、Network interface としますが、Network CIDR も便利そうです。
- Load Balancer : ALB や NLB から選択
- Network interface : 既存の ENI から選択
- Network CIDR : VPC 内に存在する CIDR を指定して、幅広に接続を提供
- Amazon RDS : RDS へ接続
Endpoint を作成しました。
Connectivity Client を接続元にインストール
Connectivity Client を接続元にインストールします。Windows と Mac が提供されています。以下の URL からインストーラーをダウンロードできます。
Verified Access Instance から設定ファイルを Export
作成した Endpoint のステータスが Active になったあとに、その Endpoint に接続するための設定を Export します。
ClientConfig-vai-0d25a84f343f84fe3.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
に配置
Connectivity Client から接続
Connectivity Client から接続をします。
サインインを押します。
ブラウザが立ち上がり、Identity Center の画面からログインをします。
パスワードを入れます。
Allow access を押します。
ログインに成功しました。
Status が接続中になっています。
接続済みに変わりました。
SSH 接続テスト
Verified Access で作成した Endpoint の詳細画面を開き、Endpoint domain を確認します。
itismydomain.vai-0d25a84f343f84fe3.prod.verified-access.ap-northeast-1.amazonaws.com
このドメインは、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 のルートを確認してみます。
- Verified Access の Endpoint Domain は、
2406:da14:1428:900::40dc:b8d9
に名前解決されている -
2406:da14:1428:900::40dc:b8d9
はルートテーブル上、2406:da14:1428:900::/57
のネットワーク範囲に含まれる -
2406:da14:1428:900::40dc:b8d9
宛の通信は、インターフェース (AWS Verified Access TAP-Windows Adapter) を通ってリンクローカルアドレスfe80::8
をネクストホップとして転送される -
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 でログを出力する設定ができます。
CloudWatch Logs に出力してみます。
こんな感じのログでした。
- どのユーザーが、どの宛先に通信したのかがわかります
{
"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 が有効化されているらしいので、基本的には問題はないはず。
-
Endpoint は、4 つの Type が存在する
- Load Balancer
- VPC Internal の NLB か ALB を選択
- Network interface
- 特定の ENI を指定することで、その ENI に対して Verified Access を利用した接続を許可する
- Network CIDR
- VPC 内の指定した CIDR に対して接続を許可
- Amazon RDS
- Load Balancer
参考 URL