Enterprise APIs Advent Calendar 2015への投稿記事です(第二弾)
Enterprise APIs Advent Calendar 2015
エンタープライズなネタということで、DropboxやGoogleDriveなどのオンラインストレージサービスをよりセキュアに利用できる仕掛けを考えてみました。
当然ながら各サービスプロバイダは様々なセキュリティ対策を講じていますが、自己防衛と言いますか、二重、三重に対策を行うことがセキュリティの原則です。
例えばアカウントが漏れてしまった場合、オンラインストレージに保存したファイルが第三者に悪用されてしまう可能性があります。 ファイル自体に暗号化を施してオンラインストレージへアップロードしておけば、仮にアカウントが漏洩したとしても中身を見られるリスクは限りなく低くなりますが、都度ファイルを暗号化してオンラインストレージにアップロードする作業は面倒です。
ということで、以下のファイル操作を自動化して、利便性を落とさずよりセキュアにオンラインストレージを利用する仕掛けを、OneDrive APIとApigeeを使って試してみました。
クライアントからアップロードされたファイル(テキスト)を自動的に暗号化し、オンラインストレージへ送信する
オンラインストレージからダウンロードしたファイル(テキスト)を自動的に復号し、クライアントへ返す
下準備
OneDrive API OneDrive APIを利用できるように、デベロッパサイトよりアプリケーション登録しておきます OneDrive APIのリファレンスも上記デベロッパサイトより確認できます
Apigeeへサインアップ Apigeeにアカウント作成し(今回は無償アカウントを使っています)、API ManagementからAPI Proxyを作成できるようにしておきます 今回はAPI Proxyを以下のような感じで作成しました。
OneDrive APIは様々なAPIが用意されていますが、今回利用するAPIはアップロードAPIとダウンロードAPIの2つです。 この2つをResourcesに追加しておきます。(パスは同じでGETかPUTかメソッドを使い分けて利用します)
ファイル自動暗号化のロジックを作成する
以下の流れでApigee上にAPI Proxyを作成していきます。 ※Apigeeの各ポリシー詳細についてはApigee Docsを参照してください。
RequestフローにExtract Variablesポリシーを追加し、OneDrive ファイルアップロードAPIのRequest Payloadを抽出
JavaScriptsで暗号ロジックを作成し、抽出した文字列を暗号化する ファイルの暗号/復号にはJavaScriptsのcrypto-jsというライブラリを使って実装してみました
暗号化した文字列をRequest Payloadに戻し、OneDrive APIを叩く
以上で終了です。 Apigee上で作成したAPI Proxyは以下のようになりました。
それでは実際に作成したAPIを叩いて、アップロードしたファイルが暗号化されているか確認してみます。 以下、HTTPieというコマンドツールを使ってAPIを叩いてみます。
$ echo 'Enterprise APIs Hack-Night #2' | http -v PUT http://*****.apigee.net/drive/root:/test/message.txt:/content "Authorization: Bearer ******"
[Request]
PUT /drive/root:/test/message.txt:/content HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
Authorization: Bearer ******
Connection: keep-alive
Content-Length: 30
Content-Type: application/json
Host: *****.apigee.net
User-Agent: HTTPie/0.9.2
Enterprise APIs Hack-Night #2
message.txtにEnterprise APIs Hack-Night #2(明日開催する勉強会です!)という文字列を書いて、OneDriveにアップロードしています。 APIの書式、AccessTokenはOneDrive APIを利用しますが、ここで指定するAPIのエンドポイントは、Apigeeで作成したAPI Proxyのエンドポイントになります。 アップロードを実行する中で、API Proxyにて暗号処理が実行され、OneDriveに暗号化ファイルが保存される仕組みです。
それではアップロードしたmessage.txtの中身が暗号化されているか、直接OneDriveにアクセスして確認してみます。
message.txtをダウンロードし開いてみると、
このように"Enterprise APIs Hack-Night #2"という文字列が暗号化されているのがわかります。 これで万が一、アカウントが漏れて第三者にアクセスされても、ファイルの中身が分からないので情報漏洩を防ぐことが可能となります。
ファイル自動復号のロジックを作成する
このままではファイルを読み取ることができないので、復号ロジックをAPI Ploxyに追加していきます。 以下の流れでApigee上にAPI Ploxyを作成していきます。
※OneDriveのファイルダウンロードAPIは、まずダウンロードリクエストを投げて、ファイルをダウンロードするURLを取得し、取得したURL(テンポラリ)に対してGETでファイルを取得する流れになっています。 この一連の流れをAPI Ploxy上に実装していきます。
ResponseフローにExtract Variablesポリシーを追加し、ファイルダウンロードURLのパスを抽出
Service Calloutポリシーを追加し、抽出したURLからファイルをダウンロードする
ダウンロードしたファイルから暗号化文字列を抽出する
JavaScriptsで復号ロジックを作成し、抽出した暗号化文字列を復号する
復号した文字列をResponse Payloadに戻し、クライアントへ返す
以上で終了です。 Apigee上で作成したAPI Proxyは以下のようになりました。
それでは実際に作成したAPIを叩いて、ダウンロードしたファイルが復号されているか確認してみます。
$ http -v GET http://*****.apigee.net/drive/root:/test/message.txt:/content "Authorization: Bearer *****"
[Request]
GET /drive/root:/test/message.txt:/content HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Authorization: Bearer *****
Connection: keep-alive
Host: *****.apigee.net
User-Agent: HTTPie/0.9.2
[Response]
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: public
Content-Disposition: attachment; filename="message.txt"
Content-Encoding: gzip
Content-Length: 84
Content-Location: https://******
Content-Type: text/plain
Date: Tue, 01 Dec 2015 04:15:16 GMT
Expires: Mon, 29 Feb 2016 04:15:17 GMT
Last-Modified: Tue, 01 Dec 2015 03:54:20 GMT
P3P: CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Server: Microsoft-IIS/8.5
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-AsmVersion: UNKNOWN; 19.32.0.0
X-Content-Type-Options: nosniff
X-MSNSERVER: DM2304____PAP035
X-PreAuthInfo: rv;poba;
X-SqlDataOrigin: S
X-StreamOrigin: X
Enterprise APIs Hack-Night #2
正常に文字列が復号されていることを確認できました。
このように、APIを活用すればセキュリティを強化してオンラインストレージを利用する仕組みも簡単に作れます。 今回、アプリケーションの開発まではやっていませんが、APIを叩くだけの簡単な実装でWebやモバイルアプリを開発できるかと思います。 これもAPI活用のメリットの一つですね。 また、暗号処理は固定の暗号鍵を使っていますが、外部のセキュリティサービスなどと組み合わせて利用することにより、さらにセキュリティレベルを上げてオンラインストレージを使うこともできると思います。 ほかにも組み合わせることで面白いことができそうなサービスがあればチャレンジしてみたいと思います。