Базовые настройки безопасности
Базовые настройки безопасности 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. Рекомендуемый рабочий флоу администратора
Вход на сервер по ключу:
ssh -p 2222 ivan@server
Для работы с проектом — переключение в сервисного пользователя:
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.
Для системных задач — поднимаем root:
sudo -i