Обеспечение безопасности сервера Jenkins: важнейшие рекомендации
Укрепите Jenkins с помощью минимального доступа, HTTPS, гигиены плагинов, безопасных конвейеров, контроля учетных данных и мониторинга.
Обеспечение безопасности вашего сервера Jenkins: Основные рекомендации
Обеспечение безопасности вашего сервера Jenkins важно, поскольку он может получить доступ к вашему исходному коду, целям развертывания, учетным данным и артефактам сборки. Если Jenkins открыт или настроен небрежно, злоумышленник может прочитать репозитории, изменить сборки, украсть секреты или использовать агенты сборки как путь в вашу сеть.
Самые безопасные конфигурации Jenkins используют многоуровневую защиту: надежную идентификацию, минимальные привилегии, зашифрованный доступ, тщательное управление плагинами, безопасные шаблоны конвейеров и полезные журналы аудита. Начните с приведенных ниже мер контроля, прежде чем открывать Jenkins для более широкой команды или подключать его к производственным системам.
Управление пользователями и контроль доступа
Надежное управление пользователями — это первая линия защиты. Jenkins позволяет детально контролировать, что пользователи могут видеть и делать. Реализация принципа минимальных привилегий гарантирует, что пользователи и сервисы имеют только необходимые разрешения для выполнения своих задач, минимизируя потенциальный ущерб от скомпрометированных учетных записей.
Аутентификация
Jenkins может интегрироваться с несколькими системами аутентификации. Для командных сред используйте централизованную аутентификацию вместо того, чтобы полагаться только на внутреннюю базу пользователей Jenkins.
- Интеграция с LDAP или Active Directory: Используйте существующие группы каталогов и средства контроля жизненного цикла учетных записей.
- SAML или OpenID Connect: Используйте единый вход через вашего поставщика удостоверений, если ваш набор плагинов Jenkins это поддерживает.
- Локальные учетные записи: Держите одну тщательно защищенную учетную запись администратора для экстренных случаев, но не делайте общие локальные учетные записи вашей обычной моделью доступа.
Стратегии авторизации
После аутентификации пользователей авторизация определяет их уровни доступа.
- Матричная безопасность: Эта встроенная стратегия позволяет назначать разрешения пользователям или группам. Она хорошо работает для небольших конфигураций, но может стать сложной для аудита по мере роста команды.
- Ролевая стратегия: Плагин Role-Based Authorization Strategy позволяет определять роли, такие как
Разработчик,ОператориАдминистратор, а затем сопоставлять пользователей или группы с этими ролями.
Пример: Настройка ролевой авторизации
- Установите плагин Role-Based Authorization Strategy из менеджера плагинов Jenkins.
- Перейдите в
Manage Jenkins>Security. - В разделе
AuthorizationвыберитеRole-Based Strategy. - Определите роли, такие как
developer,release-managerиjenkins-admin. - Дайте каждой роли только те разрешения, которые ей нужны, например
Job/Read,Job/BuildилиCredentials/View. - По возможности назначайте ролям группы каталогов, а не отдельных людей.
Обеспечение безопасности связи Jenkins
Обеспечение шифрования данных, передаваемых на ваш сервер Jenkins и с него, имеет решающее значение, особенно при работе с учетными данными и конфиденциальной информацией о сборке.
Настройка HTTPS
Настройте Jenkins на использование HTTPS для шифрования всего обмена данными между клиентами и сервером. Это предотвращает перехват и атаки типа "человек посередине".
Наиболее распространенный производственный шаблон — разместить Jenkins за обратным прокси-сервером, таким как Nginx, Apache, HAProxy или облачный балансировщик нагрузки. Завершите TLS на прокси, перенаправьте HTTP на HTTPS и установите публичный URL Jenkins в разделе Manage Jenkins > System.
Если вы запускаете встроенный веб-сервер Jenkins напрямую с HTTPS, настройте его через параметры запуска Jenkins, такие как --httpsPort, --httpsKeyStore и --httpsKeyStorePassword, или через конфигурацию службы, специфичную для пакета. Точный файл различается в зависимости от метода установки, поэтому перед изменением проверьте, как запускается ваша служба Jenkins.
Также убедитесь, что обратный прокси-сервер отправляет правильные перенаправленные заголовки. Некорректные заголовки прокси могут привести к неправильным URL-адресам перенаправления, сбоям проверки CSRF или ссылкам, указывающим на обычный HTTP.
Безопасность Jenkins и плагинов
Расширяемость Jenkins с помощью плагинов — одно из его главных преимуществ, но она также создает потенциальные риски безопасности, если не управлять ею осторожно.
Поддерживайте Jenkins и плагины в актуальном состоянии
Устаревшие версии ядра Jenkins и его плагинов являются распространенным источником уязвимостей. Регулярно обновляйте их для устранения известных недостатков безопасности.
- Обновления ядра Jenkins: Следите за уведомлениями безопасности Jenkins и планируйте регулярные окна обслуживания.
- Обновления плагинов: Часто просматривайте уведомления об обновлениях. По возможности тестируйте критические обновления плагинов на непроизводственном контроллере.
Белый список и аудит плагинов
Не все плагины одинаковы. Некоторые плагины могут иметь уязвимости безопасности или быть неподдерживаемыми.
- Используйте доверенные плагины: Отдавайте предпочтение поддерживаемым плагинам из центра обновлений Jenkins.
- Ограничьте установку плагинов: Каждый плагин добавляет код, который выполняется внутри вашего контроллера.
- Удаляйте неиспользуемые плагины: Проводите аудит плагинов ежеквартально или после серьезных изменений процессов.
Управление предупреждениями безопасности плагинов
Jenkins может предупреждать вас об установленных плагинах с известными уведомлениями безопасности. Обращайте пристальное внимание на предупреждения в разделе Manage Jenkins и обновляйте, заменяйте или удаляйте затронутые плагины.
Безопасность Jenkinsfile
Jenkinsfile определяют ваши конвейеры сборки. Их защита имеет решающее значение для предотвращения внедрения вредоносного кода в процесс сборки.
- Храните Jenkinsfile в системе контроля версий: Просматривайте изменения конвейера так же, как вы просматриваете код приложения.
- Относитесь к коду конвейера как к исполняемому коду: Jenkinsfile может выполнять команды оболочки, публиковать артефакты и запрашивать учетные данные.
- Будьте осторожны с утверждением скриптов: Плагин Script Security может потребовать от администраторов утверждения определенных методов или скриптов Groovy. Утверждайте только тот код, который вы понимаете.
- Избегайте встроенных скриптов конвейера в интерфейсе: Отдавайте предпочтение
Jenkinsfile, хранящимся в репозитории, с проверкой кода.
Пример: Утверждение скриптов
Когда конвейер сталкивается с неподтвержденной сигнатурой Groovy, Jenkins перечисляет ее в разделе Manage Jenkins > In-process Script Approval. Перед утверждением проверьте запрошенную сигнатуру и задание, которое ее вызвало. Широкое утверждение может повлиять более чем на одно задание.
Управление учетными данными Jenkins
Jenkins часто необходимо хранить конфиденциальные учетные данные, такие как ключи API, пароли и ключи SSH, для доступа к другим сервисам. Безопасное управление ими имеет решающее значение.
- Используйте хранилище учетных данных Jenkins: Храните токены API, пароли, сертификаты и ключи SSH как учетные данные, а не в виде открытого текста в определениях заданий.
- Избегайте жестко закодированных секретов: Не помещайте секреты в
Jenkinsfile, скрипты оболочки, журналы сборки или переменные репозитория. - Ограничивайте область действия учетных данных: Используйте папки и разрешения, чтобы производственные учетные данные были недоступны для заданий, которым они не нужны.
- Регулярно меняйте учетные данные: Меняйте ключи развертывания и токены сервисов, когда люди уходят, задания удаляются или секрет мог появиться в журналах.
Пример: Использование учетных данных в конвейере
pipeline {
agent any
stages {
stage('Deploy') {
steps {
withCredentials([sshUserPrivateKey(credentialsId: 'prod-deploy-key', keyFileVariable: 'SSH_KEY', usernameVariable: 'SSH_USER')]) {
sh 'ssh -i "$SSH_KEY" -o IdentitiesOnly=yes "[email protected]" "deploy_command"'
}
}
}
}
}
В этом примере prod-deploy-key — это идентификатор сохраненного закрытого ключа SSH. Jenkins записывает ключ во временный файл на время выполнения шага и маскирует поддерживаемые секретные значения в журналах.
Сетевая безопасность и контроль доступа
Помимо внутренней безопасности Jenkins, защита сервера на сетевом уровне имеет важное значение.
- Правила брандмауэра: Ограничьте доступ к Jenkins доверенными сетями, диапазонами VPN или точками входа с прокси, учитывающими идентификацию.
- Элементы управления обратным прокси: Используйте обратный прокси для TLS, перенаправления HTTP на HTTPS, ограничений запросов и согласованных заголовков.
- Изоляция агентов: Не запускайте ненадежные сборки на контроллере. Используйте одноразовые или строго контролируемые агенты для рискованных рабочих нагрузок.
- Сегментация сети: Держите Jenkins подальше от широкого доступа к внутренней сети, если это действительно не требуется заданию.
Аудит и мониторинг
Регулярный просмотр журналов Jenkins и мониторинг активности могут помочь обнаружить и отреагировать на инциденты безопасности.
- Включите журнал аудита: Регистрируйте входы в систему, изменения разрешений, изменения учетных данных, редактирование заданий и административные действия. Плагины, такие как Audit Trail, могут помочь.
- Мониторьте журналы Jenkins: Просматривайте журналы контроллера и журналы сборок на предмет неожиданного использования учетных данных, новых учетных записей администраторов, необычного редактирования заданий или повторяющихся неудачных попыток входа.
- Резервное копирование конфигурации: Создавайте резервные копии домашнего каталога Jenkins, конфигурации заданий, списков плагинов и метаданных учетных данных в соответствии с вашим планом восстановления. Защищайте резервные копии как производственные секреты.
Пусть Jenkins будет скучным
Цель — сервер Jenkins, где доступ предсказуем, изменения проверяются, плагины известны, а учетные данные не просачиваются в задания или журналы. Начните с единого входа, минимальных ролей, HTTPS, обновлений плагинов и безопасного использования учетных данных. Затем запланируйте регулярные проверки, чтобы вчерашнее временное исключение не стало завтрашним инцидентом.