SSH工作原理:
- 共同建立加密通道
客户端首次发起SSH请求,客户端需要交互式输入yes/no确认是否信任主机,信任主机后服务端将本端的主机密钥(host key)传给客户端存放于known_hosts文件中。以后客户端请求相同的IP的主机会将服务端的主机密钥和自己本身的known_hosts的host key 进行核对。如果不一致,系统默认是受到攻击会在控制台打印host key Authentication failed,这个时候就无法建立加密通道。
双方采用一种Diffie-Hellman算法共同为该会话建立密钥,整个会话的通讯内容都使用该密钥进行加密。这个阶段使用的公钥/私钥对与用户验证身份用的SSH密钥是完全无关的。
-
首先A、B双方,在通信前构建专属于自己的密钥对,假设分别是公钥A,私钥A,公钥B,私钥B;
-
A将自己的公钥A暴露给B,B通过私钥B和公钥A经过一定的运算产生出本地的密钥B;
-
同样,B将自己的公钥B暴露给A,A通过私钥A和公钥B经过一定的运算产生出本地的密钥A;
-
最后,这个算法有意思的一点就是,密钥A和密钥B是一致的,这样A、B双方就拥有了一个属于双方的"秘密"口令
-
服务器认证
- 基于密码认证
在建立了加密通道后,服务器要求客户端输入密码,客户端输入的密码经过上述的通道加密传输给服务器
-
基于公钥认证(信任关系)
SSH密钥对的验证过程起始于上一部分加密通道建立之后,其具体执行步骤如下:客户端发送自己的密钥ID给服务器端服务器在自己的authorized_keys文件中检查是否有此ID的公钥如果有,则服务器生成一个随机数,用该公钥加密之服务器将加密后的随机数发给客户端客户端用私钥解密该随机数,然后在本地为随机数做MD5哈希客户端将该MD5哈希发给服务器端服务器端为一开始自己生成的随机数也做一个MD5哈希,然后用通讯通道"公共的密钥"将该哈希加密,再跟客户端发来的内容进行对比。如果双方内容一致,则通过验证,开放访问权限给客户端
哈希函数的作用:密码哈希函数可以为一组信息创建一个简明的"签名"。同样的信息,同样的哈希函数,应生成同样的哈希结果(hash);对信息稍微做一点更改,就会生成完全不同的哈希结果。基于上述特性,哈希常用于数据完整性的检测以及通讯身份验证
sshd_config配置见解
#Port 22 sshd服务的监听端口,通信矩阵公开默认端口
#ListenAddress 0.0.0.0
设置sshd服务绑定的IP地址,TOPN中禁止采用全0 IP,应当绑定具体的IP
#PermitRootLogin yes
PermitRootLogin用来设置能不能直接以超级用户ssh登录,root远程登录Linux很危险
#PubkeyAuthentication yes
PubkeyAuthentication用来设置是否开启公钥验证,如果使用公钥验证的方式登录时,则设置为yes
#IgnoreUserKnownHosts no
IgnoreUserKnownHosts用来设置ssh在进行RhostsRSAAuthentication安全验证时是否忽略用户的"/$HOME/.ssh/known_hosts"文件
#AllowUsers<用户名1> <用户名2> <用户名3> ...
指定允许通过远程访问的用户,多个用户以空格隔开,同时存在黑名单DenyGroups,但是白名单优先级更高
Sshd_config修改后需要重启sshd服务生效且会有语法检查,如果输入无法识别字符串会重启服务失败导致服务不可用,只能通过报错行提示登录服务器修改生效。
testing