SSH-подключение: что это и как использовать

Управляем программами через текст

SSH-подключение: что это и как использовать

Управлять другими компьютерами можно удалённо. Для этого обе системы должны уметь использовать одни и те же наборы правил, которые называются сетевыми протоколами. Почему для этого до сих пор используют технологию из 1995 года — хороший вопрос. Отвечаем с подробностями.

Что такое SSH?

Чтобы лучше понять, что такое SSH-подключение, сначала надо кое-что вспомнить.

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

Есть ещё инструменты для выполнения протокола, которые его реализуют. Иногда их могут называть так же, как сам протокол. Работает это так: чтобы подключиться к другому компьютеру, нужно куда-то ввести команду, или нажать кнопку, или запустить программу. То, где мы это делаем, и будет инструментом выполнения протокола.

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

Для чего нужен SSH

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

Как работает SSH-подключение

Подключение по SSH устанавливает клиент — машина, с которой нужно удалённо управлять другой машиной.

Любой сетевой протокол между двумя точками работает примерно одинаково:

  • Клиент устанавливает соединение со второй машиной, сервером. Для этого клиент отправляет запрос на адрес сервера.
  • Клиент проходит аутентификацию — говорит, кто он, и даёт доказательства своей личности. В процессе аутентификации обычно используются логин, пароль или ключи шифрования.
  • Клиент и сервер договариваются, как будут обмениваться данными — в каком формате будет информация, как она будет разбиваться на пакеты, как шифроваться.
  • По установленным правилам проходит сеанс связи — обе системы передают друг другу все данные, которыми нужно было обменяться. Как конкретно это происходит, зависит от протокола — например, в одном варианте информация зашифрована, а в другом передаётся в открытом виде.
  • После обмена один из компьютеров закрывает соединение, второй говорит: «Ну, до скорого» — и тоже отключается до следующего раза.

Принцип работы SSH

Основной принцип работы SSH — использование шифрования.

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

Сервер шифрует открытым ключом небольшую часть данных и отдаёт данные клиенту. Клиент должен расшифровать это сообщение и отдать обратно в открытом виде. Так сервер поймёт, что публичный ключ действительно был создан клиентом.

После этого обе стороны используют алгоритм для обмена секретным ключом: это может быть алгоритм Диффи — Хеллмана или его более современные аналоги. 

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

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

В чём разница между SSH и Telnet/FTP?

Главное различие: SSH передаёт данные в зашифрованном виде, а Telnet и FTP — в открытом. 

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

Вам может быть интересно:

Подключение по SSH в разных системах

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

SSH — это инструмент командной строки, поэтому во всех ОС понадобится запустить приложение для работы с ней. В Linux и MacOS это Terminal или iTerm, а в Windows — PowerShell.

Подключение по SSH из Windows

В версиях Windows 10 и новее не нужно ничего дополнительно устанавливать — SSH уже встроен в систему.

Как включить: перейдите в Параметры → Приложения → Дополнительные компоненты. Найдите OpenSSH-клиент и установите его. Если его нет в списке, выберите: Добавить компонент → OpenSSH-клиент → Установить.

Для запуска нужно запустить WIndows PowerShell. Для этого включите стартовое меню и начните вводить Windows или PowerShell:

Подключение по SSH из Windows

Использование PuTTy. В более ранних версиях Windows нужно установить дополнительное приложение. Самый популярный вариант — PuTTy:

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

Альтернативы. PuTTy — классический вариант для windows-систем, но у него устаревший интерфейс и нет встроенной поддержки передачи файлов. Вот что ещё можно использовать.

WinSCP — клиент с графическим интерфейсом для удобной работы с файлами. Если понадобится командная строка, его можно интегрировать с Putty.

WinSCP — клиент с графическим интерфейсом для удобной работы с файлами

https://winscp.net/eng/docs/ui_explorer

Встроенный SSH-клиент в версиях Windows от 10 и новее позволяет работать через командную строку примерно так же, как в Linux и MacOS.

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

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

Если клиент не установлен, его можно добавить так:

Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

Теперь можно подключиться по SSH. Как это делать для всех систем, разбираем дальше.

Подключение по SSH в Linux/Ubuntu

Работать с SSH Linux умеет по умолчанию, в большинство дистрибутивов он уже включён. Проверить установку можно такой командой в терминале:

ssh

Если SSH не установлен, вы увидите сообщение об ошибке. Тогда его можно установить:

sudo apt-get install openssh-client

Подключение по SSH в MaCOS

Операционные системы от Apple поддерживают SSH по умолчанию. Если в терминале ввести команду ssh, вы увидите такое сообщение:

Подключение по SSH в MaCOS

Подключение к серверу по SSH

Для примера подключимся по SSH к серверу GitHub. Можно связать свой компьютер и репозиторий на облачной платформе через ключи, после этого подключаться по SSH и работать с репозиториями по защищённому протоколу.

Что нужно для подключения?

В общем виде команда для подключения будет выглядеть так:

ssh username@server_ip

Что есть что в этой команде:

  • ssh — обозначает название протокола;
  • username — имя пользователя, которое клиент будет использовать на сервере. GitHub требует использовать для всех SSH-подключений имя пользователя git;
  • server_ip — IP-адрес сервера или доменное имя. Нам нужно github.com.

Ещё нам понадобятся SSH-ключи. В выбранном приложении вводим:

ssh-keygen

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

Подключение к серверу по SSH

После этого система покажет, что ключи готовы:

Подключение к серверу по SSH

Нам нужен публичный ключ. Для этого нужно перейти в папку с ключами, выполнив в консоли команду:

cd .ssh

Теперь нужен текст публичного ключа. Вводим:

cat keys_for_CODE

Содержимое ключа появится в терминале:

Подключение к серверу по SSH

Копируем текст этого ключа и идём на GitHub. Заходим во вкладку с SSH-ключами и создаём новый ключ:

Подключение к серверу по SSH

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

Подключение к серверу по SSH

Теперь вводим в терминале такую команду:

ssh git@github.com

SSH-сервер должен узнать нас и отправить приветственное сообщение:

Подключение к серверу по SSH

Как проверить, работает ли SSH на сервере?

На разных ОС можно проверить статус сервера и отдельно порт 22, на котором этот сервер по умолчанию размещается.

На Linux узнать статус сервера можно такими командами:

systemctl status ssh

service ssh status

Если сервер включён, должно появиться сообщение:

Active: active (running) since …

Для проверки порта 22 введите:

ss -tulnp | grep ssh

netstat -tulnp | grep ssh

Если SSH работает, в выходной команде должно быть 0.0.0.0:22 или :::22.

На MacOS сервер проверяется так:

sudo systemsetup -getremotelogin

В случае подтверждения ответом будет Remote Login: On.

А 22-й порт — так:

lsof -i :22

Если выходной ответ в терминале содержит sshd, значит, сервер слушает порт, то есть проверяет его.

В Windows сервер проверяют командой:

Get-Service -Name sshd | Select-Object Status, StartType

Успешный ответ будет таким:

Status StartType
------ ---------
Running Automatic

22-й порт проверяют такой командой:

Test-NetConnection -ComputerName 127.0.0.1 -Port 22

Если порт открыт, результат будет:

TcpTestSucceeded : True

Настройка SSH-сервера

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

Как установить и запустить SSH-сервер?

Мы разберём по две команды для каждой системы — поднятие сервера и проверку того, как он работает.

Чтобы поднять сервер на Linux, выполняем:

sudo apt update && sudo apt install openssh-server

После этого сервер нужно запустить:

sudo systemctl start ssh

Проверить, всё ли в порядке, можно так:

sudo systemctl status ssh 

Результатом последней команды должно быть active (running).

Для установки и запуска на MacOS пишем в терминале команду:

sudo systemsetup -setremotelogin on

Для проверки подключаемся к своему же серверу:

ssh localhost

Установка на Windows происходит так:

  1. Открываем Параметры → Приложения → Дополнительные компоненты.
  2. Добавляем OpenSSH-сервер.sdf

Для запуска используем PowerShell:

Start-Service sshd

Set-Service -Name sshd -StartupType 'Automatic'

Базовые настройки безопасности

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

Для этого на Linux и MacOS делаем так:

sudo nano /etc/ssh/sshd_config

Меняем порт такой командой (необязательно устанавливать именно такой номер порта, можно выбрать любой доступный):

Port 2222

В Windows файл настройки обычно находится здесь:

C:\ProgramData\ssh\sshd_config

Его можно открыть через PowerShell от имени администратора:

notepad C:\ProgramData\ssh\sshd_config

После этого найдите строку #Port 22, уберите символ # в начале и замените на Port 2222

После смены порта перезапустите сервер:

  • Команда для Linux и MacOS — sudo systemctl restart ssh
  • Команда для Windows — Restart-Service sshd

Ошибка Connection refused

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

  • SSH-сервер не запущен.
  • Брандмауэр блокирует порт.
  • Неправильный IP/порт.

Для решения сначала проверьте статус сервера. В Linux/MacOS для этого нужна команда sudo systemctl status ssh, а в Windows — Get-Service sshd.

Чтобы разрешить порт в брандмауэре или файерволе, нужно сделать так: в Linux открываем нужный порт и перезагружаем:

sudo ufw allow 2222/tcp 

sudo ufw reload

После этого проверяем статус:

sudo ufw status

При успешном результате появится сообщение 2222/tcp ALLOW.

В MacOS файервол обычно отключён. Чтобы открыть настройки, выполняем команду:

sudo nano /etc/pf.conf

Теперь добавляем новое правило перед anchor "com.apple/*":

pass in proto tcp from any to any port 2222

Перезагружаем настройки и включаем файервол:

sudo pfctl -f /etc/pf.conf 

sudo pfctl -e 

В Windows открываем PowerShell и прописываем команду:

New-NetFirewallRule -DisplayName "SSH (Port 2222)" -Direction Inbound -Protocol TCP -LocalPort 2222 -Action Allow

Как проверить, заработало или нет:

Get-NetFirewallRule -DisplayName "SSH*" | Select-Object DisplayName,Enabled

Бонус для читателей

Если вам интересно погрузиться в мир ИТ и при этом немного сэкономить, держите наш промокод на курсы Практикума. Он даст вам скидку при оплате, поможет с льготной ипотекой и даст безлимит на маркетплейсах. Ладно, окей, это просто скидка, без остального, но хорошая. 

Вам слово

Приходите к нам в соцсети поделиться своим мнением о статье и почитать, что пишут другие. А ещё там выходит дополнительный контент, которого нет на сайте — шпаргалки, опросы и разная дурка. В общем, вот тележка, вот ВК — велком!

Обложка:

Алексей Сухов

Корректор:

Александр Зубов

Вёрстка:

Егор Степанов

Соцсети:

Юлия Зубарева

Вам может быть интересно
hard