2017年09月10日

googleクラウドにたてた Web Server をセキュアに使う

一つ前の記事「クラウドでのデータ分析を推奨する理由」で予告した話題です。ウェブブラウザ経由で利用する分析ツールを想定していて、それに対して簡単かつ安全にローカルからアクセスする方法です。この方法はエンジニアにとっては当たり前のことを繋げただけなのですが、データ分析者にとってはなかなか敷居が高い話題なので、ご紹介したいと思います。

やりたいこと


最近はブラウザベースの分析ツールが増えてきました。JupyterやRStudioなどがその最大手だと思いますが、これに限りません。分析者は主に、ローカルにウェブサーバーをたてて利用していると思います。

一方で、最近はクラウドでデータ分析をすることが増えてきました。上で参照した記事でも書きましたが、データセキュリティの面で安全であること、ビッグデータに対応しやすいこと、計算機リソースを調達しやすいこと、作業を一元管理できることなど、様々なメリットがあります。

この二つを併せて、クラウドでたてたウェブベースの分析環境を利用したい、しかも安全に、というのが今回のモチベーションです。

悩み


しかしそのためには悩みがありました。データや分析ツールはクラウドにあって、ローカルからはブラウザでそのリソースにアクセスしたい。このとき、データセキュリティを保つためには、@通信経路が適切に暗号化されること、A認証が適切に処理されていること。Aは特に、どこからでもID/PWだけでログインできるのはよくない、必ず二段階認証や、公開鍵認証などの方法で本人確認がなされてほしいです。

ここで、ITエンジニアであればこれらを満たす環境を容易に作ることが可能ですが、データ分析者にとってはなかなかハードルが高いです。

例えば一つの案として、クラウドに立てた分析マシンにグローバルのIPアドレスをつけてやって、そのポートに対してhttpで直接アクセスできるようにしてしまうと、通信経路が暗号化されませんから、機密のデータが全て漏れてしまいます。では、https化しようと思っても、SSLの認証が、ポートが、などなど、分析者はあまり得意ではありません。もう一つ、SSHトンネルを使ってローカルマシンのポートをクラウドに転送する方法もありますが、これも多くの分析者にとってハードル高めです。

もう一つ、これは小さな悩みとして。ローカルマシンから計算サーバーへSSHトンネルを掘ってその中を通す手段を確立するところまではできたとしましょう。SSHの通信元はローカルマシン、通信先は計算サーバーのグローバルIPです。さて、計算サーバーは計算をしている間だけ動いていればいいので、使い終わったらいちいち停止します。すると、次に立ち上げたときに、IPが替わってしまうんです。IPは共有資源ですから、使っていない間は占有しない方がいい。よって毎回返すのですけれど、そのために毎回IPが替わって、SSHトンネルを掘る宛先も毎回変えなければならない。この些細な手間が悩みです。(プロキシサーバーをたてるとか、IPでなく名前でアクセスすればとか、もちろんいろいろ方法ありますが、それはそれで事前にいろいろセッティングしなければならないので。計算サーバーというのはある種使い捨てなので、毎回小さな手間がかかるのはデータ分析に差し障りがあるのです。)

GCPでの解決方法


全体図を示します。以下でこれを解説します。ここではブラウザベースの分析ツールということで、RStudio Serverに出演していただきますが、これに限らず何でもよいです。
tunnel.png

google cloud shellはブラウザからアクセスできる小さな仮想マシンで、google側にあります。GCPのコンソールの右上にあるボタンを押せばすぐ、ブラウザでコンソールが立ち上がります。そしてこのマシンは、ローカルとはブラウザで繋がっており、リモートではGCEと繋がっています。このマシンをシエルさんと呼びましょう。また、以下ではGoogle Cloudにある計算サーバーをサブさん、ローカルで操作するマシンをロカさんと呼びます。

ロカさんとシエルさんとの通信はブラウザで行います。シエルにアクセスするにはまずGCPの管理コンソールにアクセスしますから、この時点でロカさんとシエルさんの通信はGoogle Accountで認証されています。Google Accountはほとんどの場合ID/PWと携帯電話などによる認証コード確認の二段階認証されているので、これは安全だと思いましょう。そして、ロカさんのブラウザとシエルさんとの通信はこの認証と、Gooleさんへのhttpsアクセスの中を通っていますので、安全です。つまり、シエルさんのシェル画面が、Google Accountで認証されたhttpsのトンネルの中を通って、ロカさんのブラウザに転送されています。

次に、シエルさんとサブさんとの通信を確保します。ここはSSHでトンネルを掘るのですが、シエルさんには素晴らしい機能が搭載されていて、Google Cloudとの間にアクセス承認がビルトインされています。つまり、シエルさんはGCPで作ったプロジェクトへのアクセス権が、プロジェクトのアクセス権と同等に既に与えられています。ですから、自分が参加しているプロジェクトに対してシエルさんはSSHでアクセスすることができ、逆に参加していないプロジェクトのリソースにはアクセスできないようになっています。さらに、cloud shellは初めて利用する際にシエルさんのインスタンスで鍵ペアを生成して、これを使って自分のアクセス権が設定されたプロジェクトとの認証を行いますので、その鍵を使うときにパスフレーズを入力する(これは、その鍵を開けるための鍵で、初期設定の際に決めます。確かブランクでもよかったと思いますが、何か入れましょう)だけで、あとは公開鍵認証でさくっと認証してくれます。これは便利!

さて、では、シエルさんからサブさんへSSHのトンネルを掘りましょう。GCPコンソールからgoogle cloud shellのボタンを押すと、シェル画面が立ち上がります。これはシエルさんのコンソールです。ここで、

gcloud compute ssh sabusan --project projectSabusan-123456 \\
--zone asia-northeast1-a --ssh-flag="-L" --ssh-flag="8080:localhost:8787"
を実行します。ここで、「sabusan」はサブさんのインスタンス名、「projectSabusan-123456」はサブさんが立っているプロジェクトの名前(フルネーム)、「asia-northeast1-a」はサブさんの立っているゾーン、「8080」はそのままで、「8787」はサブさんに立てたRstudio Serverへのアクセスポートです。なお、8787はRStudioのデフォルトポート、つまり、なにも指定しなければ8787番で立ち上がりますが、普通のhttpでサブさんのツールを立ち上げた場合は80番になります。ここはサブさんのなかで何を使うかによって適宜変更してください。

「gloud compute ssh」はgoogle cloud用のsshで、これを使うとGCPの中での用語を使ってsshアクセスできます。つまり、「sabusan」や「projectSabusan-123456」という名前をうまくIPに変換してくれて、その認証なども考えてくれて、正しくアクセス先に導いてくれます。上で、IPアドレスが毎回変わるのが面倒ということを書きましたが、ここではプロジェクト名とインスタンス名で通信経路を確保できるので、その悩みはなくなります。最後に、もしシエルさんのキーペアにパスフレーズを設定している場合はそれを入力すれば、無事、SSHの接続が完了します。

これで全ての通信経路が確保されました。最後に、ロカさんのブラウザ上に開かれたシェル画面の右上にある「ウェブでプレビュー」ボタンを押し、「ポート上でプレビュー8080」を選択すると、ブラウザで新しい画面が立ち上がって、サブさんでサービスしている画面、この例ではRstudio Serverの画面に繋がります。

ロカさんとgoogle cloud platformはインターネットで繋がっていて、ここが一番危険な場所ですが、そこを守っているのがSSL, Google Account認証です。そしてここはGoogle Accountでログインしていれば既に守られています。つまり、Google Accountの取り扱いさえ気をつけていれば大丈夫で、それは普段から気をつけている場所なので、問題ありません。特に、会社のメールにGSuiteを使っているところは普段からしっかり対処しています。そしてそのSSLのトンネルはシエルさんまで繋がっていて、シエルさんとサブさんは先ほどの「gcloud compute ssh 〜」でsshのトンネルを作りました。最後に、サブさんに組み込まれたRStudio Serverで作られたRStudioの画面は、SSHのトンネルとSSLのトンネルを通ってロカさんのブラウザ上に表示されます。

便利なところ


この方法の便利なところは、使うまでのアクションが三つだけだということです。(サブさんでのサーバーのインストール等の時ではなくて、すべて設定が終わって、普段分析用に利用するときです。)

@インスタンスを立ち上げる


まずは計算サーバーを立ち上げる必要があります。通常、分析するインスタンスは大きなリソースを割り当てるのが普通なので、作業が終わったら落とて、使うときに立ち上げます。これはGCPコンソールのGCEから、停止状態にあるインスタンスをクリックして「開始」すればOK。なお、RStudio Serverは自動起動するように、RStudioをインストールする際に設定しておいてください。

AGoogle Cloud ShellでSSHを指示する


上に記した、「gcloud compute ssh 〜」を実行します。このフレーズはマシン名が変わらないため毎回同じなので、cloud shellの中にメモを残しておくか、そのままスクリプトにしておいてもいいとおもいます。cloud shellはGoogle Accountが存在する限りずっとなくならないはずなので、ブラウザでGCP〜cloud shellにアクセスすればいつでもそのメモはそこにあります。

Bポート上でプレビュー


最後に、「ウェブでプレビュー」から「ポート上でプレビュー8080」を選択すれば、サブさんで立ち上がっているRStudio Serverに接続して、RStudioが使える状態になります。

安全なところ


経路は全てSSLまたはSSHで暗号化され、インターネットを通る認証はGoogle Accountによる認証だけです。Google Account認証は通常二段階認証で、普段よく使うアカウントですから、リスクが低いです。SSHもGoogle Cloudの中だけですし、認証は公開鍵認証がデフォルト、かつ、自身が割り当てられたプロジェクトにしかアクセスできないようになっています。そして特にこの方法では、プロジェクトにアクセスできるのはブラウザでGoogle Account経由、もしくはSSHでの接続だけで、httpやhttpsのポートを開けているわけではありません。プロジェクトに侵入する経路が少なければ少ないほどよく、SSHはデフォルトで開いていますが、公開鍵認証が必須なので問題ありません。サブさんのグローバルIPも立ち上げなおす度に変わるので、リスクは非常に小さいと言えます。

おわりに


以上、googleクラウドにたてたブラウザベースの分析ツールをセキュアに使う方法でした。

このように、クラウドを安全に使う方法がどんどん便利になってきていて、便利になるからこそまた安全性が増します。不便だったり、様々な知識が必要だったりすると、手抜きや知識不足のためにセキュリティが下がる可能性があるので、便利になることはいいことですし、将来的にはもっともっと便利になると思います。
posted by jinya at 11:49| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。