本文是自己参考了一些文章和进行了一些实践总结而成,并不一定就是完全是对,有什么不对地方希望大家指出我们共同探讨.

目录:
       一.Telnet和SSH
       二.SSH验证原理详解
       三.SSH配置选项详解
       四.常见SSH问题实践
       五.SSH密钥认证实现
       六.SSH双机互信脚本实现
       七.SSH相关扩展阅读



一.Telnet和SSH
   1.Telnet
       Telnet是一个远程连接服务是一个C/S架构,具有Server端和Client端,Client通过telnet协议连接到服务器端,这是早期常用的远程连接方法.然后改方法进行连接的过程中使用的都是明文进行传输,在同一网络中的其他用户很容易通过网络工具捕捉到该数据包进行分析进而获取到密码.这是一个很不安全的连接方法.telnet协议使用的是23号端口是基于tcp的链接
   2.SSH
       telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的, 就是很容易受到“中间人”(man-in-the-middle)这种方式的***。所谓“中间人”的***方式, 就是“中间人”冒充真正的服务器接收你的传给服务器的数据,然后再冒充你把数据传给真正的服务器。
服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题
       SSH的英文全称是Secure Shell。通过使用SSH,你可以把所有传输的数据进行加密,这样“中间人”这种***方式就不可能实现了,而且也能够防止DNS和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。 SSH有很多功能,它既可以代替telnet,又可以为ftp、pop、甚至ppp提供一个安全的“通道”。
       最初SSH是由芬兰的一家公司开发的。但是因为受版权和加密算法的限制,现在很多人都转而使用OpenSSH。 OpenSSH是SSH的替代软件,而且是免费的,可以预计将来会有越来越多的人使用它而不是SSH。SSH是由客户端和服务端的软件组成的,有两个不兼容的版本分别是:1.x和2.x。用SSH 2.x的客户程序是不能连接到SSH 1.x的服务程序上去的。OpenSSH 2.x同时支持SSH 1.x和2.x。


二.SSH验证原理详解
SSH验证方式主要有以下两种:
   1.基于口令的验证
   2.基于密钥的验证

SSH原理之图文详解_第1张图片

SSH原理之图文详解_第2张图片

三.SSH配置选项详解
   SSH的配置文件主要分为服务器端和客户端:

     服务器端:/etc/ssh/sshd_config
     客户端:/etc/ssh/ssh_config
 1.限制root用户远程登录
     # vi /etc/ssh/sshd_config
     PermitRootLogin no
 2.通过控制用户访问限制 SSH 访问
     # vi /etc/ssh/sshd_config
     AllowUsers fsmythe bnice swilson
     DenyUsers jhacker joebadguy jripper
 3.# vi /etc/ssh/sshd_config
     Protocol 2
 4.不要支持闲置会话,并配置 Idle Log Out Timeout 间隔:
#当客户端连上服务器端后,若没有任何操作则,服务器端默认会
#每隔一定时间发送一个alive消息给客户端寻求客户端应答,
#默认一共发三次.若都没有回应,则断开连其中            
#ClientAliveInterval设置每隔多少秒发送一次alive消息
#ClientAliveCountMax 设置一共发多少次.
     # vi /etc/ssh/sshd_config
     ClientAliveInterval 600      
     # (Set to 600 seconds = 10 minutes)
     ClientAliveCountMax 0
 5.禁用基于主机的身份验证:(这种认证方式是不安全的)
     # vi /etc/ssh/sshd_config
     HostbasedAuthentication no
 6.使用 Chroot SSHD 将 SFTP 用户局限于其自己的主目录
     # vi /etc/ssh/sshd_config
     ChrootDirectory /home/%u
 7.禁用空密码:
     # vi /etc/ssh/sshd_config
     PermitEmptyPasswords no
 8.指令压缩
     Compression {yes|no|delayed}
 #默认是delayed 意思就是等到用户认证结束后再对数据进行压缩
 9.设置日志级别
 #LogLevel INFO 默认是INFO级别,调试的时候可以选择DEBUG
 #级别,这样调试信息更加详细
 10.支持图形界面操作
     X11Forwarding yes
 #对Xwindows的数据进行转发,开启该项并使用xshell程序远程登
 #录服务器是可以打开图形界面程序

其它选项:

PrintMotd no             
# 登入后是否显示出一些信息呢?例如上次登入的时间、地点等,预设是 yes ,但是,如果为了安全,可以考虑改为 no !
PrintLastLog yes     
# 显示上次登入的信息!可以啊!预设也是 yes !
KeepAlive yes    
# 一般而言,如果设定这项目的话,那么 SSH Server 会传送
# KeepAlive 的讯息给 Client 端,以确保两者的联机正常!
# 在这个情况下,任何一端死掉后, SSH 可以立刻知道!而不会
# 有僵尸程序的发生!
Banner /to/somefile
# 指定在用户完成认证前输出到终端的信息
GSSAPIAuthentication no
#指定是否使用基于GSSAPI的用户认证默认为no
MaxAuthTries 默认值为6
#每一个链接最多尝试验证的次数为这个值得一半,此外失败的信息还会记录在/var/log/message
UseDNS yes
#是否对主机名进行dns解析(常用与没有固定IP只有域名的场合)



四.常见SSH问题实践
   1.SSH连接慢问题
   SSH链接慢的问题很普遍,网上的解决方案也很多,基本上就是两个选项的问题.
一个就是UseDNS,一个就是GSSAPIAuthentication,但是很多博文对着两个选项的讲解都是众说风云,且有很多不妥之处.
      1.当UseDNS开启的时候你使用ip地址进行远程连接时没有任何影响的
       只有当你使用域名进行连接的时候,需要进行域名解析这个时候是会慢的.
       2.当开启GSSAPIAuthentication yes的时候,会对远程连接进行基于GSSAPI的认证,然后对于这个认证是是需要获取域名的,此时
       当你使用ip地址进行连接的时候会对这个ip地址进行反向解析以获取域名,当你使用域名进行远程连接的时候,则需要进行正向解析
       当你使用ip地址无法进行反向解析的时候会弹出
    reverse mapping checking getaddrinfo for bogon failed - POSSIBLE BREAK-IN ATTEMPT!
       此时我们只要关闭该选项顿时你就会觉得连接速度快了很多.
相信对于上面的一番解释后,你会基于你的工作环境进行一个很好的设置,以提高你的远程连接速度.

   2.scp命令实现阻断
   偶然情况下发现一个可以阻断scp实现文件拷贝的方法,前提是可以正常进行ssh连接
只要在服务器端的/etc/bashrc文件中加入echo "anystring" 即可(至于原理我只是萌萌珑珑有点懂,等搞懂了再奉上)



五.SSH密钥认证实现

1.生成密钥(客户端操作)

[root@wwww ~]# ssh-keygen -t rsa -b 4096
#-t 指定生成密钥的算法 -b指定密钥的位数
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
#询问生成的密钥放在的位置,默认放在家目录下的.ssh目录
Enter passphrase (empty for no passphrase):
#询问是否对私钥再进行加密
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
e7:60:45:fe:d8:09:24:c1:1e:ef:35:cc:c1:c3:24:e4 [email protected]
#生成的指纹信息

注: 这里使用ssh-keygen -t rsa -b 4096 -f /path/to/KEY_FILE -P '指定加密私钥的密码' 这样既可实现自动化,不要交互了

2.传送密钥至远程服务器
有两种实现方式:
   方式一:

[root@wwww ~]# scp ~/.ssh/id_rsa.pub [email protected]:~/
The authenticity of host '192.168.157.132 (192.168.157.132)' can't be established.
RSA key fingerprint is 6e:0f:f8:f8:c7:c2:11:e6:4d:99:aa:16:6a:81:4a:02.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.157.132' (RSA) to the list of known hosts.
[email protected]'s password: 
id_rsa.pub                                                                                   100%  740     0.7KB/s   00:00 
然后远程连接到远程主机进行设置:
[root@wwww ~]# ssh [email protected]
[email protected]'s password:
Last login: Sat Jan 18 21:16:49 2014 from 192.168.157.128
[root@bogon ~]# mkdir .ssh
#这个目录默认不存在,但是这太机子若连接过其他服务器就会自动生成.ssh目录用来保存known_hosts文件
[root@bogon ~]# chmod 700 .ssh
#这个权限很重要,设置不对的话是没法通过验证
[root@bogon ~]# cat id_rsa.pub >> ~/.ssh/authorized_keys
#这里最好每次都是以>>追加的形式输出,不然会覆盖其他主机的公钥
[root@bogon ~]# chmod 600 ~/.ssh/authorized_keys
#修改权限放在其他用户修改查看
到此配置完成


   方式二:

[root@wwww ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
[email protected]'s password:
Now try logging into the machine, with "ssh '[email protected]'", and check in:
  .ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
#直接通过命令完成.推荐使用,但是并不是每台机器上都会装有这个命令.




六.SSH双机互信脚本实现

#!/usr/bin/expect
#author Jeff_linux
#Time 2014-01-18
set local_passwd "server"
set des_passwd "server"
set timeout 10
set localip "192.168.0.254"
set desip "192.168.0.251"
spawn ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -P ""
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$desip
expect {
"yes/no" { send "yes\r";exp_continue}
"password:" {send "$des_passwd\r";exp_continue}
}
spawn ssh $desip "ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -P \"\""
spawn scp $desip:/root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
expect {
"yes/no" { send "yes\r";exp_continue}
"password:" {send "$local_passwd\r";exp_continue}
}


七.SSH相关扩展阅读
SSH 安全性和配置入门
http://www.ibm.com/developerworks/cn/aix/library/au-sshsecurity/
SSH服务器配置文件详解  
http://jiangym19860710.blog.163.com/blog/static/56153248201301211201826/
man 5 sshd_config
man ssh