Транспорт и шифрование

Тема дорожной карты · SaltStack

Транспорт — это то, как мастер и миньоны физически обмениваются сообщениями. По умолчанию Salt использует ZeroMQ: мастер поднимает два сокета — 4505 для publish-канала (широковещательная рассылка заданий) и 4506 для request-канала (аутентификация, запросы файлов и pillar, возврат результатов). Понимание транспортного слоя нужно не для галочки: от него зависят правила файрвола, модель доверия ключей и поведение системы при обрывах сети. Шифрование здесь не TLS в привычном смысле, а собственная схема Salt: полезная нагрузка закрывается симметричным AES-ключом, а сам этот ключ распределяется через RSA-ключи миньонов, которыми управляет salt-key.

Как это работает

При старте миньон подключается к мастеру на порт 4506 и отправляет свой публичный RSA-ключ. Пока ключ не принят (salt-key -a <id>), мастер не выдаёт ничего. После приёма миньон получает AES-ключ сессии, зашифрованный его публичным ключом, — с этого момента вся полезная нагрузка (задания, файлы, pillar) ходит в AES-шифровании. Publish-канал на 4505 устроен как постоянное подписное соединение: все миньоны держат его открытым, мастер публикует задание один раз, а каждый миньон сам решает по таргету, относится ли оно к нему, — поэтому рассылка на тысячи машин не порождает тысяч отдельных соединений. Результаты возвращаются через 4506. AES-ключ ротируется, например при удалении ключа миньона, — после ротации миньоны переаутентифицируются. Соединения всегда инициируются миньоном: NAT и исходящий-only файрвол на стороне миньонов работают без дополнительной настройки.

Когда применять

Дефолтный ZeroMQ покрывает подавляющее большинство инсталляций: он быстрый, устойчивый и лучше всего обкатан. Альтернативные транспорты — TCP и websocket — нужны в специфических случаях: TCP-транспорт убирает зависимость от библиотеки ZeroMQ, websocket помогает там, где трафик должен проходить через HTTP-прокси и балансировщики. Менять транспорт стоит только при реальном ограничении среды, а не «на всякий случай»: настройка transport должна совпадать на мастере и миньонах, смешанные конфигурации не работают. На уровне сети правило простое: порты 4505/4506 открыты только от миньонов к мастеру; сегментируйте доступ файрволом, если мастер обслуживает несколько сетей. Для машин за жёсткими периметрами, где даже исходящие соединения запрещены, честнее использовать salt-ssh, чем пробивать транспорт наружу.

Типичные ошибки

Частая ошибка — открыть 4505/4506 в интернет целиком: протокол аутентифицирует миньонов, но приёмная очередь ключей и сам демон становятся публичной поверхностью атаки. Вторая — «оптимизация» файрвола, которая режет долгоживущее соединение на 4505 по idle-таймауту: миньоны молча перестают получать задания, хотя test.ping при переподключении работает; лечится keepalive-настройками миньона и таймаутами файрвола. Третья — ожидание TLS-семантики: сертификатов и CA здесь нет, доверие строится на приёме RSA-ключей, поэтому процедура верификации отпечатков заменяет PKI и пропускать её нельзя. Четвёртая — рассинхронизация transport между мастером и миньонами после частичной миграции: половина парка просто не подключается.

Связанные понятия

Полезные ресурсы

Проверить знания (2)

Загрузка вопросов…