--- title: "Безопасный production-сервер на Debian 12: пошаговая настройка" date: 2026-03-07 draft: false description: "Пошаговое руководство по защите Debian 12 с нуля: настройка SSH, ufw, Fail2ban, sysctl, автообновлений и мониторинга. Базовая безопасность production-сервера за один час." tags: ["debian", "linux", "security", "безопасность", "ssh", "ufw", "fail2ban", "sysctl", "linux-admin"] categories: - Linux - Безопасность --- Поставил чистый Debian 12 и думаешь сразу накатывать приложения? Не торопись. Сейчас потратишь час на базовую настройку безопасности - сэкономишь недели на разгребание последствий взлома. {{< lead >}}Эта статья - универсальная база для любого production-сервера. Не важно, будешь ты крутить почту, веб или базу данных - эти настройки нужны всем.{{< /lead >}} ## Что будем делать Превратим голый Debian в сервер, который: - Не пустит первого попавшегося ботнет - Автоматически обновляет критичные патчи - Не упадет от fork-бомбы - Защищен от базовых сетевых атак - Имеет бэкапы конфигов для восстановления - Логирует подозрительную активность Без фанатизма и паранойи. Только то, что реально защищает. ## Исходные данные **Что есть:** - Чистый Debian 12 (Bookworm) - Root-доступ по SSH - Статический IP-адрес **Что НЕ рассматриваю:** - Docker/Podman контейнеры (это отдельная тема) - Кластерные конфигурации - Специфичные настройки приложений ## Обновление системы Первым делом - обновить все до актуального состояния. ```bash apt update apt upgrade -y apt dist-upgrade -y ``` **Что делают команды:** - `apt update` - обновить списки пакетов - `apt upgrade` - обновить установленные пакеты - `apt dist-upgrade` - обновить с разрешением зависимостей (может удалить/добавить пакеты) Если спросит про перезагрузку сервисов - соглашайся. Проверь, нужна ли перезагрузка: ```bash [ -f /var/run/reboot-required ] && echo "Reboot needed" || echo "No reboot needed" ``` Если нужна - перезагружаемся: ```bash reboot ``` ### Базовые утилиты Поставь то, что понадобится для работы и отладки: ```bash apt install -y \ sudo \ curl \ wget \ git \ htop \ iotop \ iftop \ net-tools \ dnsutils \ telnet \ tcpdump \ screen \ tmux \ rsync \ unzip \ ca-certificates \ gnupg2 \ lsb-release ``` **Что установили:** - Мониторинг: `htop`, `iotop`, `iftop` - Сеть: `net-tools`, `dnsutils`, `telnet`, `tcpdump` - Сессии: `screen`, `tmux` - Утилиты: `curl`, `wget`, `git`, `rsync`, `unzip` ## Настройка системы ### Hostname Установи правильное имя сервера: ```bash hostnamectl set-hostname srv01.example.ru ``` Замени `srv01.example.ru` на свое. Запусти новую ssh сессию и проверь: ```bash hostname -f ``` Должно вернуть полное имя (FQDN). ### Файл /etc/hosts Открой: ```bash nano /etc/hosts ``` Приведи к виду: ``` 127.0.0.1 localhost твой-IP srv01.example.ru srv01 # IPv6 ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters ``` **Замени:** - `твой-IP` - на реальный IP сервера - `srv01.example.ru` - на свое имя ### Timezone Установи правильную временную зону: ```bash timedatectl set-timezone Europe/Moscow ``` Посмотри доступные зоны: ```bash timedatectl list-timezones | grep Moscow ``` Проверь текущее время: ```bash timedatectl ``` Должно показать правильный timezone и время. ### Локаль Проверь текущую локаль: ```bash locale ``` Если видишь ошибки или не UTF-8 - настрой: ```bash apt install -y locales dpkg-reconfigure locales ``` Выбери: - `en_US.UTF-8` - `ru_RU.UTF-8` (если нужна кириллица) По умолчанию поставь `en_US.UTF-8`. Проверь: ```bash locale ``` Должно быть `LANG=en_US.UTF-8`. ## SSH hardening SSH - главный вход на сервер. Если его взломают - все остальное не имеет смысла. ### Создание пользователя (не root) Работать от root - плохая идея. Создай обычного пользователя: ```bash adduser admin ``` Введи пароль (временный, потом отключим). Добавь в sudo: ```bash usermod -aG sudo admin ``` Проверь: ```bash groups admin ``` Должно быть: `admin : admin sudo` ### SSH ключи На **своей рабочей машине** (возможно это Windows) сгенерируй ключ: ```bash ssh-keygen -t ed25519 -C "admin@srv01" ``` или так ```pwsh cd c:\users\$env:username ssh-keygen ``` Если спросит путь - жми Enter (по умолчанию `~/.ssh/id_ed25519`). Если спросит passphrase - на твое усмотрение (дополнительная защита ключа). Скопируй публичный ключ на сервер: {{< tabs >}} {{< tab label="Windows" >}} ```pwsh type $env:userprofile\.ssh\id_ed25519.pub | ssh admin@твой-IP "if [ ! -d ~/.ssh ]; then mkdir -m 700 ~/.ssh; fi; if [ ! -f ~/.ssh/authorized_keys ]; then touch ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys; fi; cat >> ~/.ssh/authorized_keys" ``` Команда проверяет наличие `~/.ssh/authorized_keys` и если ее нет - создает с нужными правами. {{< /tab >}} {{< tab label="Linux" md=false >}} ```bash ssh-copy-id admin@твой-IP ``` {{< /tab >}} {{< /tabs >}} Введи пароль пользователя `admin`. Проверь вход по ключу: ```bash ssh admin@твой-IP ``` Не должен спрашивать пароль (только passphrase ключа, если установил). Если работает - отлично. Теперь настроим сервер. ### Настройка sshd Залогинься на сервер под `admin`: ```bash ssh admin@твой-IP ``` Открой конфиг SSH: ```bash sudo nano /etc/ssh/sshd_config ``` Найди и измени (или добавь): ``` # Базовые настройки Port 2222 PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys # Ограничения MaxAuthTries 3 MaxSessions 2 LoginGraceTime 30 # Отключаем лишнее PermitEmptyPasswords no ChallengeResponseAuthentication no UsePAM yes X11Forwarding no PrintMotd no AcceptEnv LANG LC_* # Таймауты ClientAliveInterval 300 ClientAliveCountMax 2 # Только IPv4 (если не используешь IPv6) AddressFamily inet ``` **Что настроили:** **Port 2222:** - Нестандартный порт вместо 22 - Отсекает 90% ботов - `ВАЖНО:` Запомни новый порт! **PermitRootLogin no:** - Запрет входа под root - Обязательно использовать обычного пользователя + sudo **PasswordAuthentication no:** - Отключаем пароли - Только SSH-ключи **MaxAuthTries 3:** - Максимум 3 попытки входа **LoginGraceTime 30:** - 30 секунд на авторизацию **ClientAliveInterval 300:** - Пинговать клиента каждые 5 минут - Отключать неактивные сессии Проверь конфиг: ```bash sudo sshd -t ``` Если ошибок нет - ничего не выводит. {{< alert cardColor="#e63946" iconColor="#ffffff" >}} **КРИТИЧЕСКИ ВАЖНО:** Перед перезапуском SSH открой **вторую сессию** и не закрывай её: {{< /alert >}} ```bash ssh admin@твой-IP ``` Это страховка. Если что-то пойдет не так - сможешь исправить через вторую сессию. Перезапусти SSH в первой сессии: ```bash sudo systemctl restart sshd ``` Во второй сессии проверь новое подключение: ```bash ssh -p 2222 admin@твой-IP ``` Если работает - отлично. Можешь закрыть старые сессии. Если не работает - исправляй через вторую (старую) сессию. ### SSH banner Добавь предупреждение при входе. Создай файл: ```bash sudo nano /etc/ssh/banner ``` Запиши: ``` ############################################################################### # ВНИМАНИЕ! # # # # Доступ к этой системе разрешен только авторизованным пользователям. # # Все действия логируются и могут быть использованы в качестве # # доказательств при расследовании инцидентов. # # # # Несанкционированный доступ преследуется по закону. # # # ############################################################################### ``` Добавь в `/etc/ssh/sshd_config`: ``` Banner /etc/ssh/banner ``` Перезапусти SSH: ```bash sudo systemctl restart sshd ``` При следующем входе увидишь баннер. ## Firewall (ufw) Firewall - первая линия защиты от сетевых атак. ### Установка ufw ```bash sudo apt install -y ufw ``` ### Базовые правила {{< alert >}}**ВАЖНО:** Сначала настроим правила, потом включим. Иначе можешь заблокировать себя.{{< /alert >}} Политика по умолчанию - блокировать все входящее: ```bash sudo ufw default deny incoming sudo ufw default allow outgoing ``` Разрешаем SSH на новом порту: ```bash sudo ufw allow 2222/tcp comment 'SSH' ``` **Замени 2222** на свой порт из `sshd_config`. **Не открывай порты, которые не нужны!** Добавишь потом по мере необходимости. ### Rate limiting для SSH Защита от брутфорса на уровне firewall: ```bash sudo ufw limit 2222/tcp ``` Это ограничит количество подключений (максимум 6 попыток за 30 секунд). ### Включаем firewall Проверь правила: ```bash sudo ufw show added ``` Должно быть что-то вроде: ``` ufw allow 2222/tcp ``` Включаем: ```bash sudo ufw enable ``` Спросит: `Command may disrupt existing ssh connections. Proceed with operation (y|n)?` т.е. `Выполнение команды может прервать существующие SSH-соединения. Продолжить операцию? (y|n)` Жми `y`. Проверь статус: ```bash sudo ufw status verbose ``` Должно быть: ``` Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) To Action From -- ------ ---- 2222/tcp LIMIT Anywhere ``` Включи автозапуск: ```bash sudo systemctl enable ufw ``` ## Fail2ban Firewall блокирует порты, Fail2ban блокирует IP-адреса с подозрительной активностью. ### Установка ```bash sudo apt install -y fail2ban ``` ### Базовая настройка Создай конфиг: ```bash sudo nano /etc/fail2ban/jail.local ``` Внеси: ```ini [DEFAULT] # Время бана (10 минут) bantime = 600 # Окно наблюдения (10 минут) findtime = 600 # Количество попыток maxretry = 5 # Игнорируемые IP (свои сети) ignoreip = 127.0.0.1/8 ::1 # Действие при бане banaction = ufw action = %(action_mwl)s [sshd] enabled = true port = 2222 logpath = /var/log/auth.log maxretry = 3 ``` **Что настроили:** **DEFAULT:** - `bantime = 600` - бан на 10 минут - `findtime = 600` - смотрим на последние 10 минут - `maxretry = 5` - максимум 5 попыток - `ignoreip` - список IP, которые не баним (добавь свои) - `banaction = ufw` - блокировать через ufw - `action = %(action_mwl)s` - бан + письмо (если настроена почта) **sshd:** - Защита SSH - Порт 2222 (твой порт) - Максимум 3 попытки (строже чем default) ### Запуск ```bash sudo systemctl enable fail2ban sudo systemctl start fail2ban sudo systemctl status fail2ban ``` Должен быть `active (running)`. ### Проверка Посмотри статус тюрем: ```bash sudo fail2ban-client status ``` Должно быть: ``` Status |- Number of jail: 1 `- Jail list: sshd ``` Статус конкретной тюрьмы: ```bash sudo fail2ban-client status sshd ``` Покажет: - Количество забаненных IP - Список IP ### Тест С другого IP попробуй подключиться с неправильным паролем 3 раза подряд: ```bash ssh fake@твой-IP -p 2222 ``` После 3-й попытки IP должен быть забанен. Проверь: ```bash sudo fail2ban-client status sshd ``` Должен появиться IP в `Banned IP list`. Разбань (для теста): ```bash sudo fail2ban-client set sshd unbanip IP-адрес ``` ## Kernel hardening (sysctl) Настроим ядро для защиты от сетевых атак. Открой: ```bash sudo nano /etc/sysctl.d/99-hardening.conf ``` Внеси: ```ini # IP Forwarding (отключаем если не роутер) net.ipv4.ip_forward = 0 net.ipv6.conf.all.forwarding = 0 # Защита от IP spoofing net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # Игнорировать ICMP redirects net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 # Не отправлять ICMP redirects net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 # Игнорировать ICMP broadcast net.ipv4.icmp_echo_ignore_broadcasts = 1 # Игнорировать bogus ICMP errors net.ipv4.icmp_ignore_bogus_error_responses = 1 # Логировать подозрительные пакеты net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.log_martians = 1 # Защита от SYN flood net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 5 # Отключить source routing net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 net.ipv6.conf.default.accept_source_route = 0 # Оптимизация TCP net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_keepalive_time = 300 net.ipv4.tcp_keepalive_probes = 5 net.ipv4.tcp_keepalive_intvl = 15 # Увеличить диапазон портов net.ipv4.ip_local_port_range = 1024 65535 # Защита от TIME_WAIT net.ipv4.tcp_rfc1337 = 1 # Увеличить буферы net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 # Файловая система fs.file-max = 65535 fs.inotify.max_user_watches = 524288 ``` **Что настроили:** **Защита от spoofing:** - Reverse path filtering - Проверка source routing **Защита от ICMP атак:** - Игнорируем redirects - Игнорируем broadcast ping **Защита от SYN flood:** - SYN cookies - Ограничение backlog **Оптимизация TCP:** - Таймауты соединений - Размеры буферов - Диапазон портов Применяем: ```bash sudo sysctl -p /etc/sysctl.d/99-hardening.conf ``` Проверяем: ```bash sudo sysctl net.ipv4.tcp_syncookies ``` Должно вернуть: `net.ipv4.tcp_syncookies = 1` ## Swap Если RAM мало (меньше 4GB) - настрой swap. ### Проверка наличия swap ```bash free -h ``` Если в строке `Swap` везде нули - нет swap. Также проверь: ```bash swapon --show ``` Если пусто - нет swap. ### Создание swap-файла Создаем файл на 2GB: ```bash sudo fallocate -l 2G /swapfile ``` Если `fallocate` не работает: ```bash sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 ``` Права: ```bash sudo chmod 600 /swapfile ``` Форматируем: ```bash sudo mkswap /swapfile ``` Включаем: ```bash sudo swapon /swapfile ``` Проверяем: ```bash free -h ``` Должен появиться swap. Делаем постоянным (добавляем в fstab): ```bash echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab ``` ### Настройка swappiness `Swappiness` - насколько активно использовать swap. Проверь текущее значение: ```bash cat /proc/sys/vm/swappiness ``` По умолчанию: 60 (агрессивно). Для серверов лучше 10: ```bash sudo nano /etc/sysctl.d/99-swappiness.conf ``` Запиши: ``` vm.swappiness = 10 ``` Применяем: ```bash sudo sysctl -p /etc/sysctl.d/99-swappiness.conf ``` Проверяем: ```bash cat /proc/sys/vm/swappiness ``` Должно быть: 10 ## Ограничение ресурсов Защита от fork-бомб и исчерпания дескрипторов. `fork-бомба` - это программа (вредоносная или написанная по ошибке), которая бесконечно создаёт собственные копии через системный вызов `fork()`, пока ресурсы системы полностью не иссякнут. Открой: ```bash sudo nano /etc/security/limits.conf ``` Добавь в конец: ``` # Ограничения для обычных пользователей * soft nofile 65535 * hard nofile 65535 * soft nproc 32768 * hard nproc 32768 # Ограничения для root root soft nofile 65535 root hard nofile 65535 root soft nproc 32768 root hard nproc 32768 ``` **Что настроили:** **nofile:** - Максимум открытых файлов/сокетов - 65535 достаточно для большинства случаев **nproc:** - Максимум процессов пользователя - 32768 защитит от fork-бомбы Также настрой PAM: ```bash sudo nano /etc/pam.d/common-session ``` Добавь в конец: ``` session required pam_limits.so ``` Перелогинься и проверь: ```bash ulimit -n ulimit -u ``` Должно быть: - `ulimit -n` → 65535 - `ulimit -u` → 32768 ## Автообновления безопасности Критичные патчи должны ставиться автоматически. ### Установка ```bash sudo apt install -y unattended-upgrades apt-listchanges ``` ### Настройка Открой: ```bash sudo nano /etc/apt/apt.conf.d/50unattended-upgrades ``` Найди и раскомментируй/измени: ``` Unattended-Upgrade::Origins-Pattern { // Только security-обновления: "origin=Debian,codename=${distro_codename},label=Debian-Security"; "origin=Debian,codename=${distro_codename}-security,label=Debian-Security"; }; Unattended-Upgrade::AutoFixInterruptedDpkg "true"; Unattended-Upgrade::MinimalSteps "true"; Unattended-Upgrade::Remove-Unused-Kernel-Packages "true"; Unattended-Upgrade::Remove-Unused-Dependencies "true"; Unattended-Upgrade::Automatic-Reboot "false"; Unattended-Upgrade::Automatic-Reboot-Time "03:00"; ``` **Что настроили:** **Allowed-Origins:** - Только обновления безопасности - Не обновляем все подряд **AutoFixInterruptedDpkg:** - Автоматически чинить прерванные установки **Remove-Unused-Kernel-Packages:** - Удалять старые ядра **Remove-Unused-Dependencies:** - Удалять неиспользуемые зависимости **Automatic-Reboot:** - `false` - не перезагружаться автоматически - Если хочешь автоперезагрузку → `true` (в 3 ночи) Включаем: ```bash sudo dpkg-reconfigure -plow unattended-upgrades ``` Выбери `Yes`. Проверь статус: ```bash sudo systemctl status unattended-upgrades ``` Должен быть `active`. Проверь логи (через некоторое время): ```bash cat /var/log/unattended-upgrades/unattended-upgrades.log ``` ## Отключение ненужных сервисов Меньше сервисов - меньше поверхность атаки. Арендованные VPS обычно используют специальные версии операционных систем - в них и так все по-минимуму. В остальных случаях: ### Список запущенных сервисов ```bash systemctl list-units --type=service --state=running ``` ### Что можно отключить **Bluetooth (на сервере не нужен):** ```bash sudo systemctl stop bluetooth.service sudo systemctl disable bluetooth.service sudo systemctl mask bluetooth.service ``` **ModemManager (если нет модема):** ```bash sudo systemctl stop ModemManager.service sudo systemctl disable ModemManager.service ``` **Avahi (mDNS, обычно не нужен):** ```bash sudo systemctl stop avahi-daemon.service sudo systemctl disable avahi-daemon.service ``` **Cups (печать, на сервере не нужна):** ```bash sudo systemctl stop cups.service sudo systemctl disable cups.service ``` **ВАЖНО:** Не отключай: - `sshd` - без него не зайдешь - `systemd-*` - системные сервисы - `cron` - для задач по расписанию - `rsyslog` - логирование Проверь, что отключилось: ```bash systemctl list-units --type=service --state=running ``` ## Логирование ### Настройка rsyslog Открой: ```bash sudo nano /etc/rsyslog.conf ``` Убедись, что есть: ``` # Логи аутентификации auth,authpriv.* /var/log/auth.log # Системные логи *.*;auth,authpriv.none -/var/log/syslog # Cron cron.* /var/log/cron.log # Ядро kern.* -/var/log/kern.log # Почта (если будет) mail.* -/var/log/mail.log mail.err /var/log/mail.err ``` Перезапусти: ```bash sudo systemctl restart rsyslog ``` ### Ротация логов Открой: ```bash sudo nano /etc/logrotate.conf ``` Убедись, что есть: ``` # Ротация раз в неделю weekly # Хранить 4 недели rotate 4 # Создавать новые файлы create # Сжимать старые compress ``` Настрой индивидуальную ротацию: ```bash sudo nano /etc/logrotate.d/rsyslog ``` ``` /var/log/syslog /var/log/mail.log /var/log/mail.err /var/log/auth.log { rotate 7 daily missingok notifempty compress delaycompress sharedscripts postrotate /usr/lib/rsyslog/rsyslog-rotate endscript } ``` **Что настроили:** - Ротация каждый день - Хранить 7 дней - Сжимать старые логи Проверь ротацию вручную: ```bash sudo logrotate -f /etc/logrotate.conf ``` ## Автоматическая очистка ### Старые ядра Debian накапливает старые версии ядер. Очистка: ```bash sudo apt autoremove --purge -y ``` Автоматизируем в unattended-upgrades (уже настроили выше): ``` Unattended-Upgrade::Remove-Unused-Kernel-Packages "true"; ``` ### Кэш пакетов Очистка вручную: ```bash sudo apt clean sudo apt autoclean ``` Автоматизация: ```bash sudo nano /etc/apt/apt.conf.d/10periodic ``` ``` APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Download-Upgradeable-Packages "1"; APT::Periodic::AutocleanInterval "7"; APT::Periodic::Unattended-Upgrade "1"; ``` **Что настроили:** - Обновлять списки пакетов ежедневно - Скачивать обновления - Очищать кэш раз в неделю - Ставить обновления безопасности ### Journald Ограничиваем размер логов systemd: ```bash sudo nano /etc/systemd/journald.conf ``` Раскомментируй/измени: ``` SystemMaxUse=500M SystemMaxFileSize=100M MaxRetentionSec=1month ``` Перезапусти: ```bash sudo systemctl restart systemd-journald ``` Проверь размер: ```bash sudo journalctl --disk-usage ``` Должно быть в пределах 500M. ## Базовый бэкап ### Что бэкапить **Критично:** - `/etc/` - все конфиги системы - `/root/.ssh/` - SSH ключи root - `/home/*/. ssh/` - SSH ключи пользователей - Список установленных пакетов **Важно (если есть):** - `/var/www/` - веб-сайты - `/var/spool/mail/` - почта - Базы данных ### Скрипт бэкапа конфигов Создай: ```bash sudo nano /root/backup-configs.sh ``` ```bash #!/bin/bash BACKUP_DIR="/root/backups" DATE=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="$BACKUP_DIR/config_backup_$DATE.tar.gz" # Создаем директорию если нет mkdir -p $BACKUP_DIR # Список установленных пакетов dpkg --get-selections > /root/installed-packages.txt # Архивируем конфиги tar -czf $BACKUP_FILE \ /etc/ \ /root/.ssh/ \ /home/*/.ssh/ \ /root/installed-packages.txt \ 2>/dev/null # Удаляем бэкапы старше 30 дней find $BACKUP_DIR -name "config_backup_*.tar.gz" -mtime +30 -delete echo "Backup created: $BACKUP_FILE" ls -lh $BACKUP_FILE ``` Права на выполнение: ```bash sudo chmod +x /root/backup-configs.sh ``` Запусти: ```bash sudo /root/backup-configs.sh ``` Проверь: ```bash ls -lh /root/backups/ ``` ### Автоматизация бэкапа Добавь в cron (раз в неделю): ```bash sudo crontab -e ``` Добавь: ``` 0 3 * * 0 /root/backup-configs.sh >> /var/log/backup-configs.log 2>&1 ``` Это запустит скрипт каждое воскресенье в 3 ночи. ### Восстановление Если нужно восстановить конфиги: ```bash sudo tar -xzf /root/backups/config_backup_ДАТА.tar.gz -C / ``` Если нужно восстановить пакеты: ```bash sudo dpkg --set-selections < /root/installed-packages.txt sudo apt-get dselect-upgrade ``` ## Мониторинг ### Проверка диска Установи smartmontools: ```bash sudo apt install -y smartmontools ``` Проверь диск: ```bash sudo smartctl -H /dev/sda ``` Должно вернуть: `SMART Health Status: OK` Если `FAILED` - диск умирает. Посмотри детали: ```bash sudo smartctl -a /dev/sda ``` ### Алерты на критичные события > [!TIP] Для работы почтовых уведомлений должен быть настроен MTA (например Postfix). Создай скрипт проверки: ```bash sudo nano /root/health-check.sh ``` ```bash #!/bin/bash ALERT_EMAIL="admin@example.ru" HOSTNAME=$(hostname) # Проверка места на диске DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//') if [ $DISK_USAGE -gt 90 ]; then echo "ALERT: Disk usage is ${DISK_USAGE}% on $HOSTNAME" | mail -s "Disk Alert" $ALERT_EMAIL fi # Проверка RAM MEM_USAGE=$(free | awk 'NR==2 {printf "%.0f", $3/$2*100}') if [ $MEM_USAGE -gt 90 ]; then echo "ALERT: Memory usage is ${MEM_USAGE}% on $HOSTNAME" | mail -s "Memory Alert" $ALERT_EMAIL fi # Проверка swap SWAP_USAGE=$(free | awk 'NR==3 {if ($2 > 0) printf "%.0f", $3/$2*100; else print 0}') if [ $SWAP_USAGE -gt 80 ]; then echo "ALERT: Swap usage is ${SWAP_USAGE}% on $HOSTNAME" | mail -s "Swap Alert" $ALERT_EMAIL fi # Проверка load average LOAD=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//') CORES=$(nproc) LOAD_INT=$(echo $LOAD | awk '{printf "%.0f", $1}') if [ $LOAD_INT -gt $((CORES * 2)) ]; then echo "ALERT: Load average is $LOAD on $HOSTNAME ($CORES cores)" | mail -s "Load Alert" $ALERT_EMAIL fi ``` {{< alert >}} **ВАЖНО:** Замени `admin@example.ru` на свой email. {{< /alert >}} Права: ```bash sudo chmod +x /root/health-check.sh ``` Добавь в cron (каждые 15 минут): ```bash sudo crontab -e ``` Если отправка почты настроена: ``` */15 * * * * /root/health-check.sh ``` Если отправки почты нет - можешь логировать: ``` */15 * * * * /root/health-check.sh >> /var/log/health-check.log 2>&1 ``` ### Тестирование Проверь с внешнего IP: ```bash # Проверка SSH ssh -p 2222 admin@твой-IP # Сканирование портов (с другого сервера) nmap -p 1-65535 твой-IP # Проверка firewall telnet твой-IP 22 # Должен быть недоступен telnet твой-IP 2222 # Должен быть доступен ``` ## Что дальше Сервер готов к установке приложений. Теперь можешь: - Ставить веб-сервер (Nginx/Apache) - Разворачивать почтовый сервер (Postfix/Dovecot) - Устанавливать базы данных (PostgreSQL/MySQL) - Крутить любые сервисы Все специфичные настройки делаются поверх этой базы. > [!TIP]+ **Главное:** > Не забывай регулярно проверять логи и обновлять систему. Безопасность - это процесс, а не состояние.