ssh -i (identity_file) 的纯文本参数中的密码

ssh -i (identity_file) 的纯文本参数中的密码

我知道建议使用 ssh keygen 无需密码登录,但可怕的是,如果有人以任何方式访问我的计算机,他们就有可能使用存储的密钥登录所有服务器。

因此,我正在考虑通过在身份文件上设置密码来稍微模糊该过程,并让脚本使用随机的令人难以置信的长而难的密码以纯文本形式输入 ssh 登录。

到目前为止,我已经生成了一个 ssh-keygen,如下所示,并将 .pub 的内容复制到服务器,如下所示:

❯ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/username/.ssh/id_ed25519): testssh
Enter passphrase (empty for no passphrase):          <-- This is NOT empty
Enter same passphrase again:                         <-- This is NOT empty
Your identification has been saved in testssh
Your public key has been saved in testssh.pub
The key fingerprint is:
SHA256:vWch2CbFW50FShjCZDJKW59x7iPdXc44FoYFxmr7XIM username@arch

❯ cat ~/testssh.pub | ssh [email protected] 'cat >> .ssh/authorized_keys'
[email protected]'s password: 

现在,它会询问密钥的密码,如下所示:

❯ ssh -i testssh [email protected]
Enter passphrase for key 'testssh':

但我想知道这样的事情是否可能:

❯ ssh -i testssh --passphrase="SomeIncredibleLongAndRandomizedPasswordThatIsMeantToBeUsedForScripts" [email protected]

所以问题是,如何使用身份文件以密码作为参数登录?

我希望我能清楚地表达我的观点

答案1

假设您使用的是 OpenSSH 客户端,您可以使用以下命令来执行此操作sshpass

sshpass -P "Enter passphrase for key" \
 -pSomeIncredibleLongAndRandomizedPasswordThatIsMeantToBeUsedForScripts \
 ssh -i testssh [email protected]

当然,仅仅因为您可以这样做并不意味着您应该这样做。我敦促您考虑针对您的问题提出的评论。

答案2

我知道建议使用 ssh keygen无需密码登录
[...]
所以我想稍微模糊一下这个过程,通过设置密码在身份文件上,

这听起来有点矛盾,所以很难说出你想做什么。

如果您以交互方式登录,则在使用密钥/身份文件时只需输入密码即可。

另一方面,如果您的意思是您需要将密钥提供给某些人无人看管的进程,并且希望将密钥密码存储在同一系统上,那么您还不如根本没有密码。

但如果您想避免这样做,您可以在密钥上设置常规(好的)密码/密码,然后使用ssh-agent保存未加密的密钥以供无人值守脚本使用。然后,您只需在每次重新启动后输入一次密钥密码,虽然未加密的密钥仍保留在系统内存中,但攻击者无法通过窃取驱动器来获取它。相反,他们必须破坏系统的软件安全性,或者进行冷启动攻击来读取内存内容。

然后,同样使用强制命令authorized_keys遥控器上的文件以限制密钥的用途。

要使密钥可供脚本使用ssh-agent,请启动代理并在每次重新启动后将密钥添加到其中:

# start the agent, the output contains settings needed to talk to it
# and an 'echo' command printing its PID, remove that one here
ssh-agent | grep -ve ^echo > ~/script-agent-info
. ~/script-agent-info

# add the key to the agent, this asks for the passphrase
ssh-add ~/.ssh/script_id_rsa

然后在脚本中

# load the agent settings we stored earlier
. ~/script-agent-info

# use the key
ssh somehost@somewhere

ssh-agent -a(您可以告诉代理路径,然后SSH_AUTH_SOCK在脚本中设置为该路径,而不是让代理为其使用的套接字生成随机名称。)

答案3

似乎没有办法单独使用 bash 或 open-ssh 来实现这一点。

我能够通过使用让它工作预计

期望脚本:

spawn ssh -i testssh [email protected]
expect "Enter passphrase"
send "SomeIncredibleLongAndRandomizedPasswordThatIsMeantToBeUsedForScripts\r"
interact

单线:

expect -c "spawn ssh -i testssh [email protected];expect \"Enter passphrase\";send \"SomeIncredibleLongAndRandomizedPasswordThatIsMeantToBeUsedForScripts\r\";interact"

Expect 会查找Enter passphrase并键入密码send "SomeIncredibleLongAndRandomizedPasswordThatIsMeantToBeUsedForScripts\r"

最后interact进行会话交互


请注意,通常不应使用纯文本密码

相关内容