繁体   English   中英

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

[英]How to reset Jenkins security settings from the command line?

有没有办法在没有用户/密码的情况下从命令行重置所有(或只是禁用安全设置),因为我已经设法将自己完全锁定在Jenkins之外?

最简单的解决方案是完全禁用安全性 - 在/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

然后只需重新启动詹金斯:

sudo service jenkins restart

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

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

kubectl delete pod <jenkins-pod-name>

一旦发出命令,Kubernetes 将终止旧的 pod 并启动一个新的 pod。

另一种方法是手动编辑用户的配置文件(例如 /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}")

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

echo -n 'foo{bar}' | sha256sum

你应该得到7f128793bc057556756f4195fb72cdc5bd8c5a74dee655a6bfb59b4a4c4f4349作为结果。 取散列并将其与盐一起放入<passwordHash>

<passwordHash>bar:7f128793bc057556756f4195fb72cdc5bd8c5a74dee655a6bfb59b4a4c4f4349</passwordHash>

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

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

在 El-Capitan config.xml中找不到

/var/lib/詹金斯/

它可以在

〜/ .詹金斯

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

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

  • 删除<authorizationStrategy><securityRealm>

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

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

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

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

可选清理:

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

在这个回答过程中没有证券受到损害。

在偶然的情况下,由于权限错误,您不小心将自己锁定在 Jenkins 之外,并且您没有服务器端访问权限来切换到 jenkins 用户或 root ……您可以在 Jenkins 中工作并将其添加到 Shell 脚本中:

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

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

要在 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 的访问权限后,您可以通过选择Access Control/Security Realm在“配置全局安全性”页面中重新启用安全性。 之后不要忘记创建 admin 用户

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

/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

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

\.jenkins\secrets\initialAdminPassword

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

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

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

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

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

<useSecurity>true</useSecurity>

到,

<useSecurity>false</useSecurity>

第 1 步:转到目录 cd .jenkins/secrets 然后你会得到一个“initialAdminPassword”。

第 2 步:nano 初始管理员密码

你会得到一个密码

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

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

解决这个问题的简单方法是使用 admin psw 以您的管理员用户身份登录:

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

如果没有 xclip,请安装它:

  • $ sudo apt-get install xclip

Jenkins 超越 KUBENETES 和 Docker

如果Jenkins在由Kubernetes POD管理的容器上有点复杂,因为: kubectl exec PODID --namespace=jenkins -it -- /bin/bash您是否允许直接访问运行 Jenkins 的容器,但是您将没有 root 访问权限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文件/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
[...]

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

最简单的方法是收回config.xml并使用 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 在服务器启动之前不存在.

我有一个类似的问题,按照 ArtB 的回复,

我发现我的用户没有正确的配置。 所以我做了什么:

注意:手动修改此类 XML 文件是有风险的。 风险自负。 因为我已经被锁定了,我没有什么可失去的。 AFAIK 最坏的情况我会删除 ~/.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>

编辑文件 $JENKINS_HOME/config.xml 并使用以下内容更改 de security 配置:

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

之后重新启动詹金斯。

对于使用 macOS 的用户,只需通过 homebrew 安装新版本即可。 所以为了休息,这个命令行必须使用:

brew services restart jenkins-lts

windows中文件所在目录config.xml

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

我将根据解决方案添加一些改进:

在我的场景中,它使用带有 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM