如何通过命令行重置Jenkins安全设置?

246

我是否有办法在没有用户/密码的情况下从命令行重置所有安全设置(或仅禁用安全设置),因为我已经完全锁定了自己无法进入 Jenkins

25个回答

323

最简单的解决方案是完全禁用安全性 - 在/var/lib/jenkins/config.xml文件中将true更改为false

<useSecurity>true</useSecurity>
一个一句话代码实现相同效果的方法:
sed -i 's/<useSecurity>true<\/useSecurity>/<useSecurity>false<\/useSecurity>/g' /var/lib/jenkins/config.xml

然后重新启动Jenkins:

sudo service jenkins restart

然后转到管理面板并再次设置所有内容。

如果您在Kubernetes pod中运行Jenkins并且无法运行service命令,则可以通过删除pod来重新启动Jenkins:

kubectl delete pod <jenkins-pod-name>

一旦命令被执行,Kubernetes将终止旧的Pod并启动一个新的Pod。


3
我需要重新启动Jenkins才能应用更改。 - Or Arbel
12
重新启动 Jenkins 服务命令:sudo service jenkins restart - MonoThreaded
11
对于无法找到他们的 config.xml 文件的人,请在终端中使用命令 find / -name "config.xml" 进行查找。 - Laser Hawk
1
这会使您的Jenkins安装在重新创建配置时处于未安全状态。我更喜欢aruseni下面的答案。 - kontextify
1
sed -i 's/<useSecurity>true</useSecurity>/<useSecurity>false</useSecurity>/g' config.xml - Kerry Jiang
显示剩余8条评论

205

另一种方法是手动编辑您的用户配置文件(例如 /var/lib/jenkins/users/用户名/config.xml),并更新 passwordHash 的内容:

<passwordHash>#jbcrypt:$2a$10$razd3L1aXndFfBNHO95aj.IVrFydsxkcQCcLmujmFQzll3hcUrY7S</passwordHash>

完成此操作后,只需重新启动Jenkins,并使用此密码登录:

test

1
如果这个条目不存在,应该把它放在哪里? - serup
3
<passwordHash> XML标签是<hudson.security.HudsonPrivateSecurityRealm_-Details>的子级。 查看默认管理员用户,以了解完整的XML结构。 - ivandov
3
这是一个保持安装安全的好解决方案。出于好奇,如何生成密码哈希? - kontextify
2
修改位于 C:\Users<USER>.jenkins\users\admin 的文件内容有助于解决问题。 - Sakshi Singla
1
感谢您的精彩回答。针对之前@kontextify的问题,我认为分享答案的用户已经自己加密了密码“test”,并与我们分享了哈希值。理想情况下,从哈希值中无法获取密码:D。 - bem22
显示剩余6条评论

46

<passwordHash>元素在users/<username>/config.xml中将接受以下格式的数据

salt:sha256("password{salt}")

如果您的盐值是bar,密码是foo,那么可以按照以下方式生成SHA256:

echo -n 'foo{bar}' | sha256sum

你应该得到7f128793bc057556756f4195fb72cdc5bd8c5a74dee655a6bfb59b4a4c4f4349作为结果。将哈希和盐放入<passwordHash>中:

<passwordHash>bar:7f128793bc057556756f4195fb72cdc5bd8c5a74dee655a6bfb59b4a4c4f4349</passwordHash>

重新启动Jenkins,然后尝试使用密码foo登录。然后将您的密码重置为其他内容(Jenkins默认使用bcrypt,并且一轮SHA256不是存储密码的安全方式。重置密码时会存储一个bcrypt哈希值。)


1
这似乎不起作用。一个例子以#jbscrypt的盐开始,然后定义了加密字段$2a$10$。这些是什么意思? - jrwren
我的答案对我有效。您看到的其他字段是用于不同哈希格式的。Jenkins用于处理哈希密码的库支持多种格式。您提到的jbcrypt格式比带有盐的sha256更安全,但是可以轻松地从命令行生成sha256 + salt格式---请记住,练习的重点是重新进入Jenkins,然后从Jenkins的Web界面更改密码。 - uckelman
这对我也没有用。我会尝试找到更多关于bcrypt的信息。 - Laurent Picquet
它对我有用。我使用了以下命令:PASSWORD_DIGEST="$(echo -n "${ADMIN_PASSWORD}{${SALT}}" | sha256sum | awk '{print $1}')" echo "password digest: $PASSWORD_DIGEST" sed -i -e "s#.*#${SALT}:${PASSWORD_DIGEST}#" "/usr/share/jenkins/ref/users/admin/config.xml" sed -i -e "s#.*#${API_TOKEN}#" "/usr/share/jenkins/ref/users/admin/config.xml" - Laurent Picquet
非常感谢。使用完全相同的数值,它像魔法一样正常工作了。我已经重新登录并重置了密码。 - user3837712
注意<passwordHash>中的bar:这是您的盐。删除元素中的所有内容,添加“bar:”,然后添加您的哈希结果。 - Virmundi

44

我发现有问题的文件位于/var/lib/jenkins中的config.xml,修改该文件可以解决此问题。


1
我正在使用El-Capitan,但在该位置找不到config.xml文件。 - Durai Amuthan.H
@DuraiAmuthan.H 你是用 bitnami stack 安装的吗?配置文件会在 /Applications/jenkins-2.19.3-0/apps/jenkins/jenkins_home/users/admin/config.xml - siegy22
@ryanzec,Nowakers的答案使用了相同的文件,但解释得更好,你应该考虑接受它作为正确答案。 - Katu
在 High Sierra 中我们会在哪里找到文件? - prabakaran iOS

26
在El-Capitan中,无法在/var/lib/jenkins/找到config.xml文件。相应地,它可以在~/.jenkins中找到。然后,按照其他人提到的打开config.xml文件,并进行以下更改:
  • <useSecurity>true</useSecurity>替换为<useSecurity>false</useSecurity>

  • 删除<authorizationStrategy><securityRealm>

  • 保存并重新启动jenkins(sudo service jenkins restart


我实际上无法编辑config.xml文件。当我尝试使用vim保存它时,它会抛出只读文件的错误,并且不允许进行写入访问的操作。 - Emjey

19

修改的答案是正确的。但是,如果您启用了“基于项目的矩阵授权策略”,/var/lib/jenkins/config.xml看起来应该是这样的。删除/var/lib/jenkins/config.xml并重新启动jenkins也可以解决问题。我还删除了/var/lib/jenkins/users中的用户,从零开始。

<authorizationStrategy class="hudson.security.ProjectMatrixAuthorizationStrategy">
    <permission>hudson.model.Computer.Configure:jenkins-admin</permission>
    <permission>hudson.model.Computer.Connect:jenkins-admin</permission>
    <permission>hudson.model.Computer.Create:jenkins-admin</permission>
    <permission>hudson.model.Computer.Delete:jenkins-admin</permission>
    <permission>hudson.model.Computer.Disconnect:jenkins-admin</permission>
    <!-- if this is missing for your user and it is the only one, bad luck -->
    <permission>hudson.model.Hudson.Administer:jenkins-admin</permission>
    <permission>hudson.model.Hudson.Read:jenkins-admin</permission>
    <permission>hudson.model.Hudson.RunScripts:jenkins-admin</permission>
    <permission>hudson.model.Item.Build:jenkins-admin</permission>
    <permission>hudson.model.Item.Cancel:jenkins-admin</permission>
    <permission>hudson.model.Item.Configure:jenkins-admin</permission>
    <permission>hudson.model.Item.Create:jenkins-admin</permission>
    <permission>hudson.model.Item.Delete:jenkins-admin</permission>
    <permission>hudson.model.Item.Discover:jenkins-admin</permission>
    <permission>hudson.model.Item.Read:jenkins-admin</permission>
    <permission>hudson.model.Item.Workspace:jenkins-admin</permission>
    <permission>hudson.model.View.Configure:jenkins-admin</permission>
    <permission>hudson.model.View.Create:jenkins-admin</permission>
    <permission>hudson.model.View.Delete:jenkins-admin</permission>
    <permission>hudson.model.View.Read:jenkins-admin</permission>
  </authorizationStrategy>

17

我们可以在保持安全性的前提下重置密码。

/var/lib/Jenkins/users/admin/中的config.xml文件类似于Linux或类UNIX系统中的/etc/shadow文件或Windows中的SAM文件,因为它存储帐户密码的哈希。

如果需要在未登录情况下重置密码,则可以编辑此文件,并用从bcrypt生成的新哈希替换旧哈希:

$ pip install bcrypt
$ python
>>> import bcrypt
>>> bcrypt.hashpw("yourpassword", bcrypt.gensalt(rounds=10, prefix=b"2a"))
'YOUR_HASH'

这将输出您的哈希值,并带有前缀2a,这是Jenkins哈希的正确前缀。

现在,编辑config.xml文件:

...
<passwordHash>#jbcrypt:REPLACE_THIS</passwordHash>
...

一旦您插入了新的哈希值,请重置Jenkins:

(如果您在使用systemd系统):

sudo systemctl restart Jenkins

你现在可以登录了,而且你没有将你的系统开着一秒钟。


它有效了,但是要强调一下,方法hashpw需要一个bytes参数而不是str,祝好 :) - Manuel Lazo

15

为了在 Linux 中简单地禁用 Jenkins 安全性,请运行以下命令:

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

这将从您的config.xml根配置文件中删除useSecurityauthorizationStrategy行,并重新启动您的Jenkins。

另请参阅:在Jenkins网站上禁用安全性


在获得对Jenkins的访问权限后,您可以通过选择访问控制/安全域在您的配置全局安全性页面中重新启用安全性。然后别忘了创建管理员用户


它对我起作用了,但现在它跳过了授权。 - hemanto
@hemanto 你需要启用安全性以重新启用授权。我已经更新了答案。 - kenorb

14
如果您正在使用矩阵权限(可能很容易适应其他登录方法)并且希望在不禁用安全性的情况下重置它,请执行以下操作:
  1. config.xml中,将disableSignup设置为false
  2. 重新启动Jenkins。
  3. 转到Jenkins网页并使用新用户注册
  4. config.xml中,复制一个<permission>hudson.model.Hudson.Administer:username</permission>行,并将username替换为新用户。
  5. 如果是私有服务器,请在config.xml中将disableSignup设置回true
  6. 重新启动Jenkins。
  7. 转到Jenkins网页并以新用户身份登录
  8. 重置原始用户的密码
  9. 以原始用户身份登录

可选清理:

  1. 删除新用户。
  2. 删除config.xml中的临时<permission>行。

此答案期间未对安全性造成任何伤害。


将“disableSignup”添加到清理集中,将其设置为“true”,然后重新启动Jenkins。 - Marc
将新用户(kapil)添加到assignedSIDs标签中,如下所示:<assignedSIDs><sid>kapil</sid></assignedSIDs>在config.xml文件中操作成功。 - Kapil Khandelwal

14

假如您因为权限问题而不小心将自己锁出Jenkins,并且您没有服务器端的访问权限去切换至jenkins用户或root用户... 您可以在Jenkins中创建一个作业,并将以下内容添加至Shell脚本:

sed -i 's/<useSecurity>true/<useSecurity>false/' ~/config.xml

然后点击“立即构建”按钮并重新启动 Jenkins(如果需要的话,也可以重新启动服务器!)


1
如果您被锁定在Jenkins中,如何创建一个作业? - Gerold Broser
在这种情况下,我使用一个已登录的普通Chrome窗口,更改了安全设置,并在隐身窗口中进行了测试,然后退出主窗口。测试没有让我登录,但我的会话仍然存在于主窗口中,所以我可以修复损坏。 - Nick
1
我相信我更改的安全设置中的一部分也意味着我的身份验证会话不再具有更改Jenkins安全配置的权限。 - Nick
在激活ProjectMatrixAuthorization后遇到了这个问题。当我进行更改并重新启动Jenkins时,我在Jenkins-UI中看到了一个Java异常。为了解决这个问题,我还删除了带有authorizationStrategy的行,然后一切都恢复正常了。Jenkins在下一次启动时将其重新添加为空标记。 - Peter Schneider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接