ACL и peer-коммуникация

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

По умолчанию командовать миньонами может только root на мастере — модель «всё или ничего». В реальной команде это неудобно: дежурному нужно уметь рестартить сервисы, релиз-инженеру — запускать state.apply на своём сегменте, и никому из них не нужен полный root. Для этого в конфигурации мастера есть два механизма. publisher_acl выдаёт локальным пользователям мастера ограниченный набор функций на ограниченном множестве миньонов. Интерфейс peer решает другую задачу: он разрешает самим миньонам вызывать функции на других миньонах через мастер — основа работы Salt Mine и сценариев, где, например, балансировщик должен опросить бэкенды.

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

Оба механизма настраиваются в конфиге мастера (/etc/salt/master или drop-in в master.d/). publisher_acl — это словарь «пользователь → таргет → список функций», значения поддерживают регулярные выражения:

publisher_acl:
  deploy:
    - 'web*':
        - test.ping
        - state.apply

Пользователь deploy сможет выполнить salt 'web*' state.apply, но получит отказ на cmd.run или на таргет db*. Проверка происходит на мастере в момент публикации задания. Дополнительно publisher_acl_blacklist запрещает опасные функции даже разрешённым пользователям. peer устроен зеркально, только субъект — миньон:

peer:
  'lb01':
    - network.ip_addrs

Теперь миньон lb01 может через execution-модуль publish выполнить salt-call publish.publish 'web*' network.ip_addrs: запрос уходит на мастер, тот проверяет его по peer-правилам и публикует от имени миньона. Есть и peer_run — аналогичное разрешение миньонам запускать runner'ы на мастере.

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

publisher_acl — правильный ответ, когда несколько человек или сервисных аккаунтов работают с одного мастера и им нужны разные полномочия: дежурная смена получает service.* и test.*, деплой-пользователь CI — state.apply на свой кластер. Это проще, чем полноценный eauth, потому что не требует внешнего бэкенда — достаточно локальных unix-пользователей. Если же нужен вход по корпоративным учёткам (LDAP) или доступ через salt-api — берите external_auth, синтаксис правил там тот же. peer включайте точечно и только когда без него нельзя: типовые случаи — mine.get для обмена данными между миньонами и оркестровки, где узел должен узнать адреса соседей. Широкий peer вида '*': [.*] означает, что любой скомпрометированный миньон командует всем парком.

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

Главная — считать publisher_acl полноценной защитой при разрешённых опасных функциях: cmd.run, file.write или state.single дают эскалацию до root на миньоне, а значит и на мастере, если он таргетируется. Разрешайте узкие функции, а не «всё кроме плохого». Вторая — забыть про права файловой системы: пользователю из ACL нужен доступ на чтение/запись к сокетам и кешу мастера, иначе команды падают с невнятными ошибками прав — hardening-гайд описывает нужные права. Третья — регулярки в таргетах: правило web* — это glob, а 'web.*' в ACL трактуется как regex; перепутав, вы откроете лишние машины. Четвёртая — включённый «на минутку» широкий peer, который остаётся навсегда и превращает один взломанный миньон в точку управления всеми.

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

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

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

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