Главная → Домашний сервер без боли → часть 1

Домашний сервер на 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

Даём серверу понятное имя — пригодится, когда машин станет больше одной.

Если что-то пошло не так

Всё, базовая гигиена наведена. Сервер больше не впускает по паролю, не держит открытых лишних портов и сам ставит заплатки безопасности. В следующей статье цикла поставим Docker и поднимем первые сервисы в контейнерах — так, чтобы их было легко обновлять и переносить.

Это первая часть цикла «Домашний сервер без боли». Как настроить автоматические резервные копии — в третьей части: «Автоматический бэкап: restic и таймер systemd».

Docker Compose на домашнем сервере: первый сервис и его обновление →