--- title: "Ubuntu 24.04: базовая настройка и hardening для production" date: 2026-07-07 draft: false description: "Пошаговая настройка Ubuntu 24.04 LTS (Noble Numbat) для production: SSH, firewall, fail2ban, swap, sysctl, автообновления, логи, бэкап конфигов." tags: ["ubuntu-24.04", "security", "hardening", "ssh", "ufw", "fail2ban", "sysctl", "production", "linux"] categories: ["Безопасность"] series: ["Linux Hardening"] series_order: 3 --- # Ubuntu 24.04: базовая настройка и hardening для production Ubuntu 24.04 LTS - production-ready дистрибутив с поддержкой до 2029 года (стандартная) и до 2034 года (расширенная через Ubuntu Pro). Из коробки он безопаснее голого Debian - UFW предустановлен, `unattended-upgrades` работает сразу - но настройки по умолчанию далеки от production-ready. Статья покрывает всё что нужно для сервера без контейнеров. Docker - отдельная тема. **Что получишь на выходе:** - SSH доступен только по ключам с нестандартного порта - Firewall блокирует всё лишнее - Fail2ban режет брутфорс - Swap настроен как файл (гибко, без переразбивки диска) - Ядро защищено от базовых сетевых атак - Автообновления безопасности без ручного вмешательства - Ненужные сервисы отключены - Логи ротируются, диск не забивается - Конфиги забэкаплены ## Исходные данные - Чистый Ubuntu 24.04 LTS (Noble Numbat) - Root доступ или пользователь с sudo - Статический IP Проверь версию: ```bash lsb_release -a ``` Ожидаемый вывод: ``` Distributor ID: Ubuntu Release: 24.04 Codename: noble ``` **Про пользователя:** Ubuntu при установке создаёт непривилегированного пользователя с sudo. Если устанавливал с таким пользователем - используй его. Если получил root-only сервер (облако, VPS) - создадим пользователя в разделе SSH. Все команды выполняются с `sudo` если не указано иное. Если работаешь от root - `sudo` можно опустить. ## Обновление системы ```bash sudo apt update sudo apt upgrade -y sudo apt dist-upgrade -y sudo apt autoremove -y ``` Ubuntu использует `needrestart` - после обновления сам сообщит какие сервисы нужно перезапустить. Если обновилось ядро, предложит перезагрузиться. Проверь явно: ```bash [ -f /var/run/reboot-required ] && echo "Reboot needed" || echo "No reboot needed" ``` Если нужна: ```bash sudo reboot ``` ### Snap пакеты Ubuntu активно использует snap. Обнови snap пакеты отдельно: ```bash sudo snap refresh ``` Посмотри что установлено из snap: ```bash snap list ``` Удали ненужное - каждый snap это отдельный процесс и место на диске: ```bash # Пример удаления sudo snap remove lxd sudo snap remove multipass ``` На минимальной серверной установке snap пакетов обычно нет или только `core` - это нормально. ## Базовые утилиты ```bash sudo apt install -y \ curl wget git vim htop iotop iftop \ net-tools dnsutils tcpdump \ screen tmux \ rsync unzip \ ca-certificates gnupg2 lsb-release \ smartmontools ``` ## Настройка системы ### Hostname ```bash sudo hostnamectl set-hostname srv01.example.com ``` Добавь в `/etc/hosts`: ```bash sudo nano /etc/hosts ``` ``` 127.0.0.1 localhost YOUR_IP srv01.example.com srv01 ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters ``` Замени `YOUR_IP` на реальный IP сервера. ### Timezone ```bash sudo timedatectl set-timezone Europe/Moscow ``` Проверь: ```bash timedatectl ``` Ubuntu 24.04 использует `systemd-timesyncd` для синхронизации времени - он работает из коробки. Проверь: ```bash timedatectl show-timesync ``` Если нужен `ntpd` вместо `timesyncd` - это отдельная история. Для большинства серверов `timesyncd` достаточен. ### Локаль ```bash sudo apt install -y locales sudo dpkg-reconfigure locales ``` Выбери `en_US.UTF-8` как основную. Добавь `ru_RU.UTF-8` если нужна кириллица. Проверь: ```bash locale ``` Должно быть `LANG=en_US.UTF-8`. ### DNS и systemd-resolved Ubuntu 24.04 использует `systemd-resolved` - DNS резолвер работает на `127.0.0.53`. `/etc/resolv.conf` это симлинк. Проверь: ```bash resolvectl status ``` Посмотри на какой файл указывает симлинк: ```bash ls -la /etc/resolv.conf ``` Это нормально - не трогай если резолвинг работает. Если настраиваешь статический DNS: ```bash sudo nano /etc/systemd/resolved.conf ``` ```ini [Resolve] DNS=8.8.8.8 8.8.4.4 FallbackDNS=1.1.1.1 ``` ```bash sudo systemctl restart systemd-resolved ``` **Важно:** Docker контейнеры не могут использовать `127.0.0.53` - это адрес loopback недоступный из контейнера. Для Docker-хоста это решается отдельно в следующей статье серии. ## Пользователь и SSH ### Создание пользователя (если нет) Если получил сервер без непривилегированного пользователя: ```bash adduser admin usermod -aG sudo admin ``` Проверь: ```bash groups admin # admin : admin sudo ``` ### SSH ключи На своей рабочей машине сгенерируй ключ: ```bash # Linux/macOS ssh-keygen -t ed25519 -C "admin@srv01" ``` ```powershell # Windows ssh-keygen -t ed25519 ``` Скопируй публичный ключ на сервер: ```bash # Linux/macOS ssh-copy-id admin@YOUR_IP ``` ```powershell # Windows type $env:userprofile\.ssh\id_ed25519.pub | ssh admin@YOUR_IP "mkdir -m 700 -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" ``` Проверь вход по ключу - не должен спрашивать пароль: ```bash ssh admin@YOUR_IP ``` ### SSH hardening Ubuntu 24.04 хранит конфигурацию SSH в `/etc/ssh/sshd_config.d/` - основной файл не трогаем. Создай файл с настройками: ```bash sudo nano /etc/ssh/sshd_config.d/99-hardening.conf ``` ``` # Нестандартный порт - отсекает большинство ботов Port 2222 # Только ключи, без паролей PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no PermitEmptyPasswords no ChallengeResponseAuthentication no KbdInteractiveAuthentication no # Запретить root логин PermitRootLogin no # Ограничения сессий MaxAuthTries 3 MaxSessions 3 LoginGraceTime 30 # Таймауты ClientAliveInterval 300 ClientAliveCountMax 2 # Отключить лишнее X11Forwarding no PrintMotd no AcceptEnv LANG LC_* # Только IPv4 (убери если используешь IPv6) AddressFamily inet ``` **Важно:** Ubuntu 24.04 использует socket-активацию через `ssh.socket` - порт слушает не sshd напрямую, а сокет-юнит. Обычный `systemctl restart ssh` перезапускает только сервис, порт остаётся прежним. Для применения нового порта нужно перезапускать именно сокет. **КРИТИЧНО:** Перед перезапуском открой вторую сессию и не закрывай её. Проверь конфиг на ошибки: ```bash sudo sshd -t ``` Нет вывода - нет ошибок. Примени: ```bash sudo systemctl daemon-reload sudo systemctl restart ssh.socket ``` Проверь что сервис поднялся на новом порту: ```bash sudo ss -tlnp | grep sshd ``` Ожидаемый вывод: ``` LISTEN 0 4096 0.0.0.0:2222 ``` Убедись что конфиг сокета подхватил изменение: ```bash sudo systemctl cat ssh.socket ``` Строка `ListenStream=0.0.0.0:2222` подтверждает что порт применился. В новом терминале проверь подключение: ```bash ssh -p 2222 admin@YOUR_IP ``` Если работает - старые сессии можно закрывать. ### SSH banner (опционально) ```bash sudo nano /etc/ssh/banner ``` ``` ############################################################################### # Доступ только для авторизованных пользователей. # # Все действия логируются. # # Несанкционированный доступ преследуется по понятиям! # ############################################################################### ``` Добавь в `/etc/ssh/sshd_config.d/99-hardening.conf`: ``` Banner /etc/ssh/banner ``` Перезапусти: ```bash sudo systemctl restart ssh ``` ## Firewall (UFW) UFW в Ubuntu предустановлен, но **по умолчанию выключен**. Проверь статус: ```bash sudo ufw status ``` Скорее всего увидишь `Status: inactive`. ### Настройка правил **Важно:** сначала правила, потом включение. Иначе заблокируешь себя. ```bash # Блокировать все входящие sudo ufw default deny incoming # Разрешить все исходящие sudo ufw default allow outgoing ``` Разрешаем SSH на новом порту: ```bash # Замени 2222 на свой порт sudo ufw allow 2222/tcp comment 'SSH' ``` Rate limiting на SSH: ```bash sudo ufw limit 2222/tcp comment 'SSH rate limit' ``` Включаем: ```bash sudo ufw enable ``` Проверь: ```bash sudo ufw status verbose ``` Ожидаемый вывод: ``` Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 2222/tcp LIMIT IN Anywhere # SSH rate limit 2222/tcp (v6) LIMIT IN Anywhere (v6) # SSH rate limit ``` ### Открытие дополнительных портов (опционально) ```bash # HTTP/HTTPS sudo ufw allow 80/tcp comment 'HTTP' sudo ufw allow 443/tcp comment 'HTTPS' # PostgreSQL только с конкретного IP sudo ufw allow from 192.168.1.10 to any port 5432 comment 'PostgreSQL' ``` Проверь открытые порты на хосте: ```bash ss -tulnp ``` ## Fail2ban ```bash sudo apt install -y fail2ban ``` Создай локальный конфиг: ```bash sudo nano /etc/fail2ban/jail.local ``` ```ini [DEFAULT] # Бан на 1 час bantime = 3600 # За 10 минут findtime = 600 # После 3 неудачных попыток maxretry = 3 # Не банить свои IP ignoreip = 127.0.0.1/8 ::1 [sshd] enabled = true port = 2222 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600 ``` Замени `2222` на свой SSH порт. **Особенность Ubuntu 24.04:** `systemd-journald` по умолчанию не пишет в `/var/log/auth.log`. Если файл отсутствует или пустой: ```bash ls -la /var/log/auth.log ``` Включи запись в файл: ```bash sudo nano /etc/rsyslog.d/50-default.conf ``` Убедись что строка не закомментирована: ``` auth,authpriv.* /var/log/auth.log ``` Перезапусти rsyslog: ```bash sudo systemctl restart rsyslog ``` Или используй journald backend в fail2ban - он умеет читать логи напрямую из journald без файлов: ```bash sudo nano /etc/fail2ban/jail.local ``` Добавь в секцию `[sshd]`: ```ini [sshd] enabled = true port = 2222 filter = sshd backend = systemd maxretry = 3 bantime = 3600 ``` При `backend = systemd` параметр `logpath` не нужен - fail2ban читает journald напрямую. Запусти: ```bash sudo systemctl enable fail2ban sudo systemctl start fail2ban ``` Проверь статус: ```bash sudo fail2ban-client status sudo fail2ban-client status sshd ``` ## Swap Swap в виде файла - гибче раздела: можно увеличить или уменьшить без переразбивки диска. ### Создание swap файла Проверь текущий swap: ```bash free -h swapon --show ``` Ожидаемый вывод если swap отсутствует: ``` Swap: 0B 0B 0B ``` Создай файл (пример - 2GB): ```bash sudo fallocate -l 2G /swapfile ``` Если `fallocate` не поддерживается файловой системой (например btrfs): ```bash sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress ``` Установи права: ```bash sudo chmod 600 /swapfile ``` Инициализируй и активируй: ```bash sudo mkswap /swapfile sudo swapon /swapfile ``` Проверь: ```bash free -h swapon --show ``` Ожидаемый вывод: ``` total used free shared buff/cache available Mem: 1.9Gi 860Mi 240Mi 2.5Mi 1.0Gi 1.1Gi Swap: 2.0Gi 0B 2.0Gi NAME TYPE SIZE USED PRIO /swapfile file 2G 0B -2 ``` Добавь в `/etc/fstab` для автомонтирования после перезагрузки: ```bash echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab ``` ### Настройка swappiness `swappiness` определяет агрессивность использования swap. Для production - снижаем: ```bash cat /proc/sys/vm/swappiness # по умолчанию 60 ``` Установи постоянно: ```bash echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.d/99-swap.conf sudo sysctl -p /etc/sysctl.d/99-swap.conf ``` Значение `10` - swap используется только когда RAM заполнена на 90%+. ### Изменение размера swap Нельзя перезаписать активный swap файл - ядро блокирует его пока он используется: ``` $ sudo fallocate -l 4G /swapfile fallocate: fallocate failed: Text file busy $ sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress dd: failed to open '/swapfile': Text file busy ``` Сначала отключи swap, затем меняй размер: ```bash sudo swapoff /swapfile ``` ```bash sudo fallocate -l 4G /swapfile ``` ```bash sudo mkswap /swapfile ``` ```bash sudo swapon /swapfile ``` Проверь результат: ```bash free -h ``` Ожидаемый вывод: ``` total used free shared buff/cache available Mem: 1.9Gi 872Mi 227Mi 2.5Mi 1.0Gi 1.1Gi Swap: 4.0Gi 0B 4.0Gi ``` Запись в `/etc/fstab` менять не нужно - путь тот же. ### Удаление swap ```bash sudo swapoff /swapfile ``` ```bash sudo rm /swapfile ``` Удали строку из `/etc/fstab`: ```bash sudo nano /etc/fstab # удали строку: /swapfile none swap sw 0 0 ``` ## Sysctl - защита ядра ```bash sudo nano /etc/sysctl.d/99-hardening.conf ``` ``` # Защита от SYN flood net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 2 # Игнорировать ICMP redirects (защита от MITM) net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_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 # Игнорировать source routed packets net.ipv4.conf.all.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 # Защита от IP spoofing net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # Логировать подозрительные пакеты net.ipv4.conf.all.log_martians = 1 # Защита от time-wait assassination net.ipv4.tcp_rfc1337 = 1 # Отключить IPv6 если не используешь # net.ipv6.conf.all.disable_ipv6 = 1 # net.ipv6.conf.default.disable_ipv6 = 1 ``` Примени: ```bash sudo sysctl -p /etc/sysctl.d/99-hardening.conf ``` Проверь: ```bash sudo sysctl net.ipv4.tcp_syncookies # net.ipv4.tcp_syncookies = 1 ``` ## Автообновления безопасности Ubuntu 24.04 устанавливает `unattended-upgrades` автоматически. Проверь: ```bash sudo systemctl status unattended-upgrades ``` Если не установлен: ```bash sudo apt install -y unattended-upgrades apt-listchanges sudo dpkg-reconfigure -plow unattended-upgrades ``` Настрой конфиг: ```bash sudo nano /etc/apt/apt.conf.d/50unattended-upgrades ``` Убедись что раскомментированы (или добавь): ``` Unattended-Upgrade::Mail "root"; Unattended-Upgrade::Remove-Unused-Kernel-Packages "true"; Unattended-Upgrade::Remove-Unused-Dependencies "true"; Unattended-Upgrade::Automatic-Reboot "false"; ``` `Automatic-Reboot "false"` - перезагрузку после обновления ядра делаешь вручную в удобное время. Расписание: ```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"; ``` ## Отключение ненужных сервисов Посмотри что запущено: ```bash systemctl list-units --type=service --state=running ``` Ubuntu 24.04 по умолчанию запускает больше сервисов чем Debian. Кандидаты на отключение: ```bash # Bluetooth - на сервере не нужен sudo systemctl disable --now bluetooth.service # avahi-daemon - mDNS/DNS-SD, нужен редко sudo systemctl disable --now avahi-daemon.service # ModemManager - управление модемами sudo systemctl disable --now ModemManager.service # snapd - если не используешь snap пакеты # ОСТОРОЖНО: некоторые облачные образы зависят от snap sudo systemctl disable --now snapd.service snapd.socket ``` **По поводу snapd:** если сервер облачный и ты не знаешь точно что использует snap - не отключай. Проверь сначала: ```bash snap list ``` Если кроме `core` и `snapd` ничего нет - можно отключать. Проверь открытые порты: ```bash ss -tulnp ``` ## Логи и ротация ### Ограничение journald ```bash sudo nano /etc/systemd/journald.conf ``` ``` SystemMaxUse=500M SystemMaxFileSize=100M MaxRetentionSec=1month ``` Перезапусти: ```bash sudo systemctl restart systemd-journald ``` Проверь размер: ```bash sudo journalctl --disk-usage ``` ### Ротация rsyslog ```bash sudo nano /etc/logrotate.d/rsyslog ``` ``` /var/log/syslog /var/log/mail.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/cron.log { su root syslog rotate 7 daily missingok notifempty compress delaycompress sharedscripts postrotate /usr/lib/rsyslog/rsyslog-rotate endscript } ``` Директива `su root syslog` обязательна - без неё logrotate отказывается ротировать файлы в `/var/log`, потому что директория доступна на запись группе `syslog`, что считается небезопасным. Проверь конфиг dry run: ```bash sudo logrotate -d /etc/logrotate.d/rsyslog ``` Ожидаемый вывод: ``` ... rotating pattern: /var/log/syslog /var/log/mail.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/cron.log after 1 days (7 rotations) empty log files are not rotated, old logs are removed switching euid from 0 to 0 and egid from 0 to 104 (pid 76669) ... ``` ## Мониторинг диска ### Определение имени диска Имя диска зависит от окружения - не хардкодь `/dev/sda`: ```bash lsblk ``` Ожидаемый вывод (ориентировочный) на физическом сервере: ``` NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 500G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 499G 0 part / ``` Ожидаемый вывод на виртуальной машине (KVM/Proxmox): ``` NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS vda 253:0 0 30G 0 disk ├─vda1 253:1 0 1M 0 part └─vda2 253:2 0 30G 0 part / ``` `vda` - virtio-диск на гипервизоре. `sda` - физический диск или SCSI-эмуляция. ### Физический сервер - SMART На физическом сервере SMART даёт ранние признаки деградации диска: ```bash sudo smartctl -H /dev/sda ``` Ожидаемый вывод: ``` SMART overall-health self-assessment test result: PASSED ``` Детали: ```bash sudo smartctl -a /dev/sda ``` Обращай внимание на три атрибута - если ненулевые, диск проблемный: - `Reallocated_Sector_Ct` - переназначенные секторы - `Pending_Sector_Count` - ожидающие переназначения - `Offline_Uncorrectable` - неисправимые ошибки ### Виртуальная машина - SMART недоступен На VM `smartctl` не работает - гипервизор не пробрасывает SMART данные гостю: ``` /dev/vda: Unable to detect device type Please specify device type with the -d option. ``` Это нормально. SMART мониторинг на виртуальных дисках делается на уровне гипервизора - в Proxmox через Datacenter → Node → Disks. Внутри VM контролируй заполнение и I/O: ```bash df -h ``` ```bash iostat -x 1 3 ``` `iostat` входит в пакет `sysstat`: ```bash sudo apt install -y sysstat ``` Обращай внимание на `%util` в выводе `iostat` - значения близкие к 100% означают что диск перегружен. ## Бэкап конфигов Скрипт архивирует `/etc/`, SSH ключи и список установленных пакетов. ```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 find "$BACKUP_DIR" -name "config_backup_*.tar.gz" -mtime +30 -delete echo "Backup: $BACKUP_FILE" ls -lh "$BACKUP_FILE" ``` Установи права и запусти первый раз: ```bash sudo chmod +x /root/backup-configs.sh sudo /root/backup-configs.sh ``` Ожидаемый вывод: ```bash Backup: /root/backups/config_backup_20260707_145620.tar.gz -rw-r--r-- 1 root root 660K Jul 7 14:56 /root/backups/config_backup_ДАТА.tar.gz ``` Автоматизация через cron (каждое воскресенье в 3:00): ```bash sudo crontab -e ``` ``` 0 3 * * 0 /root/backup-configs.sh >> /var/log/backup-configs.log 2>&1 ``` **Важно:** архив лежит на том же диске что и система. Это защита от случайных изменений конфигов, не от отказа диска. Копируй архивы на внешний сервер или S3-совместимое хранилище. ### Восстановление конфигов Восстановить `/etc/` и SSH ключи из архива: ```bash sudo tar -xzf /root/backups/config_backup_ДАТА.tar.gz -C / ``` Восстановить список пакетов: ```bash sudo dpkg --set-selections < /root/installed-packages.txt ``` ```bash sudo apt-get dselect-upgrade ``` ### Финальная проверка ```bash # Открытые порты ss -tulnp # Статус firewall sudo ufw status verbose # Статус fail2ban sudo fail2ban-client status sshd # Состояние диска sudo smartctl -H /dev/sda # Swap free -h ``` ## Что дальше Сервер готов к установке приложений. - Docker хост - следующая статья серии - Nginx/Traefik - reverse proxy поверх этой базы - PostgreSQL/MySQL - базы данных - Postfix/Dovecot - почтовый сервер **Стек этой статьи:** Ubuntu 24.04 LTS (Noble Numbat) · UFW · Fail2ban · OpenSSH · unattended-upgrades · systemd · systemd-resolved · smartmontools ## Послесловие: пока мы настраивали - они уже ломились Пока эта статья писалась и проверялась на реальном сервере, снаружи шла своя работа. Проверяем: ```bash sudo fail2ban-client status sshd ``` ``` Status for the jail: sshd |- Filter | |- Currently failed: 4 | |- Total failed: 22863 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 3 |- Total banned: 18 `- Banned IP list: 167.99.72.161 104.236.83.40 47.77.182.54 ``` 22 863 неудачных попытки. 18 забаненных IP. 3 в бане прямо сейчас. Сколько времени сервер вообще стоит в интернете: ```bash uptime -p ``` ``` up 4 days, 3 hours, 21 minutes ``` 4 дня. ~235 попыток в час, почти 4 в минуту - непрерывно, круглосуточно. Посмотрим на что они надеялись: ```bash sudo grep "Invalid user" /var/log/auth.log | grep -oP "Invalid user \K\S+" | sort | uniq -c | sort -rn | head -10 ``` ``` 124 ubuntu 101 user 91 test 75 debian 59 ftpuser 55 postgres 50 oracle 34 git 34 deploy 25 deployer ``` `ubuntu` - 124 попытки, классика для облачных серверов. `debian` - 75, логично для нашего дистрибутива. `ftpuser` - 59, кто-то ищет забытый FTP из 2005 года. `postgres`, `oracle` - надеялись что база данных торчит наружу с дефолтным пользователем. `git`, `deploy`, `deployer` - охота на CI/CD пайплайны с предсказуемыми именами. Все эти попытки получили одинаковый ответ: порт 22 закрыт, нестандартный порт принимает только ключи, после трёх ошибок - бан на час. Это не повод расслабиться. Это повод убедиться что всё настроено именно так, как описано выше - потому что 22 863 попытки за 4 дня на одном небольшом сервере это не целевая атака, это обычный фоновый шум интернета. Целевая атака выглядит иначе.