Установим OpenSSH Server на Ubuntu, определим адрес сервера, настроим вход по паролю и SSH-ключу, а затем безопасно отключим парольную аутентификацию.
Содержание
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-соединения;
- отпечаток сервера проверен;
- публичный ключ установлен с корректными правами;
- вход по ключу проверен в отдельном соединении;
- парольная аутентификация отключена.