ちょっと話題の記事

SSLを改めて理解してから AWS Client VPN に挑む

AWS Client VPNを触る前に知っておきたい SSL (Secure Sockets Layer)の知識を書いていきます。 1. SSLとは 2. SSLサーバー証明書 3. SSL 通信 4. AWS Client VPN (SSL-VPN)
2019.10.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS Client VPN はリモートアクセスVPNを実現するためのAWSサービスです。 クライアントPCから AWSの各種リソースに安全にアクセスすることができます。

さて、実際に AWS Client VPNの作業手順などを調べてみると、 サーバー/クライアント証明書プライベートキー認証局 などといった用語 がどんどん出てきます。

これらは全て AWS Client VPNに必要な要素です。 が、 これらがどのように関わり合って AWS Client VPNを実現しているのか はこれら手順を読んでも、中々理解するのは難しいものがあります。

そこで本記事は AWS Client VPNの中心技術である SSL について主に解説してみます。 SSLで使用される サーバー証明書認証局 などがどんな役割を持つのかを理解していただき、 AWS Client VPN(SSL-VPN) 環境の構築がスムーズにできるようになればと思います。

目次

  1. SSL とは
  2. SSLサーバー証明書
  3. SSL 通信
  4. AWS Client VPN (SSL-VPN)
  5. おわりに

SSL とは

SSL (Secure Sockets Layer) は、インターネット上でデータを暗号化し、 セキュアに通信するためのプロトコルです。 第三者による通信内容の盗み見・改ざんを防ぐことができます。

▲ 鍵のマークは SSL通信を表している

SSLは セッション層 のプロトコルです。セッション層から上を暗号化します。 (同じ AWS のVPNサービスに サイト間VPNがありますが、こちらは IPsec を使用した ネットワーク層の暗号化 です)

※ この暗号化技術は TLS (Transport Layer Security) と合わせて、 SSL/TLS とよく表現されます。 SSLと TLSは 大枠の仕組みは同じ です。 SSL3.0 を元に TLS1.0が作成され、現在は TLS1.3がリリースされています。 現在一般に使われている SSL通信は、実際は TLSなのですが、 SSLという用語が広く普及しているため、 TLSのことを SSL/TLS、または単に SSL と呼んだりします。 (以降の説明は "SSL" で統一します)

SSLサーバー証明書

SSL通信を行うにあたって必要な SSLサーバー証明書 をこの章で説明します。(以降 単にサーバー証明書と呼びます)

サーバー証明書は 電子証明書 の一つです。 サーバー証明書という名前のとおり サーバーの身元を証明するものです。 「ウェブサイトの実在性の確認」 および 「通信データの暗号化」 に使用されます。

サーバー証明書は 認証局(CA: Certification Authority) と呼ばれる 信頼された第三者機関 によって発行されます。

実際に見てみる

試しにこのサイト dev.classmethod.jp のHTTPS通信時に使用される サーバー証明書を見てみましょう。

ブラウザの URL欄にある鍵マークが SSL通信を行っていることを表していました。 鍵マークを選択、「証明書」を選択してみます。

*.classmethod.jp サーバー証明書が確認できました。 さらに上にある Amazon Root CA 1 も見てみましょう。

こちらがルート証明書です。 *.classmethod.jp サーバー証明書は 「Amazon Root CA 1」 という 認証局から発行されたサーバー証明書 であることが分かりました。 (※厳密にいうと 「Amazon Root CA 1」ルート認証局 に認証された「Amazon」中間認証局 から発行されたサーバー証明書です)

発行手順

サーバー証明書の発行プロセスを見ていきましょう。

※前提知識として 公開鍵暗号共通鍵暗号 の 2つの鍵暗号方式があります。 公開鍵暗号は データの暗号化・復号化に別々の鍵(公開鍵・秘密鍵) を使う方式、 共通鍵暗号は データの暗号化・復号化を 1つの鍵 (共通鍵) で行う方式です。

  1. 公開鍵・秘密鍵の作成

    まずはサーバー側で暗号化通信を行うための公開鍵・秘密鍵を生成します。

    ※この公開鍵をクライアントに渡すだけで暗号化通信はできます。 が、まだ ウェブサイトの身元証明 ができていません。 クライアントは、サーバーがナニモノなのか分かりません。

  2. サーバー証明書発行の申請

    認証局にサーバー証明書の発行を申請します。 この申請書 (メッセージ)を 証明書署名要求 (CSR: certificate signing request) と言います。 CSRには サーバーの公開鍵サーバーの情報(ディスティングイッシュネーム) を含みます。

    ※ ディスティングイッシュネームには WebサイトのURL( コモンネーム)や 組織名、国/地域などの情報が含まれます。

  3. サーバー証明書の受領

    認証局は CSRを厳正に審査します。 審査が通れば サーバー証明書を発行します

    サーバー証明書には サーバー所有者の情報サーバーの公開鍵 、 そして デジタル署名 が含まれています。 このデジタル署名は 公開鍵や所有者情報から得られるハッシュ値を 認証局の秘密鍵で暗号化したもの です。

    デジタル署名 (認証局の秘密鍵で暗号化したもの) 、これが後述のSSL通信のプロセスで使用されます。

SSL 通信

サーバー証明書を使った SSL通信の流れを見ていきましょう。

前提

クライアントPC には、あらかじめ 信頼できる認証局の証明書 (= 認証局の公開鍵) が保存 されています。 (以降これを ルート証明書 と呼びます)

Webブラウザで実際に見てみましょう。 Chrome の設定から 証明書の管理 を選択すると認証局の一覧、それぞれの証明書を見ることができます。

改めて登場人物と鍵たちを見てみます。

  • サーバー
    • サーバーの 秘密鍵公開鍵を含むサーバー証明書 を持っています
    • サーバー証明書のデジタル署名は 認証局の秘密鍵で暗号化 されたものです
  • クライアント
    • 認証局の公開鍵を含む ルート証明書 を持っています
  • 認証局
    • サーバー証明書を発行しています
    • クライアントに、信頼できる認証局としてルート証明書が保存されています

プロセス

上の構図を把握していれば複雑ではありません。

  1. サーバー証明書の送付

    クライアントからの SSL接続要求に対して、サーバーは サーバー証明書を送付 します。

  2. サーバー証明書の検証

    クライアントは送られてきたサーバー証明書の デジタル署名の復号化 を試みます。 ルート証明書の 公開鍵を使って復号が成功すれば、 通信相手は認証局によって身元を証明されたサーバーであることが確定します。

  3. データ暗号化用の共通鍵の作成/共有

    実際のデータのやりとりは共通鍵で暗号化します。

    • クライアントは共通鍵を作成します
    • サーバー証明書の公開鍵で共通鍵を暗号化します
    • 暗号化された共通鍵をサーバーに送付します
    • 暗号化された共通鍵を秘密鍵で復号化します

  4. SSL通信開始

    上記プロセスが完了すると SSL通信が開始されます。 データのやりとりは共通鍵によって暗号化/復号化されます。

AWS Client VPN (SSL-VPN)

ここまで理解できれば、AWS Client VPN(SSL-VPN) をすんなり設定できるかと思います。

SSL技術を利用した VPN接続を SSL-VPN といい、 AWS Client VPNは マネージドな SSL-VPNサービス です。

SSL-VPN(AWS Client VPN) で行うことは以下の 2つです。 これまで説明してきた SSL通信に クライアントの認証 を追加しただけですね。

  • SSLによる暗号化通信
  • クライアントの認証

SSLによる暗号化通信

AWS Client VPN において、SSL通信のサーバーの役割を担うリソースが クライアントVPNエンドポイント です。 クライアントはこの エンドポイントを経由して、各 AWSリソースへのアクセスが可能となります。

サーバー側で準備する必要のあるものは サーバー証明書サーバーの秘密鍵 であったことを思い出してください。 それらの情報は AWS Certificate Manager (ACM) に安全に保管し、使用されます。

クライアントの認証

AWS Client VPNにおけるクライアントの認証は、 Active Directory 認証相互認証 をサポートしています。 どちらか一方、もしくは両方を選択することができます。

  1. Active Directory 認証

    AWS Managed Microsoft ADSimple AD といった AWS Directory Service を利用した AD認証です。

  2. 相互認証

    相互認証は クライアント証明書 を使用した認証です。 サーバーの身元を証明するためにサーバー証明書が使われましたが、それのクライアント版です。

    クライアント証明書にあるデジタル署名 を復号化して認証を行うため、 クライアントのルート証明書 をあらかじめ ACMに保管する必要があります。

おわりに

以上、 SSLを改めて理解してから AWS Client VPN に挑む でした。

実際の AWS Client VPN構築は既に記事があるのでそちらを参考ください。 (1つ目が 相互認証、2つ目が AD認証の やってみた記事です)

[AWS]踏み台をワンチャンなくせる!?VPC接続にClient VPNを使ってみよう

Simple ADとAWS Client VPNを使ってピアリング先VPCのEC2にSSH接続してみた

この記事で SSL および AWS Client VPNへの理解が少しでも深まれば幸いです。

参考