Базовые настройки безопасности

Базовые настройки безопасности Linux‑сервера

Данная инструкция описывает базовую настройку безопасности продакшн‑сервера на Ubuntu 22.04+.

Цель — закрыть типовые векторы атак: брутфорс SSH, эскалация привилегий, подмена бинарников, горизонтальное перемещение между проектами.


0. Интерактивный скрипт

Репозиторий — https://github.com/1vank1n/ubuntu-init

Использование:

curl -fsSL https://github.com/1vank1n/ubuntu-init/releases/latest/download/ubuntu-init.sh | sudo bash

1. SSH — рекомендуемая конфигурация

SSH — главный вектор атак на сервер. Грамотная настройка критически снижает риски.

1.1. Выключить парольную авторизацию

Открываем:

sudo nano /etc/ssh/sshd_config

Выставляем:

PasswordAuthentication no PermitRootLogin no PermitEmptyPasswords no KbdInteractiveAuthentication no UsePAM yes

Почему:

  • спасает от брутфорса;

  • исключает доступ через украденные пароли;

  • принуждает использовать только ключи;

  • root по SSH запрещён полностью (не prohibit-password, а no — исключает любой вектор, включая возможные уязвимости в обработке ключей).

Перезапуск:

sudo systemctl restart sshd

Важно: перед перезапуском убедитесь, что ваш ключ скопирован и вы можете войти под admin. Иначе потеряете доступ к серверу.

1.2. Изменить стандартный порт (опционально)

Port 2222

Это не мера безопасности, а способ уменьшить шум от ботнетов в логах. Не заменяет fail2ban и ключи.

1.3. Разрешить SSH только именным пользователям

AllowUsers admin

Если администраторов несколько — каждый получает свой именной аккаунт:

AllowUsers ivan petr

Это даёт аудит: в логах видно, кто именно зашёл и что сделал. Один общий admin на всех — хуже, потому что действия невозможно привязать к конкретному человеку.

Принцип: AllowUsers — белый список. Все, кого в нём нет, не могут подключиться по SSH. Это надёжнее, чем DenyUsers, где легко забыть добавить нового сервисного пользователя.

1.4. Использование SSH‑ключей

На локальной машине:

ssh-keygen -t ed25519

Копируем ключ:

ssh-copy-id -p 2222 admin@SERVER

Или вручную — добавляем публичный ключ в ~/.ssh/authorized_keys на сервере.

Права:

chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys

2. Fail2ban — защита от перебора

Даже с отключёнными паролями fail2ban полезен: он банит IP, которые генерируют мусорные подключения, снижая нагрузку и шум в логах.

sudo apt install fail2ban

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

sudo nano /etc/fail2ban/jail.local
[sshd] enabled = true port = 2222 filter = sshd logpath = /var/log/auth.log bantime = 1h maxretry = 3

Обратите внимание: если вы сменили SSH‑порт на 2222, укажите его в port. Иначе fail2ban будет следить за портом 22, а бан применять через iptables тоже на 22 — и реальные атаки на 2222 пройдут мимо.

Активируем:

sudo systemctl enable fail2ban sudo systemctl start fail2ban

Проверяем:

sudo fail2ban-client status sshd

3. Разделение пользователей

Ключевой принцип: кто входит по SSH — не запускает сервисы. Кто запускает сервисы — не входит по SSH.

3.1. Именные администраторы

Каждый администратор — отдельный пользователь с sudo:

sudo adduser ivan sudo usermod -aG sudo ivan

Эти пользователи:

  • входят по SSH по ключу;

  • имеют sudo для системных задач;

  • не запускают Docker и не владеют проектами.

3.2. Сервисные пользователи проектов

Каждый проект — отдельный пользователь:

sudo adduser --disabled-password --gecos "" superbot sudo usermod -s /usr/sbin/nologin superbot

Эти пользователи:

  • нет пароля;

  • нет SSH;

  • нет sudo;

  • запускают только свой rootless Docker‑демон (см. статью про Docker).

3.3. Почему это важно

Если один пользователь одновременно входит по SSH, имеет sudo и запускает Docker — компрометация SSH‑ключа сразу даёт атакующему всё. Разделение ролей ограничивает ущерб от каждого отдельного вектора.


4. Защита /tmp и /var/tmp от исполнения

Добавить в /etc/fstab:

tmpfs /tmp tmpfs defaults,noexec,nosuid 0 0 tmpfs /var/tmp tmpfs defaults,noexec,nosuid 0 0

Применить:

sudo mount -o remount /tmp sudo mount -o remount /var/tmp

Блокирует выполнение бинарников, скачанных в /tmp — типичная техника malware после первоначального проникновения.


5. Firewall (UFW)

sudo apt install ufw sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 2222/tcp # SSH sudo ufw allow 80/tcp # HTTP (если нужен) sudo ufw allow 443/tcp # HTTPS (если нужен) sudo ufw enable

Правило: открывайте только те порты, которые реально используются. Каждый открытый порт — поверхность для атаки.


6. Автоматические обновления безопасности

Уязвимости в системных пакетах (ядро, OpenSSH, PolicyKit, sudo) — один из основных векторов эскалации привилегий. На продакшн‑сервере критические обновления должны устанавливаться автоматически.

sudo apt install unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades

Проверяем, что в /etc/apt/apt.conf.d/50unattended-upgrades включены security‑репозитории:

Unattended-Upgrade::Allowed-Origins { "${distro_id}:${distro_codename}-security"; };

Для ручного контроля (в дополнение к автообновлениям):

sudo apt update sudo apt upgrade

7. Рекомендуемый рабочий флоу администратора

  1. Вход на сервер по ключу:

ssh -p 2222 ivan@server
  1. Для работы с проектом — переключение в сервисного пользователя:

sudo -u superbot -i bash cd ~/project docker compose up -d docker compose logs -f exit

Используем sudo -u superbot -i bash, а не sudo -iu superbot, потому что shell сервисного пользователя — /usr/sbin/nologin.

  1. Для системных задач — поднимаем root:

sudo -i

Итог

Мера

Что закрывает

SSH по ключам, без паролей

Брутфорс, украденные пароли

AllowUsers + именные аккаунты

Несанкционированный вход, аудит действий

Fail2ban

Мусорные подключения, перебор

Разделение пользователей

Горизонтальное перемещение, эскалация

noexec на /tmp

Запуск малвари после проникновения

UFW

Лишние открытые порты

Автообновления

Известные уязвимости в системных пакетах