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

是否有一种方法可以从命令行重置所有(或只是禁用安全设置),而不需要用户/密码,因为我已经设法完全锁定自己的Jenkins?

395192 次浏览

我发现有问题的文件位于/var/lib/jenkins中,名为config.xml,修改后解决了这个问题。

关于修改的答案是正确的。然而,我认为应该提到的是,如果你激活了“基于项目的矩阵授权策略”,/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>

我也遇到了类似的问题,在收到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. 重启詹金斯。在我的情况下,根服务tomcat7停止;;服务tomcat7启动
  4. 请重新登录。(为我工作)**
< p >下

添加:

<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集成,所以我可以尝试替换授权策略如下:

注意:,它在我的情况下工作,因为我有一个特定的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>

编辑$JENKINS_HOME/config.xml文件,修改去安全配置如下:

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

之后詹金斯重启。

最简单的解决方案是完全禁用安全性——将true更改为/var/lib/jenkins/config.xml文件中的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将终止旧的吊舱并启动一个新的吊舱。

如果你使用矩阵权限(可能很容易适应其他登录方法),重置不禁用安全性:

  1. config.xml中,将disableSignup设置为false
  2. 重新启动詹金斯。
  3. 去Jenkins的网页和注册一个新用户
  4. config.xml中,复制其中的<permission>hudson.model.Hudson.Administer:username</permission>行,并用新用户替换username
  5. 如果它是一个私有服务器,将disableSignup设置回config.xml中的true
  6. 重新启动詹金斯。
  7. 去Jenkins的网页和以新用户身份登录
  8. 原始用户的重置密码
  9. 登录作为原始用户。

可选的清理:

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

在此回答过程中,没有任何证券受到损害。

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

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

一旦你完成了这些,只要重新启动Jenkins并使用以下密码登录:

test

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

salt:sha256("password{salt}")

所以,如果你的盐是bar,密码是foo,那么你可以像这样生成SHA256:

echo -n 'foo{bar}' | sha256sum

结果应该是7f128793bc057556756f4195fb72cdc5bd8c5a74dee655a6bfb59b4a4c4f4349。取散列并将其与盐一起放入<passwordHash>:

<passwordHash>bar:7f128793bc057556756f4195fb72cdc5bd8c5a74dee655a6bfb59b4a4c4f4349</passwordHash>

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

<useSecurity>true</useSecurity>更改为<useSecurity>false</useSecurity>是不够的,你应该删除<authorizationStrategy><securityRealm>元素,并通过执行sudo service jenkins restart重新启动jenkins服务器。

记住,只将<usesecurity>设置为false可能会给你带来问题,因为这些说明在他们的官方文档在这里中提到了。

在偶然的机会,你不小心锁定自己的Jenkins由于权限错误,你没有服务器端访问切换到Jenkins用户或根…你可以在Jenkins中创建一个作业,并将其添加到Shell脚本中:

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

然后单击Build Now并重新启动Jenkins(如果需要,也可以重启服务器!)

在El-Capitan中config . xml不能在

/var/lib/jenkins/

它可在

~ / .jenkins

然后,如前所述,打开config . xml文件并进行以下更改

  • 其中,将<useSecurity>true</useSecurity>替换为<useSecurity>false</useSecurity>

  • 删除<authorizationStrategy><securityRealm>

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

要在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的访问权限后,您可以通过选择访问控制/安全领域. xml重新启用配置全局安全页中的安全性。之后别忘了创建admin用户

\.jenkins\secrets\initialAdminPassword

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

简单的方法是使用admin psw登录您的admin用户:

  • 更改为root用户:sudo su -
  • 复制密码:xclip -sel clip < /var/lib/jenkins/secrets/initialAdminPassword
  • 用admin登录,在密码输入框上按ctrl + v

安装xclip如果你没有它:

  • $ sudo apt-get install xclip

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

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

在这个文件中,您可以更改代码

<useSecurity>true</useSecurity>

,

<useSecurity>false</useSecurity>

詹金斯对库贝努特斯和多克

在由Kubernetes豆荚管理的容器上的詹金斯的情况下,这有点复杂,因为:kubectl exec PODID --namespace=jenkins -it -- /bin/bash将允许直接访问运行Jenkins的容器,但您将没有根访问权限sudovi和许多命令都不可用,因此需要一个变通方法。

使用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

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

<useSecurity>false</useSecurity>

现在重新启动Jenkins就足够了,这个操作将导致容器和Pod死亡,它将在几秒钟内重新创建,并更新配置(并且由于持久卷,所有的机会都像vi,更新被擦除)。

整个解决方案已在谷歌Kubernetes Engine上测试。 更新 注意,你也可以运行ps -aux,即使没有根访问权限,密码也会以明文形式显示
jenkins@jenkins-87c47bbb8-g87nw:/$ps -aux
[...]
jenkins [..] -jar /usr/share/jenkins/jenkins.war --argumentsRealm.passwd.jenkins=password --argumentsRealm.roles.jenkins=admin
[...]

1首先检查位置,如果你安装战争或Linux或windows基于它

例如,如果战争在Linux和admin用户

/home/" User_NAME“.jenkins /用户/ admin / config . xml

转到#jbcrypt后面的标签:

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

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

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

确保它以2美元开头,因为这个是jenkens使用的

我们可以在打开安全系统的情况下重置密码。

/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

现在您可以登录了,而且您的系统一秒钟都没有打开。

步骤1:进入目录cd .jenkins/secrets,然后你会得到一个'initialAdminPassword'。

step-2: nano initialAdminPassword

你会得到一个密码

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

最简单的方法是取config.xml的back,然后使用sudo命令删除。

使用sudo /etc/init.d/jenkins restart命令重新启动jenkins

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

使用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的命令都将失败。

要非常简单地禁用安全性和启动向导,请使用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在服务器启动之前不存在。

对于使用macOS的用户来说,新版本只能通过自制软件安装。所以为了休息,这个命令行必须使用:

brew services restart jenkins-lts

windows下文件所在的目录config.xml

C:\Windows\System32\config\systemprofile\AppData\Local\Jenkins\.jenkins

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

  • https://stackoverflow.com/a/51255443/5322871 < a href = " https://stackoverflow.com/a/51255443/5322871 " > < / >

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

  • 附着在豆荚上:
$ docker exec -it <pod-name> bash
  • 使用python生成哈希密码(不要忘记在引用的密码之外指定字母b,方法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

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