Когда речь заходит об удаленных вычислениях, 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 в качестве метода аутентификации, на удаленной системе должна быть установлена копия открытого ключа. Копии закрытого и открытого ключей также должны быть установлены на локальной системе. По умолчанию открытые ключи перечислены в следующем файле. У каждого уникального пользователя есть уникальная копия этого файла:
|
1 |
~/.ssh/authorized_keys |
Вот как работает процесс аутентификации:
-
Клиентская система отправляет запрос на подключение к удаленной системе. Она также отправляет информацию о том, какой SSH-ключ использовать.
-
Удаленная система проверяет, указан ли открытый ключ в authorized_keys.
-
Если ключ существует, генерируется случайная строка, которая шифруется с помощью открытого ключа. Зашифрованное сообщение может быть расшифровано только с помощью закрытого ключа.
-
Получив строку, клиент расшифрует ее.
-
Объединив строку и ранее согласованный идентификатор сессии, генерируется хэш MD5. Клиент отправляет хэш MD5 удаленной системе.
-
Удаленная система знает случайную строку и идентификатор сессии. Если хэш MD5 совпадает, подключение разрешается.
Ключи SSH
В этом руководстве основное внимание при аутентификации будет уделено ключам SSH. Таким образом, этот раздел будет посвящен работе с ключами SSH.
-
Генерация пары ключей SSH
По умолчанию в системе Linux ключ SSH не установлен. Однако система может содержать ключи SSH, сгенерированные или установленные ранее. Предполагая, что предыдущего ключа SSH нет, нам нужно сгенерировать новую пару открытого и закрытого ключей SSH. SSH поддерживает множество криптографических алгоритмов для генерации ключей SSH, например, RSA, DSA, ECDSA и EdDSA. RSA является алгоритмом по умолчанию и предпочтительным алгоритмом.
-
Генерация обычной пары ключей RSA
Чтобы сгенерировать пару ключей SSH, выполните следующую команду:
|
1 |
ssh-keygen |
В запросе вас спросят, где сохранить пару ключей. Как уже упоминалось, это будет пара ключей RSA. Если значение не введено, SSH сохранит его в расположение по умолчанию /home/demo/.ssh/id_rsa.
Следующий шаг — ввод парольной фразы. Рекомендуется использовать парольную фразу. Длина парольной фразы может быть произвольной. Она добавляет дополнительный уровень безопасности. Тем не менее, SSH позволяет генерировать ключи без парольной фразы. Просто нажмите Enter, если хотите получить ключи без парольной фразы.
Итоговый вывод содержит следующую ключевую информацию:
-
Расположение закрытого ключа ( /root/.ssh/id_rsa). Им никогда не следует делиться.
-
Расположение открытого ключа ( /root/.ssh/id_rsa.pub). Его можно безопасно передавать кому угодно.
-
Отпечаток ключа.
-
Случайное изображение ключа. Идея заключается в том, что если ключи будут скомпрометированы, вы, вероятно, сможете это понять, заметив любое изменение в изображении ключа.
-
Генерация пары ключей RSA с другим количеством бит
По умолчанию ключи SSH имеют размер 2048 бит. С точки зрения безопасности этого считается вполне достаточно. Однако мы можем вручную указать другое количество бит. Чем выше значение в битах, тем надежнее ключ.
Запустите следующую команду, чтобы сгенерировать пару SSH-ключей размером 4096 бит. Большинство серверов поддерживают 4096-битные SSH-ключи. Если ключ слишком велик, он может быть отклонен в целях защиты от DDoS:
|
1 |
ssh-keygen -b 4096 |
Поскольку мы уже сгенерировали пару ключей, SSH спросит, нужно ли перезаписать предыдущую. Остальная часть процесса аналогична генерации обычной пары ключей.
-
Изменение парольной фразы закрытого ключа
Мы можем изменить парольную фразу закрытого ключа. Для этого процесса вам необходимо знать текущую парольную фразу. Чтобы изменить парольную фразу, выполните следующую команду:
|
1 |
ssh-keygen -p |

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

Введите расположение ключа. Нажмите Enter, если ключ хранится в расположении по умолчанию.
Копирование открытого ключа
Пара SSH-ключей готова для защиты удаленных подключений. Чтобы удаленная система принимала SSH-ключ для аутентификации, ей необходима копия открытого ключа. Существует несколько способов скопировать открытый ключ на удаленный сервер.
-
Использование ssh-copy-id
Утилита ssh-copy-id поставляется в составе пакета OpenSSH. Это стандартный способ копирования открытого ключа SSH. Он прост и удобен в использовании. Выполните следующую команду для переноса копии открытого ключа:
|
1 |
ssh-copy-id <username>@<secondary_server_ip> |

Для завершения процесса вам понадобится пароль от учетной записи удаленного пользователя. В случае успеха появится сообщение об успешном завершении.
-
Использование SSH-подключения
Если использование утилиты ssh-copy-id недоступно, но основной сервер может подключиться к дополнительному серверу по SSH, мы можем использовать другой трюк для копирования ключа. Он заключается в передаче содержимого открытого ключа через команду SSH на удаленную сторону. Обратите внимание, что если каталог ~/.ssh не существует на удаленной системе, это может не сработать:
|
1 |
cat ~/.ssh/id_rsa.pub | ssh <username>@<secondary_server_ip> "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" |
-
Копирование вручную
Если удаленное подключение невозможно, остается единственный вариант — вручную добавить открытый ключ на удаленный сервер. Сначала получите содержимое открытого ключа:
|
1 |
cat ~/.ssh/id_rsa.pub |
На удаленном сервере поместите ключ в соответствующее место:
|
1 2 3 |
mkdir -pv ~/.ssh echo <public_key> >> ~/.ssh/authorized_keys |
Использование SSH
Теперь, когда публичный ключ настроен, мы готовы использовать SSH для удаленного подключения.
-
Подключение к удаленной системе
Первый шаг — научиться подключаться к удаленной системе с помощью SSH. Предполагается, что как локальная, так и удаленная системы разрешают SSH-трафик. Чтобы подключиться к удаленной системе, введите следующее:
|
1 |
ssh <secondary_server_ip> |

Чтобы подключиться под определенным пользователем на удаленном сервере, используйте следующую структуру:
|
1 |
ssh <username>@<secondary_server_ip> |

Если вы подключаетесь к серверу впервые, SSH может вывести предупреждение. Введите yes, чтобы продолжить подключение. Если удаленная учетная запись защищена паролем, вам придется ввести пароль. Если SSH-ключ защищен парольной фразой, вам также потребуется ввести ее.
-
Подключение к другому порту
По умолчанию SSH работает на порту 22. SSH-клиент будет использовать значение порта по умолчанию при подключении к удаленной системе. Однако, если удаленная система ожидает SSH-трафик на другом порту, это не сработает. В такой ситуации нам нужно вручную указать номер порта. Чтобы указать конкретный порт, используйте флаг -p:
|
1 |
ssh -p <port> <username>@<secondary_server_ip> |
Постоянно указывать порт вручную неэффективно. Мы можем изменить значение порта по умолчанию на постоянной основе. Для этого откройте конфигурационный файл SSH. Если файл не существует, следующая команда создаст его:
|
1 |
nano ~/.ssh/config |
Затем добавьте следующие строки:
|
1 2 3 4 5 |
Host <remote_alias> HostName <remote_hostname> Port <port_value> |
-
Выполнение команд на удаленном сервере
Теперь, когда соединение установлено, любая команда, запущенная в локальном терминале, будет выполняться на удаленном сервере. Любой сгенерированный вывод будет отправлен в локальный терминал.
Если нужно запустить только одну команду, мы можем выполнить ее без полноценного входа по SSH. Достаточно просто указать команду после инструкции подключения SSH:
|
1 |
ssh <username>@<secondary_server_ip> <command_to_run> |
-
Добавление ключа в SSH-агент
Если у SSH-ключа есть парольная фраза, то при каждом подключении к удаленной системе вам придется вводить ее. Постоянно делать это неэффективно. Мы можем поручить это SSH-агенту. Это небольшая утилита, которая хранит закрытый ключ после того, как вы ввели парольную фразу. Закрытый ключ будет доступен в течение сессии терминала. Чтобы запустить SSH-агент, выполните следующую команду:
|
1 |
eval $(ssh-agent) |

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

Введите парольную фразу для завершения операции.
-
Перенаправление учетных данных SSH
Мы также можем настроить SSH для подключения с одного сервера на другой без пароля. Это может быть очень эффективно, особенно при работе с большим количеством удаленных серверов. Для этого нам нужно перенаправить учетные данные SSH. Перенаправление учетных данных SSH требует, чтобы удаленный сервер был настроен на прием соединений с локальной машины/сервера. Затем вам нужно лишь подключиться к первому серверу, используя флаг -A. Он перенаправляет ваши учетные данные на серверы для текущей сессии:
|
1 |
ssh -A <username>@<secondary_server_ip> |
Конфигурации удаленного сервера
В этом разделе приведены некоторые из распространенных конфигураций на стороне сервера, которые помогут улучшить отклик сервера и безопасность подключения.
-
Отключение аутентификации по паролю
Если SSH-ключи настроены и SSH-соединение работает должным образом, то можно безопасно отключить аутентификацию по паролю. Следующая конфигурация прекратит запрашивать пароль при подключении любого пользователя по SSH. На удаленном сервере откройте sshd_config файл с root/sudo правами:
|
1 |
sudo nano /etc/ssh/sshd_config |
Затем найдите запись PasswordAuthentication. Если строка закомментирована, раскомментируйте ее. Измените значение на no:
|
1 |
PasswordAuthentication no |

Сохраните файл и закройте редактор. Чтобы изменения вступили в силу, перезапустите службу SSH:
|
1 |
sudo service ssh restart |
Если система работает на CentOS/Fedora, используйте вместо этого следующую команду:
|
1 |
sudo service sshd restart |
-
Изменение порта SSH
Как упоминалось ранее, SSH использует порт 22 для обмена SSH-трафиком. Однако, по мнению некоторых системных администраторов, для SSH лучше назначить другой порт. Это может помочь защититься от автоматических ботов, наводняющих порт. Чтобы изменить порт, который слушает SSH, откройте sshd_config файл:
|
1 |
sudo nano /etc/ssh/sshd_config |
Найдите запись Port. Если она закомментирована, раскомментируйте ее. Затем измените значение на другое. Значение порта представляет собой беззнаковое 16-разрядное целое число (0-65535):
|
1 |
Port 1024 |

Сохраните файл и закройте редактор. Чтобы применить изменения, перезапустите демон SSH:
|
1 |
sudo service ssh restart |
В CentOS/Fedora вместо этого выполните следующую команду:
|
1 |
sudo service sshd restart |
-
Ограничение пользователей
Мы можем настроить, какие учетные записи пользователей могут подключаться по SSH. Это также включает в себя настройку файла sshd_config . Откройте файл с правами sudo/root:
|
1 |
sudo nano /etc/ssh/sshd_config |
Найдите запись AllowUsers. Добавьте разрешенных пользователей:
|
1 |
AllowUsers <user_1> <user_2> |

Сохраните файл и закройте редактор. Перезапустите демон SSH, чтобы изменения вступили в силу:
|
1 |
sudo service ssh restart |
В CentOS/Fedora вместо этого выполните следующую команду:
|
1 |
sudo service sshd restart |
-
Ограничение групп
Аналогично ограничению пользователей, мы также можем определить, какая группа пользователей может подключаться к системе по SSH. Откройте файл sshd_config :
|
1 |
sudo nano /etc/ssh/sshd_config |
Используйте запись AllowGroups, чтобы добавить определенную группу пользователей, которая может использовать SSH:
|
1 |
AllowGroups <user_group> |

Сохраните файл и закройте редактор. Перезапустите демон SSH, чтобы изменения вступили в силу:
|
1 |
sudo service ssh restart |
Для CentOS/Fedora вместо этого выполните следующую команду:
|
1 |
sudo service sshd restart |
Обратите внимание, что если какой-либо пользователь добавляется в группу пользователей или удаляется из нее, необходимо перезапустить демон SSH. В противном случае изменения группы не вступят в силу.
-
Отключение входа для root
Если у вас есть доступ к пользователю с привилегиями sudo, рекомендуется отключить вход для root по SSH. Откройте файл sshd_config :
|
1 |
sudo nano /etc/ssh/sshd_config |
Измените значение записи PermitRootLogin на no:
|
1 |
PermitRootLogin no |

Сохраните файл и закройте редактор. Перезапустите демон SSH, чтобы изменения вступили в силу:
|
1 |
sudo service ssh restart |
В CentOS/Fedora вместо этого выполните следующую команду:
|
1 |
sudo service sshd restart |
-
Перенаправление графического вывода приложений X
Демон SSH также может перенаправлять вывод графических приложений X с сервера на клиент. Однако для этого на удаленной системе должна быть настроена оконная система X. Эту функцию также необходимо включить в конфигурации SSH. Откройте конфигурационный файл SSH:
|
1 |
sudo nano /etc/ssh/sshd_config |
Измените значение директивы X11Forwarding на yes:
|
1 |
X11Forwarding yes |

Сохраните файл и закройте редактор. Перезапустите демон SSH, чтобы изменения вступили в силу:
|
1 |
sudo service ssh restart |
В CentOS/Fedora вместо этого выполните следующую команду:
|
1 |
sudo service sshd restart |
Конфигурации клиента
В этом разделе мы рассмотрим некоторые распространенные конфигурации SSH-клиента.
-
Информация о подключении для конкретного сервера
В локальной системе мы можем определить особенности удаленного подключения. Вся информация хранится в конфигурационном файле, расположенном по адресу ~/.ssh/config:
|
1 |
nano ~/.ssh/config |
Каждый блок удаленной системы обозначается ключевым словом Host, за которым следует псевдоним. Все директивы для конкретной системы указываются здесь. При подключении к удаленной системе SSH применит их автоматически. Для получения подробного описания конфигурации обратитесь к справочной странице (man):
|
1 |
man ssh_config |

Запись для удаленного подключения будет иметь следующую структуру:
|
1 2 3 |
Host <remote_hostname> <directive> <value> |
-
Тайм-аут подключения
Вы можете обнаружить, что сеансы SSH прерываются до того, как вы будете готовы выполнить какое-либо действие. Если клиент не отправляет пакеты на удаленный сервер, то через некоторое время время ожидания соединения истекает. Чтобы избежать подобных ситуаций, мы можем настроить локальный клиент на периодическую отправку пакетов для поддержания соединения.
Откройте локальный конфигурационный файл:
|
1 |
nano ~/.ssh/config |
В записи удаленного подключения добавьте директиву ServerAliveInterval, за которой следует интервал отправки пакетов в секундах:
|
1 |
ServerAliveInterval 120 |

Сохраните файл и закройте редактор.
-
Отключение проверки хоста
По умолчанию при попытке подключения к новому серверу SSH-клиент сообщает отпечаток пальца удаленного демона SSH. Это полезная функция для проверки подлинности хоста. Если злоумышленник попытается подменить удаленный хост, он отобразится как новый сервер.
Отключение этой функции может представлять огромную угрозу безопасности. Как правило, рекомендуется держать эту опцию включенной. Однако в определенных ситуациях отключение проверки хоста может быть удобным. Откройте конфигурационный файл:
|
1 |
nano ~/.ssh/config |
В разделе удаленного хоста добавьте следующие директивы:

|
1 2 3 |
StrictHostKeyChecking no UserKnownHostsFile /dev/null |
Первая директива отключит автоматическое добавление новых хостов в список известных хостов, хранящийся в файле known_hosts. Вторая директива указывает не предупреждать об изменениях. Сохраните файл и закройте редактор.
-
Мультиплексирование SSH через одно TCP-соединение
Иногда установление TCP-соединения может занять довольно много времени. Если необходимо установить несколько подключений к одной и той же машине, то мультиплексирование — отличная функция, которой вы можете воспользоваться. Мультиплексирование SSH позволяет использовать одно и то же TCP-соединение для нескольких сеансов SSH. Это снижает нагрузку, необходимую для создания новых сеансов. Ограничение количества подключений также может помочь.
Мы можем вручную настроить мультиплексированное соединение или позволить SSH использовать его при наличии возможности. Здесь мы настроим SSH для работы по второму сценарию. Откройте конфигурационный файл SSH:
|
1 |
nano ~/.ssh/config |
Добавьте определение хоста с подстановочным знаком (wildcard) в начало файла. Это гарантирует, что следующий набор директив будет применен ко всем удаленным подключениям. Добавьте следующие директивы:
|
1 2 3 4 5 |
ControlMaster auto ControlPath ~/.ssh/multiplex/%r@%h:%p ControlPersist 1 |

Первая директива указывает SSH автоматически использовать мультиплексирование при наличии возможности. Вторая директива задает путь к управляющему сокету. Этот сокет будет создан при установлении первого сеанса. Последующие сеансы будут использовать этот сокет.
Последняя директива указывает SSH перевести исходное мастер-соединение в фоновый режим. Она также означает, что TCP-соединения будут автоматически завершаться через одну секунду после окончания последней SSH-сессии. Затем создайте каталог, который мы объявили в конфигурационном файле:
|
1 |
mkdir -pv ~/.ssh/multiplex |
Наконец, мультиплексирование должно быть активно.
Управляющие коды SSH
После установления соединения существуют способы управления поведением соединения с помощью управляющих кодов.
-
Принудительное отключение
Зависла SSH-сессия? SSH-сессии обычно управляются сервером. Если на сервере возникают проблемы, зависание в «мертвой» SSH-сессии может сильно раздражать. К счастью, OpenSSH предлагает полезные средства управления состоянием соединения со стороны клиента.
Нажмите Enter пару раз. Затем введите следующую команду:
|
1 |
~. |
![]()
Здесь ~ — это управляющий символ. После выполнения этой команды на клиенте соединение должно немедленно закрыться.
-
Фоновая сессия SSH
Мы также можем перевести SSH-сессию в фоновый режим. При переводе в фоновый режим вы вернетесь в обычную сессию командной строки. Как только ваша работа будет завершена, вы сможете снова вернуться в оболочку SSH. Обратите внимание, что вам необходимо правильно настроить тайм-аут, чтобы избежать разрыва соединения, пока SSH-сессия находится в фоновом режиме. Чтобы перевести SSH-сессию в фоновый режим, введите управляющий символ, а затем Ctrl + Z:
|
1 |
~<Ctrl + Z> |

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

Чтобы вывести целевую задачу на передний план, запишите номер задачи из первого столбца. Затем выполните следующую команду:
|
1 |
fg %<job_value> |
-
Изменение конфигурации перенаправления портов
Используя механизм управления, мы можем изменять правила перенаправления портов на лету. После установления соединения мы можем создавать или удалять правила перенаправления портов. Это часть интерфейса командной строки SSH.
Для доступа к интерфейсу командной строки SSH выполните команду:
|
1 |
~C |
![]()
Чтобы просмотреть список доступных опций, введите следующую команду:
|
1 |
-h |
Если вывод слишком минималистичен, попробуйте повысить уровень детализации с помощью следующей управляющей команды:
|
1 |
~v |
Теперь снова запустите команду -h:
|
1 |
-h |

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