OpenSSH
OpenSSH — набор приложений для защищённой передачи данных, включающий в себя и клиентскую, и серверную часть. Является фактическим стандартом для Linux и многих других UNIX-подобных операционных систем.
Установка
Как правило, OpenSSH устанавливается при установке системы. В случае его отсутствия он может быть установлен следующей командой (на примере Debian GNU/Linux, установка и клиентской и серверной части):
apt install openssh-client openssh-server
Приложения, входящие в состав OpenSSH
В состав OpenSSH в частности входят следующие приложения:
- sshd — сервер
- ssh — клиент
- ssh-keygen — утилита для генерирования ключей и управления ими
- ssh-agent — приложение для хранения расшифрованных ключей в памяти
- ssh-add — утилита для добавления ключа для использования в ssh-agent
- scp — утилита для безопасного копирования файлов, аналогичная утилите копирования cp
- sftp — утилита для безопасной передачи файлов, аналогичная ftp-клиенту
sshd
Программа sshd является сервером SSH. Как правило, запускается автоматически. Основной конфигурационный файл сервера — это обычно /etc/ssh/sshd_config. Ошибки в конфигурации sshd могут привести к потере возможности подключения к удалённому серверу, редактировать этот файл при удалённом подключении следует с осторожностью, хотя обычно, при перезапуске OpenSSH с новым конфигурационным файлом старые соединения сохраняются, это, с одной стороны, даёт возможность исправить ошибку, а, с другой, следует помнить, что работа текущего соединения после перезапуска сервера не означает, что конфигурация правильная, следует убедиться, возможны ли новые подключения.
ssh
Программа ssh является клиентом для подключения к SSH-серверу. Кроме предоставления доступа к командной оболочке удалённого сервера она также позволяет создавать защищённые туннели.
Обычный пример использования программы ssh:
ssh user@example.com
Данный пример показывает обычный сценарий работы, подключение к серверу example.com от имени пользователя user.
При первом подключении приложение сообщит информацию об отпечатке ключа сервера и предложит подтвердить подключение (если вы заботитесь о безопасности, у вас должен быть отпечаток ключа сервера, его можно получить от администратора, также, к примеру, многие хостинг-провайдеры, предоставляющие доступ по ssh, публикуют информацию об отпечатках используемых ключей на своих сайтах).
Далее приложение ssh попытается осуществить аутентификацию. Обычный порядок действий такой: сначала будет осуществлена попытка использовать ключи, которые предоставит ssh-agent и ключи, находящиеся по стандартным именам (например, ~/.ssh/id_ed25519, ~/.ssh/id_rsa), в случае, если ни один ключ не будет принят сервером, то будет выдан запрос на ввод пароля.
Вы можете указать ключ, который ssh должен использовать, при помощи опции -i:
ssh -i ~/.ssh/id_ed25519 user@example.com
Это может быть полезно в том случае, если ключ находится по нестандартному пути, а также в ситуации, когда настройки сервера требуют прерывать соединение при нескольких неудачных попытках соединения, и ssh, перебирая ключи, не успевает дойти до правильного. В таких ситуациях выводится сообщение «Too many authentication failures», и решить проблему можно указав нужный ключ при помощи опции -i.
Такая же ошибка может возникнуть в ситуации, когда у вас нет ключа, подходящего для сервера, вам нужно зайти туда при помощи пароля, но ssh, перебирая имеющиеся ключи, просто не даёт дойти до парольной аутентификации, поскольку сервер отключается раньше, и вы получаете сообщение об ошибке «Too many authentication failures». Чтобы указать ssh, что при данном подключении не нужно использовать ключи, что требуется использовать только аутентификацию по паролю, можно использовать следующий вариант:
ssh -o PreferredAuthentications=password user@example.com
PreferredAuthentications — это имя параметра из конфигурационного файла ssh, определяющего предпочтительные методы аутентификации, а при помощи опции командной строки -o можно устанавливать такие параметры для отдельных соединений, не меняя файл настроек, в данном случае можно установить его в password, что укажет ssh, что нужно использовать только аутентификацию по паролю.
ssh-keygen
Программа ssh-keygen предназначена для генерирования криптографических пар ключей, используемых для аутентификации вместо паролей. Пример генерации криптографической пары ключей:
ssh-keygen -t ed25519 -C 'My personal key'
Здесь при помощи параметра -t указан тип ключа, при помощи параметра -C указан комментарий, который будет добавлен в открытый ключ.
После запуска приложение запросит имя файла для сохранения секретного ключа, это будет файл .ssh/id_ed25519 в домашнем каталоге пользователя (т..е полный путь может выглядеть примерно так: /home/user/.ssh/id_ed25519), обычно нет необходимости его менять (если только уже не существует другой ключ, находящийся в том файле). Далее будет запрошен пароль и, далее, подтверждение пароля. Пароль будет невозможно сбросить, если вы его забудете, при этом хорошим тоном является установка стойкого к подбору пароля достаточной длины.
Также эта утилита позволяет посмотреть отпечаток ключа сервера. Когда вы впервые подключаетесь к серверу SSH, то клиентское приложение показывает вам отпечаток ключа сервера, и вам следует сравнить его с реальным отпечатком ключа сервера, во избежание атаки типа MITM. Администратор сервера может посмотреть отпечаток ключа командой вида:
ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub
В этой команде первый ключ -l означает просмотр отпечатка, после ключа -f идёт путь к открытому ключу, они по умолчанию имеют имена вида /etc/ssh/ssh_host_TYPE_key.pub, где вместо TYPE стоит тип ключа (rsa, ed25519 и т.д.).
Иногда клиентское приложение выводит отпечаток ключа не в том виде, в котором вы его ожидаете увидеть. Например, отпечаток вы ожидаете увидеть как непрерывную строку алфавитно-цифровых символов, а клиент SSH показывает строку байт в шестнадцатеричном виде, разделённых двоеточиями. В таких случаях нужно выбрать формат, в котором программа выдаст информацию об отпечатке ключа, это делается при помощи ключа -E. Вот например как выглядит команда получения информации о ключе RSA, с выводом отпечатка ключа, полученного по алгоритму MD5:
ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub -E md5
ssh-agent и ssh-add
При аутентификации по ключу используется криптографическая пара ключей, открытый ключ известен серверу, а закрытый находится на стороне пользователя, подключающегося к серверу. Закрытый ключ, в целях безопасности, рекомендуется защищать паролем, но это означает, что, без использования дополнительных средств, пользователю придётся вводить пароль каждый раз, когда он будет подключаться к серверу. Это не очень удобно, при этом убирать пароль не рекомендуется из соображений безопасности. При работе в Linux в графическом интерфейсе пароль может потребоваться вводить только один раз (до выхода пользователя из системы), то есть, задача обычно решается автоматически, без дополнительной настройки системы. При работе из консоли соответствующий результат можно получить при помощи пары утилит: ssh-agent и ssh-add. Сначала запускается ssh-agent, этот процесс будет хранить информацию о ключах, и, далее, при помощи ssh-add туда передаётся информация о ключе (на этом этапе нужно будет ввести пароль от него), и, далее, ssh сможет многократно использовать этот ключ без дополнительного запроса пароля.
ssh-agent
Утилита ssh-agent служит для сохранения открытого ключа в расшифрованном виде между подключениями. Данное приложение запускается не совсем обычным образом (в примере предполагается использование командной оболочки bash):
eval $(ssh-agent -s)
Смысл этой конструкции в следующем. При вызове ssh-agent -s программа запускает фоновый процесс для работы с ключами, информация для подключения к нему выводится в формате команд оболочки (установка значений нескольких переменных и т.д.), например:
SSH_AUTH_SOCK=/tmp/ssh-43fFGNj1mMxC/agent.284145; export SSH_AUTH_SOCK; SSH_AGENT_PID=284146; export SSH_AGENT_PID; echo Agent pid 284146;
А при помощи конструкции eval $(...) полученный код выполняется в контексте текущей командной оболочки. Конечным результатом является установка в текущем сеансе переменных SSH_AGENT_PID и SSH_AUTH_SOCK, содержащих данные для подключения к ssh-agent. Эти данные будут нужны утилите ssh-add.
ssh-add
Утилита ssh-add добавляет данные заданного ключа в фоновый процесс ssh-agent (который должен быть запущен ранее). Утилита обычно используется в таком формате:
ssh-add ~/.ssh/id_ed25519
Команда запросит пароль к заданному ключу. После чего ключ можно будет использовать без ввода пароля (до завершения процесса ssh-agent или удаления из него информации о ключе).