Настройка SSH, zsh и удобства работы на сервере

«Комфорт — вещь субъективная, — заметил Воланд, поправляя воротник. — Но ключи в двери — это объективно.»

Введение

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

Цель данного руководства — за один последовательный проход выполнить три группы задач:

  1. Настроить SSH-ключи — переход от входа по паролю к входу по ключу, как это положено.

  2. Временно разрешить sudo без пароля — для удобства последующей настройки (в следующих руководствах это будет пересмотрено).

  3. Установить и настроить zsh — с темой powerlevel10k, шрифтами и плагинами автодополнения.

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

Входные данные: вы уже создали пользователя uservpn с sudo и подключились к серверу по SSH и паролю (ssh uservpn@<IP-АДРЕС-СЕРВЕРА>). Пользователь uservpn — тот, под которым мы работаем.


Раздел 1. Временная настройка sudo без пароля

1.1. Что такое sudo и почему временно убираем пароль

sudo (superuser do) — утилита, позволяющая обычным пользователям выполнять команды от имени root. По умолчанию при каждом вызове sudo запрашивает пароль пользователя — это защита: если кто-то получил доступ к вашему терминалу, он не сможет молча выполнить команду администратора.

Однако в процессе настройки сервера нам придётся запустить десятки команд через sudo. Вводить пароль каждый раз — утомительно и замедляет процесс. Поэтому мы временно разрешим sudo без пароля. После завершения всех настроек это будет пересмотрено.

1.2. Создание файла в /etc/sudoers.d/

Подключитесь к серверу по SSH (пока ещё по паролю):

ssh uservpn@<IP-АДРЕС-СЕРВЕРА>

Создайте временный файл sudoers от root. Для этого сначала получите права root:

sudo -i

Система запросит пароль uservpn. Введите его. Теперь вы работаете от root (приглашение сменилось на #).

Создайте файл:

echo 'uservpn ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/uservpn
chmod 440 /etc/sudoers.d/uservpn

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

Директива Значение
uservpn Пользователь, которому даём право
ALL=(ALL) На всех хостах, от имени любого пользователя
NOPASSWD:ALL Все команды без пароля
chmod 440 Чтение для root и группы, запись никому

Проверьте синтаксис файла sudoers:

visudo -c

Ожидаемый вывод:

/etc/sudoers: parsed OK
/etc/sudoers.d/uservpn: parsed OK

Если видите parsed OK — всё в порядке. Если ошибка — исправьте до продолжения, иначе sudo может перестать работать.

1.3. Возвращаемся под uservpn

Выйдите из-под root:

exit

Проверьте, что sudo работает без пароля:

sudo whoami

Ожидаемый вывод:

root

Запроса пароля не было — sudo настроен.

Воланд задумчиво покачал головой:
«Открытая дверь — удобная вещь для хозяина. И столь же удобная для всех гостей, включая непрошеных. Пользуйтесь временно, пока настраиваете хозяйство. А потом — закройте, пожалуйста.»


Раздел 2. Генерация SSH-ключа на рабочей станции

2.1. Что такое SSH-ключи

Пара SSH-ключей — это два файла, связанных математически:

  • Приватный ключ (id_ed25519) — хранится только на вашей рабочей станции. Никогда, ни при каких обстоятельствах он не покидает ваш компьютер.

  • Публичный ключ (id_ed25519.pub) — копируется на сервер. По нему сервер проверяет, что вы владеете парным приватным ключом.

Алгоритм ed25519 — современный, быстрый и компактный. Он был спроектирован в 2015 году специально для SSH и превосходит RSA по криптостойкости при меньшем размере.

2.2. Генерация

Этот шаг выполняется на вашем компьютере (рабочая станция), а не на сервере. Откройте любой терминал на своём компьютере и выполните:

ssh-keygen -t ed25519 -C "uservpn@server"

Система спросит:

Enter file in which to save the key (/home/ваш_пользователь/.ssh/id_ed25519):

Нажмите Enter — оставьте путь по умолчанию.

Enter passphrase (empty for no passphrase):

Здесь у вас два варианта:

  • Пустой passphrase (дважды нажмите Enter) — вход без дополнительной авторизации. Удобно, но кто получит файл — получит доступ.

  • Passphrase (задайте пароль) — даже если файл ключа украдут, без passphrase он бесполезен.

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

После генерации вы увидите что-то вроде:

Your identification has been saved in /home/ваш_пользователь/.ssh/id_ed25519
Your public key has been saved in /home/ваш_пользователь/.ssh/id_ed25519.pub
The key fingerprint is: SHA256:... uservpn@server

Раздел 3. Копирование публичного ключа на сервер

3.1. Копирование ключа утилитой ssh-copy-id

На рабочей станции выполните:

ssh-copy-id uservpn@<IP-АДРЕС-СЕРВЕРА>

Система запросит пароль uservpn. Введите его. Ключ будет скопирован в файл ~/.ssh/authorized_keys пользователя на сервере.

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

Number of key(s) added: 1

3.2. Проверка входа по ключу

Попробуйте подключиться:

ssh uservpn@<IP-АДРЕС-СЕРВЕРА>

Если ключ скопирован верно — сервер пустит без запроса пароля (если вы не ставили passphrase).

Если пароль всё ещё запрашивается — проверьте права на домашней директории сервера. SSH-сервер очень строг к разрешениям. Вернитесь в раздел 4.2 после настройки сервера.

Коровьев, подмигивая:
«Ключик-то у вас — золотой. Только дверь ещё не заменили. Сейчас поменяем — и старый пароль станет таким же бесполезным, как прошлогодний снег.»


Раздел 4. Отключение входа по паролю на сервере

4.1. Настройка sshd_config

Теперь, когда ключ работает, отключим вход по паролю. Это не даст злоумышленнику подобрать пароль методом перебора (brute force).

Подключитесь к серверу (теперь по ключу):

ssh uservpn@<IP-АДРЕС-СЕРВЕРА>

Сделайте резервную копию конфигурации:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d_%H%M%S)

Проверьте, что файл сохранён:

ls -la /etc/ssh/sshd_config.backup.*

Теперь отредактируйте файл:

sudo nano /etc/ssh/sshd_config

Откройте для редактирования (если nano не установлен — установите: sudo apt install -y nano).

Найдите следующие параметры и установите их значения:

PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
MaxAuthTries 3

Если строки закоментированы (начинаются с #) — раскомментируйте, убрав #.

Параметр Значение Назначение
PasswordAuthentication no Запретить вход по паролю
PubkeyAuthentication yes Разрешить вход по ключу
ChallengeResponseAuthentication no Отключить дополнительную аутентификацию
UsePAM yes Использовать PAM (Pluggable Authentication Modules) — модульную систему авторизации Linux
MaxAuthTries 3 Максимум 3 попытки авторизации на одно подключение

Сохраните файл (Ctrl+O, Enter) и выйдите (Ctrl+X).

4.2. Проверка прав домашней директории

SSH-сервер откажется подключаться, если права на домашнюю директорию или .ssh слишком открыты. Проверьте и исправьте:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 755 ~

Проверьте текущие значения:

ls -la ~
ls -la ~/.ssh/

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

drwxr-xr-x  ... .ssh/
-rw-------  ... authorized_keys

4.3. Перезапуск SSH-службы

Проверьте конфигурацию на синтаксические ошибки перед перезапуском:

sudo sshd -t

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

В Ubuntu 24.04 SSH работает через socket activation — это когда systemd запускает sshd не как непрерывный процесс, а «по требованию», при каждом новом подключении. Поэтому перезапускаем через ssh.socket:

sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
sudo systemctl restart ssh.service

4.4. Проверка соединения

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

ssh uservpn@<IP-АДРЕС-СЕРВЕРА>

Если вошли — настройка успешна.

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

Проверьте логи:

sudo journalctl -u ssh -n 50 --no-pager

В логах будет указана причина отказа (обычно — неверные права или ключ не найден).

Воланд, перечитывая журнал:
«Отказали. И совершенно правильно. Дверь не открывается — значит, она работает как замок, а не калитка. Проверьте ключ, проверьте права — и пробуйте снова.»


Раздел 5. Установка и настройка zsh

5.1. Что такое zsh и зачем его ставить

zsh (Z Shell) — расширенная оболочка командной строки, совместимая с Bash, но с расширенным набором возможностей. Она поддерживает:

  • Автодополнение — гораздо более интеллектуальное, чем Bash;

  • Исправление опечаток — zsh предложит правильный вариант, если вы ошиблись в команде;

  • Расширенный globbing — более мощные шаблоны поиска файлов;

  • Поддержку тем — внешний вид приглашения (prompt) настраивается практически без ограничений.

Bash — хороший, надёжный, но zsh — это Bash, который пошёл учиться дальше.

5.2. Установка зависимостей

Установите zsh, git и другие необходимые пакеты:

sudo apt install -y zsh git curl unzip fontconfig

5.3. Установка oh-my-zsh

oh-my-zsh — фреймворк для управления конфигурацией zsh. Он предоставляет систему тем, плагинов и автоматического обновления. Без него настройка zsh потребовала бы ручного редактирования десятков параметров.

Установите:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended

Флаг --unattended подавляет интерактивные вопросы — oh-my-zsh установится автоматически.

После установки проверьте, что zsh запустился:

zsh

Вы увидите новое приглашение командной строки и, возможно, предложение создать стартовый файл конфигурации. Ответьте y. Вернитесь в bash:

exit

5.4. Установка zsh как оболочки по умолчанию

Чтобы при следующем входе по SSH автоматически запускался zsh (а не bash), измените оболочку пользователя:

sudo chsh -s $(which zsh) uservpn

Проверьте результат:

getent passwd uservpn | cut -d: -f7

Ожидаемый вывод:

/usr/bin/zsh

5.5. Установка темы powerlevel10k

powerlevel10k — тема для oh-my-zsh, которая отображает в приглашении командной строки массу полезной информации: текущая директория, git-репозиторий, версия Python, время выполнения команд и многое другое. При этом она работает быстро.

Установите:

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

Откройте файл конфигурации:

nano ~/.zshrc

Найдите строку:

ZSH_THEME="robbyrussell"

И замените на:

ZSH_THEME="powerlevel10k/powerlevel10k"

Сохраните (Ctrl+O, Enter) и выйдите (Ctrl+X).

5.6. Установка шрифта MesloLGS NF

Тема powerlevel10k использует специальные символы (пиктограммы), которые присутствуют только в Nerd Fonts. Стандартный шрифт терминала эти символы не отобразит — вы увидите ромбики или знаки вопроса.

На сервере установите шрифт (он пригодится для совместимости и локального использования):

mkdir -p ~/.local/share/fonts
cd ~/.local/share/fonts
wget -qO MesloLGS-NF.zip https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF.zip
unzip -o MesloLGS-NF.zip && rm MesloLGS-NF.zip
fc-cache -fv
cd ~

На рабочей станции (вашем компьютере) загрузите шрифт по ссылке https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF.zip, распакуйте и установите в настройках терминала. Выберите MesloLGS NF Regular в разделе шрифтов вашего терминального эмулятора.

Без этого пиктограммы будут отображаться как квадратики.

5.7. Установка плагинов

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

# Автодополнение команд — предлагает варианты из истории
git clone https://github.com/zsh-users/zsh-autosuggestions.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

# Подсветка синтаксиса — команды зелёные, ошибочные — красные
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

# Автодополнение в процессе ввода — выпадающий список вариантов
git clone --depth 1 https://github.com/marlonrichert/zsh-autocomplete.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autocomplete

Каждый плагин:

Плагин Что делает
zsh-autosuggestions Показывает серым текст, который вы ранее набирали; нажмите чтобы принять
zsh-syntax-highlighting Подсвечивает команды: правильные — зелёным, неизвестные — красным
zsh-autocomplete Выпадающий список вариантов при вводе команды аргумента

5.8. Активация плагинов

Откройте файл ~/.zshrc:

nano ~/.zshrc

Найдите строку с плагинами (по умолчанию это выглядит так):

plugins=(git)

Замените на:

plugins=(git zsh-autosuggestions zsh-syntax-highlighting zsh-autocomplete)

Сохраните (Ctrl+O, Enter) и выйдите (Ctrl+X).

5.9. Первый запуск zsh и мастер powerlevel10k

Все настройки сохранены, но мы всё ещё находимся в bash. Запустите zsh вручную, чтобы проверить, что всё работает:

zsh

При первом запуске zsh может спросить, создать ли стартовый файл — если спросят, ответьте y.

Как только zsh загрузится, тема powerlevel10k автоматически запустит мастер настройки — интерактивный опрос по выбору стиля приветствия. Мастер задаст серию вопросов:

  • Какой стиль предпочитаете — «ромб», «классический», «современный»?

  • Иконки — unicode-символы или ASCII?

  • Показывать ли часы?

  • Разделительная линия — сплошная или пунктирная?

Пройдите мастер, выбирая понравившийся стиль. Это займёт одну-две минуты. После завершения в конец ~/.zshrc автоматически добавится:

[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh

Этот файл содержит ваши выборы. Его можно скопировать на другие серверы для одинакового оформления.

По завершении мастера вы окажетесь в zsh с новой темой. Можете вернуться в bash:

exit

Чтобы снова войти в zsh (включая мастер, если захотите перебрать стиль), выполните:

p10k configure

Это займёт одну-две минуты — не больше, чем выбор обоев на рабочий стол, но результат будет с вами при каждом входе в терминал.

Воланд удовлетворённо кивнул:
«Вот теперь ваш терминал — не чёрный прямоугольник, а рабочий инструмент. Иконки, цвета, подсказки. Всё, чтобы глаз радовался... или хотя бы не страдал.»


Раздел 6. Итоги

На данном этапе мы имеем:

Что Статус
uservpn имеет sudo без пароля (временно)
SSH-сгенерирован и скопирован
Вход по ключу работает
Вход по паролю отключён
sudo перепроверен через ключ
zsh установлен и оболочка по умолчанию
oh-my-zsh + powerlevel10k настроены
Мастер p10k запущен, стиль выбран
Плагины активны

Конец документа. Подключившемуся — уютного терминала, забывшему ключ — да поможет journalctl.