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. Spring 学习笔记(五)—— Bean之间的关系、作用域、自动装配

    继承 Spring提供了配置信息的继承机制,可以通过为<bean>元素指定parent值重用已有的<bean>元素的配置信息. <?xml version="1 ...

  2. Thymeleaf 模板 在spring boot 中的引用和应用

    Thymeleaf是一个java类库,他是一个xml/xhtml/html5的模板引擎和Struts框架的freemarker模板类似,可以作为mvc的web应用的view层. Thymeleaf还提 ...

  3. asp.net 条码 一维条码 生成, 一共有32中格式类型

    想用asp.net 实现条码功能,网上找了代码都不全. 终于找到了一个非常全的DLL 是winForm的,原以为不能用在WEB 上结果 可以使用. 首先,引用 DLL 不必说了,下面是 使用设置.还有 ...

  4. 【bzoj3144】[Hnoi2013]切糕 网络流最小割

    题目描述 输入 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤ ...

  5. 在nodejs中 Object的toString()方法 querystring的stringify() JSON.stringify()

    刚学nodejs,做到一个例子:发送简单的HTTP请求.遇到一个问题,客户端给服务端发送的消息到服务端,服务端收不到消息,确切的说是“”. 以下是服务端代码:server.js const http ...

  6. linux进程——后台运行的方法

    linux进程后台运行的几种方法: 我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败. 如何让命 ...

  7. mvvm实现

    https://segmentfault.com/a/1190000006599500 http://blog.csdn.net/pur_e/article/details/53066275

  8. ie8 不支持media

    可以用respond.js库解决,bootstrap文件夹里有.同时需要注意以下几点. 1.需要启动本地服务器(localhost),不能使用普通本地的url地址(file://开头): 2.需要外部 ...

  9. HDU5974 A Simple Math Problem---数论--转化解方程

    感谢:http://blog.csdn.net/mirror58229/article/details/63685884 题意:x+y=a lcm(x,y)=b  求x,y 12WCases +  b ...

  10. OpenCV3.1.0+VS2015开发环境配置

    摘要: 由于最近AR(增强现实)这个概念非常火爆,各种基于AR的应用及游戏逐渐面向大众,而在AR中最重要的两个技术就是跟踪识别和增强渲染,其中跟踪识别是通过OpenCV这个开源的计算机视觉库来实现的, ...