Установим OpenSSH Server на Ubuntu, определим адрес сервера, настроим вход по паролю и SSH-ключу, а затем безопасно отключим парольную аутентификацию.

ssh

Содержание

  1. 1. Установка SSH-сервера
  2. 2. Определение IP-адреса и имени пользователя
  3. 3. Первое подключение по паролю
  4. 4. Создание SSH-ключа
  5. 5. Копирование публичного ключа на сервер
  6. 6. Проверка подключения по ключу
  7. 7. Отключение входа по паролю
  8. Результат
  9. Полезные материалы

1. Установка SSH-сервера

В Ubuntu серверная часть SSH поставляется в пакете openssh-server. Обновим сведения о пакетах и установим его:

sudo apt update
sudo apt install openssh-server

Запустим службу и включим её автоматический запуск:

sudo systemctl enable --now ssh

Проверим состояние службы:

sudo systemctl status ssh

Статус active (running) означает, что SSH-сервер работает. По умолчанию SSH принимает TCP-соединения на порту 22.

Настройка UFW

UFW (Uncomplicated Firewall) - стандартный инструмент Ubuntu для управления правилами локального сетевого экрана.

Проверим его состояние:

sudo ufw status verbose

Если планируется использовать UFW, заранее разрешим подключения к SSH:

sudo ufw allow OpenSSH

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

sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status verbose

2. Определение IP-адреса и имени пользователя

Посмотрим IP-адреса сервера:

hostname -I

Пример результата:

192.168.1.100 172.17.0.1 10.0.2.15

Если адресов несколько, посмотрим состояние сетевых интерфейсов:

ip -br addr

Пример:

lo       UNKNOWN  127.0.0.1/8
enp3s0   UP       192.168.1.100/24
docker0  DOWN     172.17.0.1/16
ens33    UP       10.0.2.15/24

Как выбрать адрес

Для SSH нужен адрес, достижимый с клиентского компьютера. Если клиент находится в домашней сети 192.168.1.0/24, вероятным выбором будет 192.168.1.100.

Адрес 127.0.0.1 доступен только на самом сервере, а docker0 обычно относится к внутренней сети Docker. При этом по одному имени интерфейса нельзя надёжно определить, является он физическим или виртуальным.

Для виртуальной машины доступность адреса зависит от сетевого режима:

Режим Особенности подключения
Bridged Виртуальная машина получает отдельный адрес в той же сети, что и физический компьютер.
NAT Используется виртуальная подсеть. Доступность гостевой системы зависит от гипервизора; для внешних клиентов обычно требуется проброс порта.
Host-only Соединение обычно возможно только между хостом и виртуальной машиной внутри выделенной виртуальной сети.

Узнаем имя текущего пользователя на сервере:

whoami

Пример результата:

ivan

Далее в примерах используются пользователь ivan и адрес сервера 192.168.1.100. Замените их своими значениями.

3. Первое подключение по паролю

На клиентском компьютере откроем терминал Linux, macOS или PowerShell в Windows и выполним:

ssh ivan@192.168.1.100

При первом подключении SSH покажет отпечаток публичного ключа сервера:

The authenticity of host '192.168.1.100' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

Получить отпечаток непосредственно на сервере можно командой:

ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub

После подтверждения ключ сервера будет сохранён на клиенте в файле ~/.ssh/known_hosts и станет проверяться при следующих подключениях.

Затем SSH запросит пароль пользователя:

ivan@192.168.1.100's password:

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

4. Создание SSH-ключа

Аутентификация по ключу использует криптографическую пару:

  • приватный ключ хранится только на клиентском компьютере;
  • публичный ключ копируется на сервер в файл ~/.ssh/authorized_keys.

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

ssh-keygen -t ed25519

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

По умолчанию будут созданы:

~/.ssh/id_ed25519       # Приватный ключ
~/.ssh/id_ed25519.pub   # Публичный ключ

В Windows эти файлы обычно находятся в каталоге:

C:\Users\<имя-пользователя>\.ssh

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

Linux и macOS

Если доступна утилита ssh-copy-id, выполним:

ssh-copy-id -i ~/.ssh/id_ed25519.pub ivan@192.168.1.100

Утилита запросит пароль пользователя Ubuntu и добавит публичный ключ в файл ~/.ssh/authorized_keys.

Windows PowerShell

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

Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub" | ssh ivan@192.168.1.100 "umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys; chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys"

Команды в кавычках выполняются на сервере:

  • umask 077 ограничивает права создаваемых файлов и каталогов;
  • mkdir -p ~/.ssh создаёт каталог, если его ещё нет;
  • cat >> ~/.ssh/authorized_keys добавляет публичный ключ, не удаляя существующие записи;
  • chmod 700 ~/.ssh оставляет доступ к каталогу только его владельцу;
  • chmod 600 ~/.ssh/authorized_keys разрешает владельцу читать и изменять файл.

Проверим права доступа на сервере:

ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys

Ожидаемый вид результата:

drwx------ ... ivan ivan ... .ssh
-rw------- ... ivan ivan ... authorized_keys

При использовании ssh-copy-id необходимые права обычно устанавливаются автоматически.

6. Проверка подключения по ключу

После копирования публичного ключа подключимся обычной командой:

ssh ivan@192.168.1.100

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

ssh -i ~/.ssh/id_ed25519 ivan@192.168.1.100

Если приватный ключ защищён парольной фразой, SSH запросит именно её, а не пароль учётной записи Ubuntu.

Проверить вход исключительно с помощью публичного ключа можно так:

ssh -o PreferredAuthentications=publickey -o PasswordAuthentication=no -o KbdInteractiveAuthentication=no ivan@192.168.1.100

Успешное подключение подтверждает, что сервер принимает созданный ключ.

7. Отключение входа по паролю

Создадим отдельный конфигурационный файл:

sudo nano /etc/ssh/sshd_config.d/00-local-auth.conf

Добавим в него:

PasswordAuthentication no
KbdInteractiveAuthentication no

Префикс 00- помещает локальные настройки раньше большинства остальных drop-in-файлов. Это важно, поскольку для повторяющихся параметров OpenSSH использует первое найденное значение.

Проверим синтаксис новой конфигурации:

sudo sshd -t

Если команда ничего не вывела, синтаксических ошибок не обнаружено. Дополнительно проверим эффективные глобальные настройки:

sudo sshd -T | grep -E '^(passwordauthentication|kbdinteractiveauthentication|pubkeyauthentication) '

Ожидаемые значения:

passwordauthentication no
kbdinteractiveauthentication no
pubkeyauthentication yes

Применим конфигурацию без разрыва существующих соединений:

sudo systemctl reload ssh

Теперь откроем новый терминал и снова подключимся:

ssh ivan@192.168.1.100

Закрывать исходное административное соединение следует только после успешного входа по ключу в новом терминале.

Результат

После выполнения инструкции:

  • OpenSSH Server установлен и запущен;
  • сетевой экран разрешает необходимые SSH-соединения;
  • отпечаток сервера проверен;
  • публичный ключ установлен с корректными правами;
  • вход по ключу проверен в отдельном соединении;
  • парольная аутентификация отключена.

Полезные материалы