Зберігання секретів поза контролем джерел - ми просто переносимо проблему?


10

Я успадкував деякі проекти, в яких секрети були у керуванні джерелами в App.config та подібних файлах. На щастя, це не загальнодоступне сховище, тому ризик не такий серйозний, як міг би бути. Я розглядаю кращі способи управління цим, наприклад, Azure KeyVault. (Але я не збираюся, щоб це питання було специфічним для цього рішення.)

Загалом, чи не просто ми рухаємо проблему? Наприклад, за допомогою Azure KeyVault ідентифікатор програми та секрет програми стають речами, які вам потрібно не захищати від джерела. Ось на жаль типовий приклад того, як це має тенденцію піти не так. Інші підходи виявляються схожими з ключами API або файлами зберігання, які потрібно захистити.

Мені здається, що такі продукти, як Azure KeyVault, не є кращими і безглуздо складнішими, ніж зберігати свої секрети в окремому конфігураційному файлі і переконатися, що він знаходиться у вашому .gitignore або еквіваленті. Цей файл повинен бути наданий за потребою через бічний канал. Звичайно, люди, ймовірно, невпевнено посилають його один одному ...

Чи існує спосіб управління секретами, який не просто пересуває проблему? Я вважаю, що це питання має однозначну чітку відповідь. За аналогією, якби я запитав, як HTTPS не просто пересуває проблему, я відповів би, що ключі CA розповсюджуються у вашій ОС, і ми довіряємо їм, оскільки ми довіряємо способу розповсюдження ОС. (Чи варто нам це окреме питання ...)

Відповіді:


12

Можна сказати, що ви просто пересуваєте проблему. Зрештою, десь має зберігатися секрет, до якого у вашому додатку є доступ, щоб мати паролі, ssh-ключі та ін.

Але якщо все зроблено правильно, ви переносите проблему з кудись, що важко закріпити належним чином, до того, кого можна краще охороняти. Наприклад, розміщення секретів у загальнодоступних репортажах Github дуже схоже на те, щоб залишити ключі від будинку, приклеєні до вхідних дверей. Кожен, хто хоче їх, не матиме проблем з їх пошуком. Але якщо ви перейдете до, скажімо, магазину ключів у внутрішній мережі без зовнішнього підключення, ви маєте набагато кращі шанси захистити ваші паролі. Це більше схоже на зберігання ключів у кишені. Втратити їх неможливо (еквівалент видачі пароля Azure, наприклад,), але це обмежує експозицію порівняно з натисканням клавіш на двері.


4

Таємниці, такі як ключі шифрування та облікові дані, не слід перевіряти в контролі джерел з кількох причин. По-перше, очевидно, що ключі шифрування та облікові дані завжди повинні бути відомими, а керування джерелами не є надійним способом захисту інформації від розкриття. Інша причина, чому ви б не хотіли таких секретів у своєму джерелі управління, як правило, полягає в тому, що секрети зазвичай (але не завжди) специфічні для певного атрибуту середовища, в якому буде працювати ваша програма. (Наприклад, придбання приватного ключа для створення цифрового підпису, необхідного для авторизації веб-служби, конкретна кінцева точка цієї веб-служби може працювати в середовищі якості, що вимагає підпису якості).

Правильний спосіб поводження з навколишнім середовищем (або глобальною таємницею) - це поводження з ним, як і з будь-яким іншим атрибутом екологічної конфігурації, з додатковим контролем безпеки для хорошої міри. Добре розроблений, незалежний та надійний модуль коду повинен бути однаковим у різних середовищах, таким чином, щоб середовище, в яке вони розгорнуті, повідомляло програму про її атрибути (наприклад, деталі підключення до бази даних, облікові дані, кінцеві точки веб-служби, шляхи до файлів тощо). Тепер деталі конфігурації, важливі для вашої програми, зовнішні і стають параметрами конфігурації вашого середовища.

Тепер розглянемо деякі ваші аргументи:

Загалом, чи не просто ми рухаємо проблему?

Не існує такої ідеї, як ідеальна безпека, проте "переміщення" проблеми в область, де можуть бути встановлені додаткові заходи та контроль, покращить труднощі та зменшить ймовірність випадкового або зловмисного розкриття секретів. Хороше правило, яке слід дотримуватися при розробці системи, де конфіденційні дані повинні бути захищені, - це завжди ставити елементи керування в двійки. Що я маю на увазі під цим, це гарантувати, що для випадкового або зловмисного розкриття конфіденційної інформації або інциденту із безпекою сталося б тоді сталася помилка або два та більше контролю.

Хорошим прикладом цього може бути збереження зашифрованого файлу на сервері. У мене також є секретний ключ розшифровки, який я повинен зберігати в конфіденційності в іншому файлі.

  • Зберігайте ключ і зашифрований файл на одному сервері (0 елементів керування, будь-хто, хто має доступ до сервера, може тривіально отримати конфіденційну інформацію)
  • Виконайте наведені вище дії та захистіть доступ до файлів до обох файлів, щоб його можна було читати лише користувачеві програми, що виконує програму ОС (1 Керування, компрометація пароля кореневого користувача або користувач, що виконує програму, дозволить зловмиснику отримати конфіденційну інформацію)
  • Зберігайте ключ у сховищі зовнішніх ключів, придбайте ключ із кількома заходами безпеки, такими як білий список IP-адреси, автентифікація сертифікатів та інші заходи до програми, яка може отримати доступ до зашифрованого файлу у своїй файловій системі. (Для керування конфіденційними даними повинні виникати кілька елементів керування, кілька помилок контролю безпеки)

Знову ж таки, немає такої ідеї, як ідеальна безпека, але мета наявності декількох керуючих механізмів гарантує, що для розкриття необхідно мати кілька помилок.

Мені здається, що такі продукти, як Azure KeyVault, не є кращими і безглуздо складнішими,

Складне так, безглуздо є абсолютно суб'єктивним. Ми не можемо вести дискусію про безглуздість додаткової безпеки, не реально враховуючи, наскільки серйозним було б виявлення конфіденційних даних. Якщо хтось міг би використовувати конфіденційні дані для надсилання незаконних банківських переказів з вашої фінансової установи, то щось на зразок ключового сховища - це найдальше від безглуздого.

ніж зберігати свої секрети в окремому конфігураційному файлі та переконайтесь, що він знаходиться у вашому .gitignore чи еквіваленті.

Поки хтось випадково не перевірив це на контроль джерел, тепер секрет вбудований в історію управління джерелами назавжди.

Звичайно, люди, ймовірно, невпевнено посилають його один одному ...

Безпека - це не лише технічна проблема, це проблема людей. Це було б поза темою, але я відчуваю, що в цей момент ви намагаєтеся поговорити самі, не роблячи потреби.

Чи існує спосіб управління секретами, який не просто пересуває проблему? Я вважаю, що це питання має однозначну чітку відповідь. За аналогією, якби я запитав, як HTTPS не просто пересуває проблему, я відповів би, що ключі CA розповсюджуються у вашій ОС, і ми довіряємо їм, оскільки ми довіряємо способу розповсюдження ОС.

Безпека не завжди усуває проблеми, значну частину часу вона ставить під контроль. Ваша аналогія є короткою, тому що це саме те, що робить криптовалюта з публічно-приватним ключем. Ми «переносимо проблему» до КА, надаючи незмінну та повну довіру до нашого КА, щоб підтвердити особистість суб'єкта, який є державним партнером. В основному, нічого, крім катастрофічного ряду збоїв (наприклад, втрата довіри до CA), не повинно виникнути, щоб призвести до проблеми безпеки.

Як і для багатьох речей, безпека - це лінія, яку ви повинні провести на основі суб'єктивних критеріїв, характеру даних, наслідків розголошення, апетиту до ризику, бюджету тощо ...


0

Варто розглянути git secretпроект ( http://git-secret.io/ ), щоб зберегти секретні файли в git repo зашифрованим асиметричним ключем. Відкриті ключі також є в репо, приватний ключ немає.

Особливості такого підходу:

  • коли новому користувачеві / машині потрібно розшифрувати захищені файли - він публікує / надсилає свій відкритий ключ gpg (gnu Privacy Privacy aka pgp). Користувач, який вже може розшифровувати захищені файли, може повторно зашифрувати їх новим додатковим ключем - після цього новий користувач може розшифрувати захищені файли своїм приватним ключем.
  • Очевидно, вам потрібно контролювати, хто може здійснювати / надсилати до сховища git. В іншому випадку зловмисник може ввести власний відкритий ключ і чекати, поки хтось уповноважений перезашифрує захищені файли цим новим компрометованим відкритим ключем.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.