如何从命令行重置 Jenkins 安全设置?
Posted
技术标签:
【中文标题】如何从命令行重置 Jenkins 安全设置?【英文标题】:How to reset Jenkins security settings from the command line? 【发布时间】:2011-10-22 18:18:58 【问题描述】:有没有办法在没有用户/密码的情况下从命令行重置所有(或只是禁用安全设置),因为我已经设法将自己完全锁定在Jenkins
之外?
【问题讨论】:
【参考方案1】:最简单的解决方案是完全禁用安全性 - 将 /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 并启动一个新的。
【讨论】:
我需要重新启动 Jenkins 才能应用更改。sudo service jenkins restart
对于那些在他们的 config.xml 中找不到它的人,请在终端中使用 find / -name "config.xml"
。
这会使您的 Jenkins 安装在您重新创建配置时不安全。我更喜欢下面aruseni的回答。
文件也可以位于 ~/.jenkins/ 文件夹下【参考方案2】:
对于使用 macOS 的人来说,新版本可以通过 homebrew 安装。所以为了休息,这个命令行必须使用:
brew services restart jenkins-lts
【讨论】:
【参考方案3】:要非常简单地禁用安全和启动向导,请使用 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 不存在直到服务器启动。
【讨论】:
【参考方案4】:使用 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 的命令都会失败。
【讨论】:
【参考方案5】:很多时候您没有权限编辑 config.xml 文件。
最简单的方法是返回config.xml
并使用 sudo 命令删除。
使用命令sudo /etc/init.d/jenkins restart
重启jenkins
这将禁用 Jenkins 中的所有安全性,登录选项将消失
【讨论】:
如果你可以用 sudo 删除 config.xml,你也可以用 sudo 编辑它。例如须藤 vi ...【参考方案6】:第 1 步:转到目录 cd .jenkins/secrets 然后你会得到一个“initialAdminPassword”。
第 2 步:纳米初始管理员密码
你会得到一个密码
【讨论】:
这不能回答问题。【参考方案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】:如果您安装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 使用的
【讨论】:
【参考方案9】:Jenkins 在 KUBENETES 和 Docker 上
如果 Jenkins 在由 Kubernetes POD 管理的容器上,则稍微复杂一些,因为:kubectl exec PODID --namespace=jenkins -it -- /bin/bash
您是否允许直接访问运行 Jenkins 的容器,但您将没有 root 访问权限、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
。
然后禁用安全性 - 在 /var/jenkins_home/jenkins/config.xml
文件中将 true 更改为 false。
<useSecurity>false</useSecurity>
现在重启 Jenkins 就足够了,这将导致容器和 Pod 死掉,它会在几秒钟内再次创建并更新配置(以及所有机会,如 vi,删除更新),这要归功于持久性音量。
整个解决方案已在 Google Kubernetes Engine 上进行了测试。
更新
请注意,您也可以运行ps -aux
,即使没有 root 访问权限,也会以纯文本形式显示密码。
jenkins@jenkins-87c47bbb8-g87nw:/$ps -aux
[...]
jenkins [..] -jar /usr/share/jenkins/jenkins.war --argumentsRealm.passwd.jenkins=password --argumentsRealm.roles.jenkins=admin
[...]
【讨论】:
【参考方案10】:要在 Linux 中通过简单的步骤禁用 Jenkins 安全性,请运行以下命令:
sudo ex +g/useSecurity/d +g/authorizationStrategy/d -scwq /var/lib/jenkins/config.xml
sudo /etc/init.d/jenkins restart
它将从您的 config.xml
根配置文件中删除 useSecurity
和 authorizationStrategy
行并重新启动您的 Jenkins。
另请参阅:Disable security Jenkins 网站
获得对 Jenkins 的访问权限后,您可以通过选择 Access Control/Security Realm 在您的配置全局安全性页面中重新启用安全性。之后别忘了create the admin user。
【讨论】:
它对我有用,但是,它现在正在跳过授权。 @hemanto 您需要启用安全性才能重新启用授权。我已经更新了答案。【参考方案11】:为了在 Windows 操作系统中移除 jenkins 的默认安全性,
您可以遍历 /users/UserName/.jenkins 内部创建的文件 Config.xml。
在这个文件中你可以修改代码
<useSecurity>true</useSecurity>
到,
<useSecurity>false</useSecurity>
【讨论】:
【参考方案12】:解决这个问题的简单方法是使用管理员密码以您的管理员用户登录:
更改为root用户:sudo su -
复制密码:xclip -sel clip < /var/lib/jenkins/secrets/initialAdminPassword
用管理员登录,在密码输入框按ctrl + v
。
如果没有,请安装 xclip:
$ sudo apt-get install xclip
【讨论】:
使用默认密码对我有用。为简单起见,您可以只执行“cat secrets/initialAdminPassword”,而不是一次性安装 xclip。 有时此密码不存在。我不确定如何绕过此配置,但对我来说,它不存在,我必须编辑 config.xml【参考方案13】:\.jenkins\secrets\initialAdminPassword
从 initialAdminPassword 文件中复制密码并将其粘贴到 Jenkins。
【讨论】:
【参考方案14】:在 El-Capitan config.xml 中找不到
/var/lib/jenkins/
它在
中可用~/.jenkins
然后像其他提到的那样打开 config.xml 文件并进行以下更改
在此将<useSecurity>true</useSecurity>
替换为<useSecurity>false</useSecurity>
删除<authorizationStrategy>
和<securityRealm>
保存并重启jenkins(sudo service jenkins restart)
【讨论】:
我实际上无法编辑 config.xml 文件。当我尝试使用 vim 保存它时,它会抛出它是一个只读文件,并且不允许对其进行写访问的操作。【参考方案15】:如果您由于权限错误而意外将自己锁定在 Jenkins 之外,并且您没有服务器端访问权限来切换到 jenkins 用户或 root...您可以在 Jenkins 中工作并将其添加到外壳脚本:
sed -i 's/<useSecurity>true/<useSecurity>false/' ~/config.xml
然后单击立即构建并重新启动 Jenkins(如果需要,也可以重新启动服务器!)
【讨论】:
如何在 Jenkins 中创建工作,以防自己被锁定在工作之外? 在这种情况下,我登录了一个普通的 Chrome 窗口,并在退出主窗口之前更改了安全设置并在隐身窗口中进行了测试。测试没有让我登录,但我的会话仍然在主窗口中,因此我可以修复损坏。 我相信我更改的部分安全设置也意味着我的身份验证会话不再有权更改 Jenkins 安全配置。 激活ProjectMatrixAuthorization
后遇到这个问题。当我进行更改并重新启动 Jenkins 时,我在 Jenkins-UI 中看到了 Java 异常。为了解决这个问题,我还删除了authorizationStrategy
的行,它又好了。詹金斯在下一次开始时将其读取为空标签。【参考方案16】:
将<useSecurity>true</useSecurity>
更改为<useSecurity>false</useSecurity>
是不够的,您还应该删除<authorizationStrategy>
和<securityRealm>
元素并通过执行sudo service jenkins restart
重新启动您的jenkins 服务器。
记住这一点,将<usesecurity>
设置为false
只会给您带来问题,因为这些说明在官方文档here 中有所提及。
【讨论】:
【参考方案17】:users/<username>/config.xml
中的 <passwordHash>
元素将接受以下格式的数据
salt:sha256("passwordsalt")
所以,如果你的 salt 是 bar
,而你的密码是 foo
,那么你可以像这样生成 SHA256:
echo -n 'foobar' | sha256sum
您应该得到7f128793bc057556756f4195fb72cdc5bd8c5a74dee655a6bfb59b4a4c4f4349
作为结果。把哈希和盐一起放入<passwordHash>
:
<passwordHash>bar:7f128793bc057556756f4195fb72cdc5bd8c5a74dee655a6bfb59b4a4c4f4349</passwordHash>
重启 Jenkins,然后尝试使用密码foo
登录。然后将您的密码重置为其他密码。 (Jenkins 默认使用 bcrypt,一轮 SHA256 不是一种安全的密码存储方式。重置密码时会得到一个 bcrypt 哈希值。)
【讨论】:
这似乎不起作用。一个示例以#jbscrypt 的盐开始,然后定义加密字段$2a$10$。这些是什么意思? 我的回答对我有用。您看到的其他字段用于不同的哈希格式。 Jenkins 用于处理散列密码的库支持不止一种格式。您所指的 jbcrypt 格式比使用 salt 的 sha256 更安全,但是可以从命令行轻松生成 sha256+salt 格式——回想一下,练习的重点是回到 Jenkins,然后从 Jenkins 的 Web 界面更改密码。 这对我也不起作用。我会尝试找到更多关于 bcrypt 的信息 它对我有用。我使用了以下命令:``` PASSWORD_DIGEST="$(echo -n "$ADMIN_PASSWORD$SALT" | sha256sum | awk 'print $1')" echo "password digest: $PASSWORD_DIGEST" sed -i -e "s#另一种方法是为您的用户手动编辑配置文件(例如 /var/lib/jenkins/users/username/config.xml)并更新 passwordHash 的内容:
<passwordHash>#jbcrypt:$2a$10$razd3L1aXndFfBNHO95aj.IVrFydsxkcQCcLmujmFQzll3hcUrY7S</passwordHash>
完成此操作后,只需重新启动 Jenkins 并使用此密码登录:
test
【讨论】:
如果该条目不存在怎么办 - 实际放在哪里?<passwordHash>
xml 标签是<hudson.security.HudsonPrivateSecurityRealm_-Details>
的子标签。查看默认管理员用户,了解整个 XML 结构。
这是一个很好的解决方案,可以确保安装安全。出于好奇,如何生成密码哈希?
修改 C:\Users\如果您使用矩阵权限(可能很容易适应其他登录方法),在不禁用安全性的情况下重置它:
-
在
config.xml
中,将disableSignup
设置为false
。
重启 Jenkins。
转到 Jenkins 网页并注册一个新用户。
在config.xml
中,复制<permission>hudson.model.Hudson.Administer:username</permission>
行之一并将username
替换为新用户。
如果是私有服务器,在config.xml
中将disableSignup
设置回true
。
重启 Jenkins。
转到 Jenkins 网页并以新用户身份登录。
重置原用户的密码。
以原始用户身份登录。
可选清理:
-
删除新用户。
删除
config.xml
中的临时<permission>
行。
回答期间没有证券受到损害。
【讨论】:
添加到清理设置 disableSignup 回 true,然后重启 jenkins【参考方案20】:编辑文件 $JENKINS_HOME/config.xml 并使用以下内容更改安全配置:
<authorizationStrategy class="hudson.security.AuthorizationStrategy$Unsecured"/>
然后重启 Jenkins。
【讨论】:
【参考方案21】:我遇到了类似的问题,在 ArtB 回复之后,
我发现我的用户没有正确的配置。所以我做了什么:
注意:手动修改此类 XML 文件是有风险的。风险自负。因为我已经被锁定了,所以我没有什么可失去的。 AFAIK 最坏的情况我会删除 ~/.jenkins/config.xml 文件,如前一篇文章所述。
**> 1. ssh 到 jenkins 机器
cd ~/.jenkins (我猜有些安装把它放在 /var/lib/jenkins/config.xml 下,但在我的情况下不是) vi config.xml,并在authorizationStrategy xml 标签下,添加以下部分(仅使用我的用户名而不是“put-your-username”) 重启詹金斯。在我的情况下,作为 root 服务 tomcat7 停止; ;服务 tomcat7 启动 再次尝试登录。 (为我工作)**
在
添加:
<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】:修改的答案是正确的。但是,我认为应该提到/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>
【讨论】:
【参考方案23】:我在名为 config.xml 的 /var/lib/jenkins 中找到了有问题的文件,并对其进行了修改。
【讨论】:
我正在使用 El-Capitan 并且在该位置找不到 config.xml @DuraiAmuthan.H 您是否使用 bitnami 堆栈安装它?配置文件位于/Applications/jenkins-2.19.3-0/apps/jenkins/jenkins_home/users/admin/config.xml
@ryanzec,Nowakers 的答案使用了相同的文件,但解释得更好,您应该考虑接受它作为正确答案。
我们将在哪里找到 hight sierra 中的文件以上是关于如何从命令行重置 Jenkins 安全设置?的主要内容,如果未能解决你的问题,请参考以下文章
如何从命令提示符设置 Internet Explorer 安全设置