简介
- SSH(Secure Shell)是一个提供数据通信安全、远程登录、远程指令执行等功能的安全网络协议,由芬兰赫尔辛基大学研究员Tatu Ylönen,于1995年提出,其目的是用于替代非安全的Telnet、rsh、rexec等远程Shell协议。
- SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的 Shell 提供安全的传输和使用环境。
- 本文介绍SSH-2
连接的建立
- client连接到server上
- client和server交换自己支持的SSH协议版本号
- client和server切换到基于报文的协议
- server向client提供自己的身份证明和会话参数
- client给server发送一个(会话)密钥
- 双方启用加密并完成服务器认证
- 建立安全连接
从非对称加密改为对称加密
认证方式(身份证明)
密码认证
- ssh client向目标机器发起tcp连接(一般22端口)并发送username (username是SSH协议的一部分)
- 目标机器ssh daemon回应需要密码
- ssh client提示用户输入密码,然后将密码发送到服务器端
- ssh daemon如果密码匹配成功, 则认证通过
公钥认证
- ssh client向目标机器发起tcp连接(一般22端口)
- ssh client提示用户输入passphrase以解密私钥
- ssh client发送私钥签名的包含username和公钥等信息的message.
- 目标机器ssh daemon通过检查消息中指定用户的$HOME/.ssh/authorized_keys,确定公钥是否可用作认证并验证签名的合法性, 如果两者都ok, 则通过认证
使用ssh agent的公钥认证
- ssh client向目标机器发起tcp连接(一般22端口)
- ssh client向本地的agent请求, 得到私钥签名的包含username和公钥等信息的message
- ssh client向目标机器发送此message和签名
- 目标机器ssh daemon通过检查消息中指定用户的$HOME/.ssh/authorized_keys,确定公钥是否可用作认证并验证签名的合法性, 如果两者都ok, 则通过认证
使用ssh agent forwarding的公钥认证
- client: 假设用户已经从client连接到了第一台机器server。client的agent中已保存了用户的私钥
- server: 用户从server向server2发起ssh连接请求
- server: client向本地(server)的agent请求, 得到私钥签名的包含username和公钥等信息的message。
- server: client向目标机器server2发送此message和签名
- server2: ssh daemon通过检查消息中指定用户的$HOME/.ssh/authorized_keys,确定公钥是否可用作认证并验证签名的合法性, 如果两者都ok, 则通过认证
其中在第3步中:
注意server上其实ssh-agent压根就没有启动,ssh client只是检查$SSH_AUTH_SOCK这个环境变量是否存在,如果存在,则和这个变量指定的domain socket进行通信。而这个domain socket其实是由server上的sshd创建的。所以ssh client其实是和sshd在通信。
而server的sshd并没有私钥信息,所以sshd做的事情其实是转发该请求到本地的ssh client,再由该client将请求转发给本地的agent。该agent将需要的消息和签名准备完毕后,再将此数据按原路返回到server的ssh client