Bastion host (бастионный хост)
Бастионный хост (bastion host, или jump host) это жёстко защищённый сервер, который служит единственной намеренно открытой точкой входа в частную сеть. Администратор сначала подключается к нему, обычно по SSH, и уже оттуда попадает на внутренние серверы, поэтому им не нужен публичный порт SSH. NIST определяет его как компьютер, спроектированный и настроенный так, чтобы выдерживать атаки.
Что такое бастионный хост и когда он нужен
Бастионный хост это одна машина между интернетом и серверами, которые вы защищаете. Вместо того чтобы открывать SSH на каждой базе данных, приложении и рабочем узле, вы открываете его только на бастионе, а внутренние серверы принимают SSH исключительно с адреса бастиона. Глоссарий NIST определяет термин как компьютер специального назначения, спроектированный и настроенный так, чтобы выдерживать атаки, поэтому на бастионе должно работать как можно меньше программ.
Выигрыш в концентрации. Вы укрепляете, обновляете, мониторите и логируете одну точку входа вместо многих и видите, кто к какой внутренней системе подключался. Бастион оправдан, когда серверов несколько и они в частной сети, команда администраторов большая или нужно знать, кто куда заходил. Для одного VPS он обычно лишний: лучше настроить SSH с входом только по ключам, как описано в руководстве по защите SSH.
Подключение через бастион с помощью ProxyJump
В OpenSSH поддержка есть из коробки. Согласно справке ssh(1), опция -J сначала подключается к промежуточному хосту, а затем устанавливает оттуда TCP-проброс к конечному адресу. Можно перечислить несколько узлов через запятую. Это сокращение для директивы ProxyJump из ssh_config(5).
Разовое подключение выглядит так:
ssh -J jump.example.com app.internal
Для повседневной работы опишите маршрут в ~/.ssh/config:
Host bastion
HostName jump.example.com
User ops
Host app
HostName 10.0.0.12
User deploy
ProxyJump bastion
Теперь ssh app идёт через бастион, а другие инструменты, читающие тот же конфиг, например scp и sftp, используют тот же маршрут. В справке отмечено, что параметры из командной строки относятся к конечному хосту, а не к промежуточным, поэтому настройки для jump host держите в конфиге.
Как защитить бастион
Считайте бастион самой уязвимой машиной из всех, что у вас есть. Начните с входа только по ключам и добавьте второй фактор по руководству по двухфакторной аутентификации; директива AuthenticationMethods позволяет требовать несколько методов. Не ставьте ничего, кроме sshd и мониторинга, разрешите входящий SSH в файрволе только из известных сетей, задайте LogLevel VERBOSE вместо INFO по умолчанию и отправляйте логи за пределы хоста (см. руководство по анализу логов).
Не включайте проброс агента на бастион. Справка ssh предупреждает: тот, кто может обойти права доступа к файлам на удалённом хосте, способен воспользоваться вашим пробрасываемым агентом для аутентификации, а безопасной альтернативой назван промежуточный хост. Не храните приватные ключи на бастионе.
Одно исключение из обычного чек-листа: ProxyJump это TCP-проброс, поэтому AllowTcpForwarding здесь должен остаться включённым. Ограничивайте его на уровне ключа в authorized_keys опциями из sshd(8):
restrict,port-forwarding,permitopen="10.0.0.12:22" ssh-ed25519 AAAA...Ограничения и альтернативы
Бастион не панацея. Это единая точка отказа: если он недоступен, администраторы теряют доступ, поэтому держите запасной путь, например консоль провайдера. Это и ценная цель: тот, кто контролирует бастион, оказывается на пути к внутренней сети. В справке sshd отмечено, что отключение проброса не повышает безопасность, если пользователям не запрещён доступ к оболочке, поэтому учётным записям только для перехода не давайте и shell.
Поскольку соединение через ProxyJump это пробрасываемый TCP-поток, бастион фиксирует, кто к какому адресу подключился, но не команды, набранные внутри сессии. Если нужны записи на уровне команд, собирайте их на целевых серверах или используйте специальные средства записи сессий.
Внутренним серверам по-прежнему нужны обновления, учётные записи по принципу наименьших привилегий и собственные правила файрвола. Распространённая альтернатива, когда команде нужен доступ не только по SSH, это VPN или частная сеть провайдера. Для одного небольшого сервера лишний переход не нужен: усильте прямой доступ.
Связанные термины: SSH, Аутентификация по ключам, Двухфакторная аутентификация, Файрвол, authorized_keys, Проброс SSH-агента (agent forwarding).
Часто задаваемые вопросы
Что такое бастионный хост?
Бастионный хост это защищённый сервер, единственная публично доступная точка входа в частную сеть. Администраторы подключаются к нему, а затем через него попадают на внутренние серверы, которые могут отказывать в прямом доступе из интернета.
Бастионный хост и jump host это одно и то же?
На практике да. Термин jump host используется в справке OpenSSH, а bastion host подчёркивает, что машина укреплена так, чтобы выдерживать атаки.
Как подключиться к серверу через бастион?
Используйте ssh -J с промежуточным и конечным хостом, например ssh -J jump.example.com app.internal, или задайте ProxyJump в ~/.ssh/config. Несколько промежуточных хостов перечисляются через запятую.
Нужно ли пробрасывать агент для доступа к внутренним серверам?
Нет. В справке ssh сказано, что проброс агента нужно включать с осторожностью, а промежуточный хост назван более безопасной альтернативой: любой, кто может обойти права доступа к файлам на удалённом хосте, способен использовать ваш агент.
Нужен ли бастион для одного VPS?
Обычно нет. Один сервер лучше защитить входом только по ключам, файрволом и ограничением частоты попыток. Бастион окупается, когда вы управляете несколькими частными серверами и хотите контролировать и логировать доступ в одном месте.
Хотите увидеть, в каком состоянии ваш сервер?
Запустите бесплатную read-only проверку сервера или откройте Security Lab и посмотрите цикл обнаружение, сдерживание, восстановление, проверка в действии.
Получить бесплатную проверку сервераОткрыть Security Lab