传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。所谓“中间人”的攻击方式,就是“中间人”冒充真正的服务器接收你的传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。

一、什么是ssh

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。 SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Telnet,具有更高的安全性。 SSH提供了口令和密钥两种用户验证方式,这两者都是通过密文传输数据的。 不同的是,口令用户验证方式传输的是用户的账户名和密码,这要求输入的密码具有足够的复杂度才能具有更高的安全性。 而基于密钥的安全验证必须为用户自己创建一对密钥,并把共有的密钥放在需要访问的服务器上。当需要连接到SSH服务器上时,客户端软件就会向服务器发出请求,请求使用客户端的密钥进行安全验证。服务器收到请求之后,先在该用户的根目录下寻找共有密钥,然后把它和发送过来的公有密钥进行比较。如果两个密钥一致,服务器就用公有的密钥加密“质询”,并把它发送给客户端软件。客户端收到质询之后,就可以用本地的私人密钥解密再把它发送给服务器。这种方式是相当安全的。

二、ssh服务认证类型

1.基于口令认证

基于口令的安全验证的方式就是大家现在一直在用的,只要知道服务器的SSH连接帐号和口令(当然也要知道对应服务器的 IP及开放的 SSH端口,默认为22 ),就可以通过 ssh客户端登录到这台远程主机。此时,联机过程中所有传输的数据都是加密的。 如下所示 2.基于密钥认证

首先在客户端生成一对密钥 将客户端的公钥传到服务器端 测试

三、配置ssh服务

为了能让我们的服务器更加安全,我们可以更改配置文件来阻挡一些黑客的攻击。 首先我们配置文件备份一遍,以免出错没法还原 [root@ca .ssh]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak 修改配置文件 我们通过看配置文件发现ssh服务的默认端口是22,很多时候我们的服务器被攻击不是被人针对攻击了,而是对方在扫一个网段中开启22端口的机器,你的机器密码又是很简单的111111之类的,你不被黑谁被黑,所以我们要把默认端口改了,这样就不容易被人扫出来恶意攻击了。 修改默认端口 我们把默认端口改为9527,(注意改的这个端口一定不能占用别的服务的默认端口,以免别的服务启动不起来)效果如下 xshell默认用22端口登录,所以登录不上,我们换9527端口登录。 成功登录 禁止root登录 root在我们系统中是一个特殊的存在,他是系统管理员,也就意味着他在系统中可以为所欲为,所以它也是我们要特别关注的对象,我们可以再碰是的操作中用普通用户操作,在有需要修改一些系统设置的时候再从普通用户切换到root用户,这样可以最大限度的避免因为误操作而对系统造成破坏,同时也可以避免黑客使用root用户名来暴力破解密码登录系统 我们可以看到系统默认的配置是允许root登录的所以我们把它改为no就可以禁止root登录了,我们可以看下效果 如果你用root登录不论你密码是否输入正确他都会提示拒绝了密码,所以你可以让黑客尽情尝试暴力破解他也登录不上去。 限制ssh监听的IP 这个适用于服务器有多个IP,这样我们就可以只监听内网IP,这样就只能用在同一个局域网的机器去连接,而我们只需要让在同一个服务器的另一台机器监听在外网,这样就可以实现在外网也访问服务器了,方法如下 在sshd_config中修改监听端口 我们来看下效果 我们的这台机器是有两个ip的我们分别测试用这两个ip连接 可以看到我们只能通过192.168.92.133连接 禁止使用密码登录 在前面我们说过使用key认证登录的,这是一种比较安全的登录方式,所以为了提高安全性我们可以通过这种方式来登录服务器,再禁止使用密码登录使用key认证登录我已经说过了,在这里就说下如何禁止使用密码登录,也只需要修改一下配置文件就可以了,如下 这个时候我们是无法用密码登录系统的 而我们需要传公钥就得要密码这是很矛盾的,所以需要我们提前把公钥传给服务器,或者临时开启密码登录,然后就能实现登录了。

四、ssh端口转发

SSH 不光会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。而且SSH 还有一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程有时也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。 ssh端口转发两大功能 1.加密SSH Client 端至SSH Server端之间的通信数据 2.为了突破防火墙的限制完成一些之前无法建立的TCP连接 ssh端口转发又分为本地转发和远程转发 1.本地转发 本地转发主要运用于目标服务器因为防火墙规则无法访问,只能由处于同一个局域网内的机器访问,这时候就需要我们用本地端口转发了 本地端口转发格式如下: ssh -L <local port>:<remote host>:<remote port> <SSH hostname> 外部主机A要访问数据库服务器C,但是因为防火墙规则无法直接访问,这时候我们要先连接内部服务器B,通过B来连接C,也就是拿B做跳板 首先我们要在外部主机上选择一个端口作为监听端口,我们使用telnet访问,所以不能用管理员访问,而非管理员用户对1-1023端口是没有权限的,所以我们要选1024-65535之间未被占用的端口。 在数据库服务器上也要安装telnet.server 我们只需要在外部主机上操作就可以了 首先我们看能否直接连接数据库服务器 我们做一个本地端口转发 [root@web ~]# ssh -L 1080:centos6:23 -Nf centos7dns centos6就是我们要访问的数据库服务器 centos7dns就是我们的转发服务器 1080就是我们选择的本地端口 -f:后台启用 -N:不打开远程shell,处于等待状态 -g:启用网关功能 这个时候我们只需通过本地监听的1080端口就能访问数据库服务器了 2.远程转发 远程转发不同之处在于远程转发的监听端口是在远程主机上打开的,就像我们要访问数据库服务器C,使用远程端口转发就是在内部服务器B上进行,使用远程端口转发要保证端口转发服务器和目标服务器之间没有被防火墙拦截。 SSH 的远程端口转发的格式如下所示 ssh -R sshserver_port:remote_host:remotehost_port sshserver 远程端口的转发应用于数据库服务器和内部管理都不允许外网连接,这时候我们就需要在内部管理服务器上做一个远程端口转发隧道,让远程主机可以与数据库服务器建立连接 [root@db ~]# ssh -R 1080:centos6 -Nf centos7 这样远程主机监听本地端口,使用telnet协议就可以远程访问数据库服务器了。