首页 > 运营 > 帮助中心 > 正文

SSH远程登录和端口转发详解

2020-07-28 14:52:50
字体:
来源:转载
供稿:网友

介绍

SSH 是创建在应用层和传输层基础上的安全协议,为计算机上的 Shell(壳层)提供安全的传输和使用环境。

SSH 只是协议,有多种实现方式,本文基于其开源实现 OpenSSH

远程登录

SSH主要用于远程登录:

$ ssh user@host

当本地用户名和远程用户名一致时,可省略用户名:

$ ssh host

SSH 协议默认端口是22,指定端口可使用 -p 参数

$ ssh -p 2222 user@host

MITM

SSH 采用公钥加密的方式来保证传输安全。过程如下:

客户端发起登录请求,远程主机将自己的公钥发个用户; 客户端使用该公钥将登录密码加密后发送给远程主机; 远程主机使用私钥解密登录密码,如密码正确则允许客户端登录。

However!

由于 SSH 协议的公钥是自己签发的,并不像HTTPS 的SSL证书是有CA机构颁发的。如果有人插在用户与远程主机之间,截获登录请求,然后冒充远程主机,将伪造的公钥发给客户端,那么用户则很难辨别真伪。 这样就可以获取用户登录密码,用来登录远程主机。这就是MITM,(Man-in-the-middle attack,中间人攻击)

密码登录

第一次登录远程主机,会有如下提示:

$ ssh 10.0.0.12The authenticity of host '10.0.0.12 (10.0.0.12)' can't be established.RSA key fingerprint is 3a:45:30:52:b5:ea:2a:55:e7:23:41:ef:16:76:0b:8d.Are you sure you want to continue connecting (yes/no)?

意思是:无法确认远程主机真实性,指知道它的公钥指纹,是否继续连接?

公钥指纹(fingerprint):公钥采用RSA算法,长度较长难以比对,所以对其进行MD5计算,得到128位的指纹,即上例中的3a:45:30:52:b5:ea:2a:55:e7:23:41:ef:16:76:0b:8d

其实并没有什么有效便捷的方式确认公钥指纹的真实性,确认接受远程主机公钥:

Are you sure you want to continue connecting (yes/no)? yes

系统提示远程主机已加入到受信主机列表:

Warning: Permanently added '10.0.0.12' (RSA) to the list of known hosts.

然后提示输入密码:

root@10.0.0.11's password:

输入密码正确,就可以正常登陆了。

当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统会发现它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

公钥登陆

除了密码登录,SSH 还支持公钥登录。

“公钥登录”原理是:用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求输入密码。

公钥登录需要用户提供自己的公钥,一般保存在 $HOME/.ssh/ 目录下,id_rsa是私钥,id_rsa.pub是公钥。如果没有可以通过ssh-keygen生成。

$ ls -1 ~/.sshid_rsaid_rsa.pubknown_hosts

需要把公钥发送到远程主机:

# ssh-copy-id [-i [identity_file]] [user@]machine$ ssh-copy-id root@10.0.0.12

此后再登录就不需要输入密码了。

如果还是无法使用公钥登录,可以检查一下远程主机SSH配置/etc/ssh/sshd_config,打开如下注释并重启SSH服务[我发现CentOS release 6.8 (Final)默认SSH配置中注释掉以下内容也是可以使用公钥登录的]:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表