SSH在网络安全中的应用
SSH在网络安全中的应用
马玉军 王玉磊 李晓彦
(南阳理工学院网络中心, 河南 南阳 473004)
一.为什么网络中会存在安全问题
在互联网络飞速发展的今天,网络安全已成为人们讨论越来越多的一个话题。那么,究竟我们的网络问什么会不安全呢?这其中有一个重要的历史原因:我们都知道,互联网的通信基础是TCP/IP协议,在整个互联网的发展和普及中,TCP/IP起到了至关重要的作用,它已成为事实上的工业标准,可以说如果没有TCP/IP就没有今天蓬勃发展的互联网。但是,由于在TCP/IP的设计之初,没有考虑到网络安全问题,而考虑更多的是怎样更好的完成信息传递工作,正是由于TCP/IP的设计缺陷导致了很多安全问题。但是,TCP/IP已经成为事实上的工业标准,而且已经得到广泛的应用,要想直接修改TCP/IP协议来增强安全性是不太现实的。所以,为了在现有网络基础上实现网络的安全,设计了许多基于TCP/IP的安全协议来保护网络通信。其中的一些安全协议已经得到了广泛应用。本文要讨论的SSH就是一种已经得到广泛应用的安全协议,当前最新版本为2。
二.SSH的历史及其现状
通常网络管理员为了实现远程管理服务器,一般都使用一种叫作telnet的工具进行远程登录到服务器上执行相关的管理任务,这种管理方式需要借助于TCP/IP网络进行,在世界各地的任何地方,只要主机联入互联网,就可以轻松的远程管理服务器,这种方式给无数管理员带来了方便。但是,在使用telnet的过程中也存在一种致命的弱点,即:在进行身份认证时,它使用的是明文在互联网络上传输,这是一种潜在的安全隐患。可以假想,在网络上,如果有某一台主机监听所有的数据包(一般情况下,主机只接收发送给自己的数据包,而不是发送给自己的则丢弃,但可以把网络接口卡设置为混杂模式,网卡的这种规模式使主机接收到达主机的任何数据包,包括不是发送给自己的数据包),那么我们在网络上传送的一些敏感信息(如:用户名和密码)都可能被窃听到,而且通过相应的软件还可能被转换成明文。所以,在网络中使用telnet是非常不安全的。正是由于这种安全问题,才诞生了SSH——一种代替telnet的远程安全管理工具。
SSH最初是由程序员Tatu Yloenen开发,包括SSH协议和服务软件,英文全称为Secure Shell(即安全外壳)。它实现了密钥交换协议以及主机及客户端认证协议,在传送数据时把所有数据都加密传输,在接收方再进行解密,以防止网络窃听的发生。SSH最初允许自由的使用,但是Ylonen作为SSH Communications Security公司的创始人,最终将其商业化,如果作为商业化的应用必须付费,若非商业化还可自由使用。这也就导致了OpenSSH的诞生,它是SSH的完全免费的实现。现在在绝大多数的Linux版本中都默认的安装了OpenSSH软件(包括服务器端和客户端软件)。
SSH已经有了很多商品化版本,而且还有多种UNIX/Linux系统平台上的免费版本。本文将主要以Linux操作系统(当今最为流行的网络操作系统之一,而且公开源代码)为服务器(在其它的UNIX或UNIX的派生操作系统上的操作也一样),windows操作系统为客户端介绍免费的商业SSH版本的安装及其实现。其重点是Linux服务器的配置。
三.SSH在Linux上的安装和实际应用
1.软件的获得
软件的获得可从http://www.openssh.org下载OpenSSH,当前最新版本为3.6.1,或者从http://www.ssh.com/ 下载针对Linux的非商业版本,当前最新版本为3.2,具体地址为:
SSH服务器地址:http://www.ssh.com/support/downloads/secureshellserver/non-commercial.html
SSH客户端地址:http://www.ssh.com/support/downloads/secureshellwks/non-commercial.html(这是一个For Windows版本)。不管是OpenSSh还是SSH Communications Security公司的SSH版本,都可以使用功能基本上一样,只是前者完全免费,而后者使用时要注意许可协议。在使用角度上可考虑,笔者认为后者更好用一些。本文着重介绍后者的安装和使用。
2.安装
从SSH Communications Security公司下载的SSH服务器是源代码方式,文件名为ssh-3.2.3.tar.gz,必须对其进行编译和安装之后才能够使用,这就要求您的Linux系统中必须包含有一种C语言编译器,如:cc或gcc。
我们假设软件的下载目录为root用户的宿主目录,即”/root”目录。
(1)用以下命令进行解压缩解包操作(斜体加阴影的为从键盘输入的内容):
[root@localhost root]# tar zxvf ssh-3.2.3.tar.gz
解压缩完成后会生成一个”ssh-3.2.3”的源代码目录。
(2)切换到源代码代码目录,进行软件安装前的配置,编译和安装,命令为:
[root@localhost root]# cd ssh-3.2.3
[root@localhost ssh-3.2.3]# ./configure - -prefix=/usr/local/ssh3.2.3 - -enable-static
[root@localhost ssh-3.2.3]# make
[root@localhost ssh-3.2.3]# make install
安装成功后,在/etc/目录下会增加一个ssh2目录,这个目录是用来存放SSH服务器的所有配置文件;在”/usr/local/”目录下会生成”ssh3.2.3”子目录,它是SSH程序文件和其它文件的存放位置。
3.基本配置和应用
要想启动SSH服务器只需要在Linux服务器上简单的执行下面一条命令:
[root@localhost ssh-3.2.3]# /usr/local/ssh3.2.3/sbin/sshd &
但是,每次重新启动系统后都要重复上述操作才能启动SSH服务器,为了使保证SSH服务器每次开机时自动启动,还要在”/etc/rc.d/rc.local”文件(此文件类似于DOS下的autoexec.bat文件,每次启动系统后都要执行其中的命令)的最后加入以下内容:
#start ssh3.2
/usr/local/ssh2/sbin/sshd &
其中第一行为注释内容,第二行为启动SSH服务器并作为后台守护进程运行。
接下来要做的是配置SSH服务器,所有的配置都是通过修改”/etc/ssh2/sshd2_config”文件实现的。文件的默认配置已经能满足一般的要求。下面介绍几种比较常见的应用:
(1)使超级用户root能够直接登录服(2)务器
使用telnet时root用户默认情况下不能直接从远程登录系统(除非在文件”/etc/securetty”中加入网络终端)。一般要先以普通用户登录,然后,使用su切换到root身份,这也是出于安全性的考虑。由于SSH使用了加密方式传输数据,所以可以放心的直接使用root登录服务器,那么我们需要将sshd2_config文件中的:
# PermitRootLogin yes
取消注释,即改为:
PermitRootLogin yes
然后,重新启动SSH服务器,即可通过SSH以root身份登录Linux服务器。当然,如果您要禁止超级用户登录的话,可将”yes”该为”no”即可。
(3)如何允许或禁止某些用户或组用户使用SSH登录
要实现禁止用户或组使用SSH登录服务器,只需要修改sshd2_config文件中的以下几行内容:
# AllowUsers sj.*,s[[:digit:]]*,s(jl│amza)
# DenyUsers skuuppa,warezdude,31373
# DenyUsers don@untrusted\.org
# AllowGroups staff,users
# DenyGroups guest,anonymous
可以根据自己的实际需要,取消注视符”#”,加入实际的用户名或者组名,然后重新启动SSH服务器即可禁止(或允许)某些用户或者组使用SSH,具体操作这里不在祥述。
(4)使用SFTP(Secure FTP)代替ftp传输文件
FTP(文件传输协议)是一种使用非常广泛的在网络中传输文件的方式,但是,它也同样存在被网络窃听的危险,因为,它也是以明文传送用户认证信息。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure FTP)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。若要开启SFTP功能可以修改”sshd2_config”文件的下列内容:
# subsystem-sftp sftp-server
去掉行首的”#”,然后重新启动SSH服务器,这样在进行SSH连接时可同时使用SFTP传输文件。
(5)关于客户端设置
以上是对服务器的设置,其实在SSH服务器中已经包含了一些客户端工具(比如:ssh,sftp工具)。但是,更多的客户端用户使用windows系统,下面就对windows上的客户端系统设置加以说明。
首先从上文给出的网址下载”SSHSecureShellClient-3.2.3.exe”并安装,安装完成后,在桌面上会产成两个快捷方式,一个是”SSH Secure Shell Client”用于远程管理,另一个是”SSH Secure File Transfer Client”用于和服务器进行文件传输,在工具栏中点击”quick connnect”,输入正确的主机名和用户名,然后在弹出的对话框中输入密码完成登录,即可开始执行命令或者传输文件。在使用SFTP时默认只能显示用户的宿主目录的内容和非隐藏文件。但是,有时候您可能还要查看其他目录或者隐藏文件,这时只需要在菜单”eidtàsettingàfile transfer”的选项中选中”show root directory”和”show hidden file”两个选项即可。
(6)使普通用户仅使用SFTP而(7)没有使用Shell的权限
默认情况下管理员给系统添加的账号将同时具有SFTP和SSH的权限。Linux虽然是一个非常安全的系统,但是,如果让普通用户使用shell执行命令也是有很大的安全隐患的,如果能够禁止用户使用shell执行命令而仅使用SFTP传输文件,就能消除这种安全隐患,完全的实现ftp的功能,下面就来讨论这一问题。
正如上文所述,SFTP没有单独的守护进程,只能借助于sshd守护进程,所以我们仍然需要使用SSH服务器,要保证sshd守护进程处于运行状态。具体实现方法如下:
首先,在编译安装时,编译中一定要有”--enable-static” 选项,安装成功后,在安装目录下的bin目录中执行下面的命令:
[root@localhost bin]# ls -l ssh-dummy-shell* sftp-server2*
将看到下列输出内容:
-rwxr-xr-x 1 root root 1350417 Apr 28 16:30 sftp-server2
-rwxr-xr-x 1 root root 3566890 Apr 28 16:30 sftp-server2.static
-rwxr-xr-x 1 root root 72388 Apr 28 16:30 ssh-dummy-shell
-rwxr-xr-x 1 root root 1813412 Apr 28 16:30 ssh-dummy-shell.static
其中带”static”后缀名,且比较大的两个文件就是加上”--enable-static”选项后生成的,后面我们将用到这里两个文件。
下面以在系统中添加普通账号test为例讲述具体操作步骤。
1.在/home目录(或者将要存放普通用户宿主目录的目录)下创建bin子目录,并将两个static文件复制到此目录下(复制后改名去掉static后缀),执行如下命令:
[root@localhost bin]# cd /usr/local/ssh3.2/bin
[root@localhost bin]#cp ssh-dummy-shell.static /home/bin/ssh-dummy-shell
[root@localhost bin]# cp sftp-server2.static /home/bin/sftp-server
[root@localhost bin]#chown -R root.root /home/bin
[root@localhost bin]#chmod -R 755 /home/bin
2.添加一个组,使以后的所有禁止使用shell的用户都属于这个组,这样便于管理更多的用户:
[root@localhost bin]#groupadd template
3.在添加系统账号时使用如下命令:
[root@localhost root]#useradd -s /bin/ssh-dummy-shell -g template test
[root@localhost root]#passwd test
[root@localhost root]#mkdir /home/test/bin
[root@localhost root]#cd /home/test/bin
[root@localhost bin]#ln /home/bin/ssh-dummy-shell ssh-dummy-shell
[root@localhost bin]#ln /home/bin/sftp-server sftp-server
[root@localhost bin]#chown -R root.root /home/test/bin
[root@localhost bin]#chmod -R 755 /home/test/bin
3.用户添加成功后,还需要修改/etc/ssh2/sshd2_config文件,将下列内容:
# ChRootGroups sftp,guest
改为:
ChRootGroups sftp,guest,template
修改上面这行内容,主要是为了禁止普通用户查看系统的其它目录,而把其权限限制在自己的主目录下。重新启动SSH服务器程序,在客户端使用SSH Secure File Transfer Client登录,即使选择显示根目录,普通用户也看不到其它的任何目录,而是把自己的主目录当作根目录。注意我们这里使用的是按用户所属组限制,这样可以使包含在template组内的所有用户都可以实现此功能。若您只要限制个别用户的话可以修改下面的内容:
# ChRootUsers anonymous,ftp,guest
结论
事实证明SSH是一种非常好的网络安全解决方案,但是,目前仍有很多管理员使用telnet或ftp这种非常不安全的工具,希望尽快转移到SSH上来,以减少网络安全隐患。