Безпечно додайте хост (наприклад, GitHub) у файл відомих_хостів SSH


20

Як можна known_hostsбезпечно додати ключ хоста до файлу SSH ?

Я налаштовую розроблювальну машину, і хочу (наприклад) запобігти gitзапит, коли я клоную сховище від github.comвикористання SSH.

Я знаю, що можу використовувати StrictHostKeyChecking=no(наприклад, цю відповідь ), але це не є безпечним.

Поки що я знайшов ...

  1. GitHub публікує свої відбитки ключів SSH на https://help.github.com/articles/github-s-ssh-key-fingerprints/

  2. Я можу використовувати, ssh-keyscanщоб отримати ключ хоста для github.com.

Як я поєдную ці факти? З огляду на переповнений список відбитків пальців, як я можу перевірити, чи ssh-keyscanможна додати результат у known_hostsфайл?


Я думаю, я запитую наступне:

Як отримати відбиток пальця для ключа, який повернув ssh-keyscan?

Припустимо, що я вже був MITM-ed для SSH, але я можу довіряти сторінці GitHub HTTPS (тому що він має дійсний ланцюжок сертифікатів).

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


Пов’язано: як я хеш-хост частини виводу з ssh-keyscan? Або я можу змішувати хеш-хости / немиті хости known_hosts?


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

StrictHostKeyChecking=noє вразливим до MITM. Чи ssh-keyscanзахищено від MITM?
Роджер Ліпскомб

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

1
Оскільки це мій вихідний код у приватному репо на github, і я не хочу, щоб MITM (наприклад) вводив шкідливі зміни, коли я натискаю коміти. Це лише один приклад.
Роджер Ліпскомб

Я (на краще чи гірше) вирішу довіряти github. Я не хочу довіряти кожному випадковому мережевому зв’язку між мною та ними.
Роджер Ліпскомб

Відповіді:


12

Найважливішою частиною "надійного" додавання ключа до known_hostsфайлу є отримання ключового відбитка пальця від адміністратора сервера. Ключовий відбиток повинен виглядати приблизно так:

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

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

Встановлення ручного ключа

1) Візьміть копію ключа з сервера і отримайте його відбиток пальця. NB: Зробіть це перед тим, як перевірити відбиток пальця.

$ ssh-keyscan -t rsa github.com | tee github-key-temp | ssh-keygen -lf -
# github.com:22 SSH-2.0-babeld-f3847d63
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

2) Отримайте копію відбитка ключа від адміністратора сервера - у цьому випадку перейдіть на сторінку з інформацією на github.com

  1. Перейдіть на сайт github.com
  2. Перейдіть на сторінку довідки (у меню праворуч, якщо ви ввійшли; у нижній частині домашньої сторінки в іншому випадку).
  3. У розділі Початок роботи перейдіть до Підключення до GitHub із SSH
  4. Перейдіть на тестування свого SSH-з'єднання
  5. Скопіюйте відбиток пальця SHA256 з цієї сторінки у свій текстовий редактор для подальшого використання.

3) Порівняйте ключі з двох джерел

Розмістивши їх безпосередньо один над одним у текстовому редакторі, легко зрозуміти, чи щось змінилося

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA) #key recovered from github website
2048 SHA256:nThbg6kXUpJ3Gl7E1InsaspRomtxdcArLviKaEsTGY8 github.com (RSA) #key recovered with keyscan

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

Якщо ключі різні, скасуйте процедуру і зв’яжіться з експертом із безпеки

4) Якщо ключі порівняно правильно, то слід встановити ключ, який ви вже завантажили

cat github-key-temp >> ~/.ssh/known_hosts

Або встановити для всіх користувачів у системі (як root):

cat github-key-temp >> /etc/ssh/ssh_known_hosts

Автоматизована установка ключів

Якщо вам потрібно додати ключ під час процесу збирання, слід дотримуватися кроків 1-3 вище вручну.

Зробивши це, вивчіть вміст вашого github-key-tempфайлу і складіть сценарій, щоб додати цей вміст до відомого файлу хостів.

if ! grep github.com ~/.ssh/known_hosts > /dev/null
then
     echo "github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" >> ~/.ssh/known_hosts
fi

Тепер вам слід позбутися будь-яких sshкоманд, які StrictHostKeyCheckingвимкнулися.


17

Ви можете змішати хешовані / неприбрані записи у вашому файлі знаних_хостів.

Тож якщо ви хочете додати ключ github, ви можете просто зробити:

ssh-keyscan github.com >> ~/.ssh/known_hosts

Якщо ви хочете, щоб хеш був, додайте -Н

ssh-keyscan -H github.com >> ~/.ssh/known_hosts


1
Яка різниця між хешированими / немитими? Я знаю, що таке хешування, тільки не чому він застосовується в цьому контексті.
Глен Томас

3
Хеширование ваших записів дозволяє приховати інформацію про хостів, до яких ви використовуєте для підключення. Перевірте прийняту відповідь на security.stackexchange.com/questions/56268/…
Wee

4
Це не відповідає на запитання. Використання ssh-keyscan підпадає під час посередньої атаки, це означає, що ключ, який ви зберігаєте, може бути ключем, що належить зловмиснику, який намагається прорватися до вашої системи. Будь ласка, дивіться мою відповідь про спосіб перевірити речі.
Майкл

Att. Звернення уваги на відповіді, які завжди були невірними - "два найкращих відповіді насправді небезпечні"
Пітер Мортенсен

6

Найпростіший спосіб - це вручну отримати ключі за допомогою ssh-keyscan, перевірити їх вручну:

$ ssh-keyscan -t rsa github.com | ssh-keygen -lf -
# github.com:22 SSH-2.0-libssh-0.7.0
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

І додайте їх до свого сценарію, який потім матиме «авторитетний» відкритий ключ.


У мене є ключі, як ви сказали, як їх "додати до мого сценарію"?
Глен Томас

Або як окремий файл, або як рядок у вашому сценарії.
Jakuje

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

Att. Звернення уваги на відповіді, які завжди були невірними - "два найкращих відповіді насправді небезпечні"
Пітер Мортенсен

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