テクノロジー
KeyMeld:iPhoneとAndroid向けの共通キーとZero Vaultアーキテクチャ
KeyMeld自体はZero Vaultではありません。これは、開発者がユニバーサルキーをバックエンドの外に出し、iOSとAndroidのクライアントを結びつけ、Zero Vaultモデルに基づくアーキテクチャを構築するための独立したSaaSサービスです。
クロスプラットフォーム対応のアプリケーションには、ユーザーが普段気づかない問題があります。画面上では一つのアカウントを表示し、どのデバイスでも同じ動作を期待しています。しかし、iPhoneとAndroidは異なる保護メカニズムを採用しており、ローカルキーの取り扱いも異なります。
iPhoneではアプリがApple Keychainを使ってローカルキーを保護できます。AndroidではAndroid Keystoreが使用されます。これらの技術は重要なキーをデバイスの保護された環境に保持するためのものですが、互換性はありません。
ユーザーにとっては重要ではありません。単にiPhoneでアプリを開き、その後Androidにインストールして、同じ保護されたデータで作業を続けたいだけです。
ここで開発者はアーキテクチャ上の課題に直面します。デバイスのローカルキーを移動させることなく、2つのプラットフォーム間で共通のアクセスをどのように実現するか?ローカルキーのコピーを自身のバックエンドのデータベースに格納せずに済む方法は?
KeyMeldの理解を深める中で、同サービスはこれを可能にするための別個の普遍的なキーを提案していることがわかりました。 iOSやAndroidの内部保護には干渉しません。
異なるプラットフォーム向けの共通キー
ローカルキーは特定の端末に関連し、そのデバイスのOSの保護手段で守られています。これらはそのデバイスの安全な環境にとどまり、他の端末に自由に移動させることは想定されていません。
一方、KeyMeldのユニバーサルキーは別物です。これは特定のプロジェクト、アカウント、保護されたスペース向けに生成され、認証されたクライアント間で共有される共通のキーとなります。
このサービスはiPhoneからキーを取り出したり、Androidに移行させたり、異なる2つのキーを一つに統合しようとはしません。プラットフォームの保護機構は独立したままで、アプリは自分のプロジェクトに対する共通アクセスレベルを取得します。
これがKeyMeldのアーキテクチャ上の役割です。iOSとAndroidの保護機構を同じにするのではなく、それらの内部メカニズムを置き換えるのでもありません。代わりに、ユニバーサルキーを扱う共通レイヤーを追加し、プロジェクトがプラットフォーム間のキー配布を自動化できるようにします。
異なるプロダクトやアカウントごとに独立したキーコンテナが作成されます。これにより、各プロジェクトは自身のアクセス範囲を保持し、同一端末上の複数アカウントも分離されたまま管理できます。
Zero Vaultはプロジェクトに属する
まず重要な点として、Zero VaultはKeyMeldという名称の製品の名前ではありません。これは、接続された製品が構築できるアーキテクチャモデルです。
KeyMeldは独立したSaaSサービスとして動作します。バックエンド内部にインストールしたり、プロジェクトのデータベースの横に配置したりするものではありません。ユニバーサルキーはSaaSのコンテナ内で管理され、プロダクトのバックエンドの外側にあります。
このモデルを維持するには、プロジェクトとKeyMeld間の信頼の境界線を分離し続ける必要があります。バックエンドと外部サービスは、認証情報やアクセス権、管理メカニズムも別々に設定されている必要があります。
この状態はアーキテクチャ上のZero Vaultモデルと呼べます。つまり、サーバー側のデータベースはクライアント側の保護されたストレージのキーを保存しません。
Zero Vaultは、プロダクトのバックエンドが完全に何も保存しないことを意味しません。アカウントや設定、ビジネスデータなどはバックエンド側に存在しますが、普遍的なキーはその近くにありません。
サーバーのデータベースの漏洩は、ユニバーサルキーの漏洩を自動的に引き起こすことはありません。キーはアカウントやその他のサーバーデータと一緒に保存されません。それでも、このモデルは、クライアント側のストレージからユニバーサルキーを排除し、セキュリティを向上させる目的には適しています。
リアルなシナリオ:iPhoneとAndroidで1つのアカウント
ローカルな保護されたデータを持つアプリケーションを想定してみましょう。これは認証器、企業向けクライアント、あるいは暗号化された情報を端末上で直接扱う必要のあるサービスです。
iPhoneではアプリがiOSの仕組みを使ってローカルキーを保護します。AndroidではAndroidの保護メカニズムを使います。内部のキーは異なっていても問題ありません。
もしも別個の共通レイヤーがなかった場合、開発者は両プラットフォームでのアクセスをどう調整するかを自力で考える必要があり、2つの異なる実装の統合を行わねばなりませんでした。また、ローカルキーの移送やサーバーへのコピーも選択肢となったでしょう。
KeyMeldはこれを避け、ローカルキーの移動やサーバーへのコピーを不要とします。代わりに、共通のユニバーサルキーを導入します。
iPhoneとAndroidのクライアントは、認証されたプロジェクトとアカウントの範囲内で、同じユニバーサルキーにアクセスします。各端末はそれぞれの保護手段を継続して使います。
これにより、ユーザーには異なるデバイス間の単一アカウントのように見えます。iPhoneの内部メカニズムやAndroidの仕組みを意識する必要はありません。
電話を変える際も、ローカルキーをエクスポートしたり、新しいプラットフォーム向けに保護ストレージを個別に作成したりする必要はありません。新しいクライアントは同じプロジェクトに接続し、同じユニバーサルキーにアクセスします。
バックエンドはリクエストの認証に関与しますが、ユニバーサルキーは認証されたクライアントにのみ与えられ、プロダクトのサーバーデータベースには保存されません。
KeyMeldはアプリケーションのデータベースを移行したり、ユーザー記録の同期システムに代わったりしません。主な役割は、クライアントに対して暗号化されたデータを扱うためのキーを提供することです。ストレージの内容や更新はプロダクト側の責任範囲です。
3種類のキーとシークレット
アーキテクチャ上の異なる要素を混同しないために、3つの概念を区別します。
ローカルキーは端末固有のもので、iOSやAndroidの手段で管理されます。
ユニバーサルキーは、1つのプロジェクトとアカウントの認証されたクライアント間で使われるもので、製品レベルで異なるプラットフォームをつなぎます。
シークレット(サービスシークレット)は、バックエンドとKeyMeldとの安全なやり取りのためのもので、モバイルアプリやブラウザには渡されません。
サービスシークレットとユニバーサルキーは異なる役割を果たします。Zero Vaultでは、これらはバックエンドのデータベースに一緒に保存されません。
KeyMeldの利用には、個人名やパスワード、TOTPの情報、ビジネス記録の内容などは必要ありません。重要なのは、プロジェクト、アカウント、およびクライアントの権利の連結です。
キーアクセスは管理された状態を維持
ユニバーサルキーの取得は、すべてのクライアントに自動的に許可されるわけではありません。
端末が信用できなくなった場合や、アカウントの状態が変わった場合、あるいはアクセスが取り消された場合、KeyMeldはそれ以降のユニバーサルキーの発行を停止できます。
ただし、既存のローカルコピーを破棄したり、自動的に無効化したりするわけではありません。あくまで新規のアクセス取得や新規クライアントの参加の制御です。
ユーザーにとっては、新しい端末を追加したり、アクセスを管理したりすることは一つのシステムにまとまります。
開発者にとっては、iOSとAndroidのために個別にルールを作る必要がなくなり、その結果としてZero Vaultのモデルはどのように運用されるかに依存します。それは、プロジェクトがユニバーサルキーを自前で保持しているかどうかと、データの分離を確実に行っているかによります。
KeyMeldが行わないこと
KeyMeldはパスワードマネージャーではなく、TOTP記録も保存しません。アプリのクラウドデータベースに置き換わったり、同期機能を代替したりもしません。
これはApple KeychainやAndroid Keystoreの代わりではありません。サービスはプラットフォームのローカルメカニズムを維持しつつ、製品のための共通レベルを提供します。
また、ユーザーの識別や認証を必須とするサービスではありません。認証や認可を担当する別のサービスが存在し得ます(たとえばMeldID)。KeyMeldはあくまで、認証されたクライアントに対して、バックエンドに格納せずにユニバーサルキーを提供することに特化しています。
最後に、KeyMeldは自動的にZero Vaultを構築するものではありません。これは、外部のユニバーサルキーコンテナを提供するものであり、そのアーキテクチャを維持するために、開発者は自社のサーバーにユニバーサルキーを保存しない方針を採る必要があります。信頼のエリアは分離されたままです。
誰にとって必要か
このアプローチは、複数のプラットフォーム上で動作し、ローカルのセキュアデータを持つアプリに適しています。
認証器や企業向けアプリ、SaaS、複数端末対応のサービス、あるいはiPhoneとAndroid間で同一アカウントを必要とするプロジェクトなどです。
開発者にとっての魅力は、プラットフォームごとのロジックの削減だけでなく、責任範囲の分離です。プロダクトのバックエンドは自身のデータを保持し、KeyMeldは外部SaaSとしてユニバーサルキーを管理し、配布を行います。
この方針により、KeyMeldは、単体のZero Vaultではなく、開発者が自身の製品用にそれを構築できるツールとしての価値を持ちます。
iOSとAndroidはそれぞれ独自の保護メカニズムを使い続けます。クライアントは共通のユニバーサルキーを受け取り、バックエンドはユニバーサルキーを自分で保持しなくとも、インフラの分離を実現します。これにより、ユーザーは複数デバイス間で一つのアカウントにアクセスでき、開発者は自身のバックエンドの外にキーを出すことができ、全体としてZero Vaultのアーキテクチャが実現されるのです。
詳細はこちら:KeyMeld