Домашний сервер на Debian: первые 30 минут после установки
Базовая гигиена свежего сервера: обновления, пользователь с sudo, вход по SSH-ключу без паролей и root, брандмауэр, автоматические обновления безопасности и точное время. Проверено на чистом Debian 12.
Сначала бэкап. Всегда. Но прежде чем делать бэкапы, сервер нужно привести в порядок — и сделать это лучше в первые полчаса после установки, пока он ещё пустой и никому не интересен. Если сервер доступен из интернета, первые попытки подобрать пароль появятся в журнале очень скоро. Роботы сканируют адреса круглосуточно. Домашний сервер за роутером снаружи не виден, пока вы сами не откроете ему порт, — но гигиену стоит навести и ему.
Это первая статья цикла про домашний сервер. Здесь — базовая гигиена, без которой всё остальное строить бессмысленно.
Что получим и что нужно заранее
Результат: система обновлена, и вы работаете под обычным пользователем с правами sudo. Вход по SSH — только по ключу и без root. Лишние порты закрыты брандмауэром, обновления безопасности ставятся сами, часы идут точно.
Нужно: свежий Debian 13 (для Debian 12 и Ubuntu 22.04 и новее команды те же) и доступ root. И главное — запасной способ попасть на сервер, кроме SSH: монитор с клавиатурой для домашней машины или консоль в панели провайдера для арендованной. Мы будем трогать настройки входа, и если ошибиться, именно консоль вас спасёт. Все команды ниже проверены на чистом Debian 13 (на Debian 12 они те же).
Шаг 1. Обновляем систему
apt update
apt full-upgrade
Первая команда скачивает свежие списки пакетов, вторая ставит все обновления, в том числе меняющие зависимости.
Если обновилось ядро, перезагрузитесь сейчас, пока на сервере ничего не работает: reboot.
Шаг 2. Обычный пользователь вместо root
Работать под root — всё равно что ходить по мастерской с включённой болгаркой в руке. Одна опечатка — и последствия необратимы. Заведём своего пользователя и дадим ему право выполнять команды администратора через sudo.
apt install sudo
adduser admin
usermod -aG sudo admin
Ставим sudo (в минимальной установке Debian его может не быть), создаём пользователя admin — имя выберите своё — и добавляем его в группу sudo. Программа спросит пароль: он понадобится для sudo, так что придумайте надёжный.
Шаг 3. Вход по ключу
Пароль можно подобрать, ключ — практически нет. Что тут происходит: на своём компьютере вы создаёте пару ключей. Закрытый остаётся у вас, открытый кладётся на сервер. Сервер пускает того, у кого есть закрытая половина.
На своём компьютере (Linux, macOS или Windows 10 и новее — там SSH-клиент встроен):
ssh-keygen -t ed25519
Создаёт пару ключей типа ed25519. На вопрос о пароле для ключа лучше ответить паролем: тогда украденный файл ключа сам по себе бесполезен.
ssh-copy-id admin@АДРЕС_СЕРВЕРА
Копирует открытый ключ на сервер в файл ~/.ssh/authorized_keys пользователя admin. В Windows этой команды нет — там то же самое делает PowerShell:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh admin@АДРЕС_СЕРВЕРА "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Передаёт открытый ключ по SSH и дописывает его в нужный файл с правильными правами.
ssh admin@АДРЕС_СЕРВЕРА
Проверяем: сервер должен пустить без пароля пользователя (спросит только пароль ключа, если вы его задали). Не идите дальше, пока это не работает.
Шаг 4. Закрываем пароли и root
Теперь, когда вход по ключу проверен, выключаем всё остальное. Правим не основной файл настроек, а кладём свой рядом — так обновления пакета не затрут изменения.
sudo tee /etc/ssh/sshd_config.d/00-hardening.conf >/dev/null <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
EOF
Запрещаем вход под root, вход по паролю и по «интерактивному» паролю — остаётся только ключ.
Почему имя начинается с 00: sshd берёт первое встреченное значение каждого параметра, а файлы из этого каталога читаются по алфавиту. Некоторые установщики и облачные образы кладут туда свой файл с PasswordAuthentication yes; наш с 00 прочитается раньше и победит.
sudo sshd -t
Проверяем настройки на ошибки. Тишина — значит, всё в порядке. Если есть ошибка, sshd её назовёт; с ошибкой перезапускать нельзя.
sudo sshd -T | grep -E 'permitrootlogin|passwordauthentication'
Показывает, какие значения sshd на самом деле применит. Должно быть permitrootlogin no и passwordauthentication no.
sudo systemctl reload ssh
Применяем настройки. Текущая сессия не оборвётся.
Не закрывайте текущее окно. Откройте второе и войдите заново как admin. Получилось — можно закрывать первое. Не получилось — в первом окне удалите файл 00-hardening.conf и снова выполните reload.
Шаг 5. Брандмауэр
sudo apt install ufw
sudo ufw allow OpenSSH
Ставим ufw — простую обёртку над брандмауэром ядра — и сразу разрешаем SSH. Именно в таком порядке: если включить брандмауэр без этого правила, вы закроете дверь, стоя снаружи.
sudo ufw enable
sudo ufw status verbose
Включаем брандмауэр и смотрим правила: входящие запрещены, кроме SSH; исходящие разрешены.
Когда позже поставите веб-сервер или другой сервис, откроете его порт так же: например, sudo ufw allow 443/tcp.
Шаг 6. Обновления безопасности — автоматически
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
Ставим службу автоматических обновлений и включаем её: на вопрос ответьте «Да». По умолчанию в Debian она ставит обновления безопасности и плановые исправления стабильного выпуска — те, что выходят в точечных версиях вроде 13.1. Новых версий программ она не приносит, поэтому риск что-то сломать минимальный.
sudo unattended-upgrade --dry-run --debug 2>&1 | grep -i 'allowed origins'
Проверяем, откуда служба берёт обновления, без установки чего-либо. В списке должны быть источники с метками Debian и Debian-Security.
Шаг 7. Время и имя
sudo timedatectl set-timezone Europe/Moscow
timedatectl
Ставим часовой пояс и смотрим состояние часов. Строка System clock synchronized: yes значит, что время сверяется с серверами точного времени. Точные часы нужны не для красоты: без них ломаются сертификаты, журналы и расписания.
sudo hostnamectl set-hostname homeserver
Даём серверу понятное имя — пригодится, когда машин станет больше одной.
Если что-то пошло не так
- После шага 4 не пускает по SSH. Зайдите через консоль, удалите
/etc/ssh/sshd_config.d/00-hardening.conf, выполнитеsystemctl reload sshи проверьте ключ заново: чаще всего он лежит не у того пользователя или у~/.sshнеправильные права (нужно 700, у файла ключей — 600). - После шага 5 пропал SSH. Через консоль:
ufw allow OpenSSH— и всё вернётся, либоufw disable, чтобы выключить брандмауэр целиком. - «Permission denied (publickey)». Сервер ключ не принял. Подробности покажет
ssh -v admin@АДРЕСсо стороны клиента иjournalctl -u ssh -n 30на сервере. - Часы не синхронизируются. Проверьте, что служба времени работает:
systemctl status systemd-timesyncd. Если её нет —apt install systemd-timesyncd.
Всё, базовая гигиена наведена. Сервер больше не впускает по паролю, не держит открытых лишних портов и сам ставит заплатки безопасности. В следующей статье цикла поставим Docker и поднимем первые сервисы в контейнерах — так, чтобы их было легко обновлять и переносить.
Это первая часть цикла «Домашний сервер без боли». Как настроить автоматические резервные копии — в третьей части: «Автоматический бэкап: restic и таймер systemd».