作为一名开发者或运维工程师,当我们第一次在服务器上搭建好 Jenkins 环境时,面对那个神秘的“解锁 Jenkins”页面,往往会产生一丝困惑。这个被严加看管的“初始管理员密码”到底是什么?它藏在哪里?当我们忘记了它又该怎么办?在这篇文章中,我们将深入探讨 Jenkins 默认密码的机制,不仅会带领大家找到这个关键的“钥匙”,还会分享如何通过命令行和界面进行故障排查,以及如何建立一个安全且便于管理的用户体系。我们将从实际操作出发,一步步拆解这些看似复杂但实际上非常有条理的配置过程。
为什么我们需要关注 Jenkins 的默认密码?
Jenkins 作为一个强大的开源自动化服务器,已经成为了现代持续集成和持续交付(CI/CD)流水线的核心组件。它不仅仅是一个简单的构建工具,更是连接开发、测试和生产环境的桥梁。通过使用 Jenkins 流水线,我们可以自动化从代码提交到应用部署的全过程,甚至可以触发 Terraform 来管理和配置我们的基础设施。
正因为 Jenkins 在我们的开发流程中扮演着如此关键的角色——它拥有部署到生产服务器的权限,访问敏感代码库的能力——它的安全性就显得尤为重要。当我们在服务器上完成 Jenkins 的自动安装(例如通过 Docker 容器或系统包管理器)后,系统出于对安全的最基本考虑,并不会让我们直接使用空密码登录,而是强制要求输入一个由系统自动生成的、高强度的初始密码。这是确保只有拥有服务器访问权限的人才能配置 Jenkins 的第一道防线。
探索默认密码的藏身之处
当我们第一次尝试访问 Jenkins 的 Web 界面(通常是 http://your-server-ip:8080)时,迎接我们的不是仪表盘,而是一个名为“解锁 Jenkins”的页面。这个页面要求我们输入“管理员密码”。那么,这个密码究竟在哪里呢?
默认存储路径详解
对于绝大多数标准的 Jenkins 安装(无论是直接安装在 Linux 系统上,还是运行在 Docker 容器中),初始管理员密码都安全地存储在服务器的一个特定文件中。默认的绝对路径如下:
# Jenkins 初始管理员密码的默认存储路径
/var/jenkins_home/secrets/initialAdminPassword
路径解析:
- INLINECODEc1683595:这是 Jenkins 的主目录(JENKINSHOME),存储了所有的配置数据、工作空间和插件信息。如果你使用的是 Docker 容器,这个路径通常是容器内的挂载点。
/secrets/:这是一个专门用于存放敏感信息的子目录。initialAdminPassword:这就是包含那个神秘密码的文本文件。
如何获取并使用该密码
作为拥有服务器访问权限的管理员,我们可以通过 SSH 或终端直接读取这个文件。让我们来看看具体的操作步骤和对应的代码示例。
操作场景:在 Docker 容器中查找密码
如果你是通过 Docker 运行 Jenkins 的,首先需要进入容器的 shell 环境。
# 1. 列出正在运行的容器,找到 Jenkins 容器的 ID 或名称
docker ps
# 2. 使用 exec 命令进入容器的 bash 环境
docker exec -it /bin/bash
# 3. 进入容器后,直接使用 cat 命令查看密码文件
cat /var/jenkins_home/secrets/initialAdminPassword
操作场景:在 Linux 主机上直接查找
如果你将 Jenkins 直接安装在了宿主机上,操作会更加简单。
# 直接使用 cat 命令读取文件内容
# 通常需要使用 sudo 权限,因为该文件属于 Jenkins 用户
sudo cat /var/jenkins_home/secrets/initialAdminPassword
执行上述命令后,终端会输出一串看似随机的字母和数字组合(通常是一个 32 位的哈希值)。这就是我们需要用来解锁 Jenkins 的“金钥匙”。此时,我们只需复制这段字符串,将其粘贴到 Web 界面的“管理员密码”输入框中,点击“继续”,即可进入 Jenkins 的初始化向导。
从临时密码到永久账户:设置自定义用户
成功输入初始密码后,Jenkins 会引导我们进入“自定义 Jenkins”阶段。这是从“临时访问”迈向“长期管理”的关键一步。
插件安装与初始化
首先,系统会询问我们是否安装推荐的插件。作为最佳实践,对于初次使用的用户,我们通常建议选择“安装推荐的插件”。这些插件涵盖了 Git、Pipeline、Docker 等常用工具的集成,能够极大地提升后续的开发效率。
等待插件下载和安装的过程可能需要几分钟,具体取决于服务器的网络环境。如果在此过程中遇到某个插件安装失败,不用担心,我们可以稍后在“插件管理”页面中进行重试。
创建第一个管理员用户
插件安装完成后,Jenkins 会自动跳转到“创建第一个管理员用户”的页面。这是一个至关重要的步骤,因为之前使用的那个存储在文件中的密码只是临时的“入场券”。一旦我们创建了自定义用户,initialAdminPassword 文件中的密码实际上就完成了它的历史使命(尽管我们依然应该妥善保管服务器)。
在这个页面,我们需要填写以下信息:
- 用户名:建议使用具有辨识度的名字,如
admin或个人姓名。 - 密码:设置一个强密码,并记录在密码管理器中。
- 确认密码:再次输入以确保无误。
- 全名:可选,用于在界面显示。
- 电子邮件地址:用于接收系统通知(如构建失败的警报)。
填写完毕后,点击“保存并完成”。此刻,我们已经成功建立了 Jenkins 的身份认证体系。在随后的界面中,点击“开始使用 Jenkins”,我们就正式进入了功能强大的 Jenkins 仪表盘。
高阶故障排查:通过 CLI 移除或重置密码
在实际的生产环境维护中,我们可能会遇到一些棘手的情况。例如,某位离职的工程师修改了管理员密码却未交接,或者我们在配置 LDAP 认证时出了问题导致无法登录。当无法通过 Web 界面登录时,我们可以利用对服务器的直接访问权限(CLI)来重置安全设置。
重要提示: 以下操作涉及修改 Jenkins 的核心配置文件,建议在操作前先备份 config.xml。
步骤 1:定位配置文件
首先,我们需要通过终端导航到 Jenkins 的主目录。
# 切换到 Jenkins 主目录
cd /var/jenkins_home
# 如果是在 Linux 宿主机上且路径不同,可能是
# cd /var/lib/jenkins
步骤 2:编辑 config.xml 禁用安全控制
在这个目录下,包含了一个名为 INLINECODE9ba808d9 的核心文件,它定义了 Jenkins 的全局行为,包括安全策略。我们可以使用 INLINECODE2a4f7555 或 nano 编辑器打开它。
# 使用 vim 编辑器打开配置文件
vim config.xml
我们需要找到 INLINECODE54bd0d2a 这一行。为了暂时解除登录限制(以便我们可以无密码登录并重置),我们将 INLINECODEf7d6aa47 修改为 INLINECODE1f2bdef9。同时,为了彻底移除之前的权限限制,我们还可以删除或注释掉 INLINECODE8af448de 和 INLINECODE7c0879bb 这两个部分的内容,但通常仅修改 INLINECODE7015c01e 就足够了。
修改前的代码片段:
NORMAL
true
true
修改后的代码片段:
NORMAL
false
步骤 3:重启 Jenkins 服务
修改完配置文件并保存后,配置并不会立即生效。我们需要重启 Jenkins 服务以加载新的配置。
# 如果是使用 systemd 管理的服务
sudo systemctl restart jenkins
# 如果是在 Docker 容器中
docker restart
# 或者,如果是通过 java -jar jenkins.war 方式启动的,需要杀掉进程并重新运行
步骤 4:重新配置用户
服务重启完毕后,我们再次刷新 Jenkins 的 Web 页面。此时,系统应该不会再要求我们输入密码,而是直接让我们进入了 Jenkins 的后台界面(拥有完全的匿名管理员权限)。
现在,我们可以进入“管理 Jenkins” -> “管理用户”页面。在这里,我们可以创建一个新的管理员账户,或者更新现有账户的密码。
安全收尾:
创建好能够登录的新账户后,务必记得重新编辑 INLINECODEbcac9b68,将 INLINECODEc0193015 改回 true,并再次重启 Jenkins。否则,你的 Jenkins 实例将向所有人开放,这是一个极大的安全风险。
最佳实践与安全建议
通过上面的探讨,我们不仅掌握了如何找到默认密码,还学会了如何在紧急情况下恢复访问权限。但在日常工作中,防患于未然才是最重要的。
1. 数据持久化与备份
在云原生时代,我们经常使用 Docker 来运行 Jenkins。为了防止容器删除后导致包括用户数据在内的配置丢失,我们应当始终将 /var/jenkins_home 目录挂载到宿主机的持久化卷上。
# 推荐的 Docker 启动命令示例
docker run -d \
-p 8080:8080 \
-v jenkins_data:/var/jenkins_home \
--name my-jenkins \
jenkins/jenkins:lts
2. 删除默认密码文件(可选)
一旦我们完成了初始化设置并成功登录了第一个自定义管理员账户,出于安全考虑,我们可以选择删除服务器上的 initialAdminPassword 文件。当然,这只是防止他人通过服务器文件直接窥探,因为 Web 界面已经不再需要它了。
# 删除初始密码文件
rm /var/jenkins_home/secrets/initialAdminPassword
3. 利用脚本自动化初始配置
对于需要频繁搭建测试环境的团队,每次手动点击和输入既低效又容易出错。我们可以编写 Groovy 脚本,利用 Jenkins 的启动脚本来自动创建管理员用户。这通常被称为“Jenkins 即代码”的一种体现。
示例:使用 Groovy 脚本创建用户
我们可以在 Jenkins 启动时执行以下 Groovy 脚本(通常放在 $JENKINS_HOME/init.groovy.d/ 目录下)来绕过向导,直接创建一个默认管理员:
// ensure-admin-user.groovy
import jenkins.model.*
import hudson.security.*
def instance = Jenkins.getInstance()
def hudsonRealm = new HudsonPrivateSecurityRealm(false)
// 添加用户:admin, 密码:admin123
hudsonRealm.createAccount("admin", "admin123")
instance.setSecurityRealm(hudsonRealm)
def strategy = new FullControlOnceLoggedInAuthorizationStrategy()
strategy.setAllowAnonymousRead(false)
instance.setAuthorizationStrategy(strategy)
instance.save()
总结
从探寻 INLINECODEc48de34e 下的神秘字符,到掌握编辑 INLINECODEe5431e57 的“急救术”,我们在这篇文章中完整地梳理了 Jenkins 密码管理的方方面面。
我们了解到,Jenkins 默认密码机制的设计初衷是为了在 CI/CD 流水线建立之初就确立安全的基调。通过理解初始密码的获取方式,我们能够顺利地完成 Jenkins 的“成人礼”;通过掌握自定义用户的设置,我们确立了日常管理的身份认证体系;而通过学习命令行下的移除与重置方法,我们在面对突发故障时也能从容应对。
希望这篇指南能帮助你在构建高效、安全的自动化开发流程时更加得心应手。现在,你已经掌握了进入 Jenkins 世界的钥匙,去探索它强大的自动化能力吧!
> 常问问题(FAQ):
> Q: 如果我修改了初始密码文件后仍然无法登录怎么办?
> A: 请检查 Jenkins 的日志(通常在 /var/jenkins_home/logs/jenkins.log)以查看是否有错误信息。另外,确保你真的在 Web 界面点击了“继续”而不是在浏览器地址栏操作。
> Q: Docker 容器重启后密码会变吗?
> A: 只要你挂载了卷,初始化后的用户信息会保留。但如果每次都是全新容器且未挂载,你会需要再次查看新的 initialAdminPassword。