Pertino on Dockerでセキュアなアプリケーション配信

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

ども、大瀧です。
Pertinoで構築する次世代VPNシリーズの3本目行きます!今回はコンテナエンジンのDockerと組み合わせてどこからでもアクセスでき、かつセキュアなアプリケーション実行環境を構築してみたいと思います。

PertinoをDockerコンテナで実行するメリット

PertinoはクラウドベースのSSL-VPNソフトウェアとしてリモートアクセス、クラウド間接続に利用できます。Dockerはアプリケーションコンテナエンジンとしてアプリ実行環境を簡単に移行したり、複数のアプリ実行環境を連携させることができます。この2つを組み合わせるメリットとして、以下が挙げられます。

  • Dockerで実行するアプリケーションを、PertinoのSSL-VPNを経由しPertinoクライアントを実行する端末にのみセキュア配信できる
  • PertinoクライアントをマシンにインストールせずにDockerで手軽に実行できる

使用例1 : Dockerでアプリの開発環境を構築

例えば、Dockerでアプリの開発環境を構築する場合に、Pertinoクライアントを実行するマシンであればどこからでも開発用マシンで実行するアプリケーションにアクセスすることができるようになります。

pertino3-02

開発用PCもPertinoサーバーにHTTPSでアクセスできれば良いので、企業のネットワークで外部アクセスのポリシーが厳しい場合でも対応できます。また、Pertinoクライアントを実行するマシンからアクセスできるのは明示的に許可するDockerコンテナのみなので、開発用PCのセキュリティも比較的管理しやすいという特徴もあります。

使用例2 : Dockerでアプリの本番環境を構築

本番環境で利用する場合も、社内外の限られたユーザーにアプリケーションを配信するケースで有用です。Dockerはオンプレミス/クラウド問わず多くの環境で動作しますので、例えばAmazon EC2のインスタンス(仮想マシン)でPertinoクライアントとアプリケーションを実行することができます。

pertino3-03

また、Pertinoであれば、接続するPertinoクライアントの追加・削除や後述のDNS設定による配信するアプリケーションコンテナの切り替えをWeb管理コンソールから簡単かつ柔軟に行うことができます。

構成

DockerでPertinoクライアントを実行する構成は、Pertino社のGitHubで以下2通りのDockerfile(Dockerイメージの構成ファイル)が公開されています。

  • 同一コンテナ構成 : Pertinoクライアントとアプリケーションを単一のDockerfileに記述、単一コンテナで両方を実行する
  • 別コンテナ構成 : Pertinoクライアントとアプリケーションを別のコンテナとして実行し、Dockerのネットワーク機能でアプリケーションからPertinoのSSL-VPNを利用する

既存のDockerfileの流用やコンテナ内のプロセス管理を考慮すると、別コンテナ構成が実用的と判断して今回は別コンテナをやってみます。構成図はこんな感じです。

pertino3-01_1

動作確認環境

上図では端末PCとサーバーを別に書きましたが、同マシンでも問題ないため、MBAで両方動かしてみました。

  • OS : Mac OS X Yosemite
  • Docker環境 : Boot2Docker バージョン1.5

Pertinoは接続デバイス数3台まで無料のフリープランがあるため、今回の範囲であればアカウントを作成するだけで簡単に試すことができます。

1. Pertinoデバイス認証(API)キーの生成

まずはPertinoクライアントで使うデバイス認証キーを作成しましょう。シリーズのここまでの回では、Pertinoクライアント実行時にPertinoのアカウント情報(メールアドレス&パスワード)を入力してPertinoサーバーに接続していました。しかしパスワードの管理性や権限の粒度から、今回のようなサーバーマシンでのPertinoクライアントの実行にはAPIキー(デバイス認証キー)が適切です。デバイス認証キーの詳細は、以下のFAQを参照してください。

Pertinoの管理画面下部のツールバーにある[Settings]をクリックします。

pertino-x-docker01

[My Network API Key]の右側にある[Generate New Key and Download]ボタンをクリックします。

pertino-x-docker02

確認ダイアログが表示されたら[Generate]ボタンをクリックします。キーが記載されたテキストファイルのダウンロードが開始します。

pertino-x-docker03

apikey.pertinoというファイル名のテキストファイルで保存されるので、中にあるデバイス認証キーを控えておきます。

pertino-x-docker04

2. Pertinoクライアントコンテナの実行

上述のPertino社のDockerfileを元にビルドされたDockerイメージ(pertino/vnet)がDocker Hubで公開されているのですが、このイメージではバックグラウンド実行を考慮した構成になっていないため、実行設定を変更したDockerfileをGitHubリポジトリで公開し、Automated BuildしたDockerイメージclassmethod-aws/pertino-clientをDocker Hubに公開しました。今回はこちらを利用してみます。docker runでのコンテナ実行時のポイントは以下です。

  • --nameオプションでコンテナ名を指定する。このあとアプリケーションコンテナ実行時に指定する
  • --hostnameオプションでホスト名を付けると、Pertinoの管理画面で識別しやすくなる
  • --privilegedオプションをつける
  • -eオプションでデバイス認証キーの環境変数(PERTINO_APIKEY)を指定する
$ docker run -d \
  --name pertino \
  --hostname takipone-docker \
  --privileged \
  -e PERTINO_APIKEY=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX \
  takipone/pertino-client
a5a8138510871bbe11a02fbfd25128b99b83aa7872db22691c93903cb687578f
$ docker ps
CONTAINER ID        IMAGE                            COMMAND               CREATED             STATUS              PORTS               NAMES
a5a813851087        takipone/pertino-client:latest   "/entrypoint.sh"      18 minutes ago      Up 16 seconds                           pertino
$

Pertinoの接続ログは、docker logsコマンドで確認できます。

$ docker logs pertino
Setting up Pertino Client...
Starting Tunnel...log4cxx: gelfAppender not ready yet...
Internet Systems Consortium DHCP Client 4.2.4
Copyright 2004-2012 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/pertino0/86:9d:af:4f:61:2f
Sending on   LPF/pertino0/86:9d:af:4f:61:2f
Sending on   Socket/fallback
DHCPDISCOVER on pertino0 to 255.255.255.255 port 67 interval 3 (xid=0x12b0670f)
DHCPREQUEST of 50.203.224.7 on pertino0 to 255.255.255.255 port 67 (xid=0x12b0670f)
DHCPOFFER of 50.203.224.7 from 50.203.224.1
DHCPACK of 50.203.224.7 from 50.203.224.1
bound to 50.203.224.7 -- renewal in 3398 seconds.
  :(以下略)
$

接続できているようですね。Pertinoの管理画面からもDockerコンテナが確認できます。

pertino-x-docker07

3. アプリケーションコンテナの実行

続いて、アプリケーションを実行するコンテナです。今回はブログエンジンGhostのDockerコンテナを実行します。--netオプションで特定のコンテナ(今回はpertinoコンテナ)とのネットワークインターフェースの共有を構成するのがポイントです。こうすることで、アプリケーションコンテナでListenするポートに、Pertinoクライアントが受信するトラフィックが転送されます。

$ docker run -d \
  --net container:pertino \
  ghost:latest
bcc0d985696d70cb7af5d43908259474b576d8411c8a917a91199529064eaab7
$ docker ps
CONTAINER ID        IMAGE                            COMMAND               CREATED             STATUS              PORTS               NAMES
bcc0d985696d        ghost:latest                     "/entrypoint.sh npm   18 minutes ago      Up 2 seconds                            furious_archimedes
a5a813851087        takipone/pertino-client:latest   "/entrypoint.sh"      18 minutes ago      Up 16 seconds                           pertino
$

これでOKです。

動作確認

では、端末のWebブラウザでGhostにアクセスしてみます。アクセス先はPertinoクライアントに割り当てられるDNS名とIPアドレスの両方が利用できます。また、GhostコンテナはデフォルトでTCP2368番でListenします。

pertino-x-docker06

Ghostの初期画面が表示されました!

まとめ

PertinoをDockerコンテナで実行し、アプリケーションをSSL-VPN経由で配信する構成を紹介しました。開発、本番両方に活用できるお手軽・セキュアなアプリ配信基盤として便利な様子が見ていただけたでしょうか。アプリケーション側の構成はリバースプロキシとしてHAProxyやNginxのコンテナで受けて他のコンテナに転送したり、コンテナ外のDBなどと組み合わせることももちろん可能ですので、いろいろ応用できるのではないでしょうか。