Создание своего SSH-бастион-сервера
Зачем нужен бастион и где он живёт
Бастион — единственная точка входа в приватный сегмент сети. Вместо того чтобы открывать SSH на каждом сервере из интернета, вы пускаете трафик через один хост, на котором настроена жёсткая политика доступа. Типичная схема: интернет → bastion (публичный IP) → внутренние серверы (только private subnet, SSH слушает на 127.0.0.1 или private interface).
Бастион живёт в демилитаризованной зоне (DMZ) или публичном подсети провайдера. Внутренние машины не имеют маршрута в интернет через бастион — обратный трафик идёт по инициированным соединениям. Это базовая модель, которую можно развернуть на любом VPS за 15 минут.
Выбор ОС и базовая установка
Бастион не нужен тяжёлый. Debian, Ubuntu Server или AlmaLinux — всё подойдёт. Я обычно беру минимальную установку Ubuntu 22.04 LTS и довожу до рабочего состояния руками.
Не ставьте на бастион GUI, базы данных и прочие сервисы. Чем меньше поверхность атаки, тем лучше.
Создайте непривилегированного пользователя для работы:
Настройка SSH: ключи, порт, запрет паролей
Генерируйте ключ на рабочей машине, если его ещё нет:
На бастионе правьте /etc/ssh/sshd_config:
Перед перезагрузкой SSH убедитесь, что ключ добавлен и работает. Иначе потеряете доступ к серверу.
Проверьте конфиг и перезапустите:
Таблица ключей sshd_config и что они делают:
| Параметр | Значение | Назначение |
|---|---|---|
Port | 22220 | Нестандартный порт, снижает шум в логах |
PermitRootLogin | no | Запрещает прямой вход под root |
PasswordAuthentication | no | Разрешает только ключи |
MaxAuthTries | 3 | Ограничивает попытки аутентификации |
AllowUsers | deploy | Белый список пользователей |
Файрвол и ограничение доступа
UFW — простой способ закрыть всё лишнее:
Если бастион нужен только для вашего IP, ограничьте ещё жёстче:
Если IP динамический, используйте VPN вместо открытия порта. Открывать SSH в интернет без ограничений по источнику — плохая практика.
Для внутреннего трафика добавьте правило на бастионе, чтобы он мог маршрутизировать пакеты:
В /etc/sysctl.conf пропишите net.ipv4.ip_forward = 1, чтобы правило сохранилось после перезагрузки.
Fail2ban и защита от брутфорса
Установите и настройте Fail2ban для защиты от перебора:
В /etc/fail2ban/jail.local:
Перезапустите:
Логирование и аудит
Бастион должен логировать всё. В Debian/Ubuntu логи SSH идут в /var/log/auth.log. Для централизованного сбора настройте rsyslog на отправку на отдельный SIEM или хотя бы на второй сервер:
Для аудита действий пользователей подключите auditd:
Просмотр событий:
Логи на бастионе — первая цель атакующего. Настройте удалённую отправку как можно раньше, иначе при компрометации вы потеряете историю инцидента.
Проброс портов и туннели через бастион
Основная задача бастиона — дать доступ к внутренним машинам без открытия им портов. Три способа:
1. Проброс порта через SSH-туннель:
Теперь локальный порт 5432 на вашей машине проксируется к PostgreSQL на 10.0.1.5.
2. SOCKS-прокси для доступа ко всем внутренним хостам:
Настройте браузер или proxychains на 127.0.0.1:1080.
3. Reverse tunnel для доступа к вашей локальной машине из сети бастиона:
Это позволяет обратиться к локальному сервису на порту 9090 бастиона.
Для постоянных туннелей используйте autossh или настройте ~/.ssh/config:
Теперь достаточно ssh bastion для подключения, а туннели строятся одной командой.
Для командной работы команды хранят ключи в 1Password или HashiCorp Vault, а доступ к бастиону выдаётся через временные сессии с истекающими токенами. Это снижает риск компрометации ключа.