Перейти к основному содержимому

Сбросить/отключить настройки безопасности Jenkins из командной строки

· 7 мин. чтения

1. Обзор

Jenkins — это сервер автоматизации с открытым исходным кодом для автоматизации частичных и полных циклов разработки программного обеспечения. Это облегчает непрерывную интеграцию и непрерывную доставку .

Благодаря Jenkins у нас есть возможность предоставлять разные уровни безопасности разным пользователям. По умолчанию нам не нужно предоставлять полный доступ всем пользователям.

Безопасность Jenkins можно просмотреть, сбросить или полностью отключить из консоли Jenkins (UI) и командной строки. Используя командную строку, нам нужно изменить конфигурацию Jenkins.

Прежде чем мы продолжим, давайте сначала разберемся в проблеме. Иногда мы можем забыть учетные данные для входа в Jenkins. В результате мы не можем получить доступ к Jenkins.

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

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

2. Путем обновления основного файла конфигурации Jenkins

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

2.1. Найти основной файл конфигурации

В общем, мы можем установить Jenkins двумя способами на машину с Linux: с помощью диспетчера пакетов или с помощью файла WAR. Если Jenkins установлен с помощью сервера диспетчера пакетов, путь к файлу config.xml будет /var/lib/jenkins/config.xml . С другой стороны, если установка Jenkins была выполнена с использованием файла WAR , то файл config.xml будет находиться в ~/.jenkins/config.xml.

Если файл config.xml отсутствует ни в одном из упомянутых выше путей, мы можем использовать команду find для поиска по всей машине:

$ find / -name config.xml

2.2. Отключить безопасность Дженкинса

Найдя файл config.xml , давайте изменим следующий атрибут безопасности с true на false :

<useSecurity>false</useSecurity>

Обновим файл config.xml с помощью команды sed , если нет доступа к редактору :

$ sed -i 's/<useSecurity>true<\/useSecurity>/<useSecurity>false<\/useSecurity>/g' /var/lib/jenkins/config.xml

2.3. Перезапустите Дженкинса

Наконец, мы перезапустим Jenkins, чтобы изменения вступили в силу. Используйте следующую команду, если Jenkins установлен с помощью диспетчера пакетов:

$ systemctl restart jenkins

Если Jenkins установлен с помощью WAR, сначала нам нужно остановить процесс Java, а затем перезапустить Jenkins с помощью команды java -jar .

Теперь при доступе к консоли Jenkins пароль не запрашивается. Это решение простое, но не рекомендуется, так как оно полностью обходит систему безопасности.

3. Путем обновления файла конфигурации пользователя Jenkins

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

3.1. Найти файл конфигурации пользователя

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

<Jenkins_Working_Directory>/users/<Jenkins_User_Folder>/config.xml

Здесь Jenkins_Working_Directory — это каталог, в котором хранятся все журналы, конфигурации и артефакты сборки. Путь по умолчанию для рабочего каталога Jenkins — /var/lib/jenkins. Jenkins_User_Folder — это имя папки пользователя Jenkins:

$ cd /var/lib/jenkins/users/
$ ls
user1_4268539434599263174 user2_948489902389144094 user3_162302090988132370 users.xml
$ cd user1_4268539434599263174/
$ ls
config.xml

3.2. Генерация хэша BCrypt

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

Проще говоря, мы выберем новый пароль, сгенерируем его хэш и заменим хеш в файле config.xml . Таким образом, наш пароль будет успешно сброшен. Чтобы зашифровать пароль и сгенерировать его хэш, мы воспользуемся общедоступным инструментом .

Предположим, что мы потеряли пароль для пользователя root. Теперь мы решили обновить новый пароль как секретный. Хэш, сгенерированный с помощью онлайн-инструмента для секрета, равен $2a$10$a7XcruSVvyb0.6ckv97/hOqqTuVx.qzuf7oq9He6HG7puq8DzYwFq.

Обратите внимание, что для одного и того же пароля каждый раз, когда мы шифруем наш пароль, будет генерироваться другой хэш. Такое поведение доказывает, насколько мощным является алгоритм bcrypt.

3.3. Обновить файл конфигурации

Давайте теперь заменим passwordHash в пользовательском файле config.xml :

<passwordHash>#jbcrypt:$2a$10$a7XcruSVvyb0.6ckv97/hOqqTuVx.qzuf7oq9He6HG7puq8DzYwFq</passwordHash>

Здесь jBCrypt обозначает Java-реализацию bcrypt. Наконец, нам нужно перезапустить сервер Jenkins, чтобы изменения вступили в силу. Теперь наш пароль сброшен на секретный.

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

4. Использование другого пользователя

Поскольку мы потеряли пароль для пользователя admin, давайте создадим нового пользователя с привилегиями root. Мы будем использовать этого нового пользователя для сброса пароля старого пользователя из консоли Jenkins.

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

4.1. Включить регистрацию

По умолчанию Jenkins предоставляет возможность регистрации во время начальной установки. Давайте включим это, установив для атрибута disableSignup в основном файле config.xml ( /var/lib/jenkins/config.xml ИЛИ ~/.jenkins/config.xml ) значение false :

<disableSignup>false</disableSignup>

4.2. Создать нового корневого пользователя

Давайте теперь перезапустим сервер Jenkins и получим доступ к консоли Jenkins. На этот раз мы найдем ссылку для создания новой учетной записи на странице входа в Jenkins.

Давайте сначала зарегистрируем нового пользователя ( myuser ) из консоли Jenkins. Затем присвойте этому пользователю права администратора, обновив основной файл config.xml :

<roleMap type="globalRoles">
<role name="admin" pattern=".*">
<permissions>
...
</permissions>
<assignedSIDs>
<sid>myuser</sid>
</assignedSIDs>
</role>
<roleMap/>

Здесь мы добавили вновь созданного пользователя вокруг тега sid внутри тегаassignSIDs . Теперь перезапустите сервер Jenkins.

4.3. Обновите пароль

Давайте войдем в систему с новым пользователем ( myuser ) и перейдем к Manage Jenkins> Manage Users . Теперь выберите пользователя (root), для которого мы хотим обновить пароль, и обновите пароль.

Давайте теперь сохраним и применим изменения. Это позволит успешно обновить пароль пользователя, который мы потеряли ранее.

4.4. Очистить

Как только мы восстановим пароль, давайте все очистим. Во-первых, мы удалим только что созданного пользователя myuser . Для этого войдите в систему с правами администратора, для которых мы только что восстановили пароль. Затем перейдите в « Управление Jenkins»> «Управление пользователями» и удалите пользователя, которого мы создали ранее.

Во-вторых, нам нужно удалить запись пользователя из тегаassignSIDs в файле config.xml . Наконец, отключите функцию регистрации, установив для флага disableSignup значение true.

Это решение не наносит никакого вреда безопасности Дженкинса. Полезно, когда пользователи управляются с помощью ролевого механизма с помощью плагина Role-based Authorization Strategy .

5. Удалить конфигурации

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

5.1. Удалить атрибуты конфигурации

Мы можем удалить атрибуты безопасности useSecurity и авторизацииStrategy из config.xml , чтобы отключить параметры безопасности в Jenkins:

$ sudo ex +g/useSecurity/d +g/authorizationStrategy/d -scwq /var/lib/jenkins/config.xml

Давайте перезапустим сервер Jenkins. Получив доступ к Jenkins, мы можем снова включить безопасность на странице Configure Global Security в консоли Jenkins.

5.2. Удалить файл конфигурации

Мы также можем удалить файл Jenkins config.xml , чтобы отключить безопасность:

$ rm -f /var/lib/jenkins/config.xml

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

Опять же, нам нужно перезапустить сервер Jenkins, чтобы изменения вступили в силу.

6. Заключение

В этой статье мы рассмотрели разные подходы к восстановлению доступа к консоли Jenkins после потери пароля.

Во-первых, мы искали способ полностью отключить защиту. Это также повлияет на других пользователей. Поэтому не рекомендуется.

Далее мы сбрасываем пароль, переопределяя хэш в файле Jenkins config.xml и создавая другого пользователя-администратора. Это идеальный способ решить проблему, не мешая другим аспектам Jenkins.

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