Де зберігати приватний ключ?


22

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

Однак якщо я шифрую якийсь чіткий текст, то де я зберігаю ключ? До всього, до чого програмне забезпечення має доступ, визначений зловмисник мав би доступ, незалежно від рівня затухання:

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

Криптографія є настільки ж сильною, як і найслабша ланка у її ланцюжку, і це здається досить пухким! Якщо припустити, що це правильний інструмент для роботи (я жартівте мене), то як можна надійно захищати таку інформацію?


Щодо правильного інструменту для роботи: Мабуть, у прикладі, наприклад, у випадку доступу до сервісу (БД, сервери аутентифікації тощо), ви обмежили б доступ до цього рівня за допомогою облікового запису служби, можливо, з деяким рівнем обслуговування. аудит і т. д., і тому наявність повноважень у чіткому тексті не є такою проблемою.

Мені, однак, це все ще здається неадекватним: я не хочу, щоб хтось кидався туди, де не повинен бути!


6
Ви можете знайти різні посади в Security.SE представляти інтерес. Зауважу, що деякі рамки та мови надають спеціалізовану підтримку для цього (наприклад, зашифровані розділи конфігурації у .net).
Брайан

9
на жаль, проти "шкідливих суперпользователей" не дуже багато. Оскільки ваше програмне забезпечення потребує доступу до ключів, так і будь-який суперпользователь, оскільки він може змінювати / обходити майже будь-який ACL, який ви можете встановити.
DXM

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

2
Відповідь Амона не обмежується користувачем, а будь-яким клієнтом. DXM також підкреслює те, що ви не можете захистити свою систему від того, хто хоче її втручатися, і ви не повинні витрачати енергію, щоб ускладнити їм це. Замість цього витрачайте енергію на продукт, щоб вони не мали інтересу до цього
Кевін

3
Найкраще, що ви можете зробити щодо зловмисних клієнтів, - це обмежити їх на чітко визначений сервісний API, не надаючи їм прямого доступу до db. Ви нічого не можете зробити поза цим, оскільки не можете приховати секрет у клієнті.
CodesInChaos

Відповіді:


25

Перш за все, я б не відносився до себе як до експерта з питань безпеки, але мені довелося відповісти на це питання. Те, що я з’ясував, трохи мене здивувало: Не існує такої речі, як повністю захищена система . Ну, я думаю, цілком захищена система була б такою, де всі сервери вимкнено :)

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

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

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

Скажіть, ключ захищений моделлю захисту файлової системи; а як щодо (зловмисних) супер-серверів або платформ, які не забезпечують такої вірності?

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

Або ключ твердо закодований у бінарні програми, але його завжди можна декомпілювати, а що з програмним забезпеченням з відкритим кодом чи інтерпретованим кодом?

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

Якщо ключ генерується, такий алгоритм повинен бути детермінованим (імовірно), і тоді ця сама проблема стосується і початкових даних.

Так, по суті тоді алгоритм стає інформацією приватного ключа для створення приватного ключа. Отже, це потрібно було б зараз захистити.

Отже, я думаю, ви визначили основну проблему з будь-якою політикою безпеки, управлінням ключами . Встановлення ключової політики управління є ключовим для забезпечення захищеної системи. І, це досить широка тема .

Отже, питання полягає в тому, наскільки безпечною повинна бути ваша система (а отже, і приватний ключ)? Наскільки високо у вашій системі потрібно підняти планку?

Тепер, якщо ви готові платити, там є люди, які виробляють рішення для цього. Ми закінчилися за допомогою HSM (Hardware Security Module) . Це, в основному, захист від несанкціонованого захисту, який містить ключ апаратного забезпечення. Потім цей ключ можна використовувати для створення інших ключів, які використовуються для шифрування. Ідея тут полягає в тому, що (якщо налаштовано правильно), ключ ніколи не залишає HSM. HSM коштують багато . Але в деяких підприємствах (захист даних кредитних карток дозволяє сказати) вартість порушення значно вище. Отже, є баланс.

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

Можливо, там є програмні рішення, які надають аналогічні функції HSM, але я не знаю, що вони є.

Я знаю, що це лише певним чином відповідає на питання, але я сподіваюся, що це допомагає.


2
"Ну, я думаю, повністю захищена система була б такою, де сервери вимкнено", і не існує способу їх включення.
StingyJack

2

Те, що ви хочете, не може зробити.

Скажіть, ключ захищений моделлю захисту файлової системи; а як щодо (зловмисних) супер-серверів або платформ, які не забезпечують такої вірності?

Ви в основному хочете, щоб захист від людей, які стають шкідливими. У вашій моделі в якийсь момент хтось матиме доступ до ключа. Що робити, якщо ця людина зловмисна? Що робити, якщо ВИ зловмисні? Розумієте, проблема, яку ви заявляєте, нерозв'язна, за винятком того, що вона взагалі не має ключа.

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


2

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

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

Простий приклад - це, як ви вже згадували, дані бази даних. Очевидно, ви хочете, щоб ваш клієнт мав доступ до нього, але не будь-який випадковий Інтернет-незнайомець, тому вам потрібна якась система посвідчення / підтвердження / входу. Але основна передумова цього приховувати - це проблема: якщо сам користувач повинен володіти секретом, але ви не хочете, щоб вони знали, що це за секрет, все, що ви можете зробити, це приховати його або змусити їх відкрити " таємний пакет ". Але вони все ще можуть з’ясувати, тому вам краще скласти резервний план!

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

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

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

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

У справжньому криптографічному / захисному контекстах "керування ключами" відповідь "де зберігати приватний ключ" - "десь ще!" Шифрування - це захист від точки до точки, а шифрування публічно-приватного ключа призначене для захисту інформації, яка перебуває в дорозі через час та простір. Приватний ключ за своєю суттю є вразливим, і його захист насправді не є питанням перекриття шифрування - це захист його від доступу повністю. І якщо Система повинна отримати доступ до неї, то сама Система повинна бути захищена - і цього не можна робити на клієнтській машині. Вони завжди можуть запустити VM, скинути оперативну пам’ять, обнюхати їх мережевий трафік, встановити проксі або віртуальний NIC, декомпілювати виконавчі файли ... не вступати добровільно в цю програшну битву.

Тепер, якщо вам потрібно зробити щось на кшталт DRM, де ваша потреба зберігати секрет насправді заснована на контролі використання самого програмного забезпечення, це зовсім інша ситуація .


TLDR: Не зберігайте секрети від користувача, зберігайте секрети з користувачем.


1

Один із систем, якими я зараз користуюся, працює таким чином.

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

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

В основному, якщо у вас є зловмисний супервайзер, усі ставки вимкнено. І ви повинні припустити наявність зловмисного суперпоширення у вашій моделі загроз.

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

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


-1

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

Іншим способом може бути, щоб система безпеки була обліковим записом бази даних сама. Не дуже масштабований ...

Якщо кожен користувач у системі має свій власний обліковий запис БД, і ці облікові записи попередньо виготовлені так, що програма не має прав на створення облікових записів у БД від імені користувача, ви могли б підійти досить близько. Не є гарним рішенням, тому, мабуть, вам доведеться мати дуже обмежений доступ для читання в config-файлах і довіряти вашим супер-користувачам.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.