Назад в блог

Обзор SSH — SSH-серверы, клиенты и ключи

Обзор SSH — SSH-серверы, клиенты и ключи

Когда речь заходит об удаленных вычислениях, SSH — один из самых популярных и безопасных протоколов. SSH — это криптографический сетевой протокол, который устанавливает безопасное соединение с удаленными устройствами. После подключения к удаленному устройству пользователь может выполнять команды в удаленной оболочке. SSH наиболее распространен среди сетевых и системных администраторов.

В этом руководстве в формате шпаргалки представлен обзор SSH, некоторые распространенные способы подключения по SSH и различные конфигурации SSH.

Обзор SSH

SSH — это аббревиатура от Secure Shell. Некоторые также называют SSH Secure Socket Shell. SSH — самый распространенный способ доступа к удаленному серверу. При подключении к удаленной системе по SSH вы подключаетесь к существующей учетной записи. После подключения вы получите доступ к сеансу оболочки. Все запускаемые команды будут выполняться на удаленной машине, а вывод будет отображаться на вашем локальном терминале.

SSH-соединение работает по модели «клиент-сервер». На удаленной системе должен быть запущен демон SSH для приема удаленных SSH-соединений. Демон SSH прослушивает определенные порты, аутентифицирует запросы на подключение и создает соответствующее окружение при выполнении условий.

Для этого руководства мы настроили два сервера Ubuntu. Основной сервер будет настроен для подключения к дополнительному серверу. Дополнительный сервер будет настроен для приема SSH-соединений от основного сервера. Эти IP-адреса серверов будут использоваться на протяжении всего руководства:

  • Основной: 31.171.250.121

  • Дополнительный: 31.171.250.130

Для начала вы можете ознакомиться с нашими подробными руководствами по тому, как использовать SSH для подключения к удаленному серверу в Ubuntu и настройке сервера Linux для использования аутентификации на основе ключей SSH. А теперь начнем!

Аутентификация SSH

Существует два основных типа аутентификации SSH. Традиционный метод — использование пароля. Он менее безопасен и настоятельно не рекомендуется. Второй метод — ключи SSH. Ключи SSH обеспечивают очень высокую безопасность и настоятельно рекомендуются.

Хотя аутентификацию по паролю проще понять и настроить, ее легко взломать. Например, автоматизированные боты могут использовать брутфорс для проникновения в систему. Ключи SSH — это криптографические ключи. Каждый ключ состоит из двух частей – закрытого ключа и открытого ключа. Открытым ключом можно делиться где угодно без каких-либо опасений. Однако закрытый ключ должен оставаться под надежной защитой.

Чтобы использовать ключи SSH в качестве метода аутентификации, на удаленной системе должна быть установлена копия открытого ключа. Копии закрытого и открытого ключей также должны быть установлены на локальной системе. По умолчанию открытые ключи перечислены в следующем файле. У каждого уникального пользователя есть уникальная копия этого файла:

Вот как работает процесс аутентификации:

  • Клиентская система отправляет запрос на подключение к удаленной системе. Она также отправляет информацию о том, какой SSH-ключ использовать.

  • Удаленная система проверяет, указан ли открытый ключ в authorized_keys.

  • Если ключ существует, генерируется случайная строка, которая шифруется с помощью открытого ключа. Зашифрованное сообщение может быть расшифровано только с помощью закрытого ключа.

  • Получив строку, клиент расшифрует ее.

  • Объединив строку и ранее согласованный идентификатор сессии, генерируется хэш MD5. Клиент отправляет хэш MD5 удаленной системе.

  • Удаленная система знает случайную строку и идентификатор сессии. Если хэш MD5 совпадает, подключение разрешается.

Ключи SSH

В этом руководстве основное внимание при аутентификации будет уделено ключам SSH. Таким образом, этот раздел будет посвящен работе с ключами SSH.

  • Генерация пары ключей SSH

По умолчанию в системе Linux ключ SSH не установлен. Однако система может содержать ключи SSH, сгенерированные или установленные ранее. Предполагая, что предыдущего ключа SSH нет, нам нужно сгенерировать новую пару открытого и закрытого ключей SSH. SSH поддерживает множество криптографических алгоритмов для генерации ключей SSH, например, RSA, DSA, ECDSA и EdDSA. RSA является алгоритмом по умолчанию и предпочтительным алгоритмом.

  • Генерация обычной пары ключей RSA

Чтобы сгенерировать пару ключей SSH, выполните следующую команду:

SSH Keygen

В запросе вас спросят, где сохранить пару ключей. Как уже упоминалось, это будет пара ключей RSA. Если значение не введено, SSH сохранит его в расположение по умолчанию /home/demo/.ssh/id_rsa.

Следующий шаг — ввод парольной фразы. Рекомендуется использовать парольную фразу. Длина парольной фразы может быть произвольной. Она добавляет дополнительный уровень безопасности. Тем не менее, SSH позволяет генерировать ключи без парольной фразы. Просто нажмите Enter, если хотите получить ключи без парольной фразы.

Итоговый вывод содержит следующую ключевую информацию:

  1. Расположение закрытого ключа ( /root/.ssh/id_rsa). Им никогда не следует делиться.

  2. Расположение открытого ключа ( /root/.ssh/id_rsa.pub). Его можно безопасно передавать кому угодно.

  3. Отпечаток ключа.

  4. Случайное изображение ключа. Идея заключается в том, что если ключи будут скомпрометированы, вы, вероятно, сможете это понять, заметив любое изменение в изображении ключа.

  • Генерация пары ключей RSA с другим количеством бит

По умолчанию ключи SSH имеют размер 2048 бит. С точки зрения безопасности этого считается вполне достаточно. Однако мы можем вручную указать другое количество бит. Чем выше значение в битах, тем надежнее ключ.

Запустите следующую команду, чтобы сгенерировать пару SSH-ключей размером 4096 бит. Большинство серверов поддерживают 4096-битные SSH-ключи. Если ключ слишком велик, он может быть отклонен в целях защиты от DDoS:

SSH Keygen with bitsПоскольку мы уже сгенерировали пару ключей, SSH спросит, нужно ли перезаписать предыдущую. Остальная часть процесса аналогична генерации обычной пары ключей.

  • Изменение парольной фразы закрытого ключа

Мы можем изменить парольную фразу закрытого ключа. Для этого процесса вам необходимо знать текущую парольную фразу. Чтобы изменить парольную фразу, выполните следующую команду:

SSH Keygen Password Change

Команда предложит вам ввести расположение закрытого ключа. Нажмите Enter, если ключ хранится в расположении по умолчанию. Введите текущую парольную фразу. Если она будет принята, вы сможете назначить новую.

  • Отображение отпечатка SSH-ключа

Каждая пара SSH-ключей имеет общий криптографический отпечаток. Этот отпечаток можно использовать для идентификации уникальных ключей. Это может быть полезно во многих ситуациях. Выполните следующую команду, чтобы проверить отпечаток SSH-ключа:

SSH Key Fingerprint

Введите расположение ключа. Нажмите Enter, если ключ хранится в расположении по умолчанию.

Копирование открытого ключа

Пара SSH-ключей готова для защиты удаленных подключений. Чтобы удаленная система принимала SSH-ключ для аутентификации, ей необходима копия открытого ключа. Существует несколько способов скопировать открытый ключ на удаленный сервер.

  • Использование ssh-copy-id

Утилита ssh-copy-id поставляется в составе пакета OpenSSH. Это стандартный способ копирования открытого ключа SSH. Он прост и удобен в использовании. Выполните следующую команду для переноса копии открытого ключа:

SSH Copy ID

Для завершения процесса вам понадобится пароль от учетной записи удаленного пользователя. В случае успеха появится сообщение об успешном завершении.

  • Использование SSH-подключения

Если использование утилиты ssh-copy-id недоступно, но основной сервер может подключиться к дополнительному серверу по SSH, мы можем использовать другой трюк для копирования ключа. Он заключается в передаче содержимого открытого ключа через команду SSH на удаленную сторону. Обратите внимание, что если каталог ~/.ssh не существует на удаленной системе, это может не сработать:

SSH Copy

  • Копирование вручную

Если удаленное подключение невозможно, остается единственный вариант — вручную добавить открытый ключ на удаленный сервер. Сначала получите содержимое открытого ключа:

На удаленном сервере поместите ключ в соответствующее место:

Использование SSH

Теперь, когда публичный ключ настроен, мы готовы использовать SSH для удаленного подключения.

  • Подключение к удаленной системе

Первый шаг — научиться подключаться к удаленной системе с помощью SSH. Предполагается, что как локальная, так и удаленная системы разрешают SSH-трафик. Чтобы подключиться к удаленной системе, введите следующее:

SSH Login Without User

Чтобы подключиться под определенным пользователем на удаленном сервере, используйте следующую структуру:

SSH Login with User

Если вы подключаетесь к серверу впервые, SSH может вывести предупреждение. Введите yes, чтобы продолжить подключение. Если удаленная учетная запись защищена паролем, вам придется ввести пароль. Если SSH-ключ защищен парольной фразой, вам также потребуется ввести ее.

  • Подключение к другому порту

По умолчанию SSH работает на порту 22. SSH-клиент будет использовать значение порта по умолчанию при подключении к удаленной системе. Однако, если удаленная система ожидает SSH-трафик на другом порту, это не сработает. В такой ситуации нам нужно вручную указать номер порта. Чтобы указать конкретный порт, используйте флаг -p:

Постоянно указывать порт вручную неэффективно. Мы можем изменить значение порта по умолчанию на постоянной основе. Для этого откройте конфигурационный файл SSH. Если файл не существует, следующая команда создаст его:

Затем добавьте следующие строки:

  • Выполнение команд на удаленном сервере

Теперь, когда соединение установлено, любая команда, запущенная в локальном терминале, будет выполняться на удаленном сервере. Любой сгенерированный вывод будет отправлен в локальный терминал.

Если нужно запустить только одну команду, мы можем выполнить ее без полноценного входа по SSH. Достаточно просто указать команду после инструкции подключения SSH:

  • Добавление ключа в SSH-агент

Если у SSH-ключа есть парольная фраза, то при каждом подключении к удаленной системе вам придется вводить ее. Постоянно делать это неэффективно. Мы можем поручить это SSH-агенту. Это небольшая утилита, которая хранит закрытый ключ после того, как вы ввели парольную фразу. Закрытый ключ будет доступен в течение сессии терминала. Чтобы запустить SSH-агент, выполните следующую команду:

SSH Agent

Программа работает в фоновом режиме. Все, что вам нужно, это добавить свой закрытый ключ в агент. Выполните следующую команду:

SSH Add

Введите парольную фразу для завершения операции.

  • Перенаправление учетных данных SSH

Мы также можем настроить SSH для подключения с одного сервера на другой без пароля. Это может быть очень эффективно, особенно при работе с большим количеством удаленных серверов. Для этого нам нужно перенаправить учетные данные SSH. Перенаправление учетных данных SSH требует, чтобы удаленный сервер был настроен на прием соединений с локальной машины/сервера. Затем вам нужно лишь подключиться к первому серверу, используя флаг -A. Он перенаправляет ваши учетные данные на серверы для текущей сессии:

Конфигурации удаленного сервера

В этом разделе приведены некоторые из распространенных конфигураций на стороне сервера, которые помогут улучшить отклик сервера и безопасность подключения.

  • Отключение аутентификации по паролю

Если SSH-ключи настроены и SSH-соединение работает должным образом, то можно безопасно отключить аутентификацию по паролю. Следующая конфигурация прекратит запрашивать пароль при подключении любого пользователя по SSH. На удаленном сервере откройте sshd_config файл с root/sudo правами:

Затем найдите запись PasswordAuthentication. Если строка закомментирована, раскомментируйте ее. Измените значение на no:

Password Authentication Change

Сохраните файл и закройте редактор. Чтобы изменения вступили в силу, перезапустите службу SSH:

Если система работает на CentOS/Fedora, используйте вместо этого следующую команду:

  • Изменение порта SSH

Как упоминалось ранее, SSH использует порт 22 для обмена SSH-трафиком. Однако, по мнению некоторых системных администраторов, для SSH лучше назначить другой порт. Это может помочь защититься от автоматических ботов, наводняющих порт. Чтобы изменить порт, который слушает SSH, откройте sshd_config файл:

Найдите запись Port. Если она закомментирована, раскомментируйте ее. Затем измените значение на другое. Значение порта представляет собой беззнаковое 16-разрядное целое число (0-65535):

SSH Port Change

Сохраните файл и закройте редактор. Чтобы применить изменения, перезапустите демон SSH:

В CentOS/Fedora вместо этого выполните следующую команду:

  • Ограничение пользователей

Мы можем настроить, какие учетные записи пользователей могут подключаться по SSH. Это также включает в себя настройку файла sshd_config . Откройте файл с правами sudo/root:

Найдите запись AllowUsers. Добавьте разрешенных пользователей:

User Limitation

Сохраните файл и закройте редактор. Перезапустите демон SSH, чтобы изменения вступили в силу:

В CentOS/Fedora вместо этого выполните следующую команду:

  • Ограничение групп

Аналогично ограничению пользователей, мы также можем определить, какая группа пользователей может подключаться к системе по SSH. Откройте файл sshd_config :

Используйте запись AllowGroups, чтобы добавить определенную группу пользователей, которая может использовать SSH:

Allow User Groups

Сохраните файл и закройте редактор. Перезапустите демон SSH, чтобы изменения вступили в силу:

Для CentOS/Fedora вместо этого выполните следующую команду:

Обратите внимание, что если какой-либо пользователь добавляется в группу пользователей или удаляется из нее, необходимо перезапустить демон SSH. В противном случае изменения группы не вступят в силу.

  • Отключение входа для root

Если у вас есть доступ к пользователю с привилегиями sudo, рекомендуется отключить вход для root по SSH. Откройте файл sshd_config :

Измените значение записи PermitRootLogin на no:

Disable Root Login

Сохраните файл и закройте редактор. Перезапустите демон SSH, чтобы изменения вступили в силу:

В CentOS/Fedora вместо этого выполните следующую команду:

  • Перенаправление графического вывода приложений X

Демон SSH также может перенаправлять вывод графических приложений X с сервера на клиент. Однако для этого на удаленной системе должна быть настроена оконная система X. Эту функцию также необходимо включить в конфигурации SSH. Откройте конфигурационный файл SSH:

Измените значение директивы X11Forwarding на yes:

X11 Forwarding

Сохраните файл и закройте редактор. Перезапустите демон SSH, чтобы изменения вступили в силу:

В CentOS/Fedora вместо этого выполните следующую команду:

Конфигурации клиента

В этом разделе мы рассмотрим некоторые распространенные конфигурации SSH-клиента.

  • Информация о подключении для конкретного сервера

В локальной системе мы можем определить особенности удаленного подключения. Вся информация хранится в конфигурационном файле, расположенном по адресу ~/.ssh/config:

Каждый блок удаленной системы обозначается ключевым словом Host, за которым следует псевдоним. Все директивы для конкретной системы указываются здесь. При подключении к удаленной системе SSH применит их автоматически. Для получения подробного описания конфигурации обратитесь к справочной странице (man):

SSH Manual

Запись для удаленного подключения будет иметь следующую структуру:

  • Тайм-аут подключения

Вы можете обнаружить, что сеансы SSH прерываются до того, как вы будете готовы выполнить какое-либо действие. Если клиент не отправляет пакеты на удаленный сервер, то через некоторое время время ожидания соединения истекает. Чтобы избежать подобных ситуаций, мы можем настроить локальный клиент на периодическую отправку пакетов для поддержания соединения.

Откройте локальный конфигурационный файл:

В записи удаленного подключения добавьте директиву ServerAliveInterval, за которой следует интервал отправки пакетов в секундах:

Server Alive Interval

Сохраните файл и закройте редактор.

  • Отключение проверки хоста

По умолчанию при попытке подключения к новому серверу SSH-клиент сообщает отпечаток пальца удаленного демона SSH. Это полезная функция для проверки подлинности хоста. Если злоумышленник попытается подменить удаленный хост, он отобразится как новый сервер.

Отключение этой функции может представлять огромную угрозу безопасности. Как правило, рекомендуется держать эту опцию включенной. Однако в определенных ситуациях отключение проверки хоста может быть удобным. Откройте конфигурационный файл:

В разделе удаленного хоста добавьте следующие директивы:

Disabling Host Checking

Первая директива отключит автоматическое добавление новых хостов в список известных хостов, хранящийся в файле known_hosts. Вторая директива указывает не предупреждать об изменениях. Сохраните файл и закройте редактор.

  • Мультиплексирование SSH через одно TCP-соединение

Иногда установление TCP-соединения может занять довольно много времени. Если необходимо установить несколько подключений к одной и той же машине, то мультиплексирование — отличная функция, которой вы можете воспользоваться. Мультиплексирование SSH позволяет использовать одно и то же TCP-соединение для нескольких сеансов SSH. Это снижает нагрузку, необходимую для создания новых сеансов. Ограничение количества подключений также может помочь.

Мы можем вручную настроить мультиплексированное соединение или позволить SSH использовать его при наличии возможности. Здесь мы настроим SSH для работы по второму сценарию. Откройте конфигурационный файл SSH:

Добавьте определение хоста с подстановочным знаком (wildcard) в начало файла. Это гарантирует, что следующий набор директив будет применен ко всем удаленным подключениям. Добавьте следующие директивы:

Multiplexing SSH

Первая директива указывает SSH автоматически использовать мультиплексирование при наличии возможности. Вторая директива задает путь к управляющему сокету. Этот сокет будет создан при установлении первого сеанса. Последующие сеансы будут использовать этот сокет.

Последняя директива указывает SSH перевести исходное мастер-соединение в фоновый режим. Она также означает, что TCP-соединения будут автоматически завершаться через одну секунду после окончания последней SSH-сессии. Затем создайте каталог, который мы объявили в конфигурационном файле:

Наконец, мультиплексирование должно быть активно.

Управляющие коды SSH

После установления соединения существуют способы управления поведением соединения с помощью управляющих кодов.

  • Принудительное отключение

Зависла SSH-сессия? SSH-сессии обычно управляются сервером. Если на сервере возникают проблемы, зависание в «мертвой» SSH-сессии может сильно раздражать. К счастью, OpenSSH предлагает полезные средства управления состоянием соединения со стороны клиента.

Нажмите Enter пару раз. Затем введите следующую команду:

Forcing Disconnects

Здесь ~ — это управляющий символ. После выполнения этой команды на клиенте соединение должно немедленно закрыться.

  • Фоновая сессия SSH

Мы также можем перевести SSH-сессию в фоновый режим. При переводе в фоновый режим вы вернетесь в обычную сессию командной строки. Как только ваша работа будет завершена, вы сможете снова вернуться в оболочку SSH. Обратите внимание, что вам необходимо правильно настроить тайм-аут, чтобы избежать разрыва соединения, пока SSH-сессия находится в фоновом режиме. Чтобы перевести SSH-сессию в фоновый режим, введите управляющий символ, а затем Ctrl + Z:

SSH Background Session

Если это была ваша последняя фоновая задача, вы можете возобновить ее с помощью следующей команды:

Если фоновых задач несколько, мы можем определить нужную из списка задач:

Jobs

Чтобы вывести целевую задачу на передний план, запишите номер задачи из первого столбца. Затем выполните следующую команду:

Job Foreground

  • Изменение конфигурации перенаправления портов

Используя механизм управления, мы можем изменять правила перенаправления портов на лету. После установления соединения мы можем создавать или удалять правила перенаправления портов. Это часть интерфейса командной строки SSH.

Для доступа к интерфейсу командной строки SSH выполните команду:

SSH Command Line Interface

Чтобы просмотреть список доступных опций, введите следующую команду:

Если вывод слишком минималистичен, попробуйте повысить уровень детализации с помощью следующей управляющей команды:

Теперь снова запустите команду -h:

SSH Command Line Help

Как видно из вывода, настроить любое перенаправление портов довольно просто с помощью одной команды. Например, туннель также можно закрыть с помощью команды kill, которая обозначается символом K в списке команд.

Заключение

С SSH приходится сталкиваться довольно часто. Вот почему изучение SSH очень полезно. Наш подробный обзор SSH охватывает наиболее важные конфигурации SSH, которые пользователям необходимо знать для повседневного использования SSH. Освоив их, вы сможете работать практически с любыми конфигурациями SSH-серверов.

Приятной работы!

author

Pranay Kapgate

Автор · CloudSigma

Preslav Dobrev — креативный дизайнер в CloudSigma, сосредоточенный на формировании последовательного корпоративного образа с помощью традиционных и инновационных маркетинговых каналов. Он умело сочетает художественное видение со стратегическим маркетингом, создавая убедительные истории бренда.

Комментарии

Комментариев пока нет. Будьте первым.