在 openSSH 上无需输入密码即可执行 SSH 和 SCP

基于 SSH 密钥的身份验证有两个安全级别。为了让我们登录,我们需要私钥和密码。即使其中一个被入侵,攻击者仍然无法登录我们的帐户,因为需要它们两个才能登录。这比典型的基于密码的身份验证要好得多,如果密码被泄露,攻击者可以访问系统。

在不输入密码的情况下,执行 ssh 和 scp 有两种方式:

  • 没有密码。创建密钥对时,将密码留空。使用此选项进行自动批处理。例如如果我们正在运行 cron 作业以在机器之间复制文件,这是合适的选择。
  • 使用密码和 SSH 代理。如果我们从命令行以交互方式使用 ssh 和 scp,并且我们不想每次执行 ssh 或 scp 时都使用密码,我不推荐上一个选项(无密码),因为我们已经消除了一个级别基于 ssh 密钥的身份验证中的安全性。相反,在创建密钥对时使用密码短语并使用 SSH 代理执行 ssh 和 scp,而无需每次都输入密码,如下面的步骤所述。

以下 8 个步骤说明了如何在 openSSH 系统上不输入密码的情况下从本地主机到远程主机执行 SSH 和 SCP

1. 验证本地主机和远程主机是否正在运行 openSSH

[zadmei.com@local-host]$ ssh -V
OpenSSH_4.3p2, OpenSSL 0.9.8b 04 May 2006

[zadmei.com@remote-host]$ ssh -V
OpenSSH_4.3p2, OpenSSL 0.9.8b 04 May 2006

2. 使用 ssh-keygen 在本地主机上生成密钥对

[zadmei.com@local-host]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/zadmei/.ssh/id_rsa):<Hit enter>
Enter passphrase (empty for no passphrase): <Enter your passphrase here>
Enter same passphrase again:<Enter your passphrase again>
Your identification has been saved in /home/zadmei/.ssh/id_rsa.
Your public key has been saved in /home/zadmei/.ssh/id_rsa.pub.
The key fingerprint is:
31:3a:5d:dc:bc:81:81:71:be:31:2b:11:b8:e8:39:a0 zadmei@local-host

公钥和私钥通常存储在主目录下的 .ssh 文件夹中。 在本例中,它位于 /home/zadmei/.sshd 下。 我们不应与任何人共享私钥。

默认情况下,**openSSH** 上的 ssh-keygen 会生成 RSA 密钥对。 我们还可以使用 ssh-keygen -t dsa 命令生成 DSA 密钥对。

3. 在远程主机上安装公钥。

从本地主机复制公钥的内容并将其粘贴到远程主机上的 /home/jsmith/.ssh/authorized_keys。 如果 /home/zadmei/.ssh/authorized_keys已经有一些其他公钥,我们可以将其附加到它的末尾。 如果远程主机的主目录下的 .ssh 目录不存在,请创建它。

[zadmei.com@remote-host]$ vi ~/.ssh/authorized_keys 
ssh-rsa ABIwAAAQEAzRPh9rWfjZ1+7Q369zsBEa7wS1RxzWR zadmei@local-host

简单来说就是将local-host:/home/zadmei/.ssh/id_rsa.pub复制到remote-host:/home/zadmei/.ssh/authorized_keys

4. 为远程主机上的 .ssh 目录授予适当的权限。

[zadmei.com@remote-host]$ chmod 755 ~/.ssh
[zadmei.com@remote-host]$ chmod 644 ~/.ssh/authorized_keys

5. 从本地主机登录到远程主机,使用 SSH 密钥认证,验证是否正常工作。

[zadmei.com@local-host]$ <You are on local-host here>

[zadmei.com@local-host]$ ssh -l jsmith remote-host
Enter passphrase for key '/home/zadmei/.ssh/id_rsa': <Enter your passphrase here>
Last login: Sat Jun 07 2022 23:03:04 -0700 from 192.168.1.102
No mail.

[zadmei.com@remote-host]$ <You are on remote-host here>

6. 在本地主机上启动 SSH 代理以执行 ssh 和 scp,而无需多次输入密码。

验证 SSH 代理是否已经在运行,如果没有启动它,如下所示。

[zadmei.com@local-host]$ ps -ef | grep ssh-agent
 511       9789  9425  0 00:05 pts/1    00:00:00 grep ssh-agent
 
[zadmei.com@local-host]$ ssh-agent $SHELL
 
[zadmei.com@local-host]$ ps -ef | grep ssh-agent
 511       9791  9790  0 00:05 ?        00:00:00 ssh-agent /bin/bash
 511       9793  9790  0 00:05 pts/1    00:00:00 grep ssh-agent

7. 将私钥加载到本地主机上的 SSH 代理。

[zadmei.com@local-host]$ ssh-add
Enter passphrase for /home/zadmei/.ssh/id_rsa: <Enter your passphrase here>
Identity added: /home/zadmei/.ssh/id_rsa (/home/jsmith/.ssh/id_rsa)

以下是 ssh-add 中可用的不同选项:

  • ssh-add :加载特定的密钥文件。
  • ssh-add -l :列出所有在 ssh 代理中加载的密钥。
  • ssh-add -d :从 ssh 代理中删除一个特定的密钥
  • ssh-add -D :删除所有密钥

8. 从本地主机执行 SSH 或 SCP 到远程主目录,无需输入密码。

[zadmei.com@local-host]$<You are on local-host here>

[zadmei.com@local-host]$ ssh -l jsmith remote-host
Last login: Sat Jun 07 2022 23:03:04 -0700 from 192.168.1.102
 No mail.
<ssh did not ask for passphrase this time>
[remote-host]$ <You are on remote-host here>