FJCT_ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

クライアントキーを隠蔽してmBaaSをより安全に使おう

f:id:mbaasdevrel:20180913213909p:plain

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を利用してください。

中津川 篤司

中津川 篤司

NCMBエヴァンジェリスト。プログラマ、エンジニアとしていくつかの企業で働き、28歳のときに独立。 2004年、まだ情報が少なかったオープンソースソフトの技術ブログ「MOONGIFT」を開設し、毎日情報を発信している。2013年に法人化、ビジネスとエンジニアを結ぶDXエージェンシー「DevRel」活動をスタート。