Перейти к основному содержимому

Безопасный production-сервер на Debian 12: пошаговая настройка

Олег Казанин
Автор
Олег Казанин
Строю полезную инфраструктуру на Open Source стеке. Документирую грабли, чтобы вы на них не наступали.
Оглавление

Поставил чистый Debian 12 и думаешь сразу накатывать приложения? Не торопись. Сейчас потратишь час на базовую настройку безопасности - сэкономишь недели на разгребание последствий взлома.

Эта статья - универсальная база для любого production-сервера. Не важно, будешь ты крутить почту, веб или базу данных - эти настройки нужны всем.

Что будем делать
#

Превратим голый Debian в сервер, который:

  • Не пустит первого попавшегося ботнет
  • Автоматически обновляет критичные патчи
  • Не упадет от fork-бомбы
  • Защищен от базовых сетевых атак
  • Имеет бэкапы конфигов для восстановления
  • Логирует подозрительную активность

Без фанатизма и паранойи. Только то, что реально защищает.

Исходные данные
#

Что есть:

  • Чистый Debian 12 (Bookworm)
  • Root-доступ по SSH
  • Статический IP-адрес

Что НЕ рассматриваю:

  • Docker/Podman контейнеры (это отдельная тема)
  • Кластерные конфигурации
  • Специфичные настройки приложений

Обновление системы
#

Первым делом - обновить все до актуального состояния.

apt update
apt upgrade -y
apt dist-upgrade -y

Что делают команды:

  • apt update - обновить списки пакетов
  • apt upgrade - обновить установленные пакеты
  • apt dist-upgrade - обновить с разрешением зависимостей (может удалить/добавить пакеты)

Если спросит про перезагрузку сервисов - соглашайся.

Проверь, нужна ли перезагрузка:

[ -f /var/run/reboot-required ] && echo "Reboot needed" || echo "No reboot needed"

Если нужна - перезагружаемся:

reboot

Базовые утилиты
#

Поставь то, что понадобится для работы и отладки:

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
#

Установи правильное имя сервера:

hostnamectl set-hostname srv01.example.ru

Замени srv01.example.ru на свое.

Запусти новую ssh сессию и проверь:

hostname -f

Должно вернуть полное имя (FQDN).

Файл /etc/hosts
#

Открой:

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
#

Установи правильную временную зону:

timedatectl set-timezone Europe/Moscow

Посмотри доступные зоны:

timedatectl list-timezones | grep Moscow

Проверь текущее время:

timedatectl

Должно показать правильный timezone и время.

Локаль
#

Проверь текущую локаль:

locale

Если видишь ошибки или не UTF-8 - настрой:

apt install -y locales
dpkg-reconfigure locales

Выбери:

  • en_US.UTF-8
  • ru_RU.UTF-8 (если нужна кириллица)

По умолчанию поставь en_US.UTF-8.

Проверь:

locale

Должно быть LANG=en_US.UTF-8.

SSH hardening
#

SSH - главный вход на сервер. Если его взломают - все остальное не имеет смысла.

Создание пользователя (не root)
#

Работать от root - плохая идея. Создай обычного пользователя:

adduser admin

Введи пароль (временный, потом отключим).

Добавь в sudo:

usermod -aG sudo admin

Проверь:

groups admin

Должно быть: admin : admin sudo

SSH ключи
#

На своей рабочей машине (возможно это Windows) сгенерируй ключ:

ssh-keygen -t ed25519 -C "admin@srv01"

или так

cd c:\users\$env:username
ssh-keygen

Если спросит путь - жми Enter (по умолчанию ~/.ssh/id_ed25519).

Если спросит passphrase - на твое усмотрение (дополнительная защита ключа).

Скопируй публичный ключ на сервер:

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 и если ее нет - создает с нужными правами.

ssh-copy-id admin@твой-IP

Введи пароль пользователя admin.

Проверь вход по ключу:

ssh admin@твой-IP

Не должен спрашивать пароль (только passphrase ключа, если установил).

Если работает - отлично. Теперь настроим сервер.

Настройка sshd
#

Залогинься на сервер под admin:

ssh admin@твой-IP

Открой конфиг SSH:

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 минут
  • Отключать неактивные сессии

Проверь конфиг:

sudo sshd -t

Если ошибок нет - ничего не выводит.

КРИТИЧЕСКИ ВАЖНО: Перед перезапуском SSH открой вторую сессию и не закрывай её:
ssh admin@твой-IP

Это страховка. Если что-то пойдет не так - сможешь исправить через вторую сессию.

Перезапусти SSH в первой сессии:

sudo systemctl restart sshd

Во второй сессии проверь новое подключение:

ssh -p 2222 admin@твой-IP

Если работает - отлично. Можешь закрыть старые сессии.

Если не работает - исправляй через вторую (старую) сессию.

SSH banner
#

Добавь предупреждение при входе.

Создай файл:

sudo nano /etc/ssh/banner

Запиши:

###############################################################################
#                              ВНИМАНИЕ!                                      #
#                                                                             #
#  Доступ к этой системе разрешен только авторизованным пользователям.        #
#  Все действия логируются и могут быть использованы в качестве               #
#  доказательств при расследовании инцидентов.                                #
#                                                                             #
#  Несанкционированный доступ преследуется по закону.                         #
#                                                                             #
###############################################################################

Добавь в /etc/ssh/sshd_config:

Banner /etc/ssh/banner

Перезапусти SSH:

sudo systemctl restart sshd

При следующем входе увидишь баннер.

Firewall (ufw)
#

Firewall - первая линия защиты от сетевых атак.

Установка ufw
#

sudo apt install -y ufw

Базовые правила
#

ВАЖНО: Сначала настроим правила, потом включим. Иначе можешь заблокировать себя.

Политика по умолчанию - блокировать все входящее:

sudo ufw default deny incoming
sudo ufw default allow outgoing

Разрешаем SSH на новом порту:

sudo ufw allow 2222/tcp comment 'SSH'

Замени 2222 на свой порт из sshd_config.

Разрешаем базовые сервисы (добавь те, что нужны):

# 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:

sudo ufw limit 2222/tcp

Это ограничит количество подключений (максимум 6 попыток за 30 секунд).

Включаем firewall
#

Проверь правила:

sudo ufw show added

Должно быть что-то вроде:

ufw allow 2222/tcp
ufw allow 80/tcp
ufw allow 443/tcp
...

Включаем:

sudo ufw enable

Спросит: Command may disrupt existing ssh connections. Proceed with operation (y|n)?

т.е. Выполнение команды может прервать существующие SSH-соединения. Продолжить операцию? (y|n)

Жми y.

Проверь статус:

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

Включи автозапуск:

sudo systemctl enable ufw

Fail2ban
#

Firewall блокирует порты, Fail2ban блокирует IP-адреса с подозрительной активностью.

Установка
#

sudo apt install -y fail2ban

Базовая настройка
#

Создай конфиг:

sudo nano /etc/fail2ban/jail.local

Внеси:

[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)

Запуск
#

sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo systemctl status fail2ban

Должен быть active (running).

Проверка
#

Посмотри статус тюрем:

sudo fail2ban-client status

Должно быть:

Status
|- Number of jail:      1
`- Jail list:   sshd

Статус конкретной тюрьмы:

sudo fail2ban-client status sshd

Покажет:

  • Количество забаненных IP
  • Список IP

Тест
#

С другого IP попробуй подключиться с неправильным паролем 3 раза подряд:

ssh fake@твой-IP -p 2222

После 3-й попытки IP должен быть забанен.

Проверь:

sudo fail2ban-client status sshd

Должен появиться IP в Banned IP list.

Разбань (для теста):

sudo fail2ban-client set sshd unbanip IP-адрес

Kernel hardening (sysctl)
#

Настроим ядро для защиты от сетевых атак.

Открой:

sudo nano /etc/sysctl.d/99-hardening.conf

Внеси:

# 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:

  • Таймауты соединений
  • Размеры буферов
  • Диапазон портов

Применяем:

sudo sysctl -p /etc/sysctl.d/99-hardening.conf

Проверяем:

sudo sysctl net.ipv4.tcp_syncookies

Должно вернуть: net.ipv4.tcp_syncookies = 1

Swap
#

Если RAM мало (меньше 4GB) - настрой swap.

Проверка наличия swap
#

free -h

Если в строке Swap везде нули - нет swap.

Также проверь:

swapon --show

Если пусто - нет swap.

Создание swap-файла
#

Создаем файл на 2GB:

sudo fallocate -l 2G /swapfile

Если fallocate не работает:

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048

Права:

sudo chmod 600 /swapfile

Форматируем:

sudo mkswap /swapfile

Включаем:

sudo swapon /swapfile

Проверяем:

free -h

Должен появиться swap.

Делаем постоянным (добавляем в fstab):

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Настройка swappiness
#

Swappiness - насколько активно использовать swap.

Проверь текущее значение:

cat /proc/sys/vm/swappiness

По умолчанию: 60 (агрессивно).

Для серверов лучше 10:

sudo nano /etc/sysctl.d/99-swappiness.conf

Запиши:

vm.swappiness = 10

Применяем:

sudo sysctl -p /etc/sysctl.d/99-swappiness.conf

Проверяем:

cat /proc/sys/vm/swappiness

Должно быть: 10

Ограничение ресурсов
#

Защита от fork-бомб и исчерпания дескрипторов.

fork-бомба - это программа (вредоносная или написанная по ошибке), которая бесконечно создаёт собственные копии через системный вызов fork(), пока ресурсы системы полностью не иссякнут.

Открой:

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:

sudo nano /etc/pam.d/common-session

Добавь в конец:

session required pam_limits.so

Перелогинься и проверь:

ulimit -n
ulimit -u

Должно быть:

  • ulimit -n → 65535
  • ulimit -u → 32768

Автообновления безопасности
#

Критичные патчи должны ставиться автоматически.

Установка
#

sudo apt install -y unattended-upgrades apt-listchanges

Настройка
#

Открой:

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 ночи)

Включаем:

sudo dpkg-reconfigure -plow unattended-upgrades

Выбери Yes.

Проверь статус:

sudo systemctl status unattended-upgrades

Должен быть active.

Проверь логи (через некоторое время):

cat /var/log/unattended-upgrades/unattended-upgrades.log

Отключение ненужных сервисов
#

Меньше сервисов - меньше поверхность атаки. Арендованные VPS обычно используют специальные версии операционных систем - в них и так все по-минимуму. В остальных случаях:

Список запущенных сервисов
#

systemctl list-units --type=service --state=running

Что можно отключить
#

Bluetooth (на сервере не нужен):

sudo systemctl stop bluetooth.service
sudo systemctl disable bluetooth.service
sudo systemctl mask bluetooth.service

ModemManager (если нет модема):

sudo systemctl stop ModemManager.service
sudo systemctl disable ModemManager.service

Avahi (mDNS, обычно не нужен):

sudo systemctl stop avahi-daemon.service
sudo systemctl disable avahi-daemon.service

Cups (печать, на сервере не нужна):

sudo systemctl stop cups.service
sudo systemctl disable cups.service

ВАЖНО: Не отключай:

  • sshd - без него не зайдешь
  • systemd-* - системные сервисы
  • cron - для задач по расписанию
  • rsyslog - логирование

Проверь, что отключилось:

systemctl list-units --type=service --state=running

Логирование
#

Настройка rsyslog
#

Открой:

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

Перезапусти:

sudo systemctl restart rsyslog

Ротация логов
#

Открой:

sudo nano /etc/logrotate.conf

Убедись, что есть:

# Ротация раз в неделю
weekly

# Хранить 4 недели
rotate 4

# Создавать новые файлы
create

# Сжимать старые
compress

Настрой индивидуальную ротацию:

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 дней
  • Сжимать старые логи

Проверь ротацию вручную:

sudo logrotate -f /etc/logrotate.conf

Автоматическая очистка
#

Старые ядра
#

Debian накапливает старые версии ядер. Очистка:

sudo apt autoremove --purge -y

Автоматизируем в unattended-upgrades (уже настроили выше):

Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";

Кэш пакетов
#

Очистка вручную:

sudo apt clean
sudo apt autoclean

Автоматизация:

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:

sudo nano /etc/systemd/journald.conf

Раскомментируй/измени:

SystemMaxUse=500M
SystemMaxFileSize=100M
MaxRetentionSec=1month

Перезапусти:

sudo systemctl restart systemd-journald

Проверь размер:

sudo journalctl --disk-usage

Должно быть в пределах 500M.

Базовый бэкап
#

Что бэкапить
#

Критично:

  • /etc/ - все конфиги системы
  • /root/.ssh/ - SSH ключи root
  • /home/*/. ssh/ - SSH ключи пользователей
  • Список установленных пакетов

Важно (если есть):

  • /var/www/ - веб-сайты
  • /var/spool/mail/ - почта
  • Базы данных

Скрипт бэкапа конфигов
#

Создай:

sudo nano /root/backup-configs.sh
#!/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

Права на выполнение:

sudo chmod +x /root/backup-configs.sh

Запусти:

sudo /root/backup-configs.sh

Проверь:

ls -lh /root/backups/

Автоматизация бэкапа
#

Добавь в cron (раз в неделю):

sudo crontab -e

Добавь:

0 3 * * 0 /root/backup-configs.sh >> /var/log/backup-configs.log 2>&1

Это запустит скрипт каждое воскресенье в 3 ночи.

Восстановление
#

Если нужно восстановить конфиги:

sudo tar -xzf /root/backups/config_backup_ДАТА.tar.gz -C /

Если нужно восстановить пакеты:

sudo dpkg --set-selections < /root/installed-packages.txt
sudo apt-get dselect-upgrade

Мониторинг
#

Проверка диска
#

Установи smartmontools:

sudo apt install -y smartmontools

Проверь диск:

sudo smartctl -H /dev/sda

Должно вернуть: SMART Health Status: OK

Если FAILED - диск умирает.

Посмотри детали:

sudo smartctl -a /dev/sda

Алерты на критичные события
#

Для работы почтовых уведомлений должен быть настроен MTA (например Postfix).

Создай скрипт проверки:

sudo nano /root/health-check.sh
#!/bin/bash

ALERT_EMAIL="[email protected]"
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

ВАЖНО: Замени [email protected] на свой email.
Права:

sudo chmod +x /root/health-check.sh

Добавь в cron (каждые 15 минут):

sudo crontab -e

Если отправка почты настроена:

*/15 * * * * /root/health-check.sh

Если отправки почты нет - можешь логировать:

*/15 * * * * /root/health-check.sh >> /var/log/health-check.log 2>&1

Тестирование
#

Проверь с внешнего IP:

# Проверка SSH
ssh -p 2222 admin@твой-IP

# Сканирование портов (с другого сервера)
nmap -p 1-65535 твой-IP

# Проверка firewall
telnet твой-IP 22    # Должен быть недоступен
telnet твой-IP 2222  # Должен быть доступен

Что дальше
#

Сервер готов к установке приложений. Теперь можешь:

  • Ставить веб-сервер (Nginx/Apache)
  • Разворачивать почтовый сервер (Postfix/Dovecot)
  • Устанавливать базы данных (PostgreSQL/MySQL)
  • Крутить любые сервисы

Все специфичные настройки делаются поверх этой базы.

Главное:

Не забывай регулярно проверять логи и обновлять систему. Безопасность - это процесс, а не состояние.

Статьи по теме