Panic Sync: よくある質問と回答

Panic Syncとは?

Panic Syncとは、私たちPanicのアプリ内で使用されるあなたのデータを、あなたのデバイス(iPhoneやiPad、そしてMac)間で同期するためのウェブベースのサービスです。アプリ間で主に同期されるデータはお気に入りのサーバアドレス、クリップ、認証鍵です。

私たちはPanic Syncに信頼性、安全性、そして簡便さを実現するため多大な努力をしました。ユーザエクスペリエンスは特に重視され、使用するユーザを念頭に置いて構築されています。

一方で、お客様からこのサービスに関する質問をいただくことがあります。ここでは良くいただく質問とその回答をご紹介し共有したいと思います。

私のデータはどのようにして守られていますか?

シンプルな回答: お客様のデータはPanic Sync上で常に暗号化され、取り扱われています(つまり、デバイス上で暗号化されたデータが私たちのサーバにプッシュされ、同期先のデバイス上で復号化されています)。暗号化方式は業界標準を採用し、独自の暗号化は行なっていません。さらに、Panic Syncのコードは第三者機関である^Liftによる評価と認証を得ています。

詳細な回答:

お客様のデータは属性ごとに暗号化されます。Transmitのお気に入りを例に取ると、ユーザ名やパスワード、サーバアドレスなどすべての項目がそれぞれ暗号化されます。

暗号化はAESと256ビット鍵のペアで行われ、以下のように構築、使用されます:

アカウントを作成すると:

  1. /dev/randomからの高エントロピーデータを元にして256ビットのマスターパスワードのペア(1つは暗号化に、もう1組はHMAC認証に使われます)を作成します。
  2. 高いアルゴリズムラウンドを持つPBKDF2アルゴリズムを使用しアカウントパスワードを拡張します(私たちは新しいユーザ毎に定期的にラウンドカウントを増やし、業界の推奨に応じてパスワードを変更します)。
  3. 拡張されたデータ(派生鍵)はお客様のマスター鍵の暗号化と署名に使用されます。暗号化されたマスター鍵はPanic Syncのサーバ側データベースに格納されます。オリジナルのマスター鍵と派生鍵は保存されません。

デバイスにサインインすると:

  1. アカウントの認証後、暗号化されたマスター鍵をデバイスに配信します。
  2. デバイスは拡張されたパスワードに対し同じPBKDF2派生を実行し、派生鍵を生成し、マスター鍵を復号化します。マスター鍵はデバイスのキーチェーン(macOS、iOS共に)に格納されます。お客様のアカウントパスワードは決してデバイスに保存されません(サインインにのみ使われます)。
  3. マスター鍵は以降、アプリケーションによるデータの暗号化や復号化、検証に使われます。

データをデバイスからPanic Syncに送るとき:

  1. デバイスのキーチェーンに格納されている最初のマスター鍵を使用し、属性単位(各フィールドごと)にデータを暗号化します。
  2. 暗号文は第2マスター鍵(HMACを使用)を使用して署名されます。
  3. 署名された暗号文はPanic Syncサーバに送信され、データベースに格納されます。

データをPanic Syncからデバイスに送るとき:

  1. 署名された暗号文がデータベースから取り出され、デバイスに送信されます。
  2. デバイスは2番目のマスター鍵を使用して、署名を検証します。
  3. 暗号文を最初のマスター鍵で復号化され、結果的に得られたデータをアプリケーションに適用します。

このように、サーバまたはデバイスにはアカウントパスワードまたは派生キーは保存されません。サーバはログイン試行中にパスワードのみを受信し、アカウント作成時やパスワードの変更時、もしくはリセット時にのみ派生鍵を生成します。

認証後、アプリケーションはPanic Sync APIにアクセスするのに必要なOAuthスタイルのトークンを発行します。これはお客様のアカウント名として使用しているメールアドレスやパスワードがAPIリクエストがあっても送信されないことを意味します。またPanic Syncユーザページからはこれらアプリケーション特有のトークンを無効にすることができ、アプリケーションからのアクセスを無効にすることができます。

これが意味することは 暗号化のセキュリティはある程度アカウントのパスワードに依存しています。パスワードを強固なものにすることが、攻撃者への強力な対抗となります。私たちはユーザセキュリティについて常に最大限に配慮してまいります。

iCloud(やDropbox等)を使用しないのは何故ですか?

iCloud(や同様のクラウドサービス)は書類や写真などファイルデータの同期に特化してデザインされています。その様な書類やPDFなどの同期にはピッタリです。

ただし、最初の変更がプッシュされる前にデバイスが変更されると統合(マージ)コンフリクトが生じてしまいます。iCloudやDropboxの様なサービスにはこのコンフリクトを自動的に解決するロジックが組み込まれていません。その代わりPagesやプレビュー、Finderなど対応するアプリケーションにどの書類を選択するかを尋ねられるメッセージが表示されます(そして矛盾する編集箇所を失わなければならない場合もあります)。

私たちのお客様が取り組んでいる作業では、複数のデバイスでサーバ設定やクリップ、認証鍵を日常的に変更する必要があります。最高のエクスペリエンスを提供するためにはユーザインタフェースを表示せず、自動的に複雑な統合を行う必要があります。常にではありませんが、可能な限り選択ダイアログを表示させず自動的に頻繁に発生する統合処理を行えるようPanic Syncを設計しました。

次に、iCloudやDropboxでファイルを変更すると、それらのサービスではファイル内の変更箇所だけを取り出して置き換えることができないため、常にファイルのすべてを転送します。"何故ファイルを分割して転送しないのか?"とおっしゃる方がいますが、これらのサービスは非決定的な性質を持つため問題が生じます。すべてのファイルが同じタイミングで配信される保証が無いからです(回線の状況によって左右されますが、場合によって30秒から1分の遅延が生じることもあります)。

Panic Syncはデバイスとサーバで変更された情報のみをプッシュしたりプルしたりするようデザインされています。 これによりデバイスを半同期状態にしたりiCloudからデータを受信する際のように、"あるポイントで受信前にコールバックの通知を受け取る"必要がありません。

さらに、デバッグ性です。私たちのデバイス側のコードは動作速度、安定性、セキュリティが最高になるようチューニングされています。一方でiCloudやDropboxの様なサービスではサーバ側についてややブラックボックス化されています。障害がサーバ上で発生した時(それがクライアント側に起因したとしても)ログや診断情報などを取得することができません。例えば、ユーザから"TransmitがMacBookでの変更を取得しておらず反映されない"とレポートを受けても、私たちにはデータが反映されない理由についての十分な情報を得られないため、解決することができないでしょう。

Panic Syncではそんなことはありません。サーバログとエラーレポートの両面から問題について明確にします。サードパーティのダウンタイムに影響されたり、サポートでお待たせしたりすることもありません。

CloudKitを使用しないのは何故ですか?

CloudKitは"iCloudはファイルに対しては最良のサービスである"という問題に対するAppleのソリューションです。しかしこれは最近のサービスで、Panic Syncの開発中には存在していませんでした。さらに、(最近になってその制限を解除しましたが)App Storeで配布されるアプリケーションに限定されたサービスとアナウンスされていました。私たちは直販版を選択するお客様もいらっしゃるので、CloudKitに頼るという選択肢はありませんでした。

さらにCloudKitは、どちらかと言えば私たちの望んでいないブラックボックス状態のサービスです。Panic Syncのリリース以来、過去にサードパーティのサービスを利用していた時よりもサポートがしやすくなり、お問い合わせの件数も減っていて、結果としてお客様へのサービス向上に繋がっていることを嬉しく思います。

Promptだけ他のPanic製アプリと同期するデータが異なるのは何故ですか??

Promptは現在のところ特殊なケースです。TransmitおよびCoda(両プラットフォーム共に)は複数のサーバタイプ(SFTPからAmazon S3まで)を取り扱うアプリです。Promptはほぼ1つのタイプ: SSH(SFTPとほぼ同等)のみです。

Promptと他のアプリとで雪像情報を同期する場合、SSH/SFTPサーバだけを同期するか、すべてのサーバを同期するか、Promptだけをグレイアウトするかのいずれかになるでしょう。

お気に入りフォルダによってさらに複雑化します。お気に入りのサーバ設定をグループ化するために、フォルダで整理できるようになっています。PromptがSSH/SFTPサーバのみ同期する時、Transmitで様々なプロトコルのサーバ設定が含まれるフォルダが作成され、それが同期されるとPromptにもそのフォルダと、フォルダ内に含まれるSSH/SFTPサーバのみが同期されます。SSH/SFTPサーバがTransmitのお気に入りに含まれていない場合、Promptには中身が空のフォルダだけが同期されます(これは混乱します)。またそれにより、アプリ毎に表示される順序も異なってしまい、非常に複雑化してしまうでしょう。

このように一般的なケースで想定されるエクスペリエンスエクスペリエンスから、TransmitとCoda環境にPromptをどうミックスさせていくかを常に考えています。現在は上記の理由でこのような仕様となっています。