diff --git a/content/posts/tips-debian-12-hardening/featured.png b/content/posts/tips-debian-12-hardening/featured.png new file mode 100644 index 0000000..22314ef Binary files /dev/null and b/content/posts/tips-debian-12-hardening/featured.png differ diff --git a/content/posts/tips-debian-12-hardening/index.md b/content/posts/tips-debian-12-hardening/index.md new file mode 100644 index 0000000..89d0d09 --- /dev/null +++ b/content/posts/tips-debian-12-hardening/index.md @@ -0,0 +1,1436 @@ +--- +title: "Безопасный production-сервер на Debian 12: пошаговая настройка" +date: 2026-03-12 +draft: false +description: "Пошаговое руководство по защите Debian 12 с нуля: настройка SSH, ufw, Fail2ban, sysctl, автообновлений и мониторинга. Базовая безопасность production-сервера за один час." +tags: ["debian", "linux", "security", "безопасность", "ssh", "ufw", "fail2ban", "sysctl", "linux-admin"] +categories: + - Linux + - Безопасность +--- + +# Debian 12: базовая настройка безопасности для production + +Поставил чистый Debian 12 и думаешь сразу накатывать приложения? Не торопись. Сейчас потратишь час на базовую настройку безопасности - сэкономишь недели на разгребание последствий взлома. + +Эта статья - универсальная база для любого production-сервера. Не важно, будешь ты крутить почту, веб или базу данных - эти настройки нужны всем. + +## Что будем делать + +Превратим голый 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" +``` + +или так + +```powershell +cd c:\users\$env:username +ssh-keygen +``` + +Если спросит путь - жми Enter (по умолчанию `~/.ssh/id_ed25519`). + +Если спросит passphrase - на твое усмотрение (дополнительная защита ключа). + +Скопируй публичный ключ на сервер: + +```bash +ssh-copy-id admin@твой-IP +``` + +если Windows + +```powershell +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` и если ее нет - создает с нужными правами. + +Введи пароль пользователя `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 +``` + +Если ошибок нет - ничего не выводит. + +**КРИТИЧЕСКИ ВАЖНО:** + +Перед перезапуском SSH открой **вторую сессию** и не закрывай её: + +```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 +``` + +### Базовые правила + +**ВАЖНО:** Сначала настроим правила, потом включим. Иначе можешь заблокировать себя. + +Политика по умолчанию - блокировать все входящее: + +```bash +sudo ufw default deny incoming +sudo ufw default allow outgoing +``` + +Разрешаем SSH на новом порту: + +```bash +sudo ufw allow 2222/tcp comment 'SSH' +``` + +**Замени 2222** на свой порт из `sshd_config`. + +Разрешаем базовые сервисы (добавь те, что нужны): + +```bash +# HTTP/HTTPS (если будет веб) +sudo ufw allow 80/tcp comment 'HTTP' +sudo ufw allow 443/tcp comment 'HTTPS' + +# SMTP (если будет почта) +sudo ufw allow 25/tcp comment 'SMTP' +sudo ufw allow 587/tcp comment 'SMTP Submission' + +# IMAP (если будет почта) +sudo ufw allow 143/tcp comment 'IMAP' +sudo ufw allow 993/tcp comment 'IMAPS' +``` + +**Не открывай порты, которые не нужны!** Добавишь потом по мере необходимости. + +### Rate limiting для SSH + +Защита от брутфорса на уровне firewall: + +```bash +sudo ufw limit 2222/tcp +``` + +Это ограничит количество подключений (максимум 6 попыток за 30 секунд). + +### Включаем firewall + +Проверь правила: + +```bash +sudo ufw show added +``` + +Должно быть что-то вроде: + +``` +ufw allow 2222/tcp +ufw allow 80/tcp +ufw allow 443/tcp +... +``` + +Включаем: + +```bash +sudo ufw enable +``` + +Скажет: `Command may disrupt existing ssh connections. Proceed with operation (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 +80/tcp ALLOW Anywhere +443/tcp ALLOW 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-бомб и исчерпания дескрипторов. + +Открой: + +```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 +``` + +### Алерты на критичные события + +Создай скрипт проверки: + +```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 +``` + +**ВАЖНО:** Замени `admin@example.ru` на свой email. + +Права: + +```bash +sudo chmod +x /root/health-check.sh +``` + +Добавь в cron (каждые 15 минут): + +```bash +sudo crontab -e +``` + +``` +*/15 * * * * /root/health-check.sh +``` + +Для работы почты должен быть настроен MTA (например Postfix). + +Если почты нет - можешь логировать: + +``` +*/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) +- Крутить любые сервисы + +Все специфичные настройки делаются поверх этой базы. + +**Главное:** Не забывай регулярно проверять логи и обновлять систему. Безопасность - это процесс, а не состояние. \ No newline at end of file