美文网首页DevOps技术文
SSH协议、openSSH远程口令及密钥登录配置

SSH协议、openSSH远程口令及密钥登录配置

作者: CHUANHAI | 来源:发表于2016-05-11 15:07 被阅读1113次

    SSH(Secure Shell)协议为远程登录或其它网络服务(如:sftp、scp)提供安全保障的一种协议。它设计之初的主要目的是替代telnet远程登录协议,由于telnet协议以明文的方式在互联网上传递数据和服务器账户口令,别有用心的人很容易就可以截获得到这些数据和口令。以下是SSH详细的登录过程:

    a、版本号协商阶段

    服务器端启动ssh服务,并打开22号端口(也可以配置为其它端口),等待客户端链接。客户端向服务器端发起TCP连接。连接建立后,服务器端和客户端开始商议欲使用的协议版本号。如果协商成功,进入密钥和算法协商阶段,否则,断开TCP连接。

    b、密钥和算法协商阶段

    服务器端和客户端分别向对方发送算法协商报文,其中包括了自己支持的非对称加密算法列表、加密算法列表、消息验证码算法列表、压缩算法列表等。服务器端和客户端根据双方支持的算法得出最终使用的算法(如非对称加密算法是采用RSA,还是DSA)。协商完成后,服务器端将自己的公钥发送给客户端,客户端根据公钥指纹决定是否信任此主机。选择信任此主机后,客户端使用服务器端的公钥将自己生成的会话密钥加密,发送给服务器端。以后的会话内容和口令都通过此会话密钥加密发送。通常,每过一个小时,服务器端和客户端会重新商定会话密钥,以防止会话密钥被暴力破解。

    c、认证阶段

    基于口令的认证:

    客户端采用在算法协商阶段产生的会话密钥加密帐号、认证方法、口令,并将其传送给服务器端。服务器端收到后将其解密后,基于本地账户密码对其判断是否正确。如果正确,成功建立登录连接,否则,向客户端返回认证失败报文,其中包含了可再次认证的方法列表。当登录请求次数达到可允许的尝试上限次数后,服务器端断开本次TCP连接,并限制此帐号连接请求。

    基于密钥的认证:

    客户端使用ssh-keygen工具在本地家目录的.ssh/目录下生成一对密钥(如:公钥id_rsa.pub、私钥id_rsa)。并将公钥追加保存到将要登录的服务器上的那个帐号家目录的.ssh/authorized_keys文件中。客户端使用算法协商阶段生成的会话密钥加密帐号、认证方法、公钥,并将其传送给服务器端。服务器端收到后将解密后的公钥与本地该帐号家目录下的authorized_keys中的公钥进行对比。如果内容不相同,认证失败,否则服务器端生成一段随机字符串,并先后用客户端公钥和会话密钥对其加密,发送给客户端。客户端收到后将解密后的随记字符串用会话密钥加密发送给服务器端。如果发回的字符串与服务器端起先生成的一样,则认证通过,否则,认证失败。

    openssh便是SSH的一个开源实现。本文后续部分将简要介绍如何用openssh基于口令和密钥的远程登录。

    1、基于口令的认证

    # ssh-p PORT USERNAME@HOST

    -p PORT指定服务器端提供sshd服务的端口,默认为22号端口

    USERNAME指定将要登录的远程端帐号

    HOST指定将要登录的远端主机

    示例:

    # ssh root@172.29.166.218

    如果是第一次登录远端主机,系统会出现以下提示:

    The authenticity of host '172.29.166.218 (172.29.166.218)' can't be established.

    RSA key fingerprint is SHA256:fB5R/WXp2sHGIVxC7g4HNMMn2AeT828Ee6tJ88bE0so.

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

    因为协议本身无法确认远端服务器的真实性,用户自行根据提供的经SHA256算法提取的公钥指纹判断其真实性。如果确认为真,则输入帐号密码以登录服务器端。

    2、基于密钥的认证

    a、首先在客户端生成一对密钥

    ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1] [-N new_passphrase] [-f output_keyfile] ...

    -q指定命令静默执行

    -b bits指定密钥位数

    -t dsa | ecdsa | ed25519 | rsa | rsa1指定生成密钥的算法

    -N new_passphrase加密密钥文件,并指定加密密码

    -f output_keyfile指将密钥保存到output_keyfile文件

    示例:

    # ssh-keygen -t rsa -b 1024

    b、将客户端公钥保存到服务器端

    ssh-copy-id [-i [identity_file]] [-p port] [user@]hostname ...

    -i identity_file指定本地公钥文件

    -p port指定远端提供sshd服务的端口

    user@hostname指定远端欲登录的帐号和主机,帐号默认与客户端登录着的帐号相同

    示例:

    # ssh-copy-id -i id_rsa.pub root@localhost

    另外,可以不使用ssh-copy-id命令,改用以下命令,可以更好的理解公钥的保存过程:

    # ssh user@host '(umask 077; mkdir .ssh) && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

    c、登录验证

    # ssh root@localhost

    如果仍然无法无口令登录,请检查sshd配置文件/etc/ssh/sshd_config,并将以下几行前面的注释符号取消。

    RSAAuthentication yes

    PubkeyAuthentication yes

    AuthorizedKeysFile .ssh/authorized_keys

    参考文献

    [1] Ruanyifeng.com. (2016).SSH原理与运用(一):远程登录 - 阮一峰的网络日志. [online] Available at: http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html [Accessed 11 May 2016].

    [2] Blog.chinaunix.net. (2016).ssh详细登录过程-gsnumen-ChinaUnix博客. [online] Available at: http://blog.chinaunix.net/uid-21854925-id-3082425.html [Accessed 11 May 2016].

    相关文章

      网友评论

        本文标题:SSH协议、openSSH远程口令及密钥登录配置

        本文链接:https://www.haomeiwen.com/subject/qhxurttx.html