MoTLab -GO Inc. Engineering Blog-MoTLab -GO Inc. Engineering Blog-

AWS Client VPNをAzure AD SSO認証と連携する

SREAWS
November 17, 2022

 MoTでは、社内で利用してる数々のサービスやリソースに安全にアクセスできるよう、AWSのマネージドなVPNサービスである、AWS Client VPN環境を準備し、社内に展開しています。

 この記事では、実際に社内で利用しているAWS Client VPN環境で採用している、Azure ADでのSSO認証方法についてまとめています。


はじめに

 SREグループ・ヒロチカです。MoTでは、サービスのクラウドインフラの設計から構築・運用までを担当しています。

 MoTでは、弊社内で利用している数々のサービスやツールに対し、リモートワーク先・出張先などのネットワーク環境から安全にアクセスしたいという要望を受け、AWS Client VPNサービスを活用し、VPN接続できる環境を社内に展開しています。

 以前の記事にて、AWS Client VPN環境の構築について紹介しましたが、今回新たに、AWS Client VPN Endpointでの認証方法として、Azure ADによるSSO認証を採用したため、その経緯を含め、ご紹介できればと思います。

 (以前の記事)AWS Client VPN 環境の構築

 https://lab.mo-t.com/blog/aws-vpn-infrastructure-construction

経緯・目的

 構築時よりAWS Client VPN Endpointの社内VPN環境は、クライアント証明書(パスプレーズ付き)と.ovpnプロファイルの一式を、それぞれ社員PC上で利用する方法で運用していたため、万が一、この証明書情報が漏洩したり持ち出されたりした場合には、ユーザ情報を削除しない限り、誰でもアクセスできてしまう、セキュアでないPCからのアクセスも可能な状態になってしまう、といったことが、課題としてあげられていました。

 そこで、今回、上記の課題を解決するため、AWS Client VPN Endpointでの認証を、Azure AD SSO認証と連携する方式に切り替え、Azure AD側でデバイス制限をかけ、業務用端末を囲い込みたいと考えました。

 また、MoTでは、以前より、Azure AD SSO認証を推奨利用しており、アクセスできるユーザの管理も、Azure AD側で統一する事で、運用の負担を下げる事も期待する効果の一つでした。

構成

 今回もClient VPN Endpointを利用した、AWS Client VPNソリューションの一般的な構成で構築し、認証方法部分をAzure AD SSO認証と連携する方法をとっています。

構成図

An image from Notion

構築内容

事前準備・確認

  • 今回作成するAWS Client VPN Endpointは、”はじめに”でご紹介した記事にて作成したVPCと同じネットワークを利用するため、VPCの作成については、以前の記事をご参照ください。
  • 同様に、SSL通信のため、サーバ証明書を発行し、Certificate Managerへの登録を行なっています。このサーバ証明書の発行、ACMへの登録についても、以前の記事をご参照ください。

Azure AD 設定

 AWS Client VPN Endpointとの連携のために、エンタープライズアプリケーションを作成。Azure AD SSO認証のための設定を行います。

シングルサインオンの設定 > SAML のページ

セットアップ内容(基本的なSAML構成の各項目。属性とクレームにも一部追加)

  • 基本的なSAML構成
    • 識別子 (エンティティ ID): urn:amazon:webservices:clientvpn
    • 応答 URL (Assertion Consumer Service URL): http://127.0.0.1:35001
    • サインオン URL: https://127.0.0.1:35001
  • 属性とクレーム
    • givenname: user.givenname
    • surname: user.surname
    • emailaddress: user.mail
    • name: user.userprincipalname
    • memberOf: "user.groups"
    • 一意のユーザー ID: user.userprincipalname
  • SAML 署名証明書の署名オプションを変更
    • 署名オプション: SAML 応答とアサーションへの署名

Azure AD の管理画面トップ > アプリの登録 > すべてのアプリケーションタブ

  • エンタープライズアプリケーションを選択し、「マニフェスト」を確認し、replyUrlsWithTypeが、下記になってるか確認
"replyUrlsWithType": [
		{
			"url": "http://127.0.0.1:35001",
			"type": "Web"
		}
	],

 AWS IDプロバイダの登録で利用するため、SAML証明書のフェデレーションメタデータXMLをダウンロードしておきます。

AWS Client VPN Endpointの作成

AWS IDプロバイダ

 Azure ADのSAMLと連携した、AWS IDプロバイダを作成します。メタデータドキュメントの項目に、ダウンロードしたフェデレーションメタデータXMLをアップロードします。

An image from Notion

AWS Client VPN Endpointの作成

  • クライアントIPv4 CIDR
    • 想定接続ユーザ数をもとにサブネットを切ります
  • 認証情報
    • サーバ証明書は、事前に作成したサーバ証明書のACMのARNを選択
    • ユーザーベース認証(SAML)を指定し、先ほど作成したIDプロバイダを選択
  • DNS・ログ等は、各環境に合わせて設定してください

 

 MoTでは、上記までの一連のリソースの構成管理をterraformにより行なっています。下記にサンプルを示します。

# IAM id provider
resource "aws_iam_saml_provider" "idp-hoge" {
  name                   = "idp-hoge"
  saml_metadata_document = file("DLしたフェデレーションメタデータXML")
}

# AWS Client VPN Endpoint
resource "aws_ec2_client_vpn_endpoint" "vpn-endpoint" {
  description            = "・・・description・・・"
  client_cidr_block      = "10.0.0.0/24"
  server_certificate_arn = aws_acm_certificate.cert.arn

  dns_servers = ["8.8.8.8", "8.8.4.4"]

  authentication_options {
    type                           = "federated-authentication"
    saml_provider_arn              = aws_iam_saml_provider.idp-hoge.arn
    self_service_saml_provider_arn = aws_iam_saml_provider.idp-hoge.arn
  }
・・・
}

resource "aws_ec2_client_vpn_network_association" "vpn-network" {
  client_vpn_endpoint_id = aws_ec2_client_vpn_endpoint.vpn-endpoint.id
  subnet_id              = aws_subnet.private-subnet.id
}

AWS Client VPN のユーザ管理

 VPNで接続可能とするユーザの管理は、Azure AD側にて行います。Azure AD側画面にて、対象のエンタープライズアプリケーションを選択、[ユーザーとグループ]項の[ユーザまたはグループの追加]にて、管理する形をとります。

 また、デバイスロックについても、Azure AD側画面において、今回のエンタープライズアプリケーションに紐づけた、条件付きアクセスポリシーを設定することで実現していきます。

接続方法

 今回、構築したAWS Client VPN Endpointは、SAMLベースのフェデレーション認証を利用していますが、これはAWSの独自拡張による認証となるため、現状はAWS公式のクライアントアプリケーションのみが対応しています。そのため、MoTでもクライアント側では、AWSが公式リリースしている、AWS Client VPN for Desktop を使って接続しています。

 (参照) https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-user/connect.html

 詳しい、接続方法については、公式のドキュメントを、参照いただければと思います。

 また、AWS Client VPN Endpointへの接続に利用するプロファイル(.opvnファイル)は、AWSコンソール画面の AWS Client VPN Endpointの画面で、対象のVPNを選択後、右上の[クライアント設定をダウンロード]から、ダウンロード可能です。

An image from Notion

注意点など

制限しているクライアント

今回の接続条件の一つとして、セキュリティリスクの高い、スマホからのVPN接続は禁止としています。

IPv6のみで接続してしまう経路について

 AWS Client VPN Endpointでは、IPv6トラフィックに対応していないため、各端末から、IPv6経由のみでグローバルに接続対象先にアクセスできる環境だった場合に、VPNを経由せず、直接、接続対象先にアクセスしてしまうことがあります。

 IPv6のみで到達してしまう経路を防ぐため、IPアクセス制限を行いたいMoT内にあるリソースについてはIPv6接続を許可しないことを前提として、VPNを繋いだ際に、IPv6へ抜ける経路を防ぐよう、下記設定をプロファイルに追記しています。

ifconfig-ipv6 fd15:53b6:dead::2 fd15:53b6:dead::1
route-ipv6 2000::/4

おわりに

 従来のVPN環境における課題を、Azure AD SSO認証の連携に切り替え、デバイスロックを行う形で解決していきました。今回、AWS Client VPN Endpointで連携したSSO認証は、MoTで元々採用していたAzure AD SSO認証でしたが、VPN側の設定自体はシンプルなので、他のSSO認証の連携であっても、同様に比較的簡単に設定できるかと思います。

 また、SSO連携によってユーザ管理を統一することによって、以前までスクリプト化して対応していたユーザ発行・削除を、Azure ADコンソール上での簡素的な付け外し作業のみに変わり、ユーザ管理の運用面でも大きなメリットを感じています。


We're Hiring!

📢
Mobility Technologies ではともに働くエンジニアを募集しています。

興味のある方は 採用ページ も見ていただけると嬉しいです。

Twitter @mot_techtalk のフォローもよろしくお願いします!