本文发布于Cylon的收藏册,转载请著名原文链接~


什么是 SSH ?

SSH全称(SecureSHell)是一种网络协议,顾名思义就是非常安全的shell,主要用于计算机间加密传输。早期,互联网通信都是基于明文通信,一旦被截获,内容就暴露无遗。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。

SSH服务是由OpenSSH服务端软件OpenSSH和客户端(常见的由SSH,SecureCRT,Xshell,putty)组成,默认使用22端口提供服务,有两个不兼容的ssh协议版本,分别为1.x和2.x。

SSH协议目前有SSH1和SSH2两个主流版本,SSH2协议兼容SSH1,强烈建议使用SSH2版本。目前实现SSH1和SSH2协议的主要软件有OpenSSH 和SSH Communications Security Corporation 公司的SSH Communications 软件。前者是OpenBSD组织开发的一款免费的SSH软件,后者是商业软件,因此在linux、FreeBSD、OpenBSD 、NetBSD等免费类UNIX系统种,通常都使用OpenSSH作为SSH协议的实现软件。

$ rpm -qa openssh openssl
openssl-1.0.1e-30.el6.x86_64
openssh-5.3p1-104.el6.x86_64

SSH1.x

每台ssh服务器主机都可以使用rsa加密方式来产生一个1024bit的RSAKey,这个RSA的加密方式就是用来产生公钥与私钥的算法之一,SSH1.x的整个联机加密步骤如下: 当SSH服务启动时,会产生一个768-bit的临时公钥(sshd_config配置文件中ServerKeyBits 768)存放在server中

# centos5为768 centos6为1024
$ grep ServerKey /etc/ssh/sshd_config 
#ServerKeyBits 1024

当客户端联机请求传送过来时,服务器就会将这个768-bit的公钥传给客户端,此时客户端会将此公钥与先前存储的公钥进行对比,看是否一致。判断标准是服务器端联机用户目录下~/.ssh/know_hosts文件的内容(linux客户端)

$ ssh -p22 lamp@192.168.65.62
$ ll .ssh/known_hosts 
-rw-r--r--. 1 root root 395 Jun 16 13:15 .ssh/known_hosts

windows SecureCRT图示 在客户端接收到这个768-bit的Server Key后,客户端本地也会产生一个256bit的私钥(private key或host key),并且以加密的方式(具体的加密算法由客户端在服务器提供的所有可用算法中选择,默认为3DES算法),将Server key与host

SSHD_CONFIG配置文件详解

参数选项 注释说明
Port Num 指定sshd服务器侦听端口num。将num改成非标准端口可以提高安全性。默认端口为22。
Protocol 1|2|2,1 指定 sshd 支持的SSH协议的版本号。'1''2'表示仅仅支持SSH-1和SSH-2协议。"2,1"表示同时支持SSH-1和SSH-2协议。
PubkeyAuthentication 是否允许公钥认证。仅可以用于SSH-2。默认值为"yes"
ListenAddress 0.0.0.0 监听的IP,默认监听所有地址(可指定多个监听的地址),可使用以下格式:
ListenAddress
host | IPv4_addr | IPv6_addr
ListenAddress host | IPv4_addr:port
ListenAddress [host|IPv6_addr]:port
举例说明:如果您有两个 IP,分别是 192.168.0.100 及 192.168.2.20 ,那么只想要开放 192.168.0.100 时,就可以写如同下面的样式:ListenAddress 192.168.0.100只监听来自 192.168.0.100 这个 IP 的SSH联机。
HostKey /etc/ssh/ssh_host_key SSH version 1 使用的私钥
HostKey /etc/ssh/ssh_host_rsa_key SSH version 2 使用的 RSA 私钥
HostKey /etc/ssh/ssh_host_dsa_key SSH version 2 使用的 DSA 私钥
KeyRegenerationInterval 1h 由前面联机的说明可以知道, version 1 会使用 server 的 Public Key ,那么如果这个 Public Key 被偷的话,岂不完蛋?所以需要每隔一段时间来重新建立一次!这里的时间为秒!
ServerKeyBits 768 定义服务器密匙的位数,centos5 768,centos6 1024
SyslogFacility 指定 sshd(8) 将日志消息通过哪个日志子系统(facility)发送。有效值是:DAEMON, USER, AUTH(默认), LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7
LogLevel 指定 sshd(8) 的日志等级(详细程度)。可用值如下:QUIET, FATAL, ERROR, INFO(默认), VERBOSE, DEBUG, DEBUG1, DEBUG2, DEBUG3
DEBUG 与 DEBUG1 等价;DEBUG2 和 DEBUG3 则分别指定了更详细、更罗嗦的日志输出。
注:比 DEBUG 更详细的日志可能会泄漏用户的敏感信息,因此反对使用。
LoginGraceTime 2m 当使用者连上 SSH server 之后,会出现输入密码的画面,在该画面中,在多久时间内没有成功连上 SSH server ,就断线!时间为默认为秒,可加时间标志m,h
PermitRootLogin 是否允许 root 登录。可用值如下:
“yes”(默认) 表示允许。“no"表示禁止。
“without-password"表示禁止使用密码认证登录。
“forced-commands-only"表示只有在指定了 command 选项的情况下才允许使用公钥认证登录。同时其它认证方法全部被禁止。这个值常用于做远程备份之类的事情。
StrictModes 指定是否要求 sshd 在接受连接请求前对用户主目录和相关的配置文件进行宿主和权限检查。强烈建议使用默认值"yes"来预防可能出现的低级错误。
MaxAuthTries 指定每个连接最大允许的认证次数。默认值是 6 。如果失败认证的次数超过这个数值的一半,连接将被强制断开,且会生成额外的失败日志消息。
PubkeyAuthentication 是否允许公钥认证。仅可以用于SSH-2。默认值为"yes"
AuthorizedKeysFile 存放该用户可以用来登录的 RSA/DSA 公钥。该指令中可以使用下列根据连接时的实际情况进行展开的符号:
%% 表示’%’
%h 表示用户的主目录
%u 表示该用户的用户名
经过扩展之后的值必须要么是绝对路径,要么是相对于用户主目录的相对路径。默认值是".ssh/authorized_keys"
IgnoreRhosts 是否在 RhostsRSAAuthentication 或 HostbasedAuthentication 过程中忽略 .rhosts 和 .shosts 文件。不过 /etc/hosts.equiv 和 /etc/shosts.equiv 仍将被使用。推荐设为默认值"yes"
IgnoreUserKnownHosts 是否在 RhostsRSAAuthentication 或 HostbasedAuthentication 过程中忽略用户的 ~/.ssh/known_hosts 文件。
默认值是"no"。为了提高安全性,可以设为"yes"
PasswordAuthentication 是否允许使用基于密码的认证。默认为"yes"
PermitEmptyPasswords 是否允许密码为空的用户远程登录。默认为"no"
UseDNS 指定 sshd是否应该对远程主机名进行反向解析,以检查此主机名是否与其IP地址真实对应。默认值为"yes"。。
PidFile 指定在哪个文件中存放SSH守护进程的进程号,默认为/var/run/sshd.pid。文件。
MaxStartups 最大允许保持多少个未认证的连接。默认值是 10 。到达限制后,将不再接受新连接,除非先前的连接认证成功或超出 LoginGraceTime 的限制。

SSH服务的认证类型

从ssh客户端来看,SSH服务主要提供两种级别的安全验证,具体级别如下:

基于口令的安全验证

基于口令的安全验证是大家一直用的,只要知道服务器的SSH连接账号和口令(对应的服务器IP与开放的SSH端口,默认22),就可以通过ssh客户端登陆到这台远程主机。此时联机过程中所有传输的数据都是加密的。

口令验证测试

$ ssh -p52113 root@192.168.252.61

  The authenticity of host '[192.168.252.61]:52113 ([192.168.252.61]:52113)' can't be established.
RSA key fingerprint is 38:68:34:4e:09:c0:75:18:be:72:17:20:2c:95:0a:e6.
Are you sure you want to continue connecting (yes/no)? yes 
Warning: Permanently added '[192.168.252.61]:52113' (RSA) to the list of known hosts.
root@192.168.252.61's password: 
Last login: Thu May 11 21:37:33 2017 from 192.168.252.1
$   

基于秘钥的安全验证

基于秘钥的安全验证方式是指,需要依靠秘钥。也就是必须实现建立一对秘钥对,然后吧公用秘钥(public key)放在需要访问的目标服务器上,另外,还需要把私钥(private key)放到SSH客户端或对应的客户端服务器上

此时,如果想要连接到这个带有公用秘钥的SSH服务器,客户端SSH软件或客户端服务器就会向SSH服务器发出请求,请求用联机的用户秘钥进行安全验证。SSH服务器收到请求后,会先在该SSH服务器上连接的用户的家目录下寻找事先放上去的对应用户的公共密钥,然后把它和连接的SSH客户端发送过来的公用密钥进行比较。如果两个密钥一致,SSH服务器就用公用密钥加密“质询”(challenge)并把他发送给SSH客户端。

SSH客户端收到“质询”之后就可以用自己的私钥解密,再把发送给SSH服务器。使用这种方式,需要使用联机用户的密钥文件。与第一种基于口令验证的方式相比,第二种方式不需要在网络上传送口令密码,所以安全性更高了,这时我们也要注意保护我们的密钥文件。特别是私钥文件,一旦被黑客获取,危险就大了。

基于密钥的安全认证也有windows客户端与linux客户端的区别

WINDOWS下使用秘钥方式登陆linux

方法一:在linux服务器上生成密钥对

$ ssh-keygen -t dsa
Generating public/private dsa key pair.
# 输入文件中要保存的key
Enter file in which to save the key (/root/.ssh/id_dsa): zhangsan
# 输入一个要解密的密码,空为无密码
Enter passphrase (empty for no passphrase): 
# 再次输入密码,空为无密码
Enter same passphrase again: 
# 身份证明以保存至zhangsan这个文件
Your identification has been saved in zhangsan.
# 公钥以保存为zhangsan.pub这个文件
Your public key has been saved in zhangsan.pub.
# lamp主机的root用户的key的指纹为那些
The key fingerprint is:
10:d2:e8:03:30:4b:c9:8b:76:97:d0:6e:09:52:f7:06 root@lamp
The key's randomart image is:
+--[ DSA 1024]----+
|+oo.oE.          	|
|.*.ooo+.         	|
|o oo+ +o         	|
|.o .o*..         	|
|. . o.  S        	|
|                 	|
|                 	|
|                 	|
|                 	|
+-----------------+

$ ls
known_hosts  zhangsan  zhangsan.pub
# 在服务器上将公钥重命名,名字错误将验证不成功

$ mv id_dsa.pub authorized_keys
# 查看是否重命名成功

$ ll
-rw-r--r--. 1 root root 599 Jun 17 03:23 authorized_keys
-rw-------. 1 root root 668 Jun 17 03:23 id_dsa
# 修改公钥权限

$ chmod 600 authorized_keys 
# 查看公钥权限是否修改成功

$ ll
-rw-------. 1 root root 599 Jun 17 03:23 authorized_keys
-rw-------. 1 root root 668 Jun 17 03:23 id_dsa  

使用SecureCRT将私钥转换为openSSH格式的私钥

image-20221214233019524

选择之前下载的私钥的路径

image-20221214233039966

如果没输入密码则无这一步

image-20221214233124937

image-20221214233209994

测试过程

image-20221214233231147

image-20221214233248106

方法二:使用SecureCRT创建秘钥对

  1. 选择当前要生成的秘钥窗口,然后点击“工具”中的创建公钥选项,如下图所示

image-20221214233337089

  1. 秘钥生成向导选择下一步,如下图所示

image-20221214233355827

  1. 秘钥类型选择DSA或RSA,然后点击下一步,如下图所示

image-20221214233415756

image-20221214233427261

  1. 生成秘钥长度,保持默认即可,如下图所示

image-20221214233507874

  1. 秘钥生成过程,如下图所示

image-20221214233520164

  1. 秘钥生成后选择下一步,如下图所示

image-20221214233539086

  1. 秘钥生成后,点击下一步,选择秘钥的私钥保存的路径和,然后点击完成。如下图所示

image-20221214233550840

  1. 点击完成后,弹出是否使用此秘钥为全局公钥,以个人习惯选择是或否,这里选择否,如下图所示

image-20221214233610803

  1. 将SecureCRT生成的公钥上传到linux服务器上

image-20221214233646475

# 创建公钥存放目录
$ mkdir .ssh

# 修改.ssh目录的权限
$ chmod 700 .ssh/

# 查看ssh2兼容格式转换成openssh的格式结果
$ ssh-keygen -i -f Identity.pub  
ssh-dss AAAAB3NzaC1kc3MAAACBAIJLJsIZJ0G/RKBnWQ04uRfqnv3Vkm8iusrI3Bm784lP64kn/IVZnC/2wcs6xjwjuGFt8GgNVKty+
s5/jf4uMBse7Ju3alIv42iOmS5+qeztb3Yio1r0rEjLcEdFZVEW3dbVsYX3ufwvBa9GhPum4q3eYwY7TziKR9ub2UJZTqVzAAAAFQDSfk
HVhjW7J80YBBI2PdqVcRfZ3wAAAIBwmHcLm+BVCcMmpKfYzl+W1/79Cd7vSbeFMW+linn82Li/RcVnWF47hxeKwOwJ/O2UJ879cW1xPUG
nJUNfEvHJs93rn3zthlbwLCmyH8Ugp2pF38DgyydbU6Xs/6lyiUc14WlzvL3QqO1H+QBX/18ZgXsZjoxakd86pz329r9wTgAAAIAVakBN
8DtSRZqPLeaXDhevg3texOTlmDsmhmqBcAOmH6VnzP1VB0E8DhTB8/MWJChSJalslyEzaa1PhBNwZEn3SmG6vWe+CXSuEtHBXbVBQHsDb
xois6L+oqkL86PA7JdzTDSfiZKoGOks5f37Qb+CREnhyYcXJIjPZTE/0aIsdA==

# 将ssh2兼容格式转换成openssl的格式结果
$ ssh-keygen -i -f Identity.pub >>.ssh/authorized_keys

# 修改公钥的权限
$ chmod 600 .ssh/authorized_keys 

# 查看权限是否修改成功
$ ll .ssh/
-rw-------. 1 root root 589 Jun 17 04:37 authorized_keys  
  1. 测试结果 新建快速链接,在鉴权中选择公钥,如下图所示:

image-20221214233705203

image-20221214233722816

如果设置了通行短语,就会出现以下框

image-20221214233734945

image-20221214233756074

裸奔的后果!一次ssh被篡改的入侵事件

扫描端口实例:牤牛阵解决ssh安全问题

$ nmap 192.168.65.62 -p1-65535
Starting Nmap 5.51 ( http://nmap.org ) at 2016-06-17 05:11 CST
Nmap scan report for 192.168.65.62
Host is up (0.0000040s latency).
Not shown: 65532 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
3306/tcp open  mysql

Nmap done: 1 IP address (1 host up) scanned in 0.79 seconds  

本文发布于Cylon的收藏册,转载请著名原文链接~

链接:https://www.oomkill.com/2016/08/ssh-service/

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。