見出し画像

AWS Client VPNの環境作ってみた

【概要】

  •  AWS EC2にサーバを立てて、easy-RSAの証明書を管理する環境

  • クライアント証明書を発行して、PCに証明書データをインポートすることで、固定のグローバルIPアドレスで、外部にアクセスできるようになった

下記に行った内容を記載していきます。

1.VPCの作成

  • AWS VPCのコンソールから、VPCを作成します。「お使いのVPC」 ⇒ 「VPC作成」をクリック。

  • 任意の値などで設定し「VPCを作成」をクリックしてください。

    • IPアドレスの値に関しては、注意する点があります。今回は検証用環境の為どんなCIDRブロックでも問題ありませんが、実際のシステムの場合は他システムとの間でプライベートIPで通信するなどの要件が出てくる可能性があるので、他ネットワークと重複しない値を利用することをおすすめします。

    • CIDR値のレンジ調査ツール https://www.ipaddressguide.com/cidr

2.パブリックサブネットの作成

  • VPN用のパブリックサブネットを作成します。 「サブネット」 ⇒ 「サブネットを作成」 をクリックします。

  •  「VPC ID」は上記1.で作成したVPCを選択します。「サブネット名」は、任意ですが【パブリック】等と記載しておくと分かりやすいです。

※このあと【プライベートサブネット】も作成しますが、同じサブネットメニューに一覧表示される為、分かりやすいnameにしておくと良いです

  •  アベイラビリティーゾーンは任意の場所を指定してください。

    • 既にAWS環境下でサブネットが複数作成されている場合は、既存のサブネットと重複しないレンジの「IPv4 CIDR ブロック」を指定しましょう。 設定入力が完了したら「サブネットを作成」をクリックします。

3.NATゲートウェイの作成

  • 「NATゲートウェイ」 ⇒ 「NATゲートウェイを作成」 をクリックします。

  •  「名前」は任意の入力となります。

  • 「サブネット」は、上記2. で作成した【パブリックサブネット】を選択します。

  • 「Elastic IP」は、【Elastic IPを割り当て】をクリックすると、任意のIPが自動で割り振られます。ここで設定するIPアドレスが、VPN接続時に利用される固定のグローバルIPアドレスとなります。 既にElastic IPで作成済みのIPアドレスを指定することも可能ですので、状況に合わせて設定してください。

  • 「タグ」は、任意で設定してください。 設定入力が完了したら「NATゲートウェイを作成」をクリックします。

4.ルートテーブルの作成

  • 「ルートテーブル」 ⇒ 「ルートテーブルを作成」をクリックします

  •  「名前」は任意の入力となります。

  • 「VPC」は上記1.で作成したVPCを選択します。

  • 「タグ」は任意で設定して「ルートテーブルを作成」をクリックします。

  •  ルートテーブルのメニューに戻ると、作成したルートテーブルが表示されてますのでクリック選択します。

  • 下にスクロールし「ルート」タブ ⇒ 「ルートを編集」 をクリックします。

  •  「ルートを追加」をクリックして、送信先の値「0.0.0.0/0」を入力します。

  • ターゲットは、上記 3. で設定した【NAT ゲートウェイ ID】を指定します。

  • 「変更を保存」をクリックします。

    • 送信先の値については、例として「0.0.0.0/0」を入力しておりますが、意味合いとしては、すべての IPv4 アドレスを表しております。 ネットワーク環境などによってCIDRの範囲を任意で指定して設定することも可能なので、環境に合わせて設定してみてください。

5.プライベートサブネットの作成

  • 「サブネット」 ⇒ 「サブネットを作成」 をクリックします。

  •  「VPC ID」は上記1.で作成したVPCを選択します。「サブネット名」は、任意ですが【プライベート】等と記載しておくと分かりやすいです。※既に【パブリックサブネット】を作成していますが、同じサブネットメニューに一覧表示される為、分かりやすいnameにしておくと良いです

    • アベイラビリティーゾーンは上記 2. で作成した「パブリックサブネット」と同じアベイラビリティーゾーンを指定してください。

    • 上記 2. 等で作成済みの、既存のサブネットと重複しないレンジの「IPv4 CIDR ブロック」を指定しましょう。 設定入力が完了したら「サブネットを作成」をクリックします。

  •  サブネットのメニューに戻ると、作成したプライベートサブネットが表示されてますのでクリック選択します。

  • 下にスクロールし「ルートテーブル」タブ ⇒ 「ルートテーブルの関連付けを編集」 をクリックします。

  •  「ルートテーブルID」で、上記 4. で作成したルートテーブルを指定して「保存」をクリックします。

6.ACM の設定(証明書・キーの生成)

6-1.AWS(EC2)上で、証明書や認証機関(CA)・キーの生成や管理を行う場合

①EC2の構築(AMIはOS:Ubuntu を例に記載します)

  •  インスタンスの起動

  • 「インスタンス」 ⇒ 「インスタンスを起動」 をクリックします。

  •  名前とタグ

    • 任意の入力となりますが、「キー:Name」「値:Ubuntu」などとしておくと、設定内容が探しやすくなります。

  • AMI(Amazonマシンイメージ)

    • 例としてUbuntu(Linux)を選択しています。

  • インスタンスタイプ

    • デフォルトの無料枠だと「t2.micro」になっておりますが、スペックが足らず重たい動作になっていたので、有償の「t2.medium」を指定しています。

  • キーペア

    • EC2にアクセスする際、必要になります。既に作成済みのキーでも良いですし、新規でキーを作成頂いても良いです。状況に合わせて設定してください。

      • キーペアのタイプ:RSA を選択しました。 キーペア名:任意のものを入力する

      • 必ず【キーペアのダウンロード】を行ってください。EC2にアクセスする際、必要となりますので。

      • pemファイルは、安全な場所に保管してください。

  • ファイアウォール(セキュリティグループ)

    • EC2へのアクセスを、IPアドレス等で制御する設定になります。デフォルトは、どこから誰でも接続可能な「0.0.0.0/0」になっておりますが、セキュリティの観点から制御することをおススメします。

  • ストレージを設定

    • 任意となりますで、必要に応じて指定してください。私は一旦、デフォルトのまま設定を行いました。あとから変更可能なので。

  • 設定に問題ないことを確認して【インスタンスの作成】をクリックします。その後、インスタンスを起動してください。

②SSHでEC2にアクセスする際

  •  作成したインスタンスを開き「接続」をクリックすると、ユーザーを作成していない、初回は

  1. 【ユーザー名】に記載の名前

  2.  ダウンロードした秘密鍵
    上記1.2.で、SSH接続する。

③作ったUbuntu Serverにリモートデスクトップ接続できるようする

  • SSH接続で、EC2(Ubuntu Server)にアクセスし、コマンド入力/送信します。

# アップデートの適用
> sudo apt update

# パッケージの更新適用
> sudo apt upgrade

# リモートデスクトップ用にユーザーを作成(〇〇のところに、任意のユーザー名を入力)
> sudo adduser 〇〇

# 作成したユーザーをsudoグループに参加させる
> sudo gpasswd -a 〇〇 sudo

# デスクトップ環境のパッケージを検索
> apt search ubuntu-desktop

# ubuntu-desktopをインストール
> sudo apt install ubuntu-desktop

# オープンソース Remote Desktop Protocol のサーバソフトウェア(xrdp)のパッケージを検索
> apt search xrdp

# xrdpをインストール
> sudo apt install xrdp

# バージョンの確認
> xrdp -v

# new_cursorsを無効化する
> ls -la /etc/xrdp/ | grep xrdp
> sudo sed -e 's/^new_cursors=true/new_cursors=false/g' -i /etc/xrdp/xrdp.ini

# xrdpサービスを再起動
> sudo systemctl restart xrdp

# xrdpサービスを有効化する
> sudo systemctl enable xrdp.service

> sudo systemctl enable xrdp-sesman.service
> systemctl list-unit-files -t service | grep xrdp

# 作成したユーザーに切り替える
> su 〇〇
> cd ~
> pwd
> /home/〇〇

# 環境変数を設定する
> DESKTOP=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop

# .xsessionファイルを作成する
> cat <<EOF > ~/.xsessionrc

# Authentication Requiredダイアログを回避できるように設定する
> cat <<EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/xrdp-color-manager.pkla
  •  AWS EC2のセキュリティグループを設定する(リモートデスクトップ接続する為)

    • タイプ : RDP

    • ルール : TCP

    • ポート : 3389

    • ソース : EC2にアクセスするパブリックIPアドレス(xxx.xxx.xxx.xxx/32)

      • ソースの部分で、インバウンド(アクセス可能)なIPを指定できる(IP制御が可能)

6-2.サーバ証明書や認証機関(CA)・キーの生成やクライアント証明書の発行

①サーバー証明書の発行・秘密鍵生成など※RSAのインストール手順込み(例は、easy-rsaとなります)

  •  EC2(Ubuntu)の「端末(term)」を開き、下記のコマンド入力/送信を行います。

> sudo apt update
> sudo apt install openvpn easy-rsa

> mkdir ~/easy-rsa
> ln -s /usr/share/easy-rsa/* ~/easy-rsa/

# 〇〇は、EC2(Ubuntu)にログインしたユーザー名で良いかと思います。
# 権限の設定なので、サーバー証明書の発行や秘密鍵生成を実施したいユーザー名を指定してください。
> sudo chown 〇〇 ~/easy-rsa
> chmod 700 ~/easy-rsa

> cd ~/easy-rsa
> nano vars
set_var EASYRSA_REQ_COUNTRY "JP"
set_var EASYRSA_REQ_PROVINCE "tokyo"

# 〇〇には、任意の地域(ご自身の住んでいる市区町村など)を入力。例として沖ノ島(okinoshima)
set_var EASYRSA_REQ_CITY    "okinoshima"

# 任意の組織名を入力(例として DigitalOcean にしています)
set_var EASYRSA_REQ_ORG     "DigitalOcean"

# 〇〇には、任意のメールアドレスを入力
set_var EASYRSA_REQ_EMAIL   "〇〇"
set_var EASYRSA_REQ_OU      "Community"
set_var EASYRSA_CA_EXPIRE   3650
set_var EASYRSA_CERT_EXPIRE 365
set_var EASYRSA_DIGEST      "sha512"
> ./easyrsa init-pki
  •  補足:下記画像、赤枠内のファイルやフォルダが<$HOME/easy-rsa>配下のディレクトリに保存されていないと、pki は生成されませんのでご注意ください。

    • x509-types(フォルダ)

      • 中身:①COMMON ②ca ③client ④code-signing ⑤server ⑥serverClient

    • easyrsa(ファイル)

    • openssl-easyrsa(ファイル)

    • vars(ファイル)

    • vars.example(ファイル)

  •  <$HOME/easy-rsa>のディレクトリ内で、コマンド入力/送信を行います。

# 認証機関の構築(CA)(ca.crtファイルの作成)
> ./easyrsa build-ca nopass

# csrフォルダの作成
> cd ~/easy-rsa
> mkdir csr

# csrのディレクトリにアクセスして、秘密鍵の発行($HOME/easy-rsa/csr)
# 〇〇は、任意で発行する鍵の名前を指定してください。
> openssl genrsa -out 〇〇.key

# CSR作成。subjectも併せて
> openssl req -new -key 〇〇.key -out 〇〇.req -subj \
> /C=JP/ST=tokyo/L=okinoshima/O=DigitalOcean/CN=server.test

# 〇〇.key 〇〇.req が保存されているか、確認
> ls
〇〇.key 〇〇.req

# CSRのインポート
> cd $HOME/easy-rsa
> ./easyrsa import-req csr/〇〇.req firefly

# インポートが成功すると、下記のようなメッセージが出力されます
Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1f  31 Mar 2020

The request has been successfully imported with a short name of: firefly
You may now use this name to perform signing operations on this request.

# インポートしたCSRの署名
> cd $HOME/easy-rsa
> ./easyrsa sign-req server firefly

# yes で回答しないと、エラーになる。
> Confirm request details: yes

# CSRの発行が完成したので、中身を確認します。
> openssl x509 -in pki/issued/firefly.crt -text | head -15

# 下記のようなメッセージ出力されれば、問題ありません。
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            # 数字とアルファベットの羅列
        Signature Algorithm: sha512WithRSAEncryption
        Issuer: CN = 〇〇
        Validity
            Not Before: Nov 10 03:52:09 2021 GMT
            Not After : Nov 10 03:52:09 2022 GMT
        Subject: C = JP, ST = tokyo, L = okinoshima, O = DigitalOcean, CN = server.test
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
  • サーバー証明書の格納場所

    • 証明書本文 ~/easy-rsa/easyrsa3/pki/issued/firefly.crt

    • 証明書のプライベートキー ~/easy-rsa/easyrsa3/csr/〇〇※任意CNのネーム.key

    • 証明書チェーン ~/easy-rsa/easyrsa3/pki/ca.crt

②クライアント証明書の発行・鍵生成など

  •  EC2(Ubuntu)の「端末(term)」を開き、下記のコマンド入力/送信を行います。

# nopass はOpenVPNでクライアント証明書をインポートする際に、パスフレーズを求められないようにする場合は、記述する。
> cd $HOME/easy-rsa
> ./easyrsa build-client-full client.test nopass

# パスフレーズを求めてほしい場合
> cd $HOME/easy-rsa
> ./easyrsa build-client-full client.test

# 下記メッセージが出力されたら、任意のパスワードを設定する。
# 証明書を利用するユーザーは、パスワードの入力を求められるので、パスワード情報も一緒に共有して、利用してもらう必要があります。
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
  • クライアント証明書 (client.test)の格納場所

    • 証明書本文 ~/easy-rsa/easyrsa3/pki/issued/client.test.crt

    • 証明書のプライベートキー ~/easy-rsa/easyrsa3/pki/private/client.test.key

    • 証明書チェーン ~/easy-rsa/easyrsa3/pki/ca.crt

  • 補足

    • 証明書と秘密鍵の情報が同じペアか確認するコマンド

  1. SSL証明書:ハッシュ値の確認コマンド

> openssl x509 -in firefly.crt -modulus -noout | openssl md5

2.秘密鍵:ハッシュ値の確認コマンド

openssl rsa -in server.test.key -modulus -noout | openssl md5

1.2.のstdinの値が同じなら、ペアで問題なし。

6-3.ACMに証明書(サーバとクライアント)をインポート

  • ACM(AWS Certificate Manager) にアクセスして、インポート をクリックします。

  •  サーバー証明書/クライアント証明書に格納されている情報を貼り付けて「次へ」をクリックして、インポートする。

    • サーバー証明書/クライアント証明書を各種分ける形で、それぞれ貼り付けてください。

7.Client VPN エンドポイントの作成

  • VPC コンソールから「クライアントVPNエンドポイント」を作成します。

  • VPC > クライアントVPNエンドポイント > クライアントVPNエンドポイントを作成 をクリックします。

  •  クライアント IPv4 CIDR:接続先のVPCのCIDRと被らない任意のアドレス で設定します。

  •  サーバ証明書:ACMに登録したサーバ証明書を選択

  •  認証オプション:相互認証の使用 にチェックを入れる

  • クライアント証明書:ACMに登録したクライアント証明書を選択

    • サーバ証明書 を選択すると、クライアント証明書の設定が行えます

  • DNS サーバー 1 IP アドレス:VPC CIDRの範囲のIPアドレス を設定する

    • こちらを設定しないと、VPN接続時、インターネットに接続できませんので、ご注意ください。

    • 設定の具体例:VPC CIDRが「141.56.0.0/16(141.56.0.0~141.56.255.255)」で設定されているとしたら【DNS サーバー 1 IP アドレス】に【141.56.0.2】といったCIDR範囲内の値を設定します。

  • その他は、任意で設定頂き「クライアントVPNエンドポイントを作成」をクリックします。

8.NAT ゲートウェイへの関連付け

  • 作成したエンドポイントを選択します

    • ターゲットネットワークの関連付け タブを選択して、「ターゲットネットワークを関連付ける」をクリックします

  • VPC を選択します

  • 作成した、関連付けたいプライベートサブネット を選択します

    • 「ターゲットネットワークを関連付ける」をクリックします

9.ルートテーブルの追加

  •  作成したエンドポイントを選択します

    • 「ルートテーブル」 タブ を選択し「ルートを作成」をクリックします

  •  ルート送信先:0.0.0.0/0

  • ~サブネットID:VPN 用に作成したプライベートサブネット を選択

    • IDで表示されますので、事前にプライベートサブネットのIDをメモしておくと良いかもしれません。

  • 「ルートを作成」をクリックします

10.認証ルールの追加

  •  作成したエンドポイントを選択します

    • 「承認ルール」タブ を選択し「認証ルールを追加」をクリックします

  •  アクセスを有効にする送信先ネットワーク:0.0.0.0/0

  • アクセス権を以下に付与する:アクセス権をすべてのユーザーに許可する にチェックを入れる(任意なので、状況に併せて設定してください)

    • 「認証ルールを追加」をクリックします

11.設定ファイルのダウンロード

  •  エンドポイント から「クライアント設定をダウンロード」をクリックして、設定ファイルをダウンロードします

  • ダウンロードした設定ファイルを、テキストエディタ 等で開き、下記コマンドを追記します

# クライアント証明書本文 ~/easy-rsa/easyrsa3/pki/issued/client.test.crt
に記述している内容を <cert> </cert> の間にコピペする
<cert>
-----BEGIN CERTIFICATE-----
文字や数字の羅列
-----END CERTIFICATE-----
</cert>

# クライアント証明書のプライベートキー ~/easy-rsa/easyrsa3/pki/private/client.test.key
に記述している内容を <key> </key> の間にコピペする
<key>
-----BEGIN PRIVATE KEY-----
文字や数字の羅列
-----END PRIVATE KEY-----
</key>
  •  nobindの配下辺りに

    1. key [INLINE]

    2. persist-key

    3. persist-tun を追記する

client
dev tun
proto udp
remote cvpn-em〇〇 ndpoint-.clientvpn.ap-northeast-1.amazonaws.com 443
remote-random-hostname
resolv-retry infinite
nobind
# ここから
key [INLINE]
persist-key
persist-tun
# ここまで
remote-cert-tls server
cipher AES-256-GCM
verb 3
  •  以上で環境構築/設定は、完了となります。

  • OpenVPN(Windows)や、Tunnelblick(Mac)のアプリケーションを活用して、設定したプロファイル(ovpnファイル)をインポートすれば、VPN経由でインターネットにアクセスすることができます。

【おまけ】クライアント証明書のrevork(失効)について

  • 企業で退職者が出た際、不正にクライアント証明書を持ち出した場合、そのまま引き続きVPNへのアクセスが可能となってしまうので、クライアント証明書をrevorkする運用が発生します。

  • EC2(Ubuntuのサーバ)にアクセスし、「端末(term)」を開き、下記のコマンド入力/送信を行います。

> Cd $HOME/easy-rsa
> ./easyrsa revoke 〇〇クライアント証明書名
# クライアント証明書が保存されているフォルダから、証明書が削除され【revorked】フォルダに対象の証明書が保管される。

# 証明書失効リスト(CRL)の更新
> Cd $HOME/easy-rsa
> ./easyrsa gen-crl
# crl.pem というファイルが生成される
  •  クライアント証明書ごとに.pem生成が必要な為、1証明書をrevorkしたら、AWS側のCRLインポートを行い、完了したら改めて1証明書をrevorkしていく。

  • CRLインポート前に1証明書をrevorkしてしまうと【crl.pem】ファイルは上書きされてしまうので、注意してください。

  •  エンドポイント > アクション > クライアント証明書CRLをインポート をクリックします

  •  先ほど生成した【crl.pem】に記述されている内容を「証明書失効リスト」に入力して、クライアント証明書CRLをインポート をクリックします

  •  【クライアント証明書CRLのエクスポート】を選択して、エクスポートするとインポートしたcrl.pemの情報が確認できます

長々と記載してきましたが、以上がAWS Client VPN環境の構築となります。細かいところは、運用するにあたり様々変わってくるかと思いますので、ご利用される際は、ご注意ください。
又、不足な部分も多いかもしれませんが、温かい目で見て頂けますと助かります。
ここはもっとこうした方が良いなどありましたら、ご意見頂けますと幸いです!

この記事が参加している募集

つくってみた

この記事が気に入ったらサポートをしてみませんか?