本文发布于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格式的私钥
选择之前下载的私钥的路径
如果没输入密码则无这一步
测试过程
方法二:使用SecureCRT创建秘钥对
- 选择当前要生成的秘钥窗口,然后点击“工具”中的创建公钥选项,如下图所示:
- 秘钥生成向导选择下一步,如下图所示:
- 秘钥类型选择DSA或RSA,然后点击下一步,如下图所示:
- 生成秘钥长度,保持默认即可,如下图所示:
- 秘钥生成过程,如下图所示:
- 秘钥生成后选择下一步,如下图所示:
- 秘钥生成后,点击下一步,选择秘钥的私钥保存的路径和,然后点击完成。如下图所示:
- 点击完成后,弹出是否使用此秘钥为全局公钥,以个人习惯选择是或否,这里选择否,如下图所示:
- 将SecureCRT生成的公钥上传到linux服务器上
# 创建公钥存放目录
$ 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
- 测试结果 新建快速链接,在鉴权中选择公钥,如下图所示:
如果设置了通行短语,就会出现以下框
扫描端口实例:牤牛阵解决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 国际」 许可协议进行许可。