Поставил чистый Debian 12 и думаешь сразу накатывать приложения? Не торопись. Сейчас потратишь час на базовую настройку безопасности - сэкономишь недели на разгребание последствий взлома.
Что будем делать#
Превратим голый 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 - на твое усмотрение (дополнительная защита ключа).
Скопируй публичный ключ на сервер:
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 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 ufwFail2ban#
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.serviceModemManager (если нет модема):
sudo systemctl stop ModemManager.service
sudo systemctl disable ModemManager.serviceAvahi (mDNS, обычно не нужен):
sudo systemctl stop avahi-daemon.service
sudo systemctl disable avahi-daemon.serviceCups (печать, на сервере не нужна):
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/10periodicAPT::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Алерты на критичные события#
Создай скрипт проверки:
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)
- Крутить любые сервисы
Все специфичные настройки делаются поверх этой базы.
Главное:
Не забывай регулярно проверять логи и обновлять систему. Безопасность - это процесс, а не состояние.








