linux之openssh协议
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.201Theauthenticity 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 rsaGeneratingpublic/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-AThekey'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[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.201Address 192.168.0.201 maps to bogon, butthis does not map back to the address - POSSIBLE BREAK-IN ATTEMPT![root@Server-B ~]#[root@Server-A ~]# echo"192.168.0.200 Server-A">> /etc/hosts[root@Server-A ~]# echo "192.168.0.201 Server-B" >> /etc/hosts[root@Server-A ~]# ssh-copy-id root@192.168.0.201
对于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的用户认证默认为noMaxAuthTries 默认值为6#每一个链接最多尝试验证的次数为这个值得一半,此外失败的信息还会记录在/var/log/messageUseDNS 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)? yesWarning: 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.132root@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.132root@192.168.157.132's password:Now try logging into the machine, with "ssh 'root@192.168.157.132'", and check in: .ssh/authorized_keysto make sure we haven't added extra keys that you weren't expecting.#直接通过命令完成.推荐使用,但是并不是每台机器上都会装有这个命令. |
linux之openssh协议的更多相关文章
- Linux服务-openssh
目录 1. 使用 SSH 访问远程命令行 1.1 OpenSSH 简介 1.2 SSH 版本 1.3 SSH 认证方式 1.4 openSSH 的工作模式 1.5 Secure Shell 示例 1. ...
- 和菜鸟一起学linux之upnp协议的学习记录
UPnP全名是Universal Plug and Play,主要是微软在推行的一个标准.简单的来说,UPnP 最大的愿景就是希望任何设备只要一接上网络,所有在网络上的设备马上就能知道有新设备加入,这 ...
- linux升级openssh到7.9
客户linux主机ssh存在高危漏洞,需要进行升级修复. linux联网后,直接命令行: [root@gw ~]# yum update openssl -y 此命令只是小版本的升级,比如将opens ...
- Linux系统——http协议原理
Web服务基础 用户访问网页基本流程 (1)在浏览器中输入域名,系统会查找系统本地的DNS缓存及hosts文件信息,查找是否存在域名对应的IP解析记录 (2)DNS解析域名为IP地址,系统会把浏览器的 ...
- Linux文件传输协议2019-7-9
FTP(file transfer Protocol)是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20.21号端口,其中端口20(数据端口)用于数据传输,端口21(命令端口)用 ...
- linux系统TCP协议之Send(转)
tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...
- linux下P2P协议(BitTorrent)-libtorrent库编译,测试
1.libtorrent 简介,下载和编译 libtorrent简介 libtorrent是功能齐全的C ++ bittorrent的p2p协议实现,专注于效率和可伸缩性.它可以在嵌入式设备和台式机上 ...
- 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. ...
- linux升级openssh
升级sshd到OpenSSH-6.7并删除老版本ssh 1)升级前准备 查看是否缺包 # rpm -qa | egrep "gcc|make|perl|pam|pam-devel" ...
随机推荐
- 原始套接字--traceroute
traceroute, 也就是 trace route,跟踪路由.这个程序最早是Van Jacobson实现的.源码在网上可以找到,不过我还没有去找.是IP路由过程中对数据包TTL(Time to L ...
- HDU 4189 Cybercrime Donut Investigation 线段树+思路
参考:http://www.cnblogs.com/slon/archive/2012/03/30/2426104.html 题意:给一个有n个点的点集,有q个询问,每个询问询问一个点p,求与p曼哈顿 ...
- HDU 4665 Unshuffle DFS找一个可行解
每层找一对相等的整数,分别放在两个不同的串中. 参考了学弟的解法,果断觉得自己老了…… #include <cstdio> #include <cstring> #includ ...
- 【bzoj1875】[SDOI2009]HH去散步 矩阵乘法
题目描述 一张N个点M条边的无向图,从A走到B,要求:每一次不能立刻沿着上一次的边的反方向返回.求方案数. 输入 第一行:五个整数N,M,t,A,B. N表示学校里的路口的个数 M表示学校里的路的条数 ...
- hdu 3499 Flight (最短路径)
Flight Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Su ...
- [bzoj] 1036 Count
原题 树链剖分板子题 树剖详解: #include<cstdio> #include<algorithm> typedef long long ll; #define N 30 ...
- BZOJ4824 [Cqoi2017]老C的键盘 【树形dp】
题目链接 BZOJ4824 题解 观察出题目中的关系实际上是完全二叉树的父子关系 我们设\(f[i][j]\)为以\(i\)为根的节点在其子树中排名为\(j\)的方案数 转移时,枚举左右子树分别有几个 ...
- 洛谷 P3747 [六省联考2017]相逢是问候 解题报告
P3747 [六省联考2017]相逢是问候 题目描述 \(\text {Informatik verbindet dich und mich.}\) 信息将你我连结. \(B\) 君希望以维护一个长度 ...
- [01]关于TDD、BDD和DDD的一些看法
在实际的项目中,我们可能随时面对各种不同的需求,它的各个方面的要素决定了我们所采用的开发模式. 比如,它的复杂度如何?所有的需求是否足够清晰?开发人员对相关的业务是否足够了解?项目的工期是否合理?种种 ...
- Java的运算符及结合性
优先级 运算符 结合性 1 ()[]. 从左向右 2 !+(正)-(负)~ ++ -- 从右向左 3 * / % 从左向右 4 +(加)-(减) 从左向右 5 << >&g ...