如何在Linux/Unix系统上设置SSH密钥

时间:2020-01-09 10:39:44  来源:igfitidea点击:

如何在基于Linux或Unix的系统上设置SSH密钥?
在用于Linux/Unix的SSH中,如何设置公共密钥身份验证?

SSH密钥提供了一种登录Linux和Unix服务器的安全方法。
本教程说明了公共密钥,并向您展示了如何在Linux或类似Unix的服务器上设置SSH密钥。
我假设您正在使用带有以下软件的Linux或类Unix服务器和客户端:

  • OpenSSH SSHD服务器
  • Linux上的OpenSSH ssh客户端和朋友(Ubuntu,Debian,{Free,Open,Net} BSD,RHEL,CentOS,MacOS/OSX,AIX,HP-UX和co)。

什么是公钥认证?

OpenSSH服务器支持各种身份验证架构。
最受欢迎的两个如下:

  • 基于密码的身份验证
  • 基于公钥的身份验证。它是使用密码的另一种安全方法。建议在VPS,云,专用甚至家庭服务器上使用此方法。

如何设置SSH密钥

设置安全ssh密钥的步骤:

  • 使用ssh-keygen命令创建ssh密钥对。
  • 在Linux或Unix服务器上使用" ssh-copy-id"命令复制并安装公共ssh密钥。
  • 将您自己添加到sudo或wheel组管理员帐户。
  • 禁用root帐户的密码登录。
  • 使用ssh user @ server-name命令测试少用SSH密钥登录的密码。

让我们详细了解所有步骤。

如何设置公钥认证?

您必须同时生成一个公钥和一个私钥对。

我们的服务器设置如下:

  • server1.theitroad.local您将公用密钥存储在远程主机上,并且在此基于Linux/Unix的服务器上拥有一个帐户。
  • client1.theitroad.local您的私钥位于用于连接到server1.theitroad.local服务器的台式机/笔记本电脑/计算机(或本地服务器)上。请勿共享或将您的私人文件提供给任何人。

使用基于公共密钥的方法,您可以登录到远程主机和服务器,并将文件传输到它们,而无需使用您的帐户密码。
随意用您的实际设置替换server1.theitroad.local和client1.theitroad.local名称。
聊够了,让我们设置公钥身份验证。
如果.ssh目录不存在,请打开终端并执行以下命令:

mkdir -p $HOME/.ssh
chmod 0700 $HOME/.ssh

1:创建密钥对

在计算机上(例如client1.theitroad.local),为协议生成密钥对。

ssh-keygen -t rsa

输出示例:

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/Hyman/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/Hyman/.ssh/id_rsa.
Your public key has been saved in /Users/Hyman/.ssh/id_rsa.pub.
The key fingerprint is:
80:5f:25:7c:f4:90:aa:e1:f4:a0:01:43:4e:e8:bc:f5 Hyman@desktop01
The key's randomart image is:
+--[ RSA 2048]----+
| oo    ...+.     |
|.oo  .  .ooo     |
|o .o. . .o  .    |
| o ...+o.        |
|  o .=.=S        |
| .  .Eo .        |
|                 |
|                 |
|                 |
+-----------------+

您需要设置密钥对的位置和名称。
如果那里没有其他密钥,建议您使用默认位置,例如:$HOME/.ssh/id_rsa。
系统将提示您提供私钥的密码(密码)。
我建议您在出现提示时设置密码。
您应该在$HOME/.ssh /目录中看到两个新文件:

  • $HOME/.ssh/id_rsa包含您的私钥。
  • $HOME/.ssh/id_rsa.pub包含您的公共密钥。

高级用户的可选语法

以下语法指定要创建的RSA密钥中的4096位(默认值2048):

$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/vps-cloud.web-server.key -C "My web-server key"

其中:

  • -t rsa:指定要创建的密钥的类型。协议版本1的可能值为rsa1,协议版本2的可能值为dsa,ecdsa,ed25519或rsa。
  • -b 4096:指定要创建的密钥中的位数
  • -f~/.ssh/vps-cloud.web-server.key:指定密钥文件的文件名。
  • -C"我的Web服务器密钥":设置一个新注释。

2:将公钥安装在远程服务器中

使用scp或ssh-copy-id命令将公用密钥文件(例如$HOME/.ssh/id_rsa.pub)复制到远程服务器/主机上的帐户(例如[email protected])。
为此,请在client1.theitroad.local上输入以下命令:

ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]

或者只是将远程服务器中的公钥复制为~/.ssh /目录中的authorized_keys:

scp $HOME/.ssh/id_rsa.pub [email protected]:~/.ssh/authorized_keys

关于在远程服务器上追加公钥的注意事项

在某些系统上,可能未安装" ssh-copy-id"命令,因此请使用以下命令(在提示时提供名为Hyman的远程用户帐户的密码)来安装和追加公共密钥:

## First create .ssh directory on server ##
ssh [email protected] "umask 077; test -d .ssh || mkdir .ssh"
 
## cat local id.rsa.pub file and pipe over ssh to append the public key in remote server ##
cat $HOME/.ssh/id_rsa.pub | ssh [email protected] "cat >> .ssh/authorized_keys"

3:对其进行测试(在client1.theitroad.local上执行命令)

ssh命令的语法如下:

ssh [email protected]
ssh user@your-server-ip-address
ssh -i ~/.ssh/your-key user@your-server-ip-address

或复制一个名为foo.txt的文本文件:

scp foo.txt [email protected]:/tmp/

系统将提示您输入密码。
要在每次登录远程主机时解决口令,请尝试使用ssh-agent和ssh-add命令。

什么是ssh-agent和ssh-add,如何使用它们?

要解决当前会话的密码,请将密码添加到ssh-agent,当使用ssh或scp/sftp/rsync通过公共密钥连接到主机时,不会提示您输入密码。
语法如下:

eval $(ssh-agent)

输入ssh-add命令以提示用户输入私钥密码,并将其添加到ssh-agent命令维护的列表中:

ssh-add

输入您的私钥密码。
现在,再次尝试登录到[email protected],将不会提示您输入密码:

ssh [email protected]

可以使用-L选项列出所有身份的公钥参数:

ssh-add -L

可以使用-D选项从ssh-agent删除所有私钥,如下所示:

ssh-add -D

注销注销ssh代理后,运行:

kill $SSH_AGENT_PID

您还可以在shell启动中添加如下内容,以在注销时杀死ssh-agent:

trap "kill $SSH_AGENT_PID" 0

4:在服务器上禁用基于密码的登录

登录到您的服务器,执行:

## client commands ##
eval $(ssh-agent)
ssh-add
ssh [email protected]

使用文本编辑器(例如nano或vim)在server1.theitroad.local上编辑/etc/ssh/sshd_config:

警告:确保将自己添加到sudoers文件中。
否则,您以后将无法以root用户身份登录。
有关更多信息,请参见如何在FreeBSD服务器上向用户添加,删除和授予Sudo特权。

$ sudo vim /etc/ssh/sshd_config

或者使用vim文本编辑器直接跳转到PermitRootLogin行:

$ sudo vim +/PermitRootLogin /etc/ssh/sshd_config

找到PermitRootLogin并将其设置如下:

PermitRootLogin no

保存并关闭文件。
我将在Ubuntu Linux上将一个名为Hyman的用户添加到sudoers中:

# adduser Hyman

最后,重新加载/重新启动sshd服务器,根据您的Linux/Unix版本执行命令:

## CentOS/RHEL/Fedora (older version) Linux server reload sshd ##
sudo service sshd reload
 
## CentOS/RHEL/Fedora (latest version i.e. systemd based) Linux server reload sshd ##
sudo systemctl reload sshd 
 
## Debian/Ubuntu Linux (older version) server reload sshd ##
sudo /etc/init.d/ssh reload
 
## Debian/Ubuntu Linux (systemd based latest) server reload sshd ##
sudo systemctl reload ssh 
 
## Generic Unix method to reload sshd ##
sudo kill -HUP `cat /var/run/sshd.pid`
OR
sudo kill -HUP $(cat /var/run/sshd.pid)

5:如何为现有私钥添加或替换密码短语?

要更改密码,请输入以下命令:

ssh-keygen -p

6:如何备份现有的私钥/公钥?

只需将文件复制到备份服务器或外部U盘/硬盘驱动器:

## Copy files to  home based nas server ##
rsync -avr $HOME/.ssh [email protected]:/path/to/encrpted/nas/partition/
 
## Copy files to  usb pen drive mounted at /mnt/usb ##
cp -avr $HOME/.ssh/ /mnt/usb/backups/

如何保护我的ssh密钥?

  • 始终使用强密码短语。
  • 不要在网上任何地方共享您的私钥,也不要在不安全的云存储中存储私钥。
  • 限制帐户的特权。