Безопасность
Тема дорожной карты · SaltStack
Salt по определению выполняет произвольные команды от root на всех серверах парка, поэтому компрометация мастера означает компрометацию всей инфраструктуры. Безопасность Salt — это не тема «на потом», а часть базовой настройки. Модель угроз включает три слоя: защита канала мастер–миньон (шифрование транспорта и доверие ключей), контроль того, кто и что может запускать через мастер (publisher_acl, eauth), и защита секретов, которые Salt раздаёт миньонам (pillar, внешние бэкенды вроде Vault). У проекта есть официальный hardening-гайд — его стоит прочитать целиком до вывода мастера в продакшен и возвращаться к нему после каждого мажорного обновления.
Как это работает
Мастер слушает два порта: 4505 (publish — рассылка команд) и 4506 (request/return — запросы миньонов и возврат результатов). Соединения всегда инициируют миньоны, поэтому на мастере не нужно открывать входящие порты, а файрвол мастера должен пускать на 4505/4506 только адреса миньонов. Полезная нагрузка шифруется AES-ключом, который мастер передаёт миньонам через обмен RSA-ключами: при первом подключении миньон присылает публичный ключ и не получает ничего до команды salt-key -a <id>. Именно поэтому автоприём ключей — дыра: чужой «миньон» получит pillar-данные, которые вы ему отрендерите. Ключи сверяют по отпечаткам — salt-key -f <id> на мастере против salt-call --local key.finger на миньоне. Дальше включаются слои авторизации: publisher_acl ограничивает локальных пользователей мастера, external_auth (PAM/LDAP) даёт именованный доступ операторам, peer дозирует общение миньонов между собой.
Когда применять
Минимум для любого продакшена: файрвол на 4505/4506, верификация отпечатков ключей (вручную или через заранее подложенные preseed-ключи), работа операторов через publisher_acl/eauth вместо общего root на мастере. Если Salt пользуются несколько человек — включайте external_auth, чтобы в логах и job cache было видно, кто именно запустил state.apply на прод. Секреты не кладите в state-файлы и не таргетируйте по grains: grains формирует сам миньон и может их подделать, поэтому критичные pillar-данные привязывайте к minion id, который подтверждён ключом. Для salt-api обязательны TLS и eauth — без них REST-интерфейс превращается в удалённый root на весь парк. Внешний бэкенд секретов (Vault через saltext-vault) убирает секреты из git-репозитория с pillar.
Типичные ошибки
Классика — auto_accept: True, включённый «на время тестов» и доживший до продакшена. Вторая ошибка — выдача секретов по grains-таргетингу: скомпрометированный миньон объявляет себя чужой ролью и забирает чужие пароли. Третья — мастер, открытый портами в интернет без ограничений по адресам: любой может прислать ключ и засорять очередь приёма, а после ошибочного salt-key -A — читать pillar. Четвёртая — забытая эквивалентность прав: доступ на запись в file_roots или pillar (в том числе из CI-пайплайна) равен root на всех миньонах, поэтому репозиторий состояний и деплой-джобы защищают так же строго, как сам мастер. Наконец, старые непринятые и отозванные ключи копятся годами — периодический аудит salt-key -L должен быть рутиной.
Связанные понятия
Полезные ресурсы
🔤 Английские термины в этой теме
Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.
- equals /ˈiːkwəlz/ «иквалз», ударение на первый слог разбор: Операторы: not equal, greater or equal, arrow
- follow-up /ˈfɒloʊ ʌp/ последующая задача разбор: Описание PR: what, why, how, чеклист
- threat /θrɛt/ с «θ» разбор: Безопасность: vulnerability, exploit, hardening, least privilege
- privilege /ˈprɪvəlɪdʒ/ «прИвилидж», ударение на первый слог разбор: Английский тестирования, безопасности и фронтенда
- credentials /krəˈdɛnʃəlz/ «кридЕншелз» разбор: Безопасность: vulnerability, exploit, hardening, least privilege
- remote /rɪˈmoʊt/ ударение на второй слог разбор: Что носители скажут иначе: айтишник, сеньор, проект
- deploy /dɪˈplɔɪ/ ударение на второй слог, не «дЕплой» разбор: Рунглиш vs английский: когда что уместно