Как настроить ключи SSH в Ubuntu 18.04

### Введение

SSH (secure shell, безопасная оболочка) представляет собой шифрованный протокол для администрирования и взаимодействия между серверами. Во время работы с сервером Ubuntu вы, скорее всего, будете проводить большую часть времени в вашем терминале, подключенном через SSH к вашему серверу.

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

## Шаг 1 - Создание пары ключей RSA

Сперва создадим пару ключей на клиентской машине (обычно, это ваш компьютер):

`ssh-keygen -t rsa`

По умолчанию ssh-keygen создаёт 2048-битную пару ключей RSA, которая достаточно безопасна для большинства сценариев использования (вы можете также добавить к этой команде флаг -b 4096 для получения 4096-битный ключей).

После ввода этой команды вы должны увидеть следующий вывод:

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

 </file>

 Нажмите Enter для сохранения пары ключей в директорию ''.ssh/'' внутри вашей домашней директории или задайте другую директорию.

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

 <code>/home/your_home/.ssh/id_rsa already exists.
 Overwrite (y/n)?

```

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

Вы должны увидеть следующий вывод:

```
Enter passphrase (empty for no passphrase)

```

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

Вы должны увидеть следующий вывод:

```
Output
 Your identification has been saved in /your_home/.ssh/id_rsa.
 Your public key has been saved in /your_home/.ssh/id_rsa.pub.
 The key fingerprint is:
 a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_host
 The key's randomart image is:
 +--[ RSA 2048]----+
 +-----------------''+''

```

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

## Шаг 2 - Копирование публичного ключа на сервер Ubuntu

Самым быстрым способом скопировать ваш публичный ключ на машину с Ubuntu - использовать утилиту `ssh-copy-id`. Поскольку этот метод невероятно прост, он рекомендуется для использования в первую очередь. Если по какой либо причине использование `ssh-copy-id` невозможно, вы можете использовать один из двух альтернативных методов, описанных далее (копирование в входом по SSH с использованием пароля и ручное копирование ключа).

### Копирование ключа с использованием ssh-copy-id

Утилита `ssh-copy-id` доступна по умолчанию во многих операционных системах, поэтому, скорее всего, она доступна и на вашей локальной машине. Для использования этого метода копирования ключа вам необходимо иметь доступ к своему серверу по SSH с использованием пароля.

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

Синтаксис команды выглядит следующим образом:

`ssh-copy-id username@remote_host`

Вы можете увидеть вывод следующего вида:

```
The authenticity of host '203.0.113.1 (203.0.113.1)' 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” и нажмите `ENTER` для продолжения.

Далее утилита будет искать в директории вашего локального пользователя файл ключа `id_rsa.pub`, созданный нами ранее. Если файл ключа будет успешно обнаружен, утилита запросит пароль для входа на удалённый хост:

```
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
username@203.0.113.1's password:

```

Введите пароль (при вводе он не будет отображаться из соображений безопасности) и нажмите `ENTER`. Утилита зайдёт на удалённый хост, используя данные аккаунта, пароль для которого вы ввели. Далее утилита скопирует содержимое файла публичного ключа из `~/.ssh/id_rsa.pub` в файл `authorized_keys` в поддиректории `~/.ssh` домашней директории вашего пользователя на удалённом хосте.

Вы должны увидеть следующий вывод:

```
Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'username@203.0.113.1'"
and check to make sure that only the key(s) you wanted were added.

```

Теперь ваш публичный ключ `id_rsa.pub` загружен на удалённый хост. Вы можете перейти к Шагу 3.

### Копирование публичного ключа через SSH

Если у вас нет утилиты `ssh-copy-id`, но у вас есть пароль для входа по SSH на ваш удалённый сервер, мы можете загрузить свой ключ вручную.

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

Кроме этого, нам потребуется убедиться, что директория `~/.ssh` существует, а также имеет корректные права доступа для используемого нами аккаунта пользователя.

Далее мы сможем отправить содержимое файла ключа в файл `authorized_keys` внутри этой директории. Мы будем использовать синтаксис `»` для добавление данных в конец файла вместо перезаписи содержимого файла. Это позволит нам добавить ключ без удаления ранее добавленных ключей.

Команда выглядит следующим образом:

`cat ~/.ssh/id_rsa.pub | ssh username@remote_host «mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat » ~/.ssh/authorized_keys»`

Вы можете увидеть вывод следующего вида:

```
The authenticity of host '203.0.113.1 (203.0.113.1)' 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” и нажмите `ENTER` для продолжения.

Далее вам будет предложено ввести пароль аккаунта пользователя на удалённом хосте:

`username@203.0.113.1's password:`

После ввода пароля содержимое вашего файла публичного ключа `id_rsa.pub` будет скопировано в конец файла `authorized_keys` на удалённом хосте. Если всё прошло успешно, вы можете перейти к Шагу 3.

### Копирование публичного ключа вручную

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

Мы вручную добавим содержимое вашего файла `id_rsa.pub` в конец файла `~/.ssh/authorized_keys` на удалённой машине.

Для отображения содержимого файла `id_rsa.pub` введите следующую команду на вашей локальной машине:

`cat ~/.ssh/id_rsa.pub`

Вы увидите содержимое файла ключа, выглядящее примерно так:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@tes

Зайдите на вашу удалённую машину любым доступным для вас способом.

Далее нам необходимо убедиться, что директория `~/.ssh` существует. Следующая команда создаст директорию, если её не существует или не сделает ничего, если директория была создана ранее:

`mkdir -p ~/.ssh`

Теперь вы можете создать или отредактировать файл `authorized_keys` внутри этой директории. Вы можете добавить содержимое файла `id_rsa.pub` в конец файла `authorized_keys`, при необходимости создав его, следующей командой:

`echo строка_публичного_ключа » ~/.ssh/authorized_keys`

В команде выше замените `строка_публичного_ключа` на вывод команды `cat ~/.ssh/id_rsa.pub`, которую вы выполнили на своей локальной машине. Строка должна начинаться с `ssh-rsa AAAA…`.

Далее убедимся, что директория `~/.ssh` и файл `authorized_keys` имеют подходящие права доступа:

`chmod -R go= ~/.ssh`

Эта команда удаляет права доступа для “group” и “other” для директории `~/.ssh/`.

Если вы используете аккаунт `root` для настройки ключей для аккаунта пользователя, важно, чтобы директория `~/.ssh` принадлежала этому самому пользователю, а не пользователю `root`:

`chown -R sammy:sammy ~/.ssh`

В нашем руководстве мы используем пользователя с именем `sammy`, вам же следует использовать имя своего пользователя в команде выше.

Теперь мы можем попробовать аутентифицироваться на нашем Ubuntu сервере без пароля.

## Шаг 3 - Аутентификация на сервере Ubuntu с использованием ключей SSH

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

Процесс входа выглядит так же:

`ssh username@remote_host`

Если вы заходите на удалённый хост по SSH в первый раз, вы можете увидеть вывод следующего вида:

```
The authenticity of host '203.0.113.1 (203.0.113.1)' 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” и нажмите `ENTER` для продолжения.

Если при создании пары ключей вы не задали ключевую фразу (passphrase), вы будете залогинены автоматически. Если вы задали ключевую фразу, вам будет предложено её ввести (обратите внимание, что вводимые символы не будут отображаться на экране в целях безопасности). После аутентификации откроется новая сессия оболочки (shell session) на удалённом хосте от имени используемого вами удалённого аккаунта пользователя.

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

## Шаг 4 - Отключение аутентификации по паролю на вашем сервере

Если вам удалось войти в ваш удалённый аккаунт на удалённом хосте по SSH без ввода пароля, вы успешно настроили аутентификацию по ключу SSH для вашего аккаунта. Однако возможность входить на сервер с использованием пароля всё есть активна, что означает, что ваш сервер уязвим для атак с перебором пароля (brute-force attacks).

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

Как только вы убедитесь, что аккаунт вашего удалённого пользователя имеет привилегии администратора, войдите на сервер с использованием аутентификации по ключу SSH, используя либо аккаунт `root`, либо аккаунт пользователя с привилегиями `sudo`. Далее откройте конфигурационный файл демона SSH:

`sudo nano /etc/ssh/sshd_config`

Внутри файла найдите директиву `PasswordAuthentication`. Она может быть закомментирована. Раскомментируйте её при необходимости и установите её значение в “no”. Это отключит возможность входа на сервер по паролю.

/etc/ssh/sshd\_config

…

PasswordAuthentication no

…

Сохраните и закройте файл нажав `CTRL` + `X`, затем `Y` для подтверждения сохранения файла, а далее `ENTER` для выхода из текстового редактора nano. Для применения внесённых изменений нам необходимо перезапустить сервис `sshd`:

`sudo systemctl restart ssh`

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

`ssh username@remote_host`

После проверки работоспособности SSH соединения, вы можете закрыть все открытые сессии с сервером.

Теперь демон SSH на вашем сервере с Ubuntu работает только с ключами SSH. Аутентификация по паролю полностью отключена.

## Заключение

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