Наскільки погано мати кілька пристроїв з однаковими ключами сервера SSH?


21

Я працюю над вбудованим пристроєм, який працює на FreeBSD та SSH.

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

Мої два варіанти, як я їх бачу, це:

  • Відправте однакові ключі сервера sshd на всі пристрої
  • Встановіть файлову систему пам'яті та генеруйте серверні ключі на кожному завантаженні (повільно ...)

Чи є основною проблемою безпеки перевезення однакових ключів сервера на всі пристрої? Ці елементи не будуть безпосередньо в Інтернеті. Іноді буде кілька пристроїв, які належать одній особі та в одній мережі.

Більшу частину часу пристрій не буде підключено до Інтернету.

Вхід за допомогою SSH не є частиною звичайної роботи. Це здебільшого для зручності програмістів і техніків. Клієнти не будуть входити на пристрій за допомогою SSH.

Які наслідки використання одних і тих же ключів сервера на кількох апаратних пристроях?

PS може хтось, будь ласка, створити тег "Інтернет-речі"?

EDIT : Я говорю про встановлення однакових приватних ключів хоста на всіх серверах (пристроях). Що стосується публічних / приватних ключів користувача, наразі не планується використовувати вхід на основі ключів - це було б вхід до пароля. І знову той самий пароль на всіх серверах (пристроях).

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


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

Я говорю про встановлення одного і того ж приватного ключа хоста на всіх серверах, якщо ви це маєте на увазі.
NXT

2
Використання однакового імені користувача / пароля на всіх пристроях - дуже погана ідея. Це набагато простіше, ніж приватний ключ, який використовується для аутентифікації відкритого ключа. Навіть якщо цих неправомірних людей не має бути безпосередньо підключено до Інтернету, хтось все одно це зробить. І якщо "не підключено безпосередньо" означає NAT, вони підключені досить ...
Tero Kilkanen

7
Спільний доступ до ключа SSH означає, що той, хто може отримати доступ до приватного ключа на одному пристрої, може представити себе за всі ці пристрої.
користувач253751

3
Хоча це цікаве питання, я нічого не бачу в цьому, що стосується системного адміністрування, і, таким чином, поза темою для серверної помилки. Ви запитуєте про те, як створити інтерфейс налагодження / діагностики для вбудованого пристрою, який ви постачаєте, а не інтерфейсу, який би стосувався sysadmins. Це питання може бути перенесено до інформаційної безпеки .
200_успіх

Відповіді:


27

Замість того, щоб зберігати специфічні для хоста дані, такі як ключі хостів ssh на SD-картці або інших носіях, доступних лише для читання, ви можете зберігати це в NVRAM, для чого це потрібно для вбудованої системи. Вам потрібно буде зробити деякі спеціальні сценарії для зберігання та отримання ключів під час завантаження, але сценарії будуть точно однакові для кожного пристрою.


12

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

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

Для довідки man ssh(1):

sshавтоматично підтримує та перевіряє базу даних, що містить ідентифікацію для всіх хостів, з якими коли-небудь використовувався. Ключі хоста зберігаються в ~/.ssh/known_hostsдомашньому каталозі користувача. Крім того, файл /etc/ssh/ssh_known_hostsавтоматично перевіряється на відомі хости. Будь-які нові хости автоматично додаються у файл користувача. Якщо ідентифікація хоста колись змінюється, sshпопереджає про це та відключає автентифікацію пароля, щоб запобігти підробці серверів або атакам "людина-в-середині", які в іншому випадку можуть бути використані для обходу шифрування. Ця StrictHostKeyCheckingопція може використовуватися для управління входами на машини, чий ключ хоста не відомий або змінився.


2
Я не розумію, чому вони не можуть просто генерувати один раз (на кожному пристрої під час першого завантаження), а потім ніколи не генерувати знову (якщо їх не видалити)?
djsmiley2k - Корова

Ідеально під силу. Але ОП заявляє, що він / вона хоче: «Змонтувати файлову систему пам'яті та генерувати серверні ключі на кожному завантаженні». Тож моя відповідь передбачає це.
dawud

ага, я пропустив це, коли прочитав це вперше.
djsmiley2k - Корова

5

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

Це дозволить атакувати людиною посередині, як-от наступні:

  1. Користувач встановлює SSH-сервер із приватними ключами, отриманими від вашого пристрою, і передає цю IP-адресу вашому техніку.
  2. Ваш технік вводить пароль root через SSH-з'єднання.
  3. Користувач тепер знає кореневий пароль, який дійсний для всіх ваших пристроїв.

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

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


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

WRT №2, кореневий пароль не повинен надсилатися через SSH-з'єднання. Він повинен бути введений в клієнт-термінал і використаний для локальної половини протоколу аутентифікації, який доводить володіння секретом без передачі секрету ("підтвердження знань"). Навіть десятирічні системи знали, що надсилати хеш пароля, а не сам пароль. Включіть в протокол виклику / відповіді жодне слово, і зловмисник не знає ні оригінального пароля, ні жодного маркера, який може бути використаний замість нього.
Бен Войгт

1
@BenVoigt Я думаю, що більшість систем Unix передають пароль серверу. Тіньовий файл зберігає лише хеш, але ви не хочете довіряти хешу, згенерованому клієнтом - адже в іншому випадку будь-хто зможе увійти в систему з викраденим хешем, не повертаючи його. Отже, сервер повинен знати власне пароль, щоб запустити на ньому bcrypt або подібне.
jpa

2

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

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


1
Не могли б ви пояснити, як зловмисник використовує приватний ключ викраденого сервера для компрометації інших пристроїв?
jpa

@jpa: для ключів хоста, перехоплення та викрадення паролів тощо. Також, схоже, ця установка пропонує зробити те ж саме з ключами користувача.
Джошудсон

1

Оскільки ви згадуєте, що SSH-доступ не використовується кінцевим користувачем / замовником, ви можете вимкнути доступ SSH за замовчуванням і ввімкнути його лише тимчасово, коли пристрій переведено в режим "налагодження".

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

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


Мені подобається ця ідея.
NXT

1

Ось зразок сценарію атаки на основі обмежень:

Якщо ваші пристрої є, скажімо, наприклад, Raspberry Pi. Якщо я піднімаюсь і дістаю SD-карту з однієї, я можу вставити SD-карту на свій власний комп’ютер, знайти ключ sshd та скопіювати його куди завгодно. Можливо, я захоплюю свою власну малинову пі та карту USB Ethernet. Тепер я можу це вставити між цільовим пристроєм і де б вони не збиралися, і стежити за наявністю ssh-з'єднань. Коли я бачу, що цільовий пристрій намагається встановити ssh-з'єднання, я роблю це:

(target) <---> (my evil sshd <--> decrypted traffic <--> ssh) <---> (real server)
                                       |
                                       V
                                    log file

О, що це? Ваш пароль "Мені подобаються коти"? Хлопчик, це цікавий електронний лист, який ви надіслали дружині. Гадаю, що було б ще цікавіше, якби вона прочитала цей електронний лист, який ви надіслали дружині сусідніх сусідів.

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

Натомість зробіть те, що ви вже пропонуєте, але виправте це . Перед тим, як написати своє зображення, запустіть щось подібне:

ssh-keygen -f some-new-server
cp some-new-server /path/to/the/mounted/image/sshd/key
cp some-new-server.pub /path/to/the/mounted/image/sshd/key.pub

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


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