一、默认密码的安全性
Jenkins默认密码是安装完毕后,第一次使用时进入Jenkins时需要输入的密码。这个密码会在安装完成后的界面显示,同时也可以在Jenkins主目录下查看到,但是默认情况下这个密码是加密的。然而,在实际应用中,这个密码并不是很安全,因为它可以被解密,有一定的安全隐患。
我们来看一下Jenkins如何加密默认密码。Jenkins使用了一种叫做hudson.util.Secret的类来加密密码,例如:
String secret = hudson.util.Secret.fromString("myPassWord").getEncryptedValue();
可以看到,Jenkins是使用Secret.fromString()方法把密码转换成Secret对象,然后通过Secret对象的getEncryptedValue()方法把密码加密,得到密文。密文会被保存到Jenkins的配置文件中。在使用时,Jenkins会读取密文,并使用Secret.decrypt()方法解密。
二、原始密码的保护
Jenkins是一个自动化集成工具,因此很多时候,我们要部署Jenkins到远程服务器上,并且要通过SSH协议进行连接。在这种情况下,如果把Jenkins的原始密码明文保存在配置文件或命令行参数中,就会存在泄漏的风险。因此Jenkins提供了一种保护原始密码的方式:Jenkins的控制台可以输入原始密码,并存储在内存中,避免了直接将密码暴露在命令行或配置文件中。
在Jenkins的安装目录下,打开jenkins.sh文件,可以看到以下代码:
if [ -z "$JENKINS_PASSWORD" -a -z "$JENKINS_PASSWORD_FILE" ]; then promptForPassword fi if [ -n "$JENKINS_PASSWORD" ]; then java "-Djenkins.install.runSetupWizard=false" $JAVA_OPTS -jar "$JENKINS_WAR" fi if [ -n "$JENKINS_PASSWORD_FILE" ]; then java "-Djenkins.install.runSetupWizard=false" $JAVA_OPTS -jar "$JENKINS_WAR" --password-file="$JENKINS_PASSWORD_FILE" fi
以上代码中,Jenkins会根据以下顺序尝试读取Jenkins密码:
- 通过JENKINS_PASSWORD环境变量读取密码;
- 通过JENKINS_PASSWORD_FILE环境变量指定文件读取密码;
- 通过promptForPassword函数,在控制台中读取密码。
在控制台中输入密码,会被存储在Jenkins服务器的内存中,但这种方式并不太安全,因为服务器可能会被黑客攻击,从而导致密码泄漏。
三、明文密码的替代方案
为了避免在使用Jenkins时直接使用默认密码遇到的安全问题,可以采用一些替代方案。以下是几种常见的方法:
- 使用命令行工具来自动生成随机密码。可以使用“openssl rand -base64 10”命令来生成10个随机字符的密码。然后,把这个密码设置为Jenkins系统管理员的密码,并将其存储在系统中;
- 使用插件来管理密码。Jenkins有很多插件可以帮助管理员管理密码,例如Credentials Binding Plugin,它可以在构建过程中自动绑定凭据,并且安全地保存加密的密码;
- 使用环境变量。管理员可以使用环境变量来设置和管理凭据信息,例如使用Secret Manager托管密码,并使用环境变量来引用密码。
四、总结
Jenkins是一个非常流行的自动化集成工具,但是它的默认密码安全性存在一定问题。Jenkins提供了一些保护默认密码的方式,如控制台输入密码、加密存储密码等,但是这些方式并不是完全安全的。因此,管理员应该采用一些替代方案,例如使用随机密码、使用插件管理密码、使用环境变量等,来提高Jenkins的安全性。