Безопасность runner
Тема дорожной карты · GitHub Actions
Безопасность runner'ов в GitHub Actions охватывает практики, предотвращающие злоупотребление workflow для кражи секретов, манипуляций со сборкой или проникновения в сеть; это особенно критично для self-hosted runner'ов с постоянным доступом к внутренним системам. Ключевые меры: закрепление версий actions по SHA, объявление минимальных permissions для GITHUB_TOKEN, ограничение секретов через окружения, изоляция self-hosted runner'ов в эфемерных VM или контейнерах и отключение workflow из форков. GitHub-hosted runner'ы уже эфемерны и сбрасываются между заданиями, но безопасность self-hosted runner'ов зависит от вас: ротация учётных данных, обновление ОС и применение групп runner'ов. Использование безопасности runner'ов как многоуровневой проблемы — идентификация, сеть, образ и workflow — единственный устойчивый подход к работе с GitHub Actions в промышленном масштабе.
Как это работает
Безопасность runner runners работают на ваших машинах (VM, bare metal, k8s). Установите actions-runner пакет; зарегистрируйте через токен. Тегайте runners labels (self-hosted, linux, gpu) — workflows матчатся. Авто-скейл пулов runner через actions-runner-controller (k8s), runs-on.com или Philips Labs/terraform-aws-github-runner. Self-hosted runners получают полный доступ к репо — никогда не расшаривайте между недоверенными проектами.
Когда применять
Self-hosted — когда: сборки требуют GPU/special hardware, доступа к приватным ресурсам по сети, дольше 6 часов, большой compute дешевле cloud-квот, или compliance запрещает публичные облака. Для РФ self-hosted на Yandex Cloud / Selectel / локальной инфре — практичный выбор; GitHub-hosted могут быть медленны или недоступны. Авто-скейл или гибернация idle-runners.
Типичные ошибки
Ловушки Безопасность runner: self-hosted runner расшарен между публичными репо и приватным кодом (PR из публичного форка pwn-ит runner); runners никогда не патчатся (уязвимая поверхность); runners остаются online + принимают jobs откуда угодно (дефолт — ограничьте через runner_group); нет cleanup между jobs (state утекает).