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

2024-10-31 08:38:00
admin
原创
46
摘要:问题描述:有没有办法从命令行重置所有内容(或仅禁用安全设置),而无需用户/密码,因为我已设法完全将自己锁定Jenkins?解决方案 1:最简单的解决方案是完全禁用安全性 - 更改true为false文件/var/lib/jenkins/config.xml。<useSecurity>tru...

问题描述:

有没有办法从命令行重置所有内容(或仅禁用安全设置),而无需用户/密码,因为我已设法完全将自己锁定Jenkins


解决方案 1:

最简单的解决方案是完全禁用安全性 - 更改truefalse文件/var/lib/jenkins/config.xml

<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。

解决方案 2:

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

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

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

test

解决方案 3:

<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 哈希值。)

解决方案 4:

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

解决方案 5:

在 El-Capitan 中找不到config.xml

/var/lib/詹金斯/

它有

〜/ .詹金斯

然后按照其他人提到的打开config.xml文件并进行以下更改

  • 在此替换<useSecurity>true</useSecurity><useSecurity>false</useSecurity>

  • 移除<authorizationStrategy><securityRealm>

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

解决方案 6:

修改的答案是正确的。但是,我认为应该提到,/var/lib/jenkins/config.xml如果您已激活“基于项目的矩阵授权策略”,则看起来像这样。删除/var/lib/jenkins/config.xml并重新启动詹金斯也可以解决问题。我还删除了用户以/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>

解决方案 7:

我们可以在保持安全性的同时重置密码。

/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

您现在可以登录,并且您一秒钟都没有离开系统。

解决方案 8:

要在 Linux 中以简单的步骤禁用 Jenkins 安全性,请运行以下命令:

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

它将从你的根配置文件中删除行useSecurity并重新启动你的 Jenkins。authorizationStrategy`config.xml`

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


获得 Jenkins 访问权限后,您可以通过选择“访问控制/安全领域”在“配置全局安全”页面中重新启用安全性。之后,不要忘记创建管理员用户。

解决方案 9:

如果您使用矩阵权限(可能很容易适应其他登录方法),则要在不禁用安全性的情况下重置它:

  1. 在 中config.xml,设置disableSignupfalse

  2. 重新启动Jenkins。

  3. 进入 Jenkins 网页并注册一个新用户

  4. 在 中config.xml,复制其中一行<permission>hudson.model.Hudson.Administer:username</permission>并替换username为新用户。

  5. 如果是私人服务器,请设置disableSignup回。true`config.xml`

  6. 重新启动Jenkins。

  7. 进入 Jenkins 网页并以新用户身份登录

  8. 重置原用户的密码。

  9. 以原始用户身份登录。

可选清理:

  1. 删除新用户。

  2. <permission>删除中的临时行config.xml

此次答复并未损害任何证券。

解决方案 10:

万一您由于权限错误而意外将自己锁定在 Jenkins 之外,并且您没有服务器端访问权限来切换到 jenkins 用户或 root...您可以在 Jenkins 中创建一份工作并将其添加到 Shell 脚本中:

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

然后单击“立即构建”并重新启动 Jenkins(或服务器,如果需要!)

解决方案 11:

.jenkinssecretsinitialAdminPassword

从 initialAdminPassword 文件复制密码并将其粘贴到 Jenkins 中。

解决方案 12:

1 首先检查位置是否安装了 war 或 Linux 或 windows

例如,如果在 Linux 下发生战争并且针对管理员用户

/home/"User_NAME"/.jenkins/users/admin/config.xml

转到#jbcrypt 后的此标签:

<passwordHash>#jbcrypt:$2a$10$3DzCGLQr2oYXtcot4o0rB.wYi5kth6e45tcPpRFsuYqzLZfn1pcWK</passwordHash>

使用任何网站的 bcrypt 哈希生成器更改此密码

https://www.dailycred.com/article/bcrypt-calculator

确保它以$2a开头,因为 jenkens 使用这个

解决方案 13:

为了删除 Windows 操作系统中 jenkins 的默认安全性,

您可以遍历 /users/{UserName}/.jenkins 内创建的 Config.xml 文件。

在此文件中,你可以更改代码

<useSecurity>true</useSecurity>

到,

<useSecurity>false</useSecurity>

解决方案 14:

步骤 1:转到目录 cd .jenkins/secrets 然后您将获得“initialAdminPassword”。

步骤 2:nano initialAdminPassword

你会得到一个密码

解决方案 15:

更改<useSecurity>true</useSecurity><useSecurity>false</useSecurity>是不够的,您还应该删除<authorizationStrategy><securityRealm>元素,然后通过执行以下操作重新启动 Jenkins 服务器sudo service jenkins restart

请记住,设置<usesecurity>false仅可能会给您带来问题,因为这些说明在此处的官方文档中提到。

解决方案 16:

Jenkins 与 KUBENETES 和 Docker

对于由Kubernetes POD管理的容器中的Jenkins来说,情况会稍微复杂一些,因为:您将允许直接访问运行 Jenkins 的容器,但您将没有 root 访问权限,并且许多命令不可用,因此需要一种解决方法。kubectl exec PODID --namespace=jenkins -it -- /bin/bash`sudo`vi

用于kubectl describe pod [...]查找运行 Pod 的节点和容器 ID(docker://...)

  • SSH进入节点

  • 运行docker exec -ti -u root -- /bin/bash以使用 Root 权限访问容器

  • apt-get update

  • sudo apt-get install vim

第二个区别是 Jenkins 配置文件放在与持久卷的挂载点相对应的不同路径中,即/var/jenkins_home,此位置将来可能会发生变化,请在运行中检查df

然后禁用安全性-在文件中将 true 更改为 false /var/jenkins_home/jenkins/config.xml

<useSecurity>false</useSecurity>

现在只需重新启动 Jenkins,该操作将导致容器和 Pod 死亡,但由于持久卷的存在,它将在几秒钟内再次创建并更新配置(并且所有机会如 vi,更新都会被删除)。

整个解决方案已在 Google Kubernetes Engine 上进行了测试。
更新
请注意,即使没有 root 访问权限,您也可以ps -aux以纯文本形式显示密码。

jenkins@jenkins-87c47bbb8-g87nw:/$ps -aux
[...]
jenkins [..] -jar /usr/share/jenkins/jenkins.war --argumentsRealm.passwd.jenkins=password --argumentsRealm.roles.jenkins=admin
[...]

解决方案 17:

我会在解决方案的基础上增加一些改进:

在我的场景中,它是使用带有 nfs 卷的 Swarm 集群部署的,为了执行密码重置,我执行以下操作:

  • 附加到 pod:

$ docker exec -it <pod-name> bash
  • b用python生成哈希密码(不要忘记指定引用密码外面的字母,该方法hashpw需要一个以字节为单位的参数):

$ pip install bcrypt
$ python
>>> import bcrypt
>>> bcrypt.hashpw(b"yourpassword", bcrypt.gensalt(rounds=10, prefix=b"2a"))
'YOUR_HASH'
  • 进入容器后找到所有config.xml文件:

$ find /var/ -type f -iname "config.xml"
  • 一旦确定,修改字段的值(就我而言,config.xml 在另一个位置):

$ vim /var/jenkins_home/users/admin_9482805162890262115/config.xml
...
<passwordHash>#jbcrypt:YOUR_HASH</passwordHash>
...
  • 重启服务:

docker service scale <service-name>=0
docker service scale <service-name>=1

希望这对任何人都有帮助。

解决方案 18:

解决此问题的简单方法是使用管理员密码以管理员用户身份登录:

  • 更改为 root 用户:sudo su -

  • 复制密码:xclip -sel clip < /var/lib/jenkins/secrets/initialAdminPassword

  • 以管理员身份登录并按下ctrl + v密码输入框。

如果你没有 xclip,请安装:

  • $ sudo apt-get install xclip

解决方案 19:

使用 bcrypt 可以解决这个问题。为那些试图使用 bash 和 python 自动化该过程的人扩展 @Reem 的答案。

#!/bin/bash

pip install bcrypt
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install xmlstarlet

cat > /tmp/jenkinsHash.py <<EOF
import bcrypt
import sys

if not sys.argv[1]:
  sys.exit(10)

plaintext_pwd=sys.argv[1]
encrypted_pwd=bcrypt.hashpw(sys.argv[1], bcrypt.gensalt(rounds=10, prefix=b"2a"))
isCorrect=bcrypt.checkpw(plaintext_pwd, encrypted_pwd)

if not isCorrect:
   sys.exit(20);

print "{}".format(encrypted_pwd)
EOF

chmod +x /tmp/jenkinsHash.py
cd /var/lib/jenkins/users/admin*
pwd
while (( 1 )); do
    echo "Waiting for Jenkins to generate admin user's config file ..."

    if [[ -f "./config.xml" ]]; then
        break
    fi

    sleep 10
done

echo "Admin config file created"

admin_password=$(python /tmp/jenkinsHash.py password 2>&1)

# Repalcing the new passowrd
xmlstarlet -q ed --inplace -u "/user/properties/hudson.security.HudsonPrivateSecurityRealm_-Details/passwordHash" -v '#jbcrypt:'"$admin_password" config.xml

# Restart
systemctl restart jenkins
sleep 10

我在这里将密码硬编码,但根据要求,密码可以是用户输入的。另外,请确保添加该密码,sleep否则围绕 Jenkins 的任何其他命令都将失败。

解决方案 20:

要非常简单地禁用安全性和启动向导,请使用 JAVA 属性:

-Djenkins.install.runSetupWizard=false

它的优点在于您可以在 Docker 镜像中使用它,这样您的容器将始终立即启动而无需登录屏幕:

# Dockerfile
FROM jenkins/jenkins:lts
ENV JAVA_OPTS -Djenkins.install.runSetupWizard=false

请注意,正如其他人所提到的,Jenkins config.xml 位于/var/jenkins_home图像中,但使用sed从 Dockerfile 修改它失败,因为(大概)config.xml 在服务器启动之前不存在。

解决方案 21:

我遇到了类似的问题,根据 ArtB 的回复,

我发现我的用户没有正确的配置。所以我做了以下事情:

注意:手动修改此类 XML 文件是有风险的。请自行承担风险。由于我已经被锁定,所以我没什么可失去的。据我所知,最糟糕的情况是,我会删除上一篇文章中提到的 ~/.jenkins/config.xml 文件。

**> 1. ssh 到 jenkins 机器

  1. cd ~/.jenkins (我猜有些安装会把它放在 /var/lib/jenkins/config.xml 下,但我的情况不是)

  2. vi config.xml,在 authorizationStrategy xml 标签下,添加以下部分(只使用我的用户名而不是“put-your-username”)

  3. 重新启动詹金斯。在我的情况下,以 root 身份服务 tomcat7 停止;;服务 tomcat7 启动

  4. 尝试再次登录。(对我有用)**

在下面

添加:

<permission>hudson.model.Computer.Build:put-your-username</permission>
<permission>hudson.model.Computer.Configure:put-your-username</permission>
<permission>hudson.model.Computer.Connect:put-your-username</permission>
<permission>hudson.model.Computer.Create:put-your-username</permission>
<permission>hudson.model.Computer.Delete:put-your-username</permission>
<permission>hudson.model.Computer.Disconnect:put-your-username</permission>
<permission>hudson.model.Hudson.Administer:put-your-username</permission>
<permission>hudson.model.Hudson.ConfigureUpdateCenter:put-your-username</permission>
<permission>hudson.model.Hudson.Read:put-your-username</permission>
<permission>hudson.model.Hudson.RunScripts:put-your-username</permission>
<permission>hudson.model.Hudson.UploadPlugins:put-your-username</permission>
<permission>hudson.model.Item.Build:put-your-username</permission>
<permission>hudson.model.Item.Cancel:put-your-username</permission>
<permission>hudson.model.Item.Configure:put-your-username</permission>
<permission>hudson.model.Item.Create:put-your-username</permission>
<permission>hudson.model.Item.Delete:put-your-username</permission>
<permission>hudson.model.Item.Discover:put-your-username</permission>
<permission>hudson.model.Item.Read:put-your-username</permission>
<permission>hudson.model.Item.Workspace:put-your-username</permission>
<permission>hudson.model.Run.Delete:put-your-username</permission>
<permission>hudson.model.Run.Update:put-your-username</permission>
<permission>hudson.model.View.Configure:put-your-username</permission>
<permission>hudson.model.View.Create:put-your-username</permission>
<permission>hudson.model.View.Delete:put-your-username</permission>
<permission>hudson.model.View.Read:put-your-username</permission>
<permission>hudson.scm.SCM.Tag:put-your-username</permission>

现在,你可以朝不同的方向发展。例如,我有 github oauth 集成,所以我可以尝试用下面的代码替换 authorizationStrategy:

注意:在我的情况下,这种方法有效,因为我有一个已配置的特定 github oauth 插件。因此,这种方法比以前的解决方案风险更大。

  <authorizationStrategy class="org.jenkinsci.plugins.GithubAuthorizationStrategy" plugin="github-oauth@0.14">
    <rootACL>
      <organizationNameList class="linked-list">
        <string></string>
      </organizationNameList>
      <adminUserNameList class="linked-list">
        <string>put-your-username</string>
        <string>username2</string>
        <string>username3</string>
        <string>username_4_etc_put_username_that_will_become_administrator</string>
      </adminUserNameList>
      <authenticatedUserReadPermission>true</authenticatedUserReadPermission>
      <allowGithubWebHookPermission>false</allowGithubWebHookPermission>
      <allowCcTrayPermission>false</allowCcTrayPermission>
      <allowAnonymousReadPermission>false</allowAnonymousReadPermission>
    </rootACL>
  </authorizationStrategy>

解决方案 22:

编辑文件 $JENKINS_HOME/config.xml 并使用以下命令更改安全配置:

<authorizationStrategy class="hudson.security.AuthorizationStrategy$Unsecured"/>

之后重新启动 Jenkins。

解决方案 23:

很多时候您没有权限编辑 config.xml 文件。

最简单的方法是使用 sudo 命令返回config.xml并删除。

使用命令重启 jenkinssudo /etc/init.d/jenkins restart

这将禁用 Jenkins 中的所有安全性,并且登录选项将消失

解决方案 24:

对于使用 macOS 的用户,新版本只能通过 homebrew 安装。因此,对于其余用户,必须使用此命令行:

brew services restart jenkins-lts

解决方案 25:

windows中config.xml文件所在目录

C:WindowsSystem32configsystemprofileAppDataLocalJenkins.jenkins
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用