Linux下的openssh详解

一世执手 提交于 2019-12-10 17:50:25

前言

SSH(Secure Shell)是一个提供数据通信安全、远程登录、远程指令执行等功能的安全网络协议,由芬兰赫尔辛基大学研究员Tatu Ylönen,于1995年提出,其目的是用于替代非安全的Telnet、rsh、rexec等远程Shell协议。之后SSH发展了两个大版本SSH-1和SSH-2。

通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止 DNS欺骗 和 IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、Pop、甚至为PPP提供一个安全的"通道"。

 

SSH的基本框架

SSH协议框架中最主要的部分是三个协议:

  • 传输层协议(The Transport Layer Protocol):传输层协议提供服务器认证,数据机密性,信息完整性等的支持。
  • 用户认证协议(The User Authentication Protocol):用户认证协议为服务器提供客户端的身份鉴别。
  • 连接协议(The Connection Protocol):连接协议将加密的信息隧道复用成若干个逻辑通道,提供给更高层的应用协议使用。

SSH-AUTH是SSH里面用于验证客户端身份的协议。我们在用ssh命令输入密码的那一步实际上就是在这个阶段。可以看到的是,虽然传输的是用户名和密码,但是由于这个协议建立在SSH-TRANS之上,所以内容都是加密的,可以放心的传输。

而SSH-CONN是真正的应用协议。在这里可以定义各种不同的协议,其中我们经常使用的scp、sftp还有正常的remote shell都是定义在这里的一种协议实现。这里的各种应用协议都要首先经过SSH-AUTH的验证之后才可以使用。

这个三个协议之间的关系可以用下面这幅图来说明:

 

SSH的加密

SSH从安全和性能两方面综合考虑,结合使用了 Public Key/Private key(公钥/私钥) 和 Secret Key(密钥)

  • Public Key/Private key:非对称加密,安全,但效率低,不适合大规模进行数据的加密和解密操作;即公钥/私钥模式,公钥用来加密数据,私钥用来解密数据
  • Secret Key:对称机密,高效,但安全性相对较低,Key的分发尤其不方便;即数据的加密解密都采用同一把秘钥

 

SSH的安全连接建立

  1. 客户端连接到服务器上
  2. 客户端和服务器交换自己支持的SSH协议版本号
  3. 客户端和服务器切换到基于报文的协议
  4. 服务器向客户端提供自己的身份证明和会话参数
  5. 客户端给服务器发送一个(会话)密钥
  6. 双方启用加密并完成服务器认证
  7. 建立安全连接

 

/etc/ssh/sshd_config配置文件详细说明

Port 2
“Port”设置sshd监听的端口号。
 
ListenAddress 192.168.1.1
“ListenAddress”设置sshd服务器绑定的IP地址。
 
HostKey /etc/ssh/ssh_host_key
 
“HostKey”设置包含计算机私人密匙的文件。
 
ServerKeyBits 1024
“ServerKeyBits”定义服务器密匙的位数。
 
LoginGraceTime 600
“LoginGraceTime”设置如果用户不能成功登录,在切断连接之前服务器需要等待的时间(以秒为单位)。
 
ClientAliveInterval 300(默认为0)
这个参数的是意思是每5分钟,服务器向客户端发一个消息,用于保持连接
 
 
KeyRegenerationInterval 3600
“KeyRegenerationInterval”设置在多少秒之后自动重新生成服务器的密匙(如果使用密匙)。重新生成密匙是为了防止用盗用的密匙解密被截获的信息。
 
PermitRootLogin no
“PermitRootLogin”设置root能不能用ssh登录。这个选项一定不要设成“yes”。
 
IgnoreRhosts yes
“IgnoreRhosts”设置验证的时候是否使用“rhosts”和“shosts”文件。
 
IgnoreUserKnownHosts yes
“IgnoreUserKnownHosts”设置ssh daemon是否在进行RhostsRSAAuthentication安全验证的时候忽略用户的“$HOME/.ssh/known_hosts”
 
StrictModes yes
“StrictModes”设置ssh在接收登录请求之前是否检查用户家目录和rhosts文件的权限和所有权。这通常是必要的,因为新手经常会把自己的目录和文件设成任何人都有写权限。
 
X11Forwarding no
“X11Forwarding”设置是否允许X11转发。
 
PrintMotd yes
“PrintMotd”设置sshd是否在用户登录的时候显示“/etc/motd”中的信息。
 
SyslogFacility AUTH
“SyslogFacility”设置在记录来自sshd的消息的时候,是否给出“facility pre”。
 
LogLevel INFO
“LogLevel”设置记录sshd日志消息的层次。INFO是一个好的选择。查看sshd的man帮助页,已获取更多的信息。
 
RhostsAuthentication no
“RhostsAuthentication”设置只用rhosts或“/etc/hosts.equiv”进行安全验证是否已经足够了。
 
RhostsRSAAuthentication no
“RhostsRSA”设置是否允许用rhosts或“/etc/hosts.equiv”加上RSA进行安全验证。
 
RSAAuthentication yes
“RSAAuthentication”设置是否允许只有RSA安全验证。
 
PasswordAuthentication yes
“PasswordAuthentication”设置是否允许口令验证。
 
PermitEmptyPasswords no
“PermitEmptyPasswords”设置是否允许用口令为空的帐号登录。

 

SSH设置ACL规则

  • /etc/hosts.deny:屏蔽规则文件,在文件尾部添加相应行
  • /etc/hosts.allow:允许规则文件,在文件尾部添加相应行

PS:允许的优先级比拒绝的优先级大

 

实例

[root@sample ~]# vi /etc/hosts.deny
sshd: ALL  // 添加这一行,屏蔽来自所有的SSH连接请求

[root@sample ~]# vi /etc/hosts.allow
sshd: 192.168.0.  // 添加这一行,只允许来自内网的SSH连接请求

 

问题集锦

ssh连接很慢GSS failure解决办法;就我所遇到的情况来看, 显然是要把 GSSAPI 禁用. 以下是三种可行的方式:

1. 连接时用命令指定:

ssh -o GSSAPIAuthentication=no cherry@59.151.47.49

 

2. 在 ssh 客户端程序的配置文件里显式禁用 GSSAPI 认证. 如, 编辑 /etc/ssh/ssh_config 文件, 添加或修改使其有如下一行:

GSSAPIAuthentication no

 

3. 在用户根目录下的 .ssh 目录下创建一个 config 文件. 如, 编辑 /home/cherry/.ssh/config (如果该文件不存在, 则创建之), 添加选项:

GSSAPIAuthentication no

[注] A. /etc/ssh/ssh_config 是全局配置文件, 对其进行的修改会影响所有使用 ssh 客户端的系统用户.
        B. /home/cherry/.ssh/config 是只会影响用户 xcl 的本地 ssh 客户端配置文件. 该文件的所有配置参数会覆盖全局配置文件的相同配置参数.

 

取消DNS反向解析

vi /etc/ssh/sshd_config
#UseDNS yes
修改为
UseDNS no

service sshd restart

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!