33 KiB
| title | date | draft | description | tags | categories | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Безопасный production-сервер на Debian 12: пошаговая настройка | 2026-03-12 | false | Пошаговое руководство по защите Debian 12 с нуля: настройка SSH, ufw, Fail2ban, sysctl, автообновлений и мониторинга. Базовая безопасность production-сервера за один час. |
|
|
Поставил чистый Debian 12 и думаешь сразу накатывать приложения? Не торопись. Сейчас потратишь час на базовую настройку безопасности - сэкономишь недели на разгребание последствий взлома.
{{< lead >}}Эта статья - универсальная база для любого production-сервера. Не важно, будешь ты крутить почту, веб или базу данных - эти настройки нужны всем.{{< /lead >}}
Что будем делать
Превратим голый 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-8ru_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 - на твое усмотрение (дополнительная защита ключа).
Скопируй публичный ключ на сервер:
{{< tabs >}} {{< tab label="Windows" >}}
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 >}}
ssh-copy-id admin@твой-IP
{{< /tab >}}
{{< /tabs >}}
Введи пароль пользователя 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
Если ошибок нет - ничего не выводит.
{{< alert cardColor="#e63946" iconColor="#ffffff" >}} КРИТИЧЕСКИ ВАЖНО: Перед перезапуском SSH открой вторую сессию и не закрывай её: {{< /alert >}}
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
Базовые правила
{{< alert >}}ВАЖНО: Сначала настроим правила, потом включим. Иначе можешь заблокировать себя.{{< /alert >}}
Политика по умолчанию - блокировать все входящее:
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- блокировать через ufwaction = %(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→ 65535ulimit -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
Алерты на критичные события
[!TIP] Для работы почтовых уведомлений должен быть настроен MTA (например Postfix).
Создай скрипт проверки:
sudo nano /root/health-check.sh
#!/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 >}}
Права:
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)
- Крутить любые сервисы
Все специфичные настройки делаются поверх этой базы.
[!TIP]+ Главное: Не забывай регулярно проверять логи и обновлять систему. Безопасность - это процесс, а не состояние.