> Какие подходы по обеспечению безопасности мобильного приложения и инфраструктуры применить (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Московская биржа

Стек: iOS, Swift

> Пример ответа

Короткий ответ

Основные подходы: защита данных на устройстве (Keychain, шифрование, Secure Enclave), безопасность сети (TLS, certificate pinning, защита от MITM), защита кода (обфускация, jailbreak-детекция), безопасность аутентификации (biometrics, multi-factor), безопасность бэкенда (OAuth 2.0, rate limiting, валидация входных данных) и мониторинг угроз (runtime protection, логирование, реагирование на инциденты). Также важно соблюдать принципы минимальных привилегий и регулярно обновлять зависимости.

Подробное объяснение

Безопасность мобильного приложения охватывает несколько уровней:

На устройстве:

  • Keychain для хранения чувствительных данных (токены, пароли) - данные шифруются и привязаны к устройству
  • Шифрование файлов через Data Protection API (NSFileProtectionComplete)
  • Secure Enclave для биометрических операций и криптографических ключей
  • Ограничение доступа к данным через App Sandbox

В сети:

  • TLS 1.2+ с правильной валидацией сертификатов
  • Certificate pinning для защиты от MITM-атак
  • Подпись запросов (HMAC) и защита от replay-атак
  • Минимизация передачи чувствительных данных

В коде:

  • Обфускация и шифрование строк
  • Jailbreak/root-детекция с graceful degradation
  • Защита от reverse engineering (например, через LLVM Obfuscator)
  • Проверка целостности кода (code signing, runtime integrity checks)

Аутентификация и авторизация:

  • OAuth 2.0 / OpenID Connect с короткоживущими токенами
  • Biometric authentication (Face ID / Touch ID) через LocalAuthentication
  • Multi-factor authentication для критичных операций
  • Server-side session management с revocation

Инфраструктура:

  • HTTPS-only, HSTS
  • Rate limiting и защита от brute-force
  • Валидация и санитизация входных данных на сервере
  • Мониторинг и логирование подозрительной активности
  • Регулярные security audits и penetration testing

На практике

Для senior-уровня важно не просто перечислить подходы, а показать понимание trade-off между безопасностью и UX. Например, слишком агрессивная jailbreak-детекция может оттолкнуть пользователей, а certificate pinning усложняет отладку и обновление сертификатов.

Практические шаги:

  1. Начать с threat modeling - определить, какие данные критичны и какие атаки наиболее вероятны
  2. Использовать системные механизмы (Keychain, Secure Enclave) вместо собственной криптографии
  3. Настроить certificate pinning с возможностью быстрой ротации через remote config
  4. Внедрить runtime protection (например, проверка integrity через SecTaskCopyValueForEntitlement)
  5. Автоматизировать проверки безопасности в CI/CD (SAST, dependency scanning)
  6. Обеспечить безопасное хранение секретов - не в коде, а через environment или secure vault

Пример кода

SWIFT
// Пример безопасного хранения токена в Keychain
import Security
func saveToken(_ token: String, forKey key: String) {
let data = Data(token.utf8)
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecValueData as String: data,
kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]
SecItemDelete(query as CFDictionary)
SecItemAdd(query as CFDictionary, nil)
}
// Пример certificate pinning с URLSession
class PinnedURLSessionDelegate: NSObject, URLSessionDelegate {
func urlSession(_ session: URLSession,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust,
let serverTrust = challenge.protectionSpace.serverTrust else {
completionHandler(.cancelAuthenticationChallenge, nil)
return
}
// Проверка pinned certificate
if let pinnedCert = SecCertificateCreateWithData(nil, pinnedCertData as CFData),
SecTrustEvaluateWithError(serverTrust, nil),
SecTrustGetCertificateCount(serverTrust) > 0,
let serverCert = SecTrustGetCertificateAtIndex(serverTrust, 0),
CFEqual(serverCert, pinnedCert) {
completionHandler(.useCredential, URLCredential(trust: serverTrust))
} else {
completionHandler(.cancelAuthenticationChallenge, nil)
}
}
}

Как отвечать на собеседовании

Начните с краткого обзора уровней безопасности, затем углубитесь в конкретные решения. Покажите, что понимаете, как атаки выглядят на практике: например, объясните, как работает MITM и почему certificate pinning эффективен, или как jailbreak-детекция может быть обойдена и почему не стоит полагаться только на неё.

Обязательно упомяните, что безопасность - это процесс, а не разовая задача: регулярные обновления, мониторинг, реагирование на уязвимости. Приведите пример из своего опыта, где вы сталкивались с реальной угрозой и как её решали.

Что проверяет интервьюер

  • Глубину понимания угроз и векторов атак
  • Знание системных механизмов iOS (Keychain, Secure Enclave, Data Protection)
  • Умение балансировать между безопасностью и удобством
  • Практический опыт внедрения защитных мер
  • Понимание инфраструктурной безопасности (не только клиентской части)
  • Способность мыслить системно: от threat modeling до мониторинга

Типичные ошибки

  • Перечисление подходов без объяснения, зачем они нужны и как работают
  • Слепое доверие к jailbreak-детекции как единственной защите
  • Хранение секретов в коде или UserDefaults
  • Игнорирование серверной безопасности - только клиентская часть
  • Отсутствие плана реагирования на инциденты
  • Чрезмерная безопасность, которая ломает UX без реальной необходимости
  • Непонимание, что certificate pinning требует механизма обновления сертификатов

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью