# Протокол SSH

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

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

### Что значит «протокол»? <a href="#chto-znachit-protokol" id="chto-znachit-protokol"></a>

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

> **Пример**: вы вводите команду удаления файла, и эта команда передается на другой компьютер и выполняется там. Ответ (или сообщение об ошибке) возвращается и показывается на вашем компьютере.

### Что значит «защищенный»? <a href="#chto-znachit-zashishennyi" id="chto-znachit-zashishennyi"></a>

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

### Зачем это нужно? <a href="#zachem-eto-nuzhno" id="zachem-eto-nuzhno"></a>

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

### Как подключаться по SSH? <a href="#kak-podklyuchatsya-po-ssh" id="kak-podklyuchatsya-po-ssh"></a>

Для подключения к удаленной машине по SSH нужен клиент — специальная программа. В \*nix-подобных системах (Linux, macOS) клиент обычно установлен в системе по умолчанию, и достаточно открыть терминал. В Windows ранних версий нужно скачать сторонний клиент, например, [Putty](https://www.putty.org/). Но для WIndows 10, команда ssh также работает из командной строчки.

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

```
ssh username@remote_host -p port
```

Например, для подключения к удаленному компьютеру raspberry pi `10.8.0.6` в аккаунт `pi` нужно ввести:

```
ssh pi@10.8.0.6
```

Если не указывать порт, то будет использован порт SSH по умолчанию — `22`. Используемый порт задается при настройке SSH-сервера, программы, которая запущена на удаленном компьютере и ожидает подключения извне.

#### Fingerprint <a href="#fingerprint" id="fingerprint"></a>

При первом подключении появится сообщение:

```
The authenticity of host '10.8.0.6 (10.8.0.6)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
```

Введите `yes` в первый раз.

Это нужно для повышения безопасности. При настройке SSH-сервера создается уникальная комбинация символов — fingerprint («отпечатки пальцев»). Ваш компьютер запоминает эту комбинацию и сверяет ее при каждом новом соединении. Если кто-то переустановит SSH-сервер, или всю операционную систему, или вообще заменит удаленный компьютер, сохранив его адрес, то при следующем соединении вы узнаете об этом, потому что изменится fingerprint.

Если fingerprint не меняется, то такое сообщение не будет появляться.

### Подключение по паролю <a href="#podklyuchenie-po-parolyu" id="podklyuchenie-po-parolyu"></a>

Простейший вариант — подключение по паролю. После ввода команды `ssh` система запросит пароль:

```
pi@10.8.0.6's password: 
```

Пароль придется вводить каждый раз.

### Подключение по ключу, без пароля <a href="#podklyuchenie-po-klyuchu-bez-parolya" id="podklyuchenie-po-klyuchu-bez-parolya"></a>

Для удобного подключения по SSH (и многим другим сервисам) без ввода пароля можно использовать ключи.

Нужно создать пару ключей: **приватный** (закрытый) ключ и **публичный** (открытый) ключ. Приватный ключ нужно хранить и никогда никому не показывать. Публичный ключ можно показывать всем и распространять свободно.

Эти _ключи связаны друг с другом_ таким образом, что зашифровав информацию одним ключом, расшифровать ее можно только другим. Например, если ваш друг зашифрует письмо вашим публичным ключом, то прочитать его сможете только вы, потому что для этого нужен ваш приватный ключ. И наоборот: если вы зашифруете что-то своим приватным ключом, то расшифровать его можно только вашим публичным ключом. Так как публичный ключ доступен всем, любой может расшифровать это сообщение. Но он может быть уверен, что сообщение пришло именно от вас. В этом заключается идея цифровой подписи.

#### Генерация ключей <a href="#generaciya-klyuchei" id="generaciya-klyuchei"></a>

Создадим пару ключей:

```
ssh-keygen
```

Программа запустится и спросит, куда сохранять ключи:

```
Generating public/private rsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_rsa):
```

Нажмите Enter для сохранения в стандартное место — директорию `.ssh/id_rsa` в вашей домашней директории.

Программа запросит passphrase. Это вроде пароля для ключа. Можно просто нажать Enter и пропустить этот шаг. Или ввести passphrase — тогда его нужно будет вводить каждый раз, когда используется ключ.

```
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

Ключи созданы:

```
Your identification has been saved in /home/demo/.ssh/id_rsa.
Your public key has been saved in /home/demo/.ssh/id_rsa.pub.
The key fingerprint is:
8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|       +         |
|      o S   .    |
|     o   . * +   |
|      o + = O .  |
|       + = = +   |
|      ....Eo+    |
+-----------------+
```

Теперь у вас есть два файла:

* `~/.ssh/id_rsa` — приватный ключ. **Никогда никому и никуда не передавайте его!**
* `~/.ssh/id_rsa.pub` — публичный ключ. Спокойно распространяйте его.

В Windows можно использовать `ssh-gen` в подсистеме Ubuntu for Windows или в командной строке Git for Windows. Или создавать ключи графической утилитой вроде [PuTTYgen](https://winscp.net/eng/docs/ui_puttygen).

#### Загрузка публичного ключа на удаленный компьютер <a href="#zagruzka-publichnogo-klyucha-na-server" id="zagruzka-publichnogo-klyucha-na-server"></a>

Нужно добавить публичный ключ на робота в файл `~/.ssh/authorized_keys`. Самый простой способ — запустить на локальной машине команду для копирования ключа:

```
ssh-copy-id -i /home/pi/.ssh/id_rsa.pub pi@10.8.0.6
```

Другой способ — подключиться по паролю, открыть в редакторе файл `~/.ssh/authorized_keys`и добавить в конец текст из вашего файла `~/.ssh/id_rsa.pub`.

Теперь при подключении пароль запрашиваться не будет1.

После включения соединений по ключу **рекомендуется отключить подключение по паролю**.
