- HackWare.ru
- Этичный хакинг и тестирование на проникновение, информационная безопасность
- SSH (ч.4): Создание и настройка ключей OpenSSH
- Оглавление
- Вход в SSH без пароля (с использованием файлов ключей)
- Типы ключей
- Утилита ssh-keygen
- Как поменять количество битов в ключах ssh-keygen
- Добавление комментариев в ключи ssh-keygen
- Изменение паролей в ssh-keygen
- Показ публичного ключа из приватного
- Управление приватными ключами на клиенте SSH
- Управление публичными ключами на сервере SSH
- Как конвертировать .ppk ключ в OpenSSH ключ
- SSH в Linux
- Подключение по SSH
- Сгенерировать пару ключей
- Какой ключ куда?
- Передать ключ на удалённый хост
- ssh-copy-id
- Узнать версию OpenSSH в Linux
- Выполнить команду из скрипта на удалённом компьютере
- known_hosts
- Создать SSH туннель
- Демонстрация
- Список всех открытых SSH туннелей
- Закрыть все SSH туннели
- Запустить SSH в фоновом режиме
- SSH_MSG_USERAUTH_BANNER
- Конвертация сертификатов
HackWare.ru
Этичный хакинг и тестирование на проникновение, информационная безопасность
SSH (ч.4): Создание и настройка ключей OpenSSH
Оглавление
Вход в SSH без пароля (с использованием файлов ключей)
Вход в SSH по публичному ключу (без пароля) очень удобен и безопасен.
Процесс настройки аутентификации по публичному ключу очень простой:
- Командой создаётся пара «публичный ключ — приватный ключ».
- Публичный ключ копируется на компьютер с сервером SSH, то есть на компьютер, к которому будет осуществляться подключение и на котором будут выполнятся команды.
- Затем подключение выполняется обычным способом, но ввод пароля уже не требуется.
Публичный ключ, который копируется на удалённый сервер, не является секретным. Один и тот же ключ можно использовать на разных серверах. Главное — хранить в секрете приватный ключ.
Сгененировать ключи и скопировать их на удалённый хост можно буквально тремя командами. Для генерации пары ключей используется программа ssh-keygen, она включена в пакет ssh и если SSH у вас уже настроен, то дополнительно устанавливать ничего не нужно.
У программы ssh-keygen много функций и возможностей, начнём с рассмотрения процедуры генерации ключей, которая выполняется элементарно.
Если вы успели залогиниться на удалённой системе, разлогинтесь. После этого наберите:
У нас спрашивают имя файла, не нужно ничего вводить, будет использовано имя по умолчанию. Также спрашивается пароль. Этот пароль позволяет установить дополнительную защиту — при подключении с помощью ключей не будет спрашиваться пароль пользователя, но будет спрашиваться пароль самого ключа. Устанавливать пароль необязательно.
В результате будет создано два файла:
Первый файл нужно хранить в секрете. Второй файл нужно скопировать на удалённый компьютер, где запущен сервер SSH.
Теперь на удалённой машине нам нужно создать каталог .ssh. В предыдущей части мы уже узнали, как выполнять команды на удалённой системе по SSH. Запустите команду вида:
Теперь нам нужно скопировать содержимое файла id_rsa.pub на удалённую машину в файл
/.ssh/authorized_keys. Сделать это очень просто (не забываем менять данные на свои):
Теперь выполняем подключение с помощью клиента SSH, но пароль у нас больше спрашиваться не будет.
Типы ключей
Программа ssh-keygen можен генерировать четыре типа ключей:
- dsa
- ecdsa
- ed25519
- rsa
Чтобы выбрать любой из этих типов, используется опция -t. В предыдущем примере мы выбрали rsa — явно указывать тип RSA необязательно, поскольку он подразумевается по умолчанию (то есть генерацию ключей можно запустить вообще без опции -t).
В зависимости от выбранного типа, названия созданных файлов ключей могут различаться:
Эти файлы нужно держать в секрете, они должны быть доступны только для владельца.
Соответствующие публичные ключи будут иметь такое же название, но с дополнительным расширением .pub:
Эти файлы не являются секретными, их содержимое нужно скопировать в файл
/.ssh/authorized_keys на компьютер с сервером SSH.
Утилита ssh-keygen
Мы применили ssh-keygen для генерации ключей. Кроме этого она предназначена для управления и конвертации ключей аутентификации для ssh.
Далее рассмотрены только некоторые функции этой программы, с полным перечнем опций можно ознакомиться командой:
Как поменять количество битов в ключах ssh-keygen
Для этого используется опция: -b БИТЫ
Она определяет количество бит в создаваемом ключе. Для ключей RSA минимальный размер составляет 1024 бита, а по умолчанию — 2048 бит. Как правило, 2048 бит считается достаточным. Ключи DSA должны иметь длину 1024 бита, как указано в FIPS 186-2. Для ключей ECDSA флаг -b определяет длину ключа, выбирая один из трёх размеров эллиптической кривой: 256, 384 или 521 бит. Попытка использовать битовые длины, отличные от этих трёх значений, для ключей ECDSA потерпит неудачу. Ключи Ed25519 имеют фиксированную длину, и флаг -b будет игнорироваться.
Добавление комментариев в ключи ssh-keygen
Для работы с комментариями имеется две опции:
-C комментарий
После этой опции укажите комментарий.
-c
Эта опция включает процесс изменений комментария в файлах приватного и публичного ключей. Программа сделает запрос на файл, содержащий приватные ключи, пароль (если он установлен) и затем предложит ввести новый комментарий.
Увидеть комментарий можно с помощью опции -l. Эта опция показывает отпечаток указанного файла публичного ключа. Для RSA и DSA ключей ssh-keygen пытается найти совпадающий файл публичного ключа и вывести его отпечаток. Если совместить с -v, то визуальное художественное представление ASCII будет показано после самого отпечатка:
Файл ключа можно указать явно опцией -f:
Изменение паролей в ssh-keygen
Для работы с паролями имеется несколько опций:
-P парольная фраза
Этой опцией можно передать пароль, чтобы программа его не спрашивала. При смене пароля, этой опцией передаётся старый пароль.
-p
Эта опция вместо создания нового ключа, запускает смену парольной фразы файла приватного ключа. Программа сделает запрос, где размещён файл приватного ключа, затем спросит старый пароль и попросит дважды ввести новую парольную фразу.
-N новый_пароль
Этой опцией можно передать новый пароль, чтобы программа его не спрашивала. При создании ключей можно использовать эту опцию для указания паролей, чтобы программа не спрашивала их в интерактивном режиме.
Файл ключей нужно указать опцией -f:
Показ публичного ключа из приватного
Опция -y прочитает файл OpenSSH формата с приватным ключом и напечатает в стандартный вывод публичный ключ OpenSSH.
Также с помощью опции -f нужно указать путь до приватного ключа, из которого будет извлечён соответствующий ему публичный ключ:
Например, приватный ключ помещён в файл id_rsa, тогда команда извлечения из него публичного ключа следующая:
Вы можете столкнуться с ошибкой:
Она означает, что приватный ключ доступен для чтения кому угодно и программа ssh-keygen отказывается работать с ним по этой причине. Чтобы исправить эту ошибку, просто установите на файл с приватным ключом права доступа 600:
Управление приватными ключами на клиенте SSH
Одну и ту же пару ключей можно использовать для доступа к множеству серверов SSH. Следовательно, на каждом из них (на клиенте и на серверах) может быть по одному ключу. Тем не менее если у вас несколько ключей или если вы хотите использовать другое, не стандартное расположение файлов ключей, то далее показано, как указать расположения в строке команды и в конфигурационных файлах клиента SSH.
В конфигурационном файле клиента SSH для указания пути до приватных ключей используется директива IdentityFile. Её значения по умолчанию:
Как можно увидеть, разрешено использовать тильду для указания на домашнюю папку пользователя.
Можно иметь несколько директив IdentityFile в конфигурационных файлах; все эти идентификаторы будут опробованы по очереди. Множественные директивы IdentityFile добавят кандидатов в очередь для попыток (это поведение отличается от других конфигурационных директив).
Также можно настроить использование определённых идентификационных файлов для определённых хостов:
Для строки команды используется опция -i, после которой нужно указать путь до приватного ключа (файла идентификации). Значение по умолчанию такие же, как и у рассмотренной выше директивы. Опцию -i можно использовать несколько раз.
Управление публичными ключами на сервере SSH
Публичные ключи всех видов размещены в одном файле, значение по умолчанию:
По умолчанию проверяются файлы:
Каждая строка файла содержит один ключ (пустые строки, и строки начинающиеся с ‘#’ игнорируются как комментарии). Публичные ключи состоят из следующих разделённых пробелами полей: опции, тип ключа, ключ в кодировке base64, комментарий.
Поле с опциями является необязательным.
Тип ключа это “ecdsa-sha2-nistp256”, “ecdsa-sha2-nistp384”, “ecdsa-sha2-nistp521”, “ssh-ed25519”, “ssh-dss” или “ssh-rsa”.
Поле комментария ни для чего не используется (но может быть удобным для пользоватетля идентифицировать ключ).
Как конвертировать .ppk ключ в OpenSSH ключ
Ключ .ppk генерируется при экспорте ключей из PuTTY.
Пример файла .ppk:
Конвертация ключей из файла .ppk в формат OpenSSH в Linux
Для конвертации формата .ppk в формат OpenSSH можно использовать утилиту puttygen, которая включена в пакет Putty. Следовательно, нам нужно установить PuTTY
Linux: с вашим менеджером пакетов установите PuTTY (или более минимальный пакет PuTTY-tools):
Debian, Kali Linux, Linux Mint, Ubuntu и их производные:
Дистрибутивы на основе RPM:
Arch Linux, BlackArch и их производные:
OS X: Установите Homebrew, затем запустите
Поместите ваши ключи в какую-нибудь директорию, например, в домашнюю папку. Теперь конвертируем PPK ключи в SSH пару.
Для извлечения приватного ключа:
и для извлечения публичного ключа:
Переместите эти ключи в
/.ssh и убедитесь, что для приватного ключа ограничены права записи:
Конвертация ключей из файла .ppk в формат OpenSSH в Windows
Откройте PuTTYgen, нажмите кнопку «Load» и выберите файл .ppk с ключами.
Вы сразу увидите публичный ключ SSH, который вы можете скопировать и вставить в файл.
Теперь в меню перейдите в «Conversions» → «Export OpenSSH key» и сохраните приватный ключ.
Скопируйте ваш приватный ключ в файл
/.ssh/id_dsa (или id_rsa).
Источник
SSH в Linux
Подключение по SSH
Подключение происходит с помощью команды ssh + имя_пользователя + хост
Если вы подключаетесь к хосту впервые, появится предупреждение
The authenticity of host ‘192.168.56.101 (192.168.56.101)’ can’t be established. ECDSA key fingerprint is SHA256:db8az/qbrWOJWvNRv2d9UHaDBnnUHanJ9Svca9vFx7c. Are you sure you want to continue connecting (yes/no/[fingerprint])?
Если выбрать yes то в файл
/.ssh/known_hosts добавится похожая строка:
|1| abcdef+abcdefghijklmnopqrst=|abcdefghijklmnopqrstuvwxyz1= ssh-rsa abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrst/abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz12345/abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzB1234567
Обычно файл known_hosts имеет следующий формат (записи идут через пробел)
Это хэш от имени сервера.
Здесь через пробел записаны три элемента: хэш от имени сервера, название используемого ассиметричного алгоритма и публичный ключ сервера. Разберём их по очереди.
Сгенерировать пару ключей
Первый шаг — это генерация пары ключей. Обычно это делается на клиентской машине. Например, на вашем ноутбуке.
Основная команда ssh-keygen создаст 2048-битную пару RSA ключей. Для большей надёжности можно добавить флаг -b 4096
ssh-keygen -b 4096
Чтобы сгенерировать ключ в /home/$(whoami)/.ssh
sudo ssh-keygen -b 4096
Чтобы сгенерировать ключ в /home/root/.ssh
Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa):
Нужно придумать имя ключа.
Я назову ключ andrei-key101 а сохранять буду в текущую директорию.
Enter file in which to save the key (/root/.ssh/id_rsa): andrei-key101 Enter passphrase (empty for no passphrase): Enter same passphrase again:
Нужно два раза ввести пароль. Если он вам нужен. Обычно нет.
Your identification has been saved in andrei-key101 Your public key has been saved in andrei-key101.pub The key fingerprint is: SHA256:abcd/abcdefghijklmnopqrstuvwxyz1234567890ab root@urn-su The key’s randomart image is: +—[RSA 4096]—-+ |=o oo++ | |= oo o. = o | |+ | |Oo=o . . | |B+.o S . | |+o.o | |+.0. . | |o+= . E | |+=oo. . . | +—-[SHA256]——+
Ключи готовы. Я сохранил их в текущую директорию поэтому увижу их сделав ls
Важно помнить, что если вы генерируете ключ для другого пользователя нужно позаботиться о правильных правах доступа к этому ключу.
Какой ключ куда?
.pub ключ отправляйте на удалённую машину
приватный ключ храните на своём клиенте
Передать ключ на удалённый хост
После того, как ключи созданы нужно передать .pub ключ на удалённый хост.
Сделать это можно несколькими способами начнём с утилиты ssh-copy-id
ssh-copy-id
Я предпочитаю использовать с флагом -i и задавать путь до нужного ключа
sudo ssh-copy-id -i
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: «/home/andrei/.ssh/andrei-key.pub» The authenticity of host ‘192.168.0.2 (192.168.0.2)’ can’t be established. ECDSA key fingerprint is SHA256:abcdefgh1234567890abcdefgh1234567890abc+def. Are you sure you want to continue connecting (yes/no/[fingerprint])?
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed — if you are prompted now it is to install the new keys andrei@192.168.0.2’s password:
Number of key(s) added: 1 Now try logging into the machine, with: «ssh ‘andrei@192.168.0.2′» and check to make sure that only the key(s) you wanted were added.
Теперь на хосте 192.168.0.2 в файле /home/andrei/.ssh/authorized_keys появилась новая запись вида
ssh-rsa AAAAB3NzaC1y … lseP/jXcq … Uydr/2CwQ &hellip ++TpY19pHqD/AnhL … Az62T/Ipyx … 8U2T andrei@host.andrei.com
Знак … заменяет длинные последовательности случайных символов для экономии места.
Проверить ключ можно командой
Если вы не задавали пароль для ключа, то попадёте на удалённый хост без лишних движений
Last login: Sun Jan 10 16:48:27 2021 from 192.168.0.1
Узнать версию OpenSSH в Linux
Чтобы узнать версию OpenSSH в вашем дистрибутиве Linux выполните
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
Выполнить команду из скрипта на удалённом компьютере
Если подключение по ssh происходим из bash-скрипта , и при этом нужно ещё выполнить ряд команд после подключения — достаточно перечислить эти команды через точку с запятой
#!/bin/bash ssh andrei@192.168.0.2 «ls;cd /home/andrei/bash_scripts;ls;ip a;cal»
Если нужно выполнить команду, требующую sudo попробуйте флаг -t
#!/bin/bash ssh -t andrei@192.168.0.2 «sudo apt upgrade»
known_hosts
Список известных хостов находится в файле known_hosts
Обычно файл known_hosts имеет следующий формат (записи идут через пробел) ( подробнее )
Примеры алгоритмов: ssh-rsa, ssh-dss, ssh-ed25519, ecdsa-sha2-nistp256 …
|1| abcdef+abcdefghijklmnopqrst=|abcdefghijklmnopqrstuvwxyz1= ssh-rsa abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrst/abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz12345/abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzB1234567
Это хэш от имени сервера.
Это алгоритм шифрования
Это публичный ключ хоста
Создать SSH туннель
Туннели обычно создают для перенаправления траффика. SSH tunnel это то же самое что и SSH port forwarding.
Допустим вы хотите направить траффик со своего localhost (127.0.0.1) на удалённый хост 192.168.0.2 .
На удалённом хосте у вас есть пользователь с именем andrei и вы знаете его пароль.
Сперва нужно определиться с портами на локальном хосте и на удалённом.
Предположим, вы выбрали 9119 для локального и 9200 для удаленного хостов.
То есть вы хотите, чтобы всё, что идёт на localhost:9119 было перенаправлено на 192.168.0.2 : 9200
ssh -L 9119: 192.168.0.2 : 9200 andrei@192.168.0.2
The authenticity of host ‘192.168.0.2 (192.168.0.2)’ can’t be established.
ECDA …
…
andrei@192.168.0.2’s password:
Last login: Sun Jan 31 13:23:00 2021
Проверьте ip выполнив
Если вам нужен туннель с поддержкой графического интерфейса X Window System используйте флаг -X
ssh -X -L 9119: 192.168.0.2 : 9200 andrei@192.168.0.2
Демонстрация
Туннель создан, не закрывайте терминал. Откройте два новых терминала или две новые вкладки в старом.
У вас два пустых терминала, оба на локальном хосте. Назовём их 1 и 2.
Из терминала 2 подключимся к удалённому хосту 192.168.0.2 по ssh и будем слушать на порту 9200 с помощью nmap
ssh andrei@192.168.0.2
nmap -l 9200
На терминале 1 с помощью nmap отправим сообщение на порт 9119 локального хоста. Это тот порт, который мы настроили на проброс.
nmap localhost 9119
Введём любой текст
Откройте терминал 2 там дожен появиться тот же текст
Список всех открытых SSH туннелей
Чтобы получить список туннелей открытых именно ssh выполните
sudo lsof -i -n | egrep ‘\ ‘
ssh 14695 andrei 3u IPv4 230080 0t0 TCP 192.168.0.1:46356->192.168.0.2:ssh (ESTABLISHED) ssh 14695 andrei 4u IPv6 230103 0t0 TCP [::1]:9119 (LISTEN) ssh 14695 andrei 5u IPv4 230104 0t0 TCP 127.0.0.1:9119 (LISTEN)
Вывод этой команды при практически идентичных условиях почему-то разный.
Ниже пример второго варианта. Если вы знаете почему так получается — напишите в комментариях.
ssh 15151 andrei 3u IPv4 239364 0t0 TCP 192.168.0.1:46464->192.168.0.2:ssh (ESTABLISHED) ssh 15151 andrei 4u IPv6 239380 0t0 TCP [::1]:mxit (LISTEN) ssh 15151 andrei 5u IPv4 239381 0t0 TCP 127.0.0.1:mxit (LISTEN) ssh 15151 andrei 9u IPv6 239428 0t0 TCP [::1]:mxit->[::1]:54306 (ESTABLISHED)
Закрыть все SSH туннели
Чтобы закрыть всё, что связано с ssh можно выполнить
sudo killall ssh sshd
Этот метод хорош только если вы работаете один, например на какой-то виртуальной машине.
Запустить SSH в фоновом режиме
Существует несколько способов запустить ssh соединение в фоновом режиме — то есть освободим текущий терминал.
-L, screen, tmux, nohup
Мне запустить ssh фоном из скрипта помог nohup, поэтому начнём с него
nohup ssh user@host «cd scripts;python3 my_script.py $ARG1 $ARG2; exit» &
Для чего это было нужно: Python скрипт сначала открывал одно ssh соединение из subprocess там выполнялась команда для запуска мониторинга потребления памяти и больше от этого соединения ничего было не нужно, зато необходимо было выполнять новые соединения с нагрузкой из другого скрипта.
Чтобы уйдя из первого подключения не оборвать мониторинг потребления памяти перед ssh нужно было добавить nohup, а в самом конце поставить &
SSH_MSG_USERAUTH_BANNER
Клиенту, подключившемуся к ssh серверу можно показать баннер SSH_MSG_USERAUTH_BANNER
sudo vi /etc/issue.net
И отредактируйте файл добавив свой баннер
Откройте sshd_config и укажите путь до баннера
sudo vi /etc/ssh/sshd_config
/banner
# no default banner path #Banner none
Этот баннер будет показан ДО авторизации, то есть во время ввода пароля
Чтобы создать баннер, который будет показан после успешного входа выполните
sudo vi /etc/motd
После редактирования файлов перезапустите sshd
sudo systemctl restart sshd.service
Конвертация сертификатов
Рассмотрим простой пример: вы достали из базы данных сертификат MIIC4jCCAc … A7A6Rpt8V9Q== , но он не отформатирован и не проходит валидацию
Сертификат, конечно, длиннее, я поставил троеточие для экономии места и вашего времени.
echo ‘MIIC4jC … 7A6Rpt8V9Q==’ | base64 -d | openssl x509 -inform der
Либо, если вам нужно работать с файлами — сохраните исходный сертифика в фай raw_cert
echo MIIC4jC … 7A6Rpt8V9Q== > raw_cert
cat raw_cert | base64 -d | openssl x509 -inform der > cert
cat cert
——BEGIN CERTIFICATE——
MIIC4jC … 7A6Rpt8V9Q==
——END CERTIFICATE——
Такого же результата можно было добиться аккуратно добавив ——BEGIN CERTIFICATE—— в начало и ——END CERTIFICATE—— в конец файла, но не всегда всё так просто.
Источник