Оглавление
- Что такое bastion host и jump server
- Почему прямой SSH на каждый сервер - слабое место
- Как меняется схема доступа
- Что именно дает bastion host
- Как выглядит базовая архитектура
- Настраиваем firewall: закрываем SSH снаружи
- Ужесточаем SSH на bastion host
- Подключение через ProxyJump
- Нужен ли отдельный пользователь на bastion
- SSH-ключи, сертификаты и срок жизни доступа
- Двухфакторная аутентификация на bastion
- Аудит подключений: что нужно записывать
- Запись команд: полезно, но не без нюансов
- Ограничение прав: bastion не должен быть “всемогущим”
- Защита самого bastion host
- Agent forwarding: удобно, но осторожно
- Один bastion или несколько
- Типовая настройка для VPS или выделенных серверов
- Что делать с root-доступом
- Мониторинг и оповещения
- Частые ошибки при внедрении jump server
- Мини-чек-лист внедрения
- Когда bastion host особенно нужен
- Bastion host не заменяет остальные меры безопасности
- Практичный итог
SSH часто становится той самой дверью, через которую администратор быстро чинит сервер, обновляет сервис или проверяет логи. Проблема в том, что эту же дверь постоянно дергают боты, сканеры и злоумышленники. Если SSH открыт наружу на каждом сервере, инфраструктура превращается в коридор с десятками входов, где достаточно забыть один слабый замок. Гораздо спокойнее, когда вход один, он хорошо освещен, охраняется и записывает, кто через него прошел. Такую роль выполняет bastion host, он же jump server. Это отдельный контролируемый узел, через который администраторы подключаются к внутренним серверам. Внешний SSH закрывается на всех рабочих машинах, доступ остается только через один защищенный шлюз, а команда получает понятную точку контроля, аудита и управления правами.
Что такое bastion host и jump server
Bastion host - это сервер-посредник, который стоит на границе между внешней сетью и закрытым внутренним контуром. Он принимает SSH-подключения от администраторов, после чего через него выполняется переход на нужные серверы: web, database, backend, monitoring, storage и другие узлы. Jump server - по сути то же самое в контексте SSH. Его задача - быть “прыжковой площадкой” между рабочей станцией администратора и сервером, который напрямую из интернета недоступен. Представьте офисное здание. Можно сделать отдельный вход в каждую комнату с улицы. Но тогда каждую дверь придется охранять, обслуживать, проверять и чинить. Логичнее сделать один главный вход с пропусками, видеонаблюдением и журналом посещений. Комнаты внутри здания не исчезают, просто попасть в них можно только через контролируемую точку. С серверами работает тот же принцип.
Много входов vs один КПП
Bastion — единая контролируемая точка SSH-доступа.
Почему прямой SSH на каждый сервер - слабое место
Открытый SSH сам по себе не означает взлом. Но он резко увеличивает поверхность атаки. Каждый сервер с доступным портом SSH становится отдельной целью для сканирования, перебора паролей, попыток использовать старые ключи, уязвимые настройки или человеческие ошибки. Типичная ситуация выглядит так: компания поднимает несколько VPS, пару выделенных серверов, тестовый стенд, staging, базу данных и мониторинг. На старте все удобно - админы заходят куда нужно напрямую. Через год серверов уже двадцать, доступы раздавались разным подрядчикам, где-то остался старый пользователь, где-то парольная авторизация, где-то забыли обновить правила firewall. Проблема не в одном сервере. Проблема в количестве точек входа. Bastion host помогает сократить этот хаос. Вместо двадцати внешних SSH-точек остается одна. Это не магия и не “серебряная пуля”, но это сильное архитектурное упрощение. А в безопасности простота часто важнее красивых, но плохо поддерживаемых схем.
Поверхность атаки SSH
Каждый открытый порт 22 — отдельная цель для сканеров и перебора.
Как меняется схема доступа
Без bastion host администратор подключается так
ssh admin@web-01
ssh admin@db-01
ssh admin@cache-01
ssh admin@backup-01
Каждый сервер должен быть доступен снаружи или хотя бы из большого списка IP-адресов. На каждом сервере нужно отдельно следить за настройками SSH, ключами, пользователями, логами и блокировками.
С jump server схема становится другой
ssh admin@bastion
ssh admin@web-01
Или удобнее, через локальный SSH-конфиг: ssh web-01 При этом web-01 снаружи не виден. Он принимает SSH только от bastion host по внутренней сети. Для внешнего мира рабочий сервер словно исчезает с карты. Такой подход особенно полезен для инфраструктуры, где есть базы данных, панели администрирования, внутренние API, CI/CD-раннеры, хранилища резервных копий и служебные сервисы. Эти узлы редко должны быть доступны напрямую из интернета. Им нужен управляемый административный доступ, а не открытая дверь на весь мир.
Схема доступа
Внутренние серверы не видны снаружи — только через bastion.
Что именно дает bastion host
Главная польза - централизованный контроль. Но за этой фразой прячется несколько очень практичных вещей.
Меньше открытых портов
Если SSH открыт только на bastion host, остальные серверы можно закрыть firewall-правилами. Например, разрешить порт 22 или нестандартный SSH-порт только с внутреннего IP bastion-узла. Мини-пример: у вас есть база данных db-01. Она не должна принимать подключения откуда попало. Вы закрываете SSH снаружи, оставляете доступ только с 10.0.0.10, где находится bastion. Даже если кто-то сканирует публичный IP базы, SSH там не отвечает. Это снижает шум, уменьшает количество атак и делает инфраструктуру понятнее.
Единая точка аудита
Когда все администраторы проходят через один узел, проще отвечать на вопросы
• Кто подключался вчера ночью?
• С какого IP был вход?
• На какой сервер пошел пользователь?
• Какие команды выполнялись?
• Почему в 03:14 был перезапущен сервис?
Без bastion host такие ответы приходится собирать по разным серверам. Где-то лог сохранился, где-то ротировался, где-то время не синхронизировано, где-то пользователь заходил под общим аккаунтом. В итоге расследование похоже на сбор пазла, в котором половина деталей лежит под диваном. С bastion host картина становится чище. Не идеальной автоматически, но гораздо более управляемой.
Проще отозвать доступ
Сотрудник ушел из команды. Подрядчик завершил работу. Временный доступ больше не нужен. Если прямой SSH был открыт на десятке серверов, нужно проверить каждый. Удалить ключи, закрыть пользователя, проверить группы, убедиться, что не осталось обходного пути. Если доступ идет через bastion host, первая точка отзыва - именно он. Отключили пользователя на bastion, удалили ключ или сертификат, заблокировали MFA - и человек больше не проходит в инфраструктуру стандартным путем. Да, внутренние серверы тоже нужно содержать в порядке. Но операционная нагрузка заметно ниже.
Удобнее внедрять строгие правила
На bastion host проще включить двухфакторную аутентификацию, ограничить вход по IP, настроить AllowUsers или AllowGroups, запретить root-login, отключить пароли, включить расширенное логирование и централизованную отправку логов. Можно сказать так: bastion host - это место, где security-политика перестает быть теорией и становится конкретной конфигурацией.
Как выглядит базовая архитектура
Простая схема может быть такой: Администратор | | SSH vBastion host / Jump server | | SSH по внутренней сети vВнутренние серверы: web, app, db, cache, backup У bastion host есть публичный IP. У внутренних серверов публичный SSH закрыт. Они могут иметь публичные IP для своих сервисов, например web-порт 443, но административный SSH должен быть доступен только из доверенного сегмента. В идеале рабочие серверы находятся в private network. Тогда bastion подключается к ним по приватным адресам: 10.x.x.x, 172.16.x.x или другому внутреннему диапазону. Если используется несколько площадок или дата-центров, можно связать их через VPN или приватные каналы, а bastion сделать частью этой схемы. Для небольшой команды достаточно одного bastion host. Для продакшена с высокими требованиями лучше иметь пару: основной и резервный. Иначе bastion превращается в единую точку отказа. В безопасности важно не только закрыть вход, но и не запереть самих себя снаружи.
Базовая архитектура
Публичный IP у bastion; SSH внутренних узлов — только из private network.
Настраиваем firewall: закрываем SSH снаружи
Первый практический шаг - запретить прямой SSH на рабочих серверах. Допустим, bastion host имеет внутренний IP: 10.0.0.10 А сервер web-01 находится по адресу: 10.0.0.21 На web-01 правило должно разрешать SSH только с bastion: sudo ufw allow from 10.0.0.10 to any port 22 proto tcpsudo ufw deny 22/tcpsudo ufw enable Если используется iptables или nftables, логика та же: разрешаем входящий SSH от bastion, запрещаем остальное. Перед применением таких правил важно держать открытую активную SSH-сессию и проверить новый доступ из второго окна. Это простое правило спасает от классической ошибки: администратор применил firewall, потерял доступ и теперь пишет в поддержку с просьбой подключить KVM или rescue mode.
Хороший порядок действий
Поднять bastion host. Проверить, что с него есть доступ к внутреннему серверу. Добавить firewall-правила на внутреннем сервере. Проверить новое подключение через bastion. Только потом закрывать прямой SSH окончательно. Без спешки. В инфраструктуре спешка часто стоит дороже, чем пять минут проверки.
Закрытие SSH снаружи
Порядок: bastion → проверка → UFW на внутренних → закрыть прямой SSH.
Ужесточаем SSH на bastion host
Bastion host должен быть самым аккуратно настроенным сервером в этой цепочке. Если его скомпрометируют, злоумышленник окажется у входа во внутренний контур. Поэтому к нему применяются более строгие правила, чем к обычному серверу. Базовый набор настроек в /etc/ssh/sshd_config может выглядеть так: PermitRootLogin noPasswordAuthentication noPubkeyAuthentication yesAllowGroups ssh-adminsMaxAuthTries 3LoginGraceTime 30X11Forwarding noAllowTcpForwarding noAllowAgentForwarding noClientAliveInterval 300ClientAliveCountMax 2LogLevel VERBOSE
Что здесь важно
PermitRootLogin no запрещает прямой вход под root. Администратор заходит под своим пользователем, а привилегии получает через sudo. PasswordAuthentication no отключает парольный вход. Пароли слишком часто становятся слабым звеном: их повторно используют, утаскивают из менеджеров, случайно отправляют в чат или подбирают автоматикой. AllowGroups ssh-admins ограничивает вход только участниками нужной группы. Это удобнее, чем поддерживать длинный список пользователей в конфиге. MaxAuthTries 3 и LoginGraceTime 30 уменьшают окно для перебора и подвисших попыток авторизации. LogLevel VERBOSE помогает видеть больше полезных деталей в логах, включая информацию о ключах, которые использовались при аутентификации. Отдельный вопрос - forwarding. На bastion host часто возникает соблазн разрешить все: agent forwarding, TCP forwarding, X11 forwarding. Удобно? Да. Безопасно? Не всегда. Если jump server используется только как точка перехода, лучше запретить лишнее и разрешать исключения осознанно. Например, для конкретной группы или конкретного сценария.
Подключение через ProxyJump
Для администратора схема через bastion не должна превращаться в мучение. Если каждый раз вручную заходить на bastion, а потом оттуда на нужный сервер, люди быстро начнут искать обходные пути. OpenSSH решает это через ProxyJump. В файле ~/.ssh/config на рабочей станции можно указать: Host bastion HostName bastion.example.com User admin IdentityFile ~/.ssh/id_ed25519_bastionHost web-01 HostName 10.0.0.21 User admin IdentityFile ~/.ssh/id_ed25519_internal ProxyJump bastionHost db-01 HostName 10.0.0.31 User admin IdentityFile ~/.ssh/id_ed25519_internal ProxyJump bastion После этого подключение выглядит просто: ssh web-01 Снаружи администратор видит удобное имя web-01, а SSH-клиент сам строит маршрут через bastion. Это тот случай, когда безопасность не спорит с удобством, а помогает сделать нормальный рабочий процесс. Для старых клиентов можно использовать ProxyCommand, но в большинстве современных случаев ProxyJump читается проще и поддерживается стандартным OpenSSH.
Нужен ли отдельный пользователь на bastion
Один из частых вопросов: можно ли всем администраторам дать один общий пользователь, например deploy или admin? Технически можно. Практически - плохая идея. Общий пользователь убивает персональную ответственность. В логах видно, что заходил admin, но кто именно это был - Павел, Игорь, подрядчик или бывший сотрудник с забытым ключом - уже вопрос к гадалке. Лучше создавать персональные учетные записи:
• pavel
• igor
• anna
• contractor_smirnov
Каждый пользователь получает собственный ключ, собственные права и собственный след в логах. Если доступ нужно закрыть, отключается конкретный пользователь, а не общий аккаунт, которым пользуется половина команды. Для командной работы это чуть больше дисциплины на старте, зато намного меньше боли во время инцидента.
SSH-ключи, сертификаты и срок жизни доступа
Обычные SSH-ключи работают хорошо, если ими аккуратно управлять. Но в реальной жизни ключи живут годами, копируются между ноутбуками, остаются у подрядчиков и редко ротируются.
Минимальный порядок
• ключи должны быть персональными
• приватные ключи должны быть защищены passphrase
• старые ключи нужно удалять
• доступы нужно регулярно пересматривать
• ключи подрядчиков должны иметь срок действия на уровне процесса, даже если сам OpenSSH-ключ бессрочный.
Более зрелый вариант - SSH-сертификаты. В такой модели сервер доверяет не каждому отдельному публичному ключу, а центру сертификации. Пользователь получает временный сертификат, например на 8 часов, и после окончания срока он больше не работает. Это особенно удобно для компаний, где администраторы меняются, подрядчики подключаются на короткие проекты, а доступ нужно выдавать не “навсегда”, а под задачу. Можно сравнить обычный ключ с металлическим ключом от двери. Потерял - надо менять замок или надеяться, что никто не воспользуется. SSH-сертификат ближе к пропуску в офис, который сам перестает работать вечером.
Двухфакторная аутентификация на bastion
Если bastion host - главная дверь, одного ключа часто недостаточно. Хорошая практика - добавить второй фактор: TOTP, аппаратный ключ, SSO/MFA через специализированное решение или PAM-интеграцию. Сценарий простой: даже если приватный SSH-ключ утек, злоумышленнику все равно нужен второй фактор. Это не отменяет расследование, но дает время и снижает риск мгновенного входа.
Особенно полезна MFA для
• доступа из внешних сетей
• подрядчиков
• привилегированных администраторов
• инфраструктуры с персональными данными
• production-среды
серверов, где хранятся бэкапы и секреты. Главное - заранее продумать аварийный доступ. MFA может сломаться, телефон может потеряться, провайдер SSO может быть недоступен. У команды должен быть документированный break-glass-процесс: кто может открыть аварийный доступ, где хранится резервный ключ, как фиксируется такой вход и кто потом проверяет логи.
Аудит подключений: что нужно записывать
Bastion host без аудита - это просто удобный переходник. Настоящая ценность появляется, когда он отвечает на вопросы после инцидента или спорной ситуации.
Минимально стоит собирать
• успешные и неуспешные попытки входа
• имя пользователя
• исходный IP-адрес
• время подключения и отключения
• использованный SSH-ключ или сертификат
• целевой сервер
• команды с повышенными привилегиями через sudo
• изменения в системных файлах
• попытки запрещенных действий
• события firewall и блокировок.
На Linux часть этой информации уже попадает в auth.log, secure или journalctl, в зависимости от дистрибутива. Но хранить все только локально на bastion host рискованно. Если атакующий получит root-доступ, он может попытаться почистить следы. Поэтому логи лучше отправлять наружу: на отдельный syslog-сервер, в SIEM, в систему централизованного логирования или хотя бы на защищенный удаленный хост с ограниченными правами записи. Хороший принцип: bastion пишет логи туда, где сам не может их незаметно удалить.
Запись команд: полезно, но не без нюансов
Многим хочется видеть не только факт входа, но и команды администратора. Это логично: одно дело знать, что пользователь был на сервере, другое - понимать, что он делал.
Есть несколько уровней
Простой уровень - логировать команды через shell history. Это удобно, но ненадежно. Историю можно отключить, изменить, не записать при аварийном завершении сессии.
Средний уровень - логировать sudo. Это уже лучше, потому что важные административные действия часто идут через повышение привилегий. Можно видеть, кто запускал systemctl restart nginx, кто редактировал конфиг, кто менял права.
Более строгий уровень - использовать auditd, session recording, tlog, sudoreplay или специализированные PAM/PAM-совместимые решения. Они позволяют записывать сессии подробнее, иногда вплоть до воспроизведения терминала.
Но здесь важно не перегнуть. Запись терминала может захватывать секреты: токены, пароли, приватные данные, содержимое конфигов. Поэтому перед включением session recording нужно решить, кто имеет доступ к записям, как долго они хранятся, как защищаются и что считается чувствительной информацией. Аудит нужен не для тотального недоверия к команде. Он нужен, чтобы в критический момент быстро понять, что произошло, и не строить расследование на догадках.
Ограничение прав: bastion не должен быть “всемогущим”
Распространенная ошибка - поставить bastion host, а потом дать с него полный доступ ко всем серверам всем администраторам. Вроде стало безопаснее, но на практике просто появился один удобный коридор без дверей внутри. Лучше разделять доступ по ролям.
Например
• DevOps-инженеры имеют доступ к web, app, CI/CD и monitoring
• DBA имеют доступ к database-серверам
• разработчики могут заходить только на staging
• подрядчики видят только серверы своего проекта
• доступ к backup-серверу есть у ограниченного числа людей.
На внутренних серверах это можно реализовать через группы, AllowUsers, AllowGroups, sudoers и отдельные ключи. На bastion можно дополнительно ограничить, кто куда имеет право подключаться, особенно если используется обертка через ForceCommand или специализированные access gateway-решения. Принцип простой: человек должен иметь доступ только туда, где ему реально нужно работать. Не “на всякий случай”, не “потом разберемся”, не “пусть будет”. Лишний доступ всегда превращается в лишний риск.
Защита самого bastion host
Bastion host должен быть минималистичным. На нем не стоит держать сайт, базу данных, тестовые скрипты, Docker-контейнеры, панели управления и случайные утилиты “для удобства”. Чем меньше сервисов, тем меньше потенциальных дыр.
Хороший bastion host
регулярно обновляется; имеет минимальный набор пакетов; не хранит лишние секреты; не используется как рабочая машина; защищен firewall; подключен к мониторингу; отправляет логи на внешний сервер; имеет резервный доступ через out-of-band или rescue-инструменты; не принимает подключения от всего интернета, если можно ограничить IP. Если у команды есть фиксированные офисные IP или VPN, вход на bastion лучше разрешить только оттуда. Если администраторы работают из разных мест, можно использовать корпоративный VPN, Zero Trust-доступ или хотя бы аккуратно настроенные allowlist-правила. И еще важный момент: на bastion не должны лежать приватные ключи от всех внутренних серверов без защиты. Иначе при компрометации bastion злоумышленник получает готовую связку ключей от всей инфраструктуры.
Agent forwarding: удобно, но осторожно
SSH agent forwarding часто используют, чтобы не копировать приватные ключи на bastion. Администратор подключается к bastion, а затем идет дальше на внутренний сервер, используя агент со своей рабочей станции. Звучит хорошо. Но есть нюанс: если bastion скомпрометирован, атакующий может попытаться использовать доступный agent socket для подписи операций, пока сессия активна. Приватный ключ он не получит напрямую, но сможет воспользоваться агентом в рамках текущего окна. Поэтому agent forwarding лучше не включать по умолчанию для всех. Более безопасные варианты: использовать ProxyJump, чтобы ключ применялся с локальной машины без интерактивной работы на bastion; применять короткоживущие SSH-сертификаты; ограничивать forwarding только нужным пользователям и сценариям; использовать аппаратные ключи с подтверждением операции; не держать активные сессии открытыми без необходимости. Здесь нет универсального ответа. Но есть хороший вопрос: “Что произойдет, если bastion прямо сейчас уже скомпрометирован?” Если схема все еще выглядит приемлемо, вы на верном пути.
Один bastion или несколько
Для небольшой инфраструктуры один bastion host часто достаточен. Например, команда из трех администраторов, десять серверов, одна площадка. Тут важнее правильно закрыть прямой SSH и настроить логирование, чем строить сложную схему.
Для более серьезной инфраструктуры стоит подумать о нескольких bastion-узлах
• отдельный bastion для production
• отдельный bastion для staging/dev
• резервный bastion на случай аварии
• региональные bastion-узлы для разных дата-центров
отдельный доступ для подрядчиков. Разделение помогает ограничить последствия ошибки. Если подрядчик работает со staging, ему не нужен даже теоретический маршрут в production. Если один регион недоступен, второй bastion может сохранить административный доступ к другой части инфраструктуры. Главное - не плодить хаос. Несколько bastion-узлов должны быть описаны, одинаково управляться и логироваться в одном стиле. Иначе вы просто замените хаос прямого SSH на хаос jump server-ов.
Типовая настройка для VPS или выделенных серверов
Допустим, у компании есть: bastion-01 - публичный IP, внутренний IP 10.0.0.10web-01 - внутренний IP 10.0.0.21app-01 - внутренний IP 10.0.0.22db-01 - внутренний IP 10.0.0.31backup-01 - внутренний IP 10.0.0.41 На bastion открываем SSH только для доверенных источников: sudo ufw default deny incomingsudo ufw default allow outgoingsudo ufw allow from 203.0.113.10 to any port 22 proto tcpsudo ufw allow from 198.51.100.0/24 to any port 22 proto tcpsudo ufw enable На внутренних серверах разрешаем SSH только от bastion: sudo ufw default deny incomingsudo ufw allow from 10.0.0.10 to any port 22 proto tcpsudo ufw allow 80/tcpsudo ufw allow 443/tcpsudo ufw enable Для базы данных публичные порты обычно вообще не нужны: sudo ufw default deny incomingsudo ufw allow from 10.0.0.10 to any port 22 proto tcpsudo ufw allow from 10.0.0.22 to any port 5432 proto tcpsudo ufw enable Здесь app-01 может подключаться к PostgreSQL на db-01, а SSH доступен только через bastion. Это уже намного чище, чем база с открытым SSH и database-портом на весь интернет.
VPS / dedicated: типовая схема
10.0.0.10 bastion → внутренние web, app, db, backup.
Что делать с root-доступом
Root-доступ напрямую лучше отключать. Это одно из самых простых и эффективных правил SSH-гигиены.
Правильнее сделать так
Создать персонального пользователя. Добавить его в нужную группу. Настроить sudo. Включить логирование sudo. Запретить прямой вход под root. Пример: sudo adduser pavelsudo usermod -aG sudo pavel В /etc/ssh/sshd_config: PermitRootLogin noPasswordAuthentication no После изменений: sudo sshd -tsudo systemctl reload ssh Команда sshd -t проверяет конфигурацию перед перезагрузкой сервиса. Это маленькая привычка, которая экономит много нервов. Ошибка в SSH-конфиге на удаленном сервере - неприятный жанр приключений.
Мониторинг и оповещения
Bastion host должен быть под наблюдением. Если на него пошел всплеск неуспешных попыток входа, это важно увидеть быстро. Если кто-то подключился ночью с неизвестного IP, это тоже сигнал. Если резко вырос outbound-трафик или появились странные процессы, это уже повод для расследования.
Минимальный набор мониторинга
• доступность bastion
• CPU, RAM, disk
• сетевой трафик
• количество SSH-логинов
• неуспешные попытки входа
• изменения в /etc/ssh/sshd_config
• изменения в sudoers
• новые пользователи и группы
• подозрительные процессы
• заполнение диска логами.
Можно использовать Zabbix, Prometheus, Grafana, Wazuh, ELK/OpenSearch, Graylog, SIEM-платформу или более простые инструменты. Важно не название продукта, а то, чтобы команда действительно получала понятные сигналы. Оповещение “на bastion host вошел root” должно быть красным. В нормальной схеме такого события просто не должно происходить.
Частые ошибки при внедрении jump server
Ошибка 1. Оставили прямой SSH “на всякий случай”
Это самая частая история. Bastion поставили, ProxyJump настроили, но прямой SSH на рабочие серверы не закрыли. В итоге архитектура стала не безопаснее, а сложнее: появился дополнительный узел, но старые двери остались открытыми. Проверка простая: с внешней машины попробуйте подключиться напрямую к каждому серверу. Если SSH отвечает там, где не должен, схема не закончена.
Ошибка 2. Все ходят под одним пользователем
Общий пользователь удобен только до первого инцидента. Потом начинается: “Кто заходил?”, “Кто перезапустил базу?”, “У кого был этот ключ?” Ответов нет. Персональные аккаунты - обязательны. Даже в маленькой команде.
Ошибка 3. Логи хранятся только локально
Если bastion взломан, локальные логи могут исчезнуть или измениться. Отправляйте их на отдельный сервер. Лучше - с ограниченной возможностью удаления и нормальным retention-периодом.
Ошибка 4. Bastion используют как обычный сервер
На нем запускают скрипты, держат временные файлы, копируют дампы, ставят панели, хранят ключи. Через месяц это уже не bastion, а склад с открытым проходом во внутреннюю сеть. Bastion должен быть скучным. Скучный сервер - хороший сервер.
Ошибка 5. Нет аварийного сценария
Firewall настроили, SSH закрыли, bastion обновили, после перезагрузки он не поднялся. И все: команда отрезана от инфраструктуры. Нужен резервный доступ: второй bastion, rescue mode, KVM/IPMI для выделенных серверов, документированный аварийный процесс. Без этого безопасность может превратиться в самоблокировку.
Мини-чек-лист внедрения
Перед запуском bastion host проверьте
• выбран отдельный сервер под bastion
• на нем нет лишних сервисов
• включены обновления и базовый hardening
• прямой root-login отключен
• парольная SSH-аутентификация отключена
• доступ разрешен только нужным пользователям или группам
• вход на bastion ограничен по IP или через VPN, если это возможно
• внутренние серверы принимают SSH только от bastion
• у каждого администратора персональный аккаунт
• ключи персональные и защищены passphrase
• настроено логирование входов и sudo-действий
• логи отправляются на внешний сервер
• есть мониторинг и оповещения
• описан аварийный доступ
• доступы регулярно пересматриваются.
Этот список не закрывает все возможные сценарии, но дает крепкий фундамент. А крепкий фундамент в инфраструктуре - это уже половина спокойствия.
Когда bastion host особенно нужен
Jump server стоит внедрять почти всегда, если серверов больше одного-двух и к ним подключается не один человек. Но есть ситуации, где он особенно полезен. Во-первых, production-инфраструктура. Там прямой SSH снаружи должен быть исключением, а не нормой. Во-вторых, базы данных и backup-серверы. Эти узлы содержат самое ценное: данные и возможность восстановления. Им точно не нужен широкий административный вход из интернета. В-третьих, работа с подрядчиками. Временный доступ удобнее выдавать через контролируемую точку, чем раскладывать ключи по всем серверам. В-четвертых, compliance и внутренний аудит. Если бизнесу нужно понимать, кто и когда получал доступ к инфраструктуре, bastion host сильно упрощает сбор доказательной базы. В-пятых, распределенная инфраструктура: VPS, dedicated servers, несколько площадок, private networks, VPN-сегменты. Чем больше контуров, тем выше ценность единой и понятной схемы доступа.
Bastion host не заменяет остальные меры безопасности
Важно не переоценивать bastion. Он не отменяет обновления, firewall, резервные копии, управление секретами, мониторинг, антивирусные или EDR-подходы там, где они нужны, и нормальную работу с правами. Bastion host - это не бронекупол. Это контрольно-пропускной пункт. Если за КПП внутри здания все двери открыты, документы лежат на столах, а камеры не записывают, одной проходной мало. Но без проходной тоже плохо: кто угодно может ходить через десятки боковых входов.
Сильная схема складывается из нескольких слоев
• закрытый внешний SSH
• доступ через bastion
• MFA
• персональные аккаунты
• минимальные права
• централизованные логи
• мониторинг
• регулярный пересмотр доступов
• резервный аварийный доступ.
Каждый слой не идеален отдельно. Вместе они дают устойчивость.
Слои безопасности
Bastion — КПП, не замена обновлений, MFA и мониторинга.
Практичный итог
Bastion host и jump server помогают навести порядок там, где SSH-доступ постепенно превращается в набор случайных исключений. Вместо прямого входа на каждый сервер команда получает один контролируемый маршрут. Вместо разрозненных логов - понятную точку аудита. Вместо десятков открытых SSH-портов - закрытую инфраструктуру, куда можно попасть только через проверенный узел. Для VPS, выделенных серверов и смешанной инфраструктуры это один из самых разумных шагов безопасности. Не самый сложный, не самый дорогой, но очень заметный по эффекту. Особенно если подойти к нему без иллюзий: закрыть прямой SSH, не использовать общие аккаунты, отправлять логи наружу, ограничить права и заранее подготовить аварийный доступ. Хорошая инфраструктура не должна быть героической. Она должна быть предсказуемой. Bastion host как раз про это: меньше случайных входов, больше контроля, спокойнее работа команды и понятнее ответственность за каждое подключение.
Итог: что даёт jump server
Один маршрут, аудит, закрытые порты, персональные доступы.