Введение
SSH (Secure Shell) ключи — это безопасный способ аутентификации на удаленных серверах, предлагающий более надежную альтернативу входу по паролю. Для повышения безопасности приватный SSH-ключ может быть зашифрован с помощью кодовой фразы (passphrase). Если злоумышленник получит доступ к вашему файлу приватного ключа, ему все равно потребуется кодовая фраза для его использования.
Однако слабая кодовая фраза может стать серьезной уязвимостью. В этой лабораторной работе вы выступите в роли аналитика по безопасности, чтобы понять этот риск. Вы научитесь использовать John the Ripper, мощный инструмент с открытым исходным кодом для взлома паролей, для взлома кодовой фразы приватного SSH-ключа. Это упражнение проводится в образовательных целях, чтобы подчеркнуть важность использования надежных кодовых фраз.
Создание приватного SSH-ключа с защитой паролем
На этом шаге вы сгенерируете новую пару SSH-ключей. Приватный ключ будет защищен простой, легко угадываемой кодовой фразой. Этот ключ послужит целью для нашего упражнения по взлому на последующих этапах.
Для создания ключа мы будем использовать команду ssh-keygen. Мы укажем тип ключа, размер в битах и имя файла, чтобы гарантировать его создание в каталоге нашего проекта.
Выполните следующую команду для генерации пары RSA SSH-ключей. Когда будет предложено ввести кодовую фразу, введите labex.
ssh-keygen -t rsa -b 2048 -f ./my_ssh_key -C "labex@labex.io"
Вам будет предложено ввести и подтвердить кодовую фразу. Введите labex и нажмите Enter для обоих запросов.
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): labex
Enter same passphrase again: labex
Your identification has been saved in ./my_ssh_key
Your public key has been saved in ./my_ssh_key.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx labex@labex.io
The key's randomart image is:
+---[RSA 2048]----+
| . |
| . . |
| . . |
| . . . . |
| . . S . |
| . . . o |
| . . . + . |
| . . . =.o.o |
|.. .oo*+E+ |
+----[SHA256]-----+
Теперь выведите список файлов в текущем каталоге, чтобы увидеть только что созданную пару ключей: приватный ключ my_ssh_key и публичный ключ my_ssh_key.pub.
ls -l
total 12
-rw------- 1 labex labex 1823 Jan 01 12:00 my_ssh_key
-rw-r--r-- 1 labex labex 401 Jan 01 12:00 my_ssh_key.pub
-rw-r--r-- 1 labex labex 48 Jan 01 12:00 wordlist.txt
Вы успешно создали приватный SSH-ключ с защитой паролем.
Извлечение хеша из SSH-ключа с помощью ssh2john
John the Ripper не может работать напрямую с форматом файла SSH-ключа. Ему требуется определенный формат хеша, представляющий зашифрованную кодовую фразу. Чтобы получить этот хеш, мы будем использовать утилиту под названием ssh2john, которая входит в состав пакета John the Ripper.
На этом шаге вы запустите ssh2john на приватном ключе, который вы создали (my_ssh_key), и сохраните его вывод в новый файл. Этот файл будет содержать хеш, который john затем сможет попытаться взломать.
Выполните следующую команду, чтобы извлечь хеш и сохранить его в файл с именем ssh_hash.txt:
ssh2john my_ssh_key > ssh_hash.txt
Эта команда не выводит ничего в терминал, потому что мы перенаправили вывод в файл ssh_hash.txt с помощью оператора >.
Чтобы увидеть содержимое сгенерированного файла хеша, используйте команду cat:
cat ssh_hash.txt
Вы увидите длинную строку текста, которая является хеш-представлением кодовой фразы вашего ключа. Она будет выглядеть примерно так:
my_ssh_key:$ssh2$0$16$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$1040$xxxxxxxx...
Теперь у вас есть файл с хешем, готовый для процесса взлома.
Взлом хеша SSH-ключа с помощью John the Ripper
После извлечения хеша пришло время использовать John the Ripper для его взлома. Мы выполним "словарную атаку", при которой john пробует каждое слово из заданного списка в качестве потенциальной кодовой фразы. Для этой лаборатории мы будем использовать файл wordlist.txt, который был предварительно создан в вашей среде.
В реальных сценариях злоумышленники используют огромные списки слов, содержащие миллионы распространенных паролей, имен и словарных слов. Наш простой список слов содержит правильную кодовую фразу labex, что гарантирует успешный взлом для этой демонстрации.
Запустите команду john, указав список слов и файл с хешем:
john --wordlist=wordlist.txt ssh_hash.txt
John начнет процесс взлома. Поскольку кодовая фраза находится в нашем коротком списке слов, она будет найдена почти мгновенно.
Using default input encoding: UTF-8
Loaded 1 password hash (SSH [RSA/DSA/EC/OPENSSH private keys ssh2john])
Cost 1 (KDF/cipher) is 0 for all loaded hashes
Cost 2 (iteration count) is 16 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
labex (my_ssh_key)
1g 0:00:00:00 DONE (2023-01-01 12:05) 12.50g/s 12.50p/s 12.50c/s 12.50C/s sunshine..labex
Use the "--show" option to display all of the cracked passwords reliably
Session completed
Успех! Строка вывода labex (my_ssh_key) показывает, что кодовая фраза labex была успешно восстановлена для ключа my_ssh_key.
John the Ripper сохраняет взломанные пароли в файле, называемом "pot file" (по умолчанию ~/.john/john.pot). Чтобы просмотреть взломанный пароль снова, не перезапуская атаку, вы можете использовать опцию --show:
john --show ssh_hash.txt
my_ssh_key:labex
1 password hash cracked, 0 left
Это подтверждает взломанную кодовую фразу. Теперь вы успешно взломали слабую кодовую фразу SSH-ключа.
Понимание безопасности SSH-ключей
Эта лаборатория демонстрирует критически важный момент: безопасность SSH-ключа, защищенного кодовой фразой, зависит только от самой кодовой фразы. Давайте разберем компоненты безопасности SSH-ключей.
Сила ключа (криптография): Это относится к алгоритму (например, RSA, ECDSA, Ed25519) и размеру ключа (например, 2048, 4096 бит), используемым для генерации ключа. Больший размер ключа экспоненциально затрудняет для злоумышленника взлом базовой криптографии путем перебора. Это защищает от атак, пытающихся получить приватный ключ из публичного ключа.
Сила кодовой фразы (шифрование): Это защищает сам файл приватного ключа. Когда вы устанавливаете кодовую фразу, файл приватного ключа шифруется. Если кто-то украдет этот файл, он не сможет использовать его без предварительного расшифрования. Как вы видели, слабую, распространенную или словарную кодовую фразу можно легко взломать. Сильная кодовая фраза должна быть длинной, сложной и уникальной, что делает словарную атаку или атаку методом перебора вычислительно невозможной.
Разрешения файлов (контроль доступа): Разрешения файлов вашей операционной системы обеспечивают первую линию защиты. Файл приватного ключа всегда должен иметь разрешения, ограничивающие доступ только владельцу (например,
600или-rw-------). Это предотвращает чтение файла ключа другими пользователями в той же системе.
В нашей лаборатории криптографическая сила ключа была неважна, потому что вектором атаки была не сама криптография, а слабая кодовая фраза, использованная для шифрования файла.
Рекомендации по управлению SSH-ключами
Понимание рисков — первый шаг. Применение лучших практик — это способ их снижения. Вот основные правила безопасного управления вашими SSH-ключами в реальной среде.
Используйте надежные, уникальные кодовые фразы:
- Никогда не используйте распространенные слова, имена или простые шаблоны.
- Надежная кодовая фраза должна быть длинной (15+ символов) и содержать комбинацию прописных и строчных букв, цифр и символов.
- Рассмотрите возможность использования менеджера паролей для генерации и хранения очень сложных кодовых фраз.
Используйте современные алгоритмы и достаточные размеры ключей:
- Предпочитайте современные алгоритмы, такие как Ed25519 или ECDSA, вместо устаревшего RSA. Они обеспечивают лучшую безопасность и производительность.
- При использовании RSA убедитесь, что размер ключа составляет не менее 2048 бит, а для долгосрочной безопасности рекомендуется 4096 бит.
Защищайте файлы приватных ключей:
- Всегда убедитесь, что ваши файлы приватных ключей (например,
~/.ssh/id_rsa) имеют строгие разрешения. Используйтеchmod 600, чтобы разрешить доступ на чтение/запись только вашему пользователю.
- Всегда убедитесь, что ваши файлы приватных ключей (например,
Используйте SSH-агент:
- SSH-агент (
ssh-agent) — это фоновая программа, которая кэширует ваши расшифрованные приватные ключи в памяти. Вы вводите кодовую фразу один раз при добавлении ключа в агент, и вам не придется вводить ее снова в течение вашей сессии. Это удобно и безопасно, поскольку кодовая фраза не вводится повторно и не хранится на диске.
- SSH-агент (
Регулярно меняйте ключи:
- Периодически генерируйте новые пары SSH-ключей и отзывайте старые. Это ограничивает возможности злоумышленника, если старый ключ когда-либо будет скомпрометирован.
Никогда не делитесь приватными ключами:
- Приватный ключ — это приватный ключ. Это ваша уникальная идентификация. Никогда не отправляйте его по электронной почте, в чате или любым другим способом. Если другому человеку нужен доступ, он должен сгенерировать свою собственную пару ключей и предоставить вам свой публичный ключ.
Итоги
В этой лаборатории вы получили практический опыт выполнения распространенной задачи аудита безопасности. Вы успешно:
- Сгенерировали новую пару SSH-ключей, защищенную кодовой фразой.
- Использовали утилиту
ssh2johnдля извлечения хеша из файла приватного ключа, который можно взломать. - Выполнили словарную атаку с помощью John the Ripper для взлома слабой кодовой фразы.
- Изучили фундаментальные принципы безопасности SSH-ключей, включая различные роли криптографической стойкости и стойкости кодовой фразы.
- Рассмотрели основные рекомендации по безопасному управлению SSH-ключами.
Это упражнение демонстрирует, что даже сильные криптографические инструменты могут быть подорваны слабыми человеческими практиками. Всегда защищайте свои SSH-ключи надежными, уникальными кодовыми фразами, чтобы обеспечить целостность вашей цифровой личности.


