Apple PCC
Я тут розгриз блог-пост про епловський Private Cloud Compute, і, чесно кажучи, підхід до проблеми вражає. Якщо ви не в темі — Епл робить сервіс для Епл хоче мати сервіс, де вони залізно можуть сказати “це — дуже приватно”. Але ж якщо просто зробити сек’юрний та приватний сервіс, як це довести? Є кілька проблем з доведенням цього факту:
-
Конфігурацію сервера складно верифікувати зовні
-
Визначити, який софт відповідає в якості сервісу, складно
Що робити з адмінами, які можуть все споганити?
Вони використовують купу рішень, і вже існуючих, і нових, для того, щоб це забезпечити. Напишу все списком, бо так багато, що в тексті я сам почав заплутуватися:
Сильно звужений ланцюжок постачальників, щоби влізти в нього було дорожче і це було легше поміти.
Кожен сервер перед закриванням фоткається з високою роздільністю.
Коли сервер прибуває в датацентр, “we perform extensive revalidation” перед встановленням.
Для завантаження використовується Secure Boot, який завантажує тільки підписаний софт.
Інсталяція софта залишає записи десь? Це я так зрозумів фразу “approved for that specific PCC node”.
Що цікавіше, використовується Secure Enclave — так само як в айфонах. Забезпечує сек’юрність і незмінність розділу, де зберігається ОС та моделі. Стежить, щоби завантажений код неможливо було змінити чи підмінити під час виконання. Забороняє JIT, щоб новий код не виникав сам по собі.
Операційна система — це власне обрізана iOS/macOS, зі значно зменшеною поверхнею для атаки: наприклад, там немає ні ssh, ні будь-яких інших засобів віддаленого керування.
Увесь (новий) код написан на Swift’і, щоби не було питань із безпекою доступу до пам’яті.
Під час кожного завантаження Secure Enclave генерує новий випадковий ключ для шифрування диску (на який попадають користувацькі дані) і не зберігає цей ключ нікуди. Таким чином можна бути певним, що після перезавантаження дані на диску прочитати буде неможливо.
Окрім цього, кожен процес виконується у sandbox’і, з увімкненим Pointer Authentication Codes — це система, яка заважає підмінювати адреси функцій і адреси повернення (тобто крек для фотошопу в такому середовищі не спрацює 😁).
Після виконання дані стираються, а пам’ять, яка використовувалася для їх обробки, періодично очищається — щоб не залишалося якихось обривків тих самих даних.
Очевидно, e2e шифрування зробити неможливо — бо сервісу потрібно мати доступ до власне даних. Але кожен запис шифрується публічними (верифікованими під час виконання айфоном) ключами ноди PCC — таким чином жодна прокся/балансувальник їх прочитати не можуть. [Це вони https описали чи шо? Трохи не вистачає порівнянь із загально прийнятими практиками]
Всі запити проходять через незалежну OHTTP проксю, щоби епловські ноди не знали, від кого цей запит.
Ключі, доречі, не одні на всіх — перед власне запитом клієнт отримує від балансувальника вказівку, куди робити запит. Балансувальник при тому нічого не знає ні про клієнта, ні про характер його запиту — тому не може направляти упереджено.
Нагадаю, немає ssh чи ще чогось типу RDP — підписування коду і Secure Enclave теж завадили би запуску зайвого коду, але інтерактивний шел давав би значно більшу поверхню для атак на систему.
Інструментарій для спостереження за системою теж дуже обмежений. Скажімо, логи, які покидають машину, задаються заздалегідь, і проходять кілька рівнів незалежного рев’ю для апруву — де стежать, щоби в них не попадали користувацькі дані.
Кожен реліз софта для PCC публічний! Бінарна збірка мається на увазі, не джерельний код.
Клієнти шифрує свої запити за допомогою тільки тих сертифікатів, наявність яких можна перевірити у спеціальному публічному реєстрі релізів PCC.
Доповнюйте, якщо щось забув (або формулювання невдале) — пост трохи перенасичений повторенням одного і того самого з різних боків, тому я вже почав губитися і не певен, чи все цікаве перерахував. Але, як я вже сказав, масштабність підходу вражає.