Index
アプリ外に保存されている機密データはありません
説明
ユーザーの資格情報、セッショントークン、PII などの機密データの適切な保存を保証するため、機密データはアプリケーションコンテナまたはシステムの資格情報ストレージの外部に保存してはなりません。
機密データは、安全ではない IPC メカニズムを通じて公開されたり、クラウドストレージ、バックアップ、またはキーボードキャッシュに意図せず漏洩したりする可能性があります。したがって、モバイルデバイスの紛失や盗難のリスクには、物理的アクセスのシナリオを考慮する必要があります。
推奨事項
iOS
iOS では、開発者は iOS Data Protection API を活用して機密データを保護できます。この API は、Secure Enclave Processor (SEP) に依存して、安全な暗号化処理と鍵管理を提供します。
ファイルには、さまざまなレベルの保護を提供する保護クラスを割り当てることができます。
-
完全な保護 (
NSFileProtectionComplete): ユーザーのパスコードとデバイス UID から派生した鍵が、このクラス鍵を保護します。派生鍵は、デバイスがロックされた直後にメモリから消去されるため、ユーザーがデバイスのロックを解除するまでデータにアクセスできなくなります。 -
開いていない限り保護 (
NSFileProtectionCompleteUnlessOpen): この保護クラスは完全な保護に似ていますが、ロック解除時にファイルが開かれている場合、ユーザーがデバイスをロックしてもアプリはファイルにアクセスし続けることができます。この保護クラスは、たとえば、メールの添付ファイルがバックグラウンドでダウンロードされている場合に使用されます。 -
最初のユーザー認証まで保護 (
NSFileProtectionCompleteUntilFirstUserAuthentication): 起動後、ユーザーが初めてデバイスのロックを解除するとすぐにファイルにアクセスできます。その後ユーザーがデバイスをロックし、クラス鍵がメモリから削除されない場合でもアクセスできます。 -
保護なし (
NSFileProtectionNone): この保護クラスの鍵は UID のみで保護されます。クラス鍵は「Effaceable Storage(消去可能なストレージ)」に保存されます。これは、少量のデータを保存できる iOS デバイスのフラッシュメモリの領域です。この保護クラスは、高速なリモートワイプ(クラス鍵を即座に削除し、データにアクセスできなくする)のために存在します。
NSFileProtectionNone を除くすべてのクラス鍵は、デバイス UID とユーザーのパスコードから派生した鍵で暗号化されます。
その結果、復号はデバイス自体でのみ可能であり、正しいパスコードが必要です。
iOS 7 以降、デフォルトのデータ保護クラスは「最初のユーザー認証まで保護」です。
Keychain には、暗号化鍵やセッショントークンなどの小さなデータを保存することもできます。Keychain へのアクセスは、次のようなカスタム API を使用して行われます。
SecItemAddSecItemUpdateSecItemCopyMatchingSecItemDelete
Keychain に保存されたデータは、ファイル暗号化に使用されるクラス構造に似たクラス構造を介して保護されます。Keychain に追加されたアイテムはバイナリ plist としてエンコードされ、Galois/Counter Mode (GCM) でアイテムごとに 128 ビットの AES 鍵で暗号化されます。大きなデータのブロックは Keychain に直接保存することを目的としていないことに注意してください。それが Data Protection API の目的です。SecItemAdd または SecItemUpdate の呼び出しで kSecAttrAccessible 鍵を設定することにより、Keychain アイテムのデータ保護を構成できます。
次の構成可能な kSecAttrAccessible のアクセシビリティ値 は、Keychain データ保護クラスです。
kSecAttrAccessibleAlways: デバイスがロックされているかどうかに関係なく、Keychain アイテムのデータには常にアクセスできます。kSecAttrAccessibleAlwaysThisDeviceOnly: デバイスがロックされているかどうかに関係なく、Keychain アイテムのデータには常にアクセスできます。データは iCloud またはローカルバックアップに含まれません。kSecAttrAccessibleAfterFirstUnlock: ユーザーがデバイスのロックを解除するまで、再起動後は Keychain アイテムのデータにアクセスできません。kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly: デバイスがユーザーによって 1 回ロック解除されるまで、再起動後は Keychain アイテムのデータにアクセスできません。この属性を持つアイテムは新しいデバイスに移行されません。したがって、別のデバイスのバックアップから復元した後、これらのアイテムは存在しません。kSecAttrAccessibleWhenUnlocked: ユーザーがデバイスのロックを解除している間のみ、Keychain アイテムのデータにアクセスできます。kSecAttrAccessibleWhenUnlockedThisDeviceOnly: ユーザーがデバイスのロックを解除している間のみ、Keychain アイテムのデータにアクセスできます。データは iCloud またはローカルバックアップに含まれません。kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly: デバイスのロックが解除されている場合にのみ、Keychain のデータにアクセスできます。この保護クラスは、デバイスにパスコードが設定されている場合にのみ使用できます。データは iCloud またはローカルバックアップに含まれません。
AccessControlFlags は、ユーザーが鍵を認証できるメカニズムを定義します (SecAccessControlCreateFlags)。
kSecAccessControlDevicePasscode: パスコードを介してアイテムにアクセスします。kSecAccessControlBiometryAny: Touch ID に登録された指紋の 1 つを介してアイテムにアクセスします。指紋を追加または削除しても、アイテムは無効になりません。kSecAccessControlBiometryCurrentSet: Touch ID に登録された指紋の 1 つを介してアイテムにアクセスします。指紋を追加または削除すると、アイテムは_無効_になります。kSecAccessControlUserPresence: 登録された指紋のいずれか(Touch ID を使用)を介してアイテムにアクセスするか、デフォルトでパスコードにアクセスします。
Android
Android では、開発者は Shared Preferences、SQLite、内部および外部ストレージなどのデータを保存するいくつかの機能を活用できますが、ログ、バックアップ、キャッシュなどのメカニズムを通じてデータを漏洩する可能性もあります。
Shared Preference は、誰でも読み取り可能な権限で宣言できる、データストレージに一般的に使用される API です。Shared Preferences API を安全ではない方法で使用すると、データが公開される可能性があります。
SQLite はデータを保存するためのもう 1 つの一般的な形式であり、暗号化されていません。開発者は、データプライバシーの向上を提供する SQLCipher などの暗号化された代替手段を優先する必要があります。
内部ストレージはデフォルトでコンテナ化されており、デバイス上の他のアプリケーションからアクセスすることはできません。ただし、安全ではないモード MODE_WORLD_READABLE および MODE_WORLD_WRITEABLE を設定することは可能ですが、どちらも非推奨になっています。
外部ストレージは誰でも読み取り可能であり、機密データの保存に使用してはなりません。アプリケーションコンテナ /data/data/<package-name> の外に保存されたデータは、アプリケーションが削除されても削除されないことに注意することが重要です。
Android KeyStore と KeyChain は安全なデータストレージを提供します。KeyStore は公開鍵を使用して暗号化シークレットを作成し、データを暗号化します。KeyChain はシステム全体の秘密鍵を保存するために使用され、ユーザーは PIN またはパスワードを設定する必要があります。
リンク
標準
- HIPAA_CONTROLS:
- SECURITY251
- SECURITY212
- SECURITY213