Реалізація контейнеризації корпоративних даних у мобільному додатку
Контейнеризація даних на мобільному—архітектурний принцип: корпоративні дані ізольовані від особистих та інших додатків, зашифровані незалежним ключем, доступ захищений окремою аутентифікацією. Не Docker-контейнери—data container на рівні мобільної ОС.
Платформенні механізми контейнеризації
iOS: Keychain Access Groups + Data Protection API. Keychain-записи з спільною accessGroup доступні кільком додаткам одного вендора—базовий механізм шеринга секретів. Для ізоляції наоборот: кожний додаток має власну Keychain секцію, недоступну без явної Access Group.
Data Protection класи визначають, коли дані розшифровуються:
// Файл доступний лише при розблокованому пристрої
let attrs: [FileAttributeKey: Any] = [
.protectionKey: FileProtectionType.complete
]
try FileManager.default.setAttributes(attrs, ofItemAtPath: filePath)
// Для Keychain-записів
let query: [String: Any] = [
kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]
kSecAttrAccessibleWhenUnlockedThisDeviceOnly—ключ привязаний до пристрою (не переноситься в iCloud Backup) та доступний лише при розблокованому екрані. Для корпоративних даних—мінімально достатній рівень захисту.
Android: Work Profile + EncryptedSharedPreferences + Keystore. Work Profile створює ізольований user space з окремим екземпляром Keystore. EncryptedSharedPreferences шифрує ключі та значення через бібліотеку Tink:
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val sharedPreferences = EncryptedSharedPreferences.create(
context,
"corporate_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
Для файлів—EncryptedFile із androidx.security:security-crypto:
val encryptedFile = EncryptedFile.Builder(
context,
File(context.filesDir, "corporate_document.enc"),
masterKey,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()
encryptedFile.openFileOutput().use { output ->
output.write(corporateData)
}
Ізоляція на рівні мережі
Корпоративні дані не повинні утікати через особисті мережні канали. Реалізація через per-app VPN:
-
iOS:
NEAppProxyProvider+ MDM-конфігурація. MDM призначає VPN конкретному bundle ID. Трафік цього додатка йде через корпоративний VPN, особистих додатків—напрямки. -
Android:
VpnServiceзallowedApplicationsуVpnProfile. Лише перелічені пакети туннелюються.
Без per-app VPN альтернатива—NSURLSession з URLSessionConfiguration.ephemeral та принудовими Corporate Proxy налаштуваннями через ProxyDictionary.
Контейнер для файлів: власна реалізація
Для додатків із вимогою повного контролю над шифруванням (фінансові, медичні) іноді потрібен власний файловий контейнер—аналог VeraCrypt-тому на мобільному рівні.
Спрощена архітектура:
container.vault
├── header (256 bytes): версія, salt, PBKDF2 params, iv
├── index.enc: CBOR-маніфест (ім'я, розмір, offset, per-file iv)
└── data.blob: конкатенація зашифрованих файлів (AES-256-GCM, per-file key)
Мастер-ключ деривується з біометрії через LAContext.evaluatePolicy + Keychain-зв'язка. Без біометрії—хеш пароля через Argon2. Контейнер відкривається при авторизації, закривається при applicationWillResignActive.
Захист від утечки через буфер обмену
UIPasteboard.general—глобальний, читається будь-яким додатком. Для корпоративних даних використовуємо UIPasteboard.withUniqueName()—приватний буфер з TTL:
let privatePasteboard = UIPasteboard.withUniqueName()
privatePasteboard.setData(corporateData, forPasteboardType: UTType.plainText.identifier)
privatePasteboard.setPersistent(false)
// Автоматично видаляється при наступному запуску або через TTL
На Android: ClipboardManager глобален до Android 10. З Android 10 додатки можуть читати clipboard лише у foreground—обмежує атаку. Додатково: очищуємо буфер при onPause якщо в нього була скопійована чутлива інформація.
Етапи роботи
Аналіз даних та рівнів чутливості → проектування схеми зберігання → реалізація encrypted storage (Keychain + EncryptedFile) → per-app VPN конфігурація → clipboard protection → тестування ізоляції (спроби прочитати дані з іншого додатка, з backup) → security audit → деплой.
Терміни: реалізація encrypted storage з Keychain/Keystore—3–4 тижні. Повний контейнер з per-app VPN, clipboard protection та security audit—8–12 тижнів. Вартість розраховується індивідуально.







