mBaaSはアプリケーションキーとクライアントキーの組み合わせによって認証を行っています。アプリケーションキーとクライアントキー、そしてACLを組み合わせることで安全にアプリのデータを保護しています。
しかしアプリケーションキーとクライアントキーが漏洩してしまうと、個人個人のデータ操作はできない(ACLを正しく設定していた場合)ものの、新規にデータを作成したり、検索などを行ってAPIを浪費できてしまう可能性があります。
そこで今回はクライアントキーを隠蔽する方法について紹介します。
アプリケーションキーは隠蔽できない
アプリケーションキーはmBaaSにアクセスする際のヘッダーに埋め込まれます。そのため、アプリケーションキーを隠蔽するためにはmBaaSへのアクセスをすべてサーバサイドで行う必要があります。しかし、アプリとそのサーバとはどう接続するのでしょうか。その部分の設計が甘いとデータ操作できてしまう可能性があります。アプリとmBaaSの間にプロキシサーバ的なものを立てるのはあまり良い選択肢とは言えません。
そのためクライアントキーの隠蔽が優先になります。
クライアントキーの役割
そもそもクライアントキーの役割はmBaaSへのリクエストが正しいものであると署名することにあります。それ以外では使われません。そのため署名処理を隠蔽化すれば良いだけです。隠蔽化は幾つかに分類されます。
- 全体を暗号化
- 外部で暗号化
- 内部で暗号化
全体を暗号化/コンパイル
アプリケーション全体をコンパイル、暗号化することでキーを隠蔽化できます。これはiOS/Android/Unityなどのネイティブアプリを生成するタイプで利用可能です。MonacaやWebアプリケーションでは容易ではありません。なお、Monacaの場合は暗号化プラグインを使うことで、HTML/JavaScript/CSSなどを暗号化でき、これによってキーを隠蔽することもできます。mBaaSをWebアプリケーションで使う場合には選択できないでしょう。
外部で暗号化
サーバサイドで署名処理を行うことで、クライアントキーの隠蔽を行えます。この場合、サーバサイドに対して署名化して欲しい文字列をすべて送り、サーバ側で署名だけを生成してレスポンスを返すのが一般的です。署名するだけであれば、ごく簡単なコードなのでPHPやJava、Rubyなど言語を問わず利用可能です。
問題点はネットワークアクセスが一回増えてしまうことでしょう。Webアプリケーションの場合はCORS対応のためにOPTIONリクエストも行われますので、一回の署名処理で二回のHTTPリクエストが発生します。オフライン時に署名処理がエラーになるという問題もありますが、mBaaS自体がオフラインでは使えないので問題にはならないでしょう。
内部で暗号化
WebアプリケーションやMonacaアプリの場合、WebAssemblyを使うことで署名処理をクライアントキーを隠蔽化して行えるようになります。JavaScript SDKに多少手を加える必要がありますが、手軽な方式と言えます。
なお、署名処理は隠蔽化されても、JavaScriptのコードは見られる状態になっていますので注意が必要です。また、JavaScript SDKをアップデートした際には同じようにWebAssemblyを使うように修正しなければなりません。
なおWebAssemblyのバイナリはテキストへの変換も可能で、クライアントキーを探すことは不可能ではない点に注意してください。
まとめ
WebアプリケーションでmBaaSを使う場合には「内部で暗号化」するのが手軽です。ついで「外部で暗号化」になるでしょう。iOS/Android/Unityであれば「全体をコンパイル」することで隠蔽化され、Monacaアプリであれば「全体を暗号化」するプラグインを用いるのが手軽です。
クライアントキーを安全に運用し、セキュアな環境でmBaaSを利用してください。