SSH的全称是Secure Shell,简单说来ssh是一种安全的外壳协议,用于两个计算机间安全的远程登陆,说它安全,是因为ssh采用公钥加密的机制。最开始时用作远程管理的工具是telnet,这个协议工作时在网络上传输的数据全是明文,出于安全性的考虑,此协议的使用率越来越少。而ssh的安全性使用它成为一种互联网上远程登陆主机的解决方案。在windows系统上常用到的有Putty、SecureCRT、XManager中的Xshell工具,而XManager工具是我见到的IT工作者中使用频率极高的一个工具,在windows上好像没有ssh协议的服务器端的实现,ssh协议的实现也分为商业的实现和开源的实现,在这里将是对ssh协议的一个开源实现的学习与记录。Openssh即是Linux系统下开源的实现,它开放且免费。

从客户端来看,SSH提供两种级别的安全验证。

第一种级别(基于用户名和口令的安全验证)只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。

第二种级别(基于密匙的安全验证也叫基于公钥的验证)需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在你在该服务器的家目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。

用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。

上述2种方式一般选其一。

putty这2种都支持,我们一般用putty的时候,需要输入用户名和密码,就是基于口令的验证。

其过程:

应对中间人攻击,SSH有2种方法应对,一是远程主机把自己的公钥拿到CA处做认证,申请一个数字证书;二是远程主机把自己公钥的指纹信息公布出来,比如公布在网站上,大家都可查看到公钥的指纹信息。这样用户在登陆时就可以鉴别主机的真伪了。提取主机的指纹信息的方法如下:

[root@Server-A ~]# ssh-keygen -lf/etc/ssh/ssh_host_dsa_key.pub 
102439:61:e5:80:e8:09:b3:83:10:39:c8:b4:5e:ca:45:7e /etc/ssh/ssh_host_dsa_key.pub(DSA)

远程主机可以把这个采用dsa算法的指纹信息发布在一个网站上,那我用xshell去远程连接时就可对比一下指纹信息是不是一样,如果是一样的那就能证明我连接的是真实的主机。

在linux下用ssh方式登陆另一linux主机时,如果第一次登陆会有如下的提示:

[root@Server-A~]# ssh 192.168.0.201
Theauthenticity of host '192.168.0.201 (192.168.0.201)' can't be established.
RSAkey fingerprint is 4c:a3:2f:29:69:86:f6:0f:38:25:8c:7c:7c:3b:d5:91.
Areyou sure you want to continue connecting (yes/no)?

表示的意义与用xshell登陆时的提示相同,输入“yes”,再输入远程主机的口令即可登陆,登陆成功后本地主机会生成“~/.ssh/known_hosts”文件,这文件里保存着远程主机的公钥信息,这样下次再远程登陆时就不需要发送公钥信息了,直接输入口令即可。

基于公钥的认证:

基于用户口令的认证方式每次都要求用户提供正确的口令,比较麻烦,且增加了口令泄露的机率。而基于公钥的认证则不需要用户输入口令即可完成远程登陆。这种认证方式是这样工作的:用户把自己的公钥存储在远程主机上,在登陆时,远程主机向用户发送一段随机字符串,用户用自己的私钥加密这段随机数字,并把加密后的信息发送给远程主机,远程主机用事先存储的公钥来解密这个数据,如果解密成功,则说明请求登陆的用户是可信任的,这样就直接允许用户登陆,而不要求输入密码了。这种认证方式需要把用户自己的公钥保存到远程主机上。若没有现成的公钥,那就生成:

[root@Server-A~]# ssh-keygen -t rsa
Generatingpublic/private rsa key pair.
Enterfile in which to save the key (/root/.ssh/id_rsa): 
Enterpassphrase (empty for no passphrase): 
Entersame passphrase again: 
Youridentification has been saved in /root/.ssh/id_rsa.
Yourpublic key has been saved in /root/.ssh/id_rsa.pub.
Thekey fingerprint is:
9b:ef:2c:6a:92:05:c7:f4:4b:b8:4e:b4:ce:05:2f:0croot@Server-A
Thekey's randomart image is:
+--[RSA 2048]----+
|                 |
|      .         |
|     o o        |
|    E * o       |
|     * *S.      |
|      B +o      |
|     B oo       |
|    o = .o      |
|     o.. o+     |
+-----------------+
[root@Server-A~]# ls .ssh/
id_rsa  id_rsa.pub known_hosts
 
此时在家目录下的“./ssh”目录下生成了两个文件,一个id_rsa(私钥文件),id_rsa.pub(公钥文件)。接着把公钥文件拷贝到远程主机:

[root@Server-A ~]# scp .ssh/id_rsa.pub 192.168.0.201:/root/.ssh/authorized_keys

这里的“authorized_keys”这个文件名不能更改,这是由“/etc/ssh/sshd_config”文件定义的。

测试一下能否不输入密码就能远程登陆Server_B主机:

[root@Server-A ~]# ssh 192.168.0.201
Address 192.168.0.201 maps to bogon, butthis does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
[root@Server-B ~]#
没错,成功了,但有报告信息,这是因为在/etc/hosts文件里没有增加两主机的映射关系,增加就可以了,在两主机中的“/etc/hosts”文件中都增加以下两行:
[root@Server-A ~]# echo"192.168.0.200  Server-A">> /etc/hosts
[root@Server-A ~]# echo "192.168.0.201  Server-B" >> /etc/hosts
上边用“scp”命令直接把主机的公钥文件拷贝到远程主机用户家目录下的“root/.ssh/authorized_keys”,其实还有一个更好的方法,ssh为我们提供了一个客户端工具,即“ssh-copy-id”,这个工具能将本地主机的公钥自动拷贝到远程主机上生成“authorized_keys”文件,且会让这个文件的权限为“600”这样更为安全,此命令的用法如下:
[root@Server-A ~]# ssh-copy-id root@192.168.0.201
建议用这个命令来实现无密码公钥登陆,因为用“scp”命令把公钥拷贝到远程主机后,不会把authorized_keys文件的权限修改成“600”,在某些linux版本下是无法实现基于公钥登陆的。
 
 
 

对于openssh,我们需要关注的配置文件分为两类,一类是公共配置文件,另一类是私有配置文件。公共配置文件又分为服务端的配件文件和客户端的配置文件。

/etc/ssh/sshd_config   #服务端配置文件

/etc/ssh/ssd_config    #客户端配置文件

~/.ssh/*               #私有配置文件

我们主要关注的是服务端的配置文件和私有配置文件。

SSH的配置文件主要分为服务器端和客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
     服务器端:/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程序远程登
 #录服务器是可以打开图形界面程序

其它选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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只有域名的场合)
 
 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
[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 root@wwww.axhu.com
#生成的指纹信息

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@wwww ~]# scp ~/.ssh/id_rsa.pub root@192.168.157.132:~/
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.
root@192.168.157.132's password:
id_rsa.pub                                                                                   100%  740     0.7KB/s   00:00
然后远程连接到远程主机进行设置:
[root@wwww ~]# ssh root@192.168.157.132
root@192.168.157.132'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
#修改权限放在其他用户修改查看
到此配置完成

方式二:

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

linux之openssh协议的更多相关文章

  1. Linux服务-openssh

    目录 1. 使用 SSH 访问远程命令行 1.1 OpenSSH 简介 1.2 SSH 版本 1.3 SSH 认证方式 1.4 openSSH 的工作模式 1.5 Secure Shell 示例 1. ...

  2. 和菜鸟一起学linux之upnp协议的学习记录

    UPnP全名是Universal Plug and Play,主要是微软在推行的一个标准.简单的来说,UPnP 最大的愿景就是希望任何设备只要一接上网络,所有在网络上的设备马上就能知道有新设备加入,这 ...

  3. linux升级openssh到7.9

    客户linux主机ssh存在高危漏洞,需要进行升级修复. linux联网后,直接命令行: [root@gw ~]# yum update openssl -y 此命令只是小版本的升级,比如将opens ...

  4. Linux系统——http协议原理

    Web服务基础 用户访问网页基本流程 (1)在浏览器中输入域名,系统会查找系统本地的DNS缓存及hosts文件信息,查找是否存在域名对应的IP解析记录 (2)DNS解析域名为IP地址,系统会把浏览器的 ...

  5. Linux文件传输协议2019-7-9

    FTP(file transfer Protocol)是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20.21号端口,其中端口20(数据端口)用于数据传输,端口21(命令端口)用 ...

  6. linux系统TCP协议之Send(转)

    tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...

  7. linux下P2P协议(BitTorrent)-libtorrent库编译,测试

    1.libtorrent 简介,下载和编译 libtorrent简介 libtorrent是功能齐全的C ++ bittorrent的p2p协议实现,专注于效率和可伸缩性.它可以在嵌入式设备和台式机上 ...

  8. Linux usb 2. 协议分析

    文章目录 0. 背景 1. USB 协议传输格式 1.1 Packet 1.1.1 Token Packet 1.1.2 Data Packet 1.1.3 Handshake Packet 1.1. ...

  9. linux升级openssh

    升级sshd到OpenSSH-6.7并删除老版本ssh 1)升级前准备 查看是否缺包 # rpm -qa | egrep "gcc|make|perl|pam|pam-devel" ...

随机推荐

  1. URAL 1732. Ministry of Truth ( KMP 多模式串匹配 )

    问在第一个串中删掉几个字符能否得到第二个串.注意在第二个串中不连续的单词在第一个串中也必须不连续. 一组数据: Input: abababbbbababbb aba ab Output: I HAVE ...

  2. 贪吃蛇StringBuilder 和 定时器

    ConsoleKeyInfo info = Console.ReadKey(); while (true) { if (info.Key == ConsoleKey.UpArrow)//只能输入一次但 ...

  3. 关于tap设备

    $QEMU_PATH \ -nographic \ -drive file=./rootfs.ext4,format=raw \ -net nic,vlan=0 -net tap,vlan=0,ifn ...

  4. 七、vue计算属性

    细节流程图 初始化 计算属性的初始化是发生在 Vue 实例初始化阶段的 initState 函数中,执行了 if (opts.computed) initComputed(vm, opts.compu ...

  5. Java性能监控之Instrumentation

    注:网上摘取的资料整理出来,供大家学习理解,希望有所帮助. 1.1.      Instrumentation 简介 利用 Java 代码,即 java.lang.instrument 做动态 Ins ...

  6. npm理解

    NPM就是一个下载器,通过它可以下载到几乎所有你需要的代码资源.它的成功,包括如下几个方面: 海量资源:NPM背后有数以万计的开源免费模块. 高效利用:作为开发者,只需要敲几个简单的命令就可以将这些开 ...

  7. hdu 1811 Rank of Tetris (拓扑 & 并查集)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  8. SPOJ - BALNUM Balanced Numbers

    题意: 求出所给范围内满足其数位上的奇数出现偶数次,数位上的偶数出现奇数次(或不出现)的数的个数. 思路: 对于0 ~ 9 每个数有3种情况. 1.没出现过 2.出现奇数次 3.出现偶数次 那么就可以 ...

  9. [codeforces] 498D Traffic Jams in th Land

    原题 简单的线段树问题. 对于题目中,a[i]的范围是2~6,我们仔细思考可以得出第0秒和第60秒是一样的(因为2~6的最小公倍数是60,),然后我们可以建一个线段树,里面记录0~59秒时刻开始通过这 ...

  10. 汕头市队赛 SRM14 T1 计算几何瞎暴力

    计算几何瞎暴力 (easy.pas/c/cpp) 128MB 1s 在平面上,给定起点和终点,有一面墙(看作线段)不能穿过,问从起点走到终点的最短路程. 输入格式 输入一行,包含8个用空格分隔的整数x ...