我有一个运行在Ubuntu服务器上的Jenkins实例通过Docker运行。该Jenkins实例使用ssh脚本(“使用ssh在远程主机上执行shell脚本”)连接到同一台Ubuntu服务器运行作业。身份验证是通过私钥完成的,已经安全运行了一年多。
最近,我升级了我的Ubuntu版本(do-release-upgrade),之后涉及该服务器的所有脚本都无法进行身份验证。
错误信息:
[SSH] executing...
[SSH] Exception:Auth fail
com.jcraft.jsch.JSchException: Auth fail
我不确定为什么,但我一直在进行故障排除:
还有一些 SSH 脚本连接到其他机器,这些仍然运行良好。这个问题并不涉及 SSH 插件或 Jenkins 本身,而是连接的服务器。
我有两个用户为此服务器配置了私钥(假设为
<user>
和root
),但都无法工作。因此,它似乎与特定用户无关,而是与服务器有关。我尝试使用一个简单的
echo "hello"
,结果是相同的。这证实了脚本不是问题所在——也应该如此,因为它们没有被更改。如果我将身份验证方法从私钥更改为用户名和密码,则系统可以正常连接。因此,它并不像是任何机器或代理阻止它。再次强调,除了升级 Ubuntu 外,任何设置都没有更改。这应该排除许多基本问题,如确保 IP/端口正确等。
我尝试重新创建密钥,结果是一样的。我使用了一些变体来创建它们(有关更多详细信息,请参见下面的“Key variants”)。在这样做时,我将私钥的内容复制到了 Jenkins 中;我尝试生成带有和不带有口令的密钥。请注意,我遵循了上次创建密钥时的相同过程,并且这一直有效(我记录下来以防忘记)。
为了安全起见,我尝试彻底删除
~/.ssh/
文件夹并重新创建它,以防有些问题。如果我尝试使用 MacBook 上的私钥登录到服务器,连接就可以正常工作(
ssh -i key.pem <user>@<ip> -p <port>
),其中 key.pem 是我正在粘贴到 Jenkins 凭据中的相同内容。这让我想到密钥已经正确生成。在升级后,我在 MacBook 上不得不删除
known_hosts
中对服务器的旧引用。但是,我无法在 Jenkins 配置中找到相同的内容——事实上,它可以使用用户名和密码进行连接,这使我认为没有任何东西阻止连接,而是 Jenkins 无法正确使用私钥。我知道服务器上的某些文件在升级后发生了更改,包括
/etc/ssh/sshd_config
。我必须恢复一些设置,包括将PasswordAuthentication no
更改为PasswordAuthentication yes
——我相信这是我之前的设置。(查看下面的 sshd_config 内容,一些部分被遮盖了)。我还尝试更新 Jenkins 及其插件,永远不知道会发生什么。
虽然使用用户名和密码是可行的,但我希望确认一下是否使用了私钥,因为这种方式感觉更加安全,而且易于管理不同用户的访问和权限级别。对于如何解决或尝试下一步操作有什么想法吗? :)
提前感谢!
附录
密钥变体
通用
# Generate keys
mkdir ~/.ssh; cd ~/.ssh/ && ssh-keygen -t rsa -m PEM -C "Jenkins agent key" -f "jenkinsAgent_rsa"
# Authorize keys
cat jenkinsAgent_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys ~/.ssh/jenkinsAgent_rsa
# Get private key for Jenkins
cat ~/.ssh/jenkinsAgent_rsa
拥有root权限
# Run before the other commands
sudo su $AGENT_USER
或者
# Run before the other commands
sudo su
不同的密钥生成器
ssh-keygen -t rsa -b 4096 -m PEM -C "Jenkins agent key" -f "jenkinsAgent_rsa"
ssh-keygen -t rsa -C "Jenkins agent key" -f "jenkinsAgent_rsa"
生成的密钥(格式化后,内容已剥离)
这是我要复制到Jenkins的内容。
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,518C612F99A868<somecharsremoved>09C9A6047E20
sDqB0yOas0sf4dJRLvb8IxyOvoIwr8Ls3uMbugwTOJ/
(...)
MuZyUzWXnhUaWgnXJlTLhnmXiJ9XgUClYftQpP4RZw9Ult/dje5XD81RmwwhuxUV
-----END RSA PRIVATE KEY-----
sshd_config(删除所有注释)
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Include /etc/ssh/sshd_config.d/*.conf
Port <port>
# This used to be `ChallengeResponseAuthentication no` but I assume no issues.
KbdInteractiveAuthentication no
UsePAM yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
PasswordAuthentication yes
[SSH] executing... /n ERROR: Failed to authenticate with public key /n com.jcraft.jsch.JSchException: invalid privatekey: [B@42f2a9bc
。我使用以下命令生成了密钥ssh-keygen -t ed25519 -m PEM -C "Jenkins (nito)" -f "jenkins_nito_key"
。该密钥以-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAA (...)
开头。看起来 Jenkins 还不支持它 - https://issues.jenkins.io/browse/JENKINS-64654。 - nitobuendia/etc/sshd_config
中添加HostkeyAlgorithms +ssh-rsa
和PubkeyAcceptedAlgorithms +ssh-rsa
,并重新启动ssh服务,但原始错误仍然存在。这是否产生了与您在~/.ssh/config
中提出的Host old-host
和配置建议相同的结果? - nitobuendia~/.ssh/config
是 ssh 客户端的配置文件。/etc/sshd_config
是 sshd 守护进程(ssh 服务器)的配置文件。您可以尝试在您连接到的服务器上添加这些选项。另一个选项是尝试使用 ECDSA 密钥。希望从 Jenkins 中看到更详细的日志,Auth fail
并不是很有信息量(类似于ssh -vvv
)。 - Alexander Volkovsky