AWS Client VPN で iPhone からプライベートリソースを表示してみた

記事タイトルとURLをコピーする

こんにちは、技術2課の駒井です。
今更ながら NBC ドラマの HEROES を視聴しているのですが、
頻繁にガラケーが登場するのでなんだか不思議な気持ちになりますね。

今回は、AWS Client VPN を手元の iPhone から接続してみようと思います。
これでお手軽にプライベートリソースに接続できますね! ヤッター!\(^o^)/(時空間制御)

VPN 接続端末について

Client: iPhoneX Software Version 13.3
App: OpenVPN Connect Version 3.1.1

接続までの流れ

VPN 接続に際して AD 認証と証明書認証のどちらか、または両方を利用する必要がありますが、
今回は証明書認証のみを採用します。
以下のような流れで環境を作っていきます。

  1. VPC/Public Subnet/Private Subnet を作成
  2. EC2 を作成
  3. EC2 内で証明書を作成, ACM に登録
  4. Client VPN Endpoint を作成

環境準備

VPC/Public Subnet/Private Subnet を作成

今回は、証明書の作成、ACMへの登録を作業用に構築したEC2で実施するため、
以下のような環境を作成します。
証明書の作成をローカルで行う場合は Public Subnet は必要ありません。

EC2 を作成

IAM ポリシー : AWSCertificateManagerFullAccess を付与したロールを作成しておきます。
その IAM ロールをアタッチした、インスタンスを Public Subnet 内に作成します。
また、Private Subnet 内に Client VPN 接続後のアクセス確認用インスタンスを用意しておきます。

EC2 内で証明書を作成, ACM に登録

以下の公式ドキュメントを参照して作成します
[クライアント認証と認可]
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/authentication-authrization.html

    git clone https://github.com/OpenVPN/easy-rsa.git
    cd easy-rsa/easyrsa3
    ./easyrsa init-pki
    ./easyrsa build-ca nopass
    ./easyrsa build-server-full server nopass
    ./easyrsa build-client-full client1.domain.tld nopass
    sudo mkdir /client_vpn
    sudo cp pki/ca.crt /client_vpn/
    sudo cp pki/issued/server.crt /client_vpn/
    sudo cp pki/private/server.key /client_vpn/
    sudo cp pki/issued/client1.domain.tld.crt /client_vpn
    sudo cp pki/private/client1.domain.tld.key /client_vpn/
    cd /client_vpn/
    sudo aws acm import-certificate --certificate file://server.crt --private-key file://server.key --certificate-chain file://ca.crt --region ap-northeast-1
    sudo aws acm import-certificate --certificate file://client1.domain.tld.crt --private-key file://client1.domain.tld.key --certificate-chain file://ca.crt --region ap-northeast-1

Client VPN Endpoint を作成

クライアント IPv4 CIDR は 192.168.252.0/22 としました。
サーバー証明書 ARN の項目に、 ACM へ登録した server 証明書 ARN を選択します。
そして、相互認証の使用オプションにチェックを入れ、
クライアント証明書 ARN の項目に ACM に登録したクライアント証明書の
ARN (今回はclient1.~のACM) を選択します。


作成が完了したら、サブネットの関連付けとセキュリティグループの設定、受信の承認を設定します。
AWS Management Console から、クライアント設定ファイル(.ovpn)のダウンロードも忘れずに行いましょう。

OpenVPN Client を使用して接続

接続の前に、iPhone から利用する、クライアント設定ファイルの書き換えを行います。
ダウンロードしたファイルは以下のようになっていると思います。
(AD 認証がオンの場合は auth-user-pass のオプションが記載されています)

    client
    dev tun
    proto udp
    remote cvpn-endpoint-XXXXXXXXXXXXXXXX.clientvpn.ap-northeast-1.amazonaws.com 443
    remote-random-hostname
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    remote-cert-tls server
    cipher AES-256-GCM
    verb 3
    <ca>
    -----BEGIN CERTIFICATE-----
    XXXXXXXXXXXXXX
    -----END CERTIFICATE-----
    </ca>
    reneg-sec 0

このファイルを3点修正します。
①エンドポイントの修正
②クライアント証明書を追記
③クライアント証明書キーを追記
証明書の指定は絶対パスでの指定が可能ですが、今回は iPhone での利用を考慮して、
直接ファイルに証明書情報を記載して、ファイルを配置することにしました。

①エンドポイントの修正

なんと、iOS の OpenVPN アプリケーションを利用する場合はこのままだと繋がりません。
エンドポイントの記載を少し修正します。

    remote cvpn-endpoint-XXXXXXXXXXXXXXXX.clientvpn.ap-northeast-1.amazonaws.com 443

ダウンロードした状態だと上記のようになっていると思いますので、以下に変更します。
わかりづらいですが、エンドポイントの頭に *. を付与しています。

    remote *.cvpn-endpoint-XXXXXXXXXXXXXXXX.clientvpn.ap-northeast-1.amazonaws.com 443

②クライアント証明書を追記, ③クライアント証明書キーを追記

作成したクライアント証明書 client1.domain.tld.crt の
-----BEGIN CERTIFICATE----- から -----END CERTIFICATE----- までと、
クライアント証明書のキー client1.domain.tld.key の
-----BEGIN PRIVATE KEY----- から -----END PRIVATE KEY----- までを
追記します。

    <cert>
    -----BEGIN CERTIFICATE-----
    XXXXXXXXXXXXXXXX
    -----END CERTIFICATE-----
    </cert>

    <key>
    -----BEGIN PRIVATE KEY-----
    XXXXXXXXXXXXXXXX
    -----END PRIVATE KEY-----
    </key>

上記すべてを修正すると、以下のようになります

    client
    dev tun
    proto udp
    remote *.cvpn-endpoint-XXXXXXXXXXXXXXXX.clientvpn.ap-northeast-1.amazonaws.com 443
    remote-random-hostname
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    remote-cert-tls server
    cipher AES-256-GCM
    verb 3
    <ca>
    -----BEGIN CERTIFICATE-----
    XXXXXXXXXXXXXXXXXXXX
    -----END CERTIFICATE-----
    </ca>
    <cert>
    -----BEGIN CERTIFICATE-----
    YYYYYYYYYYYYYYYYYYYY
    -----END CERTIFICATE-----
    </cert>
    <key>
    -----BEGIN PRIVATE KEY-----
    ZZZZZZZZZZZZZZZZZZZZ
    -----END PRIVATE KEY-----
    </key>
    reneg-sec 0

iPhone から接続

先ほど作成した .ovpn ファイルをお好みの方法で iPhone へと送ります。
ファイルを開くと自動的に OpenVPN アプリケーションが立ち上がり、以下のような画面になるかと思います。

Profile Name にお好みの接続名を入力するだけで、晴れてセットアップ完了となります。
接続ボタンを押し、以下のような画面になれば接続成功です。

プライベート接続の確認

Clinet VPN によって接続している VPC リソースへ、アクセスしてみようと思います
iPhone からアクセスするので、今回は接続テスト用に Private Subnet のインスタンスに Apache を入れておきました
(Security Group を開けるのを忘れずに)

Private IP をブラウザで入力すると無事 Apache のテストページが確認できました。
これでプライベートリソースへのアクセスも自由に設定できそうです。

まとめ

今回は iPhone から Private EC2 リソースに接続するまでを試してみました。
皆様もお手元の端末から、パブリックに公開していない、
または公開できないリソースにアクセスしてみてはいかがでしょうか。
導入コストも低く、構築もさほど難しくないためぜひお試しください!

余談ですが、先日(2020/01/16)Client VPN サービスにポート設定が追加されましたね
443 ポートがクライアント側で使えないよ〜って方には朗報かもしれません(1192が利用可能です) ではまた次のブログでお会いしましょう!さよなライオン!

駒井 基 (記事一覧)

SRE 2課所属

ヴァンダル派です