«Комфорт — вещь субъективная, — заметил Воланд, поправляя воротник. — Но ключи в двери — это объективно.»
Настоящее руководство продолжает настройку сервера, начатую в предыдущем документе. Мы начинаем с уже работающего SSH-сервера, к которому мы можем подключиться по паролю под пользователем uservpn.
Цель данного руководства — за один последовательный проход выполнить три группы задач:
Настроить SSH-ключи — переход от входа по паролю к входу по ключу, как это положено.
Временно разрешить sudo без пароля — для удобства последующей настройки (в следующих руководствах это будет пересмотрено).
Установить и настроить zsh — с темой powerlevel10k, шрифтами и плагинами автодополнения.
Все шаги пронумерованы и должны выполняться в указанном порядке. Перескакивать не рекомендуется.
Входные данные: вы уже создали пользователя
uservpnсsudoи подключились к серверу по SSH и паролю (ssh uservpn@<IP-АДРЕС-СЕРВЕРА>). Пользовательuservpn— тот, под которым мы работаем.
sudo без пароляsudo и почему временно убираем парольsudo (superuser do) — утилита, позволяющая обычным пользователям выполнять команды от имени root. По умолчанию при каждом вызове sudo запрашивает пароль пользователя — это защита: если кто-то получил доступ к вашему терминалу, он не сможет молча выполнить команду администратора.
Однако в процессе настройки сервера нам придётся запустить десятки команд через sudo. Вводить пароль каждый раз — утомительно и замедляет процесс. Поэтому мы временно разрешим sudo без пароля. После завершения всех настроек это будет пересмотрено.
/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 может перестать работать.
uservpnВыйдите из-под root:
exit
Проверьте, что sudo работает без пароля:
sudo whoami
Ожидаемый вывод:
root
Запроса пароля не было — sudo настроен.
Воланд задумчиво покачал головой:
«Открытая дверь — удобная вещь для хозяина. И столь же удобная для всех гостей, включая непрошеных. Пользуйтесь временно, пока настраиваете хозяйство. А потом — закройте, пожалуйста.»
Пара SSH-ключей — это два файла, связанных математически:
Приватный ключ (id_ed25519) — хранится только на вашей рабочей станции. Никогда, ни при каких обстоятельствах он не покидает ваш компьютер.
Публичный ключ (id_ed25519.pub) — копируется на сервер. По нему сервер проверяет, что вы владеете парным приватным ключом.
Алгоритм ed25519 — современный, быстрый и компактный. Он был спроектирован в 2015 году специально для SSH и превосходит RSA по криптостойкости при меньшем размере.
Этот шаг выполняется на вашем компьютере (рабочая станция), а не на сервере. Откройте любой терминал на своём компьютере и выполните:
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
ssh-copy-idНа рабочей станции выполните:
ssh-copy-id uservpn@<IP-АДРЕС-СЕРВЕРА>
Система запросит пароль uservpn. Введите его. Ключ будет скопирован в файл ~/.ssh/authorized_keys пользователя на сервере.
Ожидаемый результат:
Number of key(s) added: 1
Попробуйте подключиться:
ssh uservpn@<IP-АДРЕС-СЕРВЕРА>
Если ключ скопирован верно — сервер пустит без запроса пароля (если вы не ставили passphrase).
Если пароль всё ещё запрашивается — проверьте права на домашней директории сервера. SSH-сервер очень строг к разрешениям. Вернитесь в раздел 4.2 после настройки сервера.
Коровьев, подмигивая:
«Ключик-то у вас — золотой. Только дверь ещё не заменили. Сейчас поменяем — и старый пароль станет таким же бесполезным, как прошлогодний снег.»
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).
SSH-сервер откажется подключаться, если права на домашнюю директорию или .ssh слишком открыты. Проверьте и исправьте:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 755 ~
Проверьте текущие значения:
ls -la ~
ls -la ~/.ssh/
Ожидаемый результат:
drwxr-xr-x ... .ssh/
-rw------- ... authorized_keys
Проверьте конфигурацию на синтаксические ошибки перед перезапуском:
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
Не закрывайте текущую сессию SSH! Откройте новый терминал и попробуйте подключиться:
ssh uservpn@<IP-АДРЕС-СЕРВЕРА>
Если вошли — настройка успешна.
Если не вошли и соединение отклонено — парольный вход уже отключён, а ключ почему-то не сработал. Не закрывайте старую сессию — через неё можно вернуться назад и исправить проблему.
Проверьте логи:
sudo journalctl -u ssh -n 50 --no-pager
В логах будет указана причина отказа (обычно — неверные права или ключ не найден).
Воланд, перечитывая журнал:
«Отказали. И совершенно правильно. Дверь не открывается — значит, она работает как замок, а не калитка. Проверьте ключ, проверьте права — и пробуйте снова.»
zsh (Z Shell) — расширенная оболочка командной строки, совместимая с Bash, но с расширенным набором возможностей. Она поддерживает:
Автодополнение — гораздо более интеллектуальное, чем Bash;
Исправление опечаток — zsh предложит правильный вариант, если вы ошиблись в команде;
Расширенный globbing — более мощные шаблоны поиска файлов;
Поддержку тем — внешний вид приглашения (prompt) настраивается практически без ограничений.
Bash — хороший, надёжный, но zsh — это Bash, который пошёл учиться дальше.
Установите zsh, git и другие необходимые пакеты:
sudo apt install -y zsh git curl unzip fontconfig
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
Чтобы при следующем входе по SSH автоматически запускался zsh (а не bash), измените оболочку пользователя:
sudo chsh -s $(which zsh) uservpn
Проверьте результат:
getent passwd uservpn | cut -d: -f7
Ожидаемый вывод:
/usr/bin/zsh
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).
Тема 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 в разделе шрифтов вашего терминального эмулятора.
Без этого пиктограммы будут отображаться как квадратики.
Установите три плагина, которые значительно упростят работу с терминалом:
# Автодополнение команд — предлагает варианты из истории
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 |
Выпадающий список вариантов при вводе команды аргумента |
Откройте файл ~/.zshrc:
nano ~/.zshrc
Найдите строку с плагинами (по умолчанию это выглядит так):
plugins=(git)
Замените на:
plugins=(git zsh-autosuggestions zsh-syntax-highlighting zsh-autocomplete)
Сохраните (Ctrl+O, Enter) и выйдите (Ctrl+X).
Все настройки сохранены, но мы всё ещё находимся в bash. Запустите zsh вручную, чтобы проверить, что всё работает:
zsh
При первом запуске zsh может спросить, создать ли стартовый файл — если спросят, ответьте y.
Как только zsh загрузится, тема powerlevel10k автоматически запустит мастер настройки — интерактивный опрос по выбору стиля приветствия. Мастер задаст серию вопросов:
Какой стиль предпочитаете — «ромб», «классический», «современный»?
Иконки — unicode-символы или ASCII?
Показывать ли часы?
Разделительная линия — сплошная или пунктирная?
Пройдите мастер, выбирая понравившийся стиль. Это займёт одну-две минуты. После завершения в конец ~/.zshrc автоматически добавится:
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
Этот файл содержит ваши выборы. Его можно скопировать на другие серверы для одинакового оформления.
По завершении мастера вы окажетесь в zsh с новой темой. Можете вернуться в bash:
exit
Чтобы снова войти в zsh (включая мастер, если захотите перебрать стиль), выполните:
p10k configure
Это займёт одну-две минуты — не больше, чем выбор обоев на рабочий стол, но результат будет с вами при каждом входе в терминал.
Воланд удовлетворённо кивнул:
«Вот теперь ваш терминал — не чёрный прямоугольник, а рабочий инструмент. Иконки, цвета, подсказки. Всё, чтобы глаз радовался... или хотя бы не страдал.»
На данном этапе мы имеем:
| Что | Статус |
|---|---|
uservpn имеет sudo без пароля (временно) |
✅ |
| SSH-сгенерирован и скопирован | ✅ |
| Вход по ключу работает | ✅ |
| Вход по паролю отключён | ✅ |
sudo перепроверен через ключ |
✅ |
| zsh установлен и оболочка по умолчанию | ✅ |
| oh-my-zsh + powerlevel10k настроены | ✅ |
| Мастер p10k запущен, стиль выбран | ✅ |
| Плагины активны | ✅ |
Конец документа. Подключившемуся — уютного терминала, забывшему ключ — да поможет journalctl.