SSH协议
- SSH
- 简介
- 实现
- OpenSSH
- ssh中的四个文件
- ~/.ssh文件路径
- 实验解析
SSH
简介
SSH(secure shell)只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是OpenSSH,它是自由软件,应用非常广泛。这里只讨论SSH在Linux Shell中的用法。如果要在Windows系统中使用SSH,会用到另一种软件PuTTY,这需要另文介绍。
💧CSDN@划过手的泪滴t
SSH之所以能够保证安全,原因在于它采用了公钥加密
整个过程是这样的:
(1)远程主机收到用户的登录请求,把自己的公钥发给用户。
(2)用户使用这个公钥,将登录密码加密后,发送回来。
(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
这个过程本身是安全的,
但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。
可以设想,如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。
再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。
这种风险就是著名的"中间人攻击"(Man-in-the-middle attack)。
实现
OpenSSH
SSH协议有诸多的实现软件,广泛使用的SSH实现软件是OpenSSH。OpenSSH是SSH协议的一种开源实现,现在已经成为Linux、Unix等操作系统的SSH协议默认实现。
ssh中的四个文件
- id_rsa:私钥
- id_rsa.pub:公钥
- known_hosts:存储的是远端主机的公钥
- authorized_keys:存储的远端主机的公钥
~/.ssh文件路径
~/.ssh
是存放SSH客户端相关配置和密钥文件的目录,但是第一次使用ssh的时候这个目录一般是空的,上述的konwn_hosts只有使用了ssh之后才会自动创建,然后其他主机发送公钥至本机之后,本机会生成authorized_keys
文件用于存放相关的主机和密钥信息。如果想要对客户端的配置进行修改,也可以在该目录下创建config文件。
执行ssh-keygen命令创建密钥对,
ssh-keygen -t rsa -b 4096
密钥生成后会在当前目录下多出两个文件,id_rsa和id_rsa.pub,其中id_rsa是私钥(敲黑板:这个很重要,不能外泄),id_rsa.pub这个是公钥,把公钥拷贝到需要登录的远程服务器或Linux系统上,这里可以使用ssh-copy-id自动完成,也可以手动追加秘钥到远程服务器。
方法一(推荐):
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.137
执行命令了会要求输入远程机器的密码,输入密码即可。
注:ssh-copy-id默认端口是22,如果您的SSH端口不是22,也就是远程服务器端口修改成其他的了,那就要得加上 -p +端口。
将上面生成的公钥id_rsa.pub追加到authorized_keys文件中:
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
密钥准备好了接下来就可以使用密钥登录了,
ssh -i ./id_rsa root@192.168.1.116
实验解析
1、使用scp将d盘中的任意文件夹拷贝到linux中的/opt/a1
scp -r D:\tmp1\ root@192.168.0.137:/opt/a1
2、使用scp命令将d盘任意文件夹中以a开头的文件拷贝到linux的/opt/b1中
scp -r D:\qqdata\313851039\FileRecv\a* root@192.168.0.137:/opt/b1
3、SSH密钥对登录实验,服务端为linux,客户端一台linux一台windows
ssh-keygen -b 1024 -t rsa
#执行命令的过程中是会提示呢输入密钥的密码
将生成的公钥以安全的方式传输到要登录的服务器
scp ~/.ssh/id_rsa.pub root@192.168.0.137:~/
Linux服务端
mkdir .ssh
cat id_rsa.pub >> ~/.ssh/authorized_key
chmod 600 /root/.ssh/authorized_keys
vim /etc/ssh/sshd_config
systemctl restart sshdssh -i ./id_rsa.pub root@192.168.0.116
Windows
4、使用tcp-wrapper限制宿主机对服务端的连接
vim /etc/hosts.deny
#追加
sshd:192.168.0.106