Какие привилегии необходимы для успешной перезагрузки Jenkins из веб-интерфейса?

Вопрос или проблема

У меня возникает проблема при попытке перезапустить Jenkins с помощью веб-интерфейса (через http(s)://theserver/restart или http(s)://theserver/saferestart), так как Jenkins застревает на экране “Пожалуйста, подождите, пока Jenkins перезапускается. Ваш браузер автоматически обновится, когда Jenkins будет готов.” и служба не останавливается, поэтому нам приходится вручную заходить в Службы сервера и останавливать/запускать или перезапускать службу Jenkins в Windows, чтобы Jenkins снова был готов.

Наш сервер Jenkins (текущая версия 2.60.3) работает на Windows2012R2, процесс Jenkins запускается как служба Windows с технической учетной записью (domain\sirjenkins), которая имеет ограниченные привилегии.

Когда техническая учетная запись, выполняющая процесс, является администратором, Jenkins перезапускается нормально через минуту после появления сообщения “пожалуйста, подождите”.

Привилегии, которые я назначил учетной записи domain\sirjenkins, такие: – Член группы Пользователи на сервере – Полный контроль над файлами конфигурации Jenkins – Полный контроль над папками рабочей области Jenkins – Право на “Вход в систему как служба” в локальной политике безопасности.

Все остальное в веб-интерфейсе Jenkins и автоматизированные процессы (кроме перезапуска с веб-интерфейса) работают без проблем при использовании этой учетной записи для запуска службы Jenkins в Windows.

Я искал в интернете аналогичную проблему, но в основном нахожу проблемы, связанные с невозможностью запустить Jenkins из-за проблем/ошибок конфигурации, или предложения назначить привилегии, которые я уже дал этой учетной записи. Дополнительное тестирование показало, что у Jenkins нет проблем с запуском при ограниченных привилегиях, которые ему были даны, но он сталкивается с трудностями при попытке успешно остановить себя во время перезапуска через веб.

Кто-нибудь еще сталкивался с этой проблемой и есть ли какие-то права пользователя, которые мы могли бы упустить в “локальной политике безопасности” для учетной записи, которая запускает Jenkins как службу, чтобы можно было успешно перезапустить Jenkins через веб-интерфейс?

Спасибо заранее.

Что я использую для перезапуска Jenkins, это следующий скрипт для конвейера:

import jenkins.model.*
sleep 15
Jenkins.instance.doSafeRestart(null);

Просто создайте новую задачу типа “Pipeline”, вставьте приведенный выше код и убедитесь, что флажок “Использовать песочницу Groovy” снят.

В моей конфигурации служебная учетная запись имеет дополнительные привилегии, но этот метод может сработать и для ограниченной учетной записи.

Вы также можете назначать права пользователей для каждого проекта, чтобы “собирать” (фактически, запускать) эту задачу, используя Matrix Authorization Strategy Plugin, или запланировать выполнение задачи на периодической основе.

// Извините – в настоящее время не могу добавить прямой комментарий.
В ответ на ответ от Орен Чапо выше: к сожалению, даже с предложенным подходом – если пользователь, выполняющий Jenkins-задачу, не имеет прав на запуск Jenkins – будет сообщена та же ошибка.
Поэтому решение состоит в предоставлении необходимых прав доступа (и тогда не существенно, выполняется ли задача через CLI или через Pipeline).

К сожалению, в Windows я не нашел правильный способ включить такие права доступа в Jenkins (даже при запуске задачи от имени учетной записи System проблема не решается, потому что в момент, когда Jenkins должен быть перезапущен, задача уже “исчезла”).
Так что в настоящее время лучший способ – это какой-то “внешний скрипт” (например, python или batch/bash), который имеет/обеспечивает достаточные права доступа и вручную перезапускает службу Jenkins (т.е. безопасное завершение работы Jenkins, чтобы выполняющиеся задачи завершились, затем снова запуск его от учетной записи пользователя, которой это разрешено).

.

Ответ или решение

Для успешного перезапуска Jenkins с веб-интерфейса необходимы определенные привилегии для учетной записи, которая запускает сервис Jenkins. Из описания вашего случая видно, что учетная запись с ограниченными привилегиями может запускать и выполнять Jenkins, но сталкивается с проблемами именно в момент его остановки и последующего запуска при использовании функции перезапуска через веб-интерфейс.

Теория

Перезапуск Jenkins через веб-интерфейс предполагает, что процесс Jenkins может корректно завершить свою работу и сразу же возобновить её. Для этого необходимы следующие условия:

  1. Полный контроль над сервисом Windows: учетная запись должна иметь возможность остановить и запустить Windows-сервис, под которым работает Jenkins.
  2. Доступ к файловой системе: учетная запись требует достаточных прав для записи в конфигурационные и рабочие директории Jenkins.
  3. Сетевая доступность: в случае перезапуска по сети должны быть учтены все ограничения на межсетевые взаимодействия, если таковые имеются.
  4. Привилегии администратора: зачастую для доступа к системным функциям по остановке, запуску и перезапуску служб, учетная запись должна обладать административными правами.

Пример

Ваш текущий сценарий показывает, что учетная запись domain\sirjenkins, которая выполняет Jenkins как Windows-сервис, не имеет достаточных административных прав, что мешает корректной остановке и последующему запуску Jenkins при попытке выполнить перезапуск через веб-интерфейс. Когда эта учетная запись является администратором, проблема исчезает.

Дополнительно, ваш коллега предложил запуск скрипта на языке Groovy в конвейере Jenkins с использованием метода Jenkins.instance.doSafeRestart(null);. Это может быть решением, но у вас есть опасения, что это не сработает без надлежащих привилегий для перезапуска Jenkins, управляемых из Windows.

Применение

Для разрешения текущей ситуации необходимо:

  1. Повышение привилегий учетной записи:

    • Проверьте, что учетная запись domain\sirjenkins имеет привилегию "Log on as a service", и она должна быть локальным администратором на сервере Jenkins. Это можно проверить через "Локальная политика безопасности" (Local Security Policy) на сервере Windows.
    • Рассмотрите возможность добавления учетной записи domain\sirjenkins в группу администраторов, если это возможно и соответствует вашим политикам безопасности.
  2. Альтернативные методы перезапуска:

    • Можно создать внешний скрипт (например, на языке Python или Bash), который бы выполнял остановку и запуск Jenkins с помощью учетной записи с необходимыми привилегиями. Этот скрипт может выполняться с сервера Jenkins или удаленно, используя SSH или другие секторы удаленного доступа.
    • Рассмотрите возможность использования плагинов Jenkins, таких как Matrix Authorization Strategy Plugin, для предоставления специфических привилегий, необходимых для выполнения критически важных действий вроде перезапуска.
  3. Инфраструктурные изменения:

    • Убедитесь, что сетевые порты и межсетевые экраны (firewall) настроены так, чтобы не блокировать запросы перезапуска, если это необходимо.
  4. Документирование и тестирование:

    • Изучение и документирование всех направлений, влияющих на процесс перезапуска Jenkins. Протестируйте все предложенные решения в безопасной среде перед применением в производстве.

Сбалансированный подход, включающий и технические изменения, и внимательное соблюдение политик безопасности, приведет к успешной интеграции функций перезапуска Jenkins в повседневные процессы компании.

Оцените материал
Добавить комментарий

Капча загружается...