如何在Linux服务器之间交换SSH密钥以实现无密码认证?
在Linux上实现基于SSH密钥的身份验证
SSH(Secured Shell)是一种在SSH客户端和远程服务器之间创建加密连接的协议。
使用SSH可以安全地管理和管理远程服务器。这在很多方面都很有帮助。
- 多服务器部署
- 远程停止/启动服务
- 自动化
以及所有您的创意(希望如此)…
作为系统管理员,这是基础知识。
让我们学习如何…
我将生成一对私钥和公钥。私钥应存储在您的ssh客户端机器上,并且必须保持安全。公钥必须复制到远程服务器以便从SSH客户端机器登录到该服务器而无需密码。
您将学到以下内容。
- 安装SSH(如果已安装,则无需安装)
- 生成SSH密钥
- 将SSH密钥复制到远程服务器
- 使用SSH登录到远程服务器
为了演示目的,我有两个具有以下IP地址的服务器,一个是客户端系统,另一个是服务器,我将通过ssh从客户端机器登录到该服务器。
- 客户端(用户-> yaoweibin):192.168.56.102
- 远程(用户-> ubuntu):192.168.56.101
安装SSH
在按照本文中提到的步骤之前,确保服务器上已安装openssh-server
。如果尚未安装,请运行以下命令进行安装。
sudo apt-get install openssh-server
sudo systemctl enable ssh
sudo systemctl start ssh
您可以运行ssh命令来检查系统是否安装了它。
yaoweibin@yaoweibin:~$ ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
[-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
[-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
[-i identity_file] [-J [user@]host[:port]] [-L address]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-Q query_option] [-R address] [-S ctl_path] [-W host:port]
[-w local_tun[:remote_tun]] destination [command]
生成SSH密钥
这需要在客户端服务器上完成。
运行ssh-keygen
命令生成SSH密钥。当它询问文件、密码短语和相同密码短语时,只需按Enter键。它会默认在~/.ssh
目录中生成一对密钥。id_rsa是私钥,id_rsa.pub是相关的公钥。
yaoweibin@yaoweibin:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/yaoweibin/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/yaoweibin/.ssh/id_rsa.
Your public key has been saved in /home/yaoweibin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:3XDm62tzJegGm8oAmFYCyeFZovJOuU42zNgyn9GzH30 yaoweibin@yaoweibin
The key's randomart image is:
+---[RSA 2048]----+
|o+.. |
|+o+ |
|oo. . . o |
|.. * . * |
| B . S . o. |
| O o . . . ... .|
|+ @ o o . E=. o |
| B + o + .o.= . |
| + ... o. oo+ |
+----[SHA256]-----+
它会在~/.ssh
目录中生成两个新文件。
将SSH密钥复制到远程服务器
私钥应复制到远程服务器的~/.ssh
文件夹中。大多数服务器应已经拥有此文件夹,如果没有,您需要创建一个文件夹。
为此,执行以下操作:
- 使用要连接的用户登录到远程服务器。在我的情况下,用户名是
ubuntu
- 确保当前工作目录是用户的主目录,然后创建一个.ssh文件夹。你也可以使用以下单个命令创建一个
mkdir -p ~/.ssh
如果你已经有了.ssh文件夹,请备份它。
接下来,让我们将公钥从客户端服务器推送到远程服务器。
在客户端机器上(192.168.56.102),运行以下命令将公钥复制到远程服务器的.ssh目录中的authorized_keys
文件中。
yaoweibin@yaoweibin:~$ cat .ssh/id_rsa.pub | ssh [email protected] 'cat >> .ssh/authorized_keys'
[email protected]的密码:
运行以下命令在远程服务器上设置authorized_keys文件的权限。
yaoweibin@yaoweibin:~$ ssh [email protected] "chmod 700 .ssh; chmod 640 .ssh/authorized_keys"
太好了,密钥交换和权限设置完成。
使用SSH登录到远程服务器
让我们测试一下看看是否可以工作!
让我们作为yaoweibin用户从客户端机器(192.168.56.102)登录到远程服务器(192.168.56.101)。
运行以下命令进行测试,这次不会询问密码。
yaoweibin@yaoweibin:~$ ssh [email protected]
欢迎使用Ubuntu 16.04.6 LTS(GNU / Linux 4.4.0-151-generic i686)
* 文档: https://help.ubuntu.com
* 管理: https://landscape.canonical.com
* 支持: https://ubuntu.com/advantage
可更新346个软件包。
有11个安全更新。
上次登录时间:周一6月17日00:10:32 2019年
就这样。
我已经成功登录到远程服务器。运行以下命令将提供远程机器的IP详细信息。
ubuntu@ubuntu:~$ ifconfig
enp0s3 链路类型:以太网 硬件地址:08:00:27:9b:47:86
inet 地址:10.0.2.15 广播:10.0.2.255 掩码:255.255.255.0
inet6 地址:fe80::5c62:3267:b752:fe5d/64 范围:链接
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
接收数据包:20239 错误:0 丢弃:0 过载:0 帧:0
发送数据包:5406 错误:0 丢弃:0 过载:0 载体:0
碰撞:0 txqueuelen:1000
接收字节:22678039(22.6 MB) 发送字节:701710(701.7 KB)
enp0s8 链路类型:以太网 硬件地址:08:00:27:a9:4a:6b
inet 地址:192.168.56.101 广播:192.168.56.255 掩码:255.255.255.0
inet6 地址:fe80::54a9:761c:9034:21a2/64 范围:链接
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
接收数据包:330 错误:0 丢弃:0 过载:0 帧:0
发送数据包:197 错误:0 丢弃:0 过载:0 载体:0
碰撞:0 txqueuelen:1000
接收字节:42847(42.8 KB) 发送字节:32774(32.7 KB)
lo 链路类型:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0
inet6 地址:::1/128 范围:主机
UP LOOPBACK RUNNING MTU:65536 Metric:1
接收数据包:997 错误:0 丢弃:0 过载:0 帧:0
发送数据包:997 错误:0 丢弃:0 过载:0 载体:0
碰撞:0 txqueuelen:1
接收字节:79654(79.6 KB) 发送字节:79654(79.6 KB)
结论
如你所见,设置SSH密钥交换非常简单。希望这对你有所帮助,如果你有兴趣学习Linux管理和故障排除,请查看这个Udemy course。