在中小型异构网络中,很多用户选择Linux作为网络操作系统,利用其简单的配置和用户熟悉的图形界面提供Internet服务,FTP便是其提供的服务之一。在众多网络应用中,FTP(文件传输协议)有着非常重要的地位。互联网一个十分重要的资源就是软件资源,而各种各样的软件资源大多数都放在FTP服务器中。与大多数互联网服务一样,FTP也是一个客户机/服务器系统。
FTP是传统的网络服务程序,在本质上是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。所谓“中间人”的攻击方式,就是“中间人”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”转手后做了手脚之后,就会出现很严重的问题。 截获这些口令的方式主要为暴力破解。另外使用sniffer程序监视网络封包捕捉FTP开始的会话信息,便可顺手截获root密码。
SSH(Secure Shell)是以远程联机服务方式操作服务器时的较为安全的解决方案。它最初由芬兰的一家公司开发,但由于受版权和加密算法的限制,很多人转而使用免费的替代软件OpenSSH。 用户通过SSH可以把所有传输的数据进行加密,使“中间人”的攻击方式不可能实现,而且也能够防止DNS和IP欺骗。它还有一个额外的好处是传输的数据是经过压缩的,可以加快传输的速度。SSH作用广泛,既可以代替Telnet,又可以为FTP、POP,甚至为PPP提供一个安全的“通道”。SSH协议在预设的状态中,提供两个服务器功能:一个是类似Telnet的远程联机使用Shell服务器,即俗称SSH功能;另一个是类似FTP服务的SFTP-Server功能,可提供更安全的FTP服务。
SSH的安全验证如何工作呢?主要依靠联机加密技术。从客户端来看,有以下两种安全验证级别:
1.基于口令的安全验证(ssh1) 只要知道自己的账号和口令,就可以登录到远程主机。所有传输的数据都将被加密,但是不能保证正在连接的服务器就是想要连接的服务器。可能受到“中间人”的攻击。
2.基于密匙的安全验证(ssh2) 需要依靠密匙,即用户必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用密匙进行安全验证。服务器收到请求之后,先在该服务器的home目录下寻找公用密匙,然后把它和发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge),并把它发送给客户端软件。客户端软件收到“质询”后,就可以用私人密匙解密再把它发送给服务器。使用这种方式,用户必须知道自己密匙的口令。与第一种级别相比,这种级别不需要在网络上传送口令,不仅加密所有传送的数据,而且阻止了“中间人”攻击方式。OpenSSH目前存在两个安全遗患:口令、密匙破解(利用字典文件去解密码)和OpenSSH中可能被安放木马。
一、SRP简介
SRP全称:Secure Remote Password(安全远程密码),它是一个开放源代码认证协议。使用SRP的客户机/服务器不会在网络上以明文或加密的方式传送密码,这样可以完全消除密码欺骗行为。保证口令可以安全地在网络上面传送。基本的思想是,防止有被动或主动网络入侵者使用字典攻击。Standford大学计算机系开发了SRP软件包,提供基于口令认证和会话加密的安全机制,而不需要用户或者是网管参与密钥的管理或分发。SRP为每一个人提供透明的密码安全,而没有其他昂贵的起始开销,比如阻止其他安全套件软件的使用等。不像其他的安全软件,SRP套件是一个完全的实现密码认证的软件包,不是临时的解决方案。和标准的/etc/shadow-style 安全比较,SRP在每一个方面都是比较好的。使用SRP对用户和管理者都有以下的好处:
SRP抵制“password sniffing”(口令监听)攻击。在一个使用SRP认证的会话中,监听者不会监视到任何在网络中传送的口令。在远程登陆软件中,明文的密码传送是最大的安全漏洞。任何人可以用一个简单的嗅探器(sniffer)工具得到你登陆到远程系统的密钥。
SRP抵制字典攻击。一个系统保护简单的密码监听是不够的。如果攻击者使用强力攻击,例如字典攻击等,他们不是简单的直接监听密码,而是跟踪整个的会话过程,然后把整个的信息和字典中的普通密码对照。甚至有的Kerberos系统对这样的攻击也是脆弱的。SRP在抵制字典攻击的前,就进行口令的安全处理了。使用的算法就是在攻击者进行强力攻击前就要求攻击者必须执行一次不可能的的大的计算。SRP甚至保护针对口令的“active”攻击。因此,即使入侵者有能力和网络接触,也不能攻破SRP。所以即使是用户使用的是很脆弱的口令,也不会让入侵者很容易地破解的。SRP对于终端用户是完全透明的。因为没有所谓的“密钥链”(keyrings)以及“证书”(certificates),或者“票据”(ticket)。你的口令就是密钥。SRP简单地保护这个密钥,但要比老的、弱的密钥保护机制要好。SRP从管理者的角度来说也是容易实施的。没有所谓的“密钥服务器”、“证书认证”,以及“认证服务器”等这样的概念。SRP口令文件在标准的Unix口令文件的旁边,软件本身协同这两个系统口令和SRP口令文件的一致性,没有多余的维护系统的机制。SRP在认证一个用户的时候交换一个加密的密钥。这就意味着一个登陆会话是可以被加密,而抵制所谓的网络监听和恶意地篡改。用户在远程阅读他们的信笺,是使用128-bit加密后的信息,这是当用户登陆后自动处理的,而用户本身不必关心到底需要不需要加密。系统完成加密,然后送到用户的这里。另外SRP不使用加密进行认证,这使得它比基于公用/私用密匙的认证方式速度更快捷、安全。SRP缺省使用的128-bit的CAST加密算法。CAST-128在RFC2144(http://srp.stanford.edu/srp/rfc2144.txt)中有定义。标准的SRP也支持56-bit的DES以及48位的DES。高级的支持Triple-DES加密手段。本文将介绍如何建立基于SRP的Telnet服务器。操作环境Redhat Linux 9.0。
二、软件下载和编译
SRP软件主页是:http://srp.stanford.edu 最新版本2.1.1,安装SRP前先要安装OpenSSL。
#wget http://srp.stanford.edu/source/srp-2.1.1.tar.gz #cp /usr/src/redhat/SOURCES #./configure --with-openssl=/usr/src/redhat/SOURCES/openssl-0.9.6 / --with-pam #make;make install |
三、建立指数密码系统EPS
EPS全称:Exponential Password System(指数密码系统),SRP软件包中已经包括EPS源代码。
1. 安装PAM模块
PAM简介:
PAM全称:Pluggable Authentication Module (嵌入式认证模块)。它最初有SUN公司开发;很快被Linux社区的接受,并且开发了更多的模块。其目标是提供一套可用于验证用户身份的函数库,从而将认证从应用程序开发中独立出来。Linux-PAM处理四种独立的(管理)工作。它们是: 认证管理; 帐号管理; 会话期间管理;和密码管理。
PAM工作方式:
(1) 调用某个应用程序,以得到该程序的服务。
(2) PAM应用程序调用后台的PAM库进行认证工作。
(3) PAM库在/etc/pam.d/目录中查找有关应用程序细节的配置文件,该文件告诉PAM,本应用程序使用何种认证机制。
(4) PAM库装载所需的认证模块。
(5) 这些模块可以让PAM与应用程序中的会话函数进行通信。
(6) 会话函数向用户要求有关信息。
(7) 用户对这些要求做出回应,提供所需信息。
(8) PAM认证模块通过PAM库将认证信息提供给应用程序。
(9) 认证完成后,应用程序做出两种选择:
将所需权限赋予用户,并通知用户。
认证失败,并通知用户。
PAM工作流程见图1。
图1 PAM工作流程
PAM具体使用方法:
#cd /usr/src/redhat/SOURCES/srp-2.1.1/base/pam_eps. #install -m 644 pam_eps_auth.so pam_eps_passwd.so /lib/security |
上面命令会在/lib/security 目录下安装PAM模块。然后使用命令:“/usr/local/bin/tconf”创建/etc/tpasswd 和 /etc/tpasswd.conf文件。
2. 使用EPS PAM模块进行密码验证
(1) 首先备份 /etc/pam.d/system-auth文件
(2) 修改 /etc/pam.d/system-auth文件如下形式:
auth required /lib/security/pam_unix.so likeauth nullok md5 shadow auth sufficient /lib/security/pam_eps_auth.so auth required /lib/security/pam_deny.so account sufficient /lib/security/pam_unix.so account required /lib/security/pam_deny.so password required /lib/security/pam_cracklib.so retry=3 password required /lib/security/pam_eps_passwd.so password sufficient /lib/security/pam_unix.so nullok use_authtok md5 shadow password required /lib/security/pam_deny.so session required /lib/security/pam_limits.so session required /lib/security/pam_unix.so |
注意上面第一行黑体字表示PAM的eps_auth模块可以满足认证需求。第二行黑体字表示PAM 的pam_eps_passwd.so 模块用来进行密码管理。
(3) 将标准密码转换为EPS格式
(4) /etc/pam.d/system-auth 配置文件的模块pam_eps_passwd.so 将EPS版本的密码验证字符串写入/etc/tpasswd 文件中。 修改 /etc/pam.dpasswd文件如下形式:
auth required /lib/security/pam_stack.so service=system-auth account required /lib/security/pam_stack.so service=system-auth password required /lib/security/pam_stack.so service=system-auth |
四、启动SRP版本下的FTP服务器
(1)进入SRP源代码FTP子目录,分别建立FTP服务器文件和FTP客户端文件:
#cd /usr/src/redhat/SOURCES/srp-2.2.1/ftp #make;make install |
(2)建立超级访问程序/etc/xinetd.d/srp-ftpd 内容如下:
service ftp { socket_type = stream wait = no user = root server = /usr/local/sbin/ftpd log_on_success += DURATION USERID log_on_failure += USERID nice = 10 disable = no } |
(3)使用命令从新启动xinetd
#killall -USR1 xinetd |
(4)建立/etc/pam.d/telnet 文件,内容如下:
#%PAM-1.0 auth required /lib/security/pam_listfile.so item=user / sense=deny file=/etc/ftpusers onerr=succeed auth required /lib/security/pam_stack.so service=srp-ftp auth required /lib/security/pam_shells.so account required /lib/security/pam_stack.so service=srp-ftp session required /lib/security/pam_stack.so service=srp-ftp |
到此为止现在就建立了一个使用SRP服务的FTP服务器。首先在本地进行试验。下面是一个典型会话:
$$ /usr/local/bin/ftp localhost Connected to localhost.intevo.com. 220 k2.intevo.com FTP server (SRPftp 1.3) ready. SRP accepted as authentication type. Name (localhost:kabir): cao SRP Password: xxxxxxxx SRP authentication succeeded. Using cipher CAST5_CBC and hash function SHA. 200 Protection level set to Private. 232 user kabir authorized by SRP. 230 User kabir logged in. Remote system type is UNIX. Using binary mode to transfer file |
使用SRP的FTP服务中非常好下面的密码公式:
NONE (1) BLOWFISH_ECB (2) BLOWFISH_CBC (3) BLOWFISH_CFB64 (4) BLOWFISH_OFB64 (5) CAST5_ECB (6) CAST5_CBC (7) CAST5_CFB64 (8) CAST5_OFB64 (9) DES_ECB (10) DES_CBC (11) DES_CFB64 (12) DES_OFB64 (13) DES3_ECB (14) DES3_CBC (15) DES3_CFB64 (16) DES3_OFB64 (17) |
SRP也支持MD5和SHA哈希函数。缺省情况下SRP使用CAST5_CBC 密码和SHA 函数。要使用其它格式的密码。可以使用-c或-h选项。
#/usr/local/bin/ftp -c blowfish_cfb64 “ip地址” |
上面的命令使用BLOWFISH_CFB64 密码而不是缺省的CAST5_CBC。
#/usr/local/bin/ftp –h md5 “ip地址” |
上面的命令使用MD5函数而不是缺省的SHA函数。
五、在非Linux平台上使用SRP客户机
SRP同样支持其他流行的操作系统(Unix、BSD、Winodws、MacOS)。Kermit 95是一个工作在Windows 9x, ME, NT, and 2000, XP和 OS/2操作系统下的SRP客户机。详细情况前查看相关网址:http://www.columbia.edu/kermit/k95.html 。
总结:详细的SRP工作原理可以在SRP的有关站点发现。地址是http://srp.stanford.edu/srp,在这里你可以得到有关协议的在线说明http://srp.standford.edu/srp/design.html或者是一个出版的关于SRP的技术白皮书http://srp.standford.edu/srp/ftp。 以上提供了相对OPENSSH更加安全快捷的FTP登录远程Linux服务器的方法,基于SRP服务 FTP应用与其他网络应用一样属于客户机/服务器模型,一旦连通后,客户机可以享有服务器所提供的一切服务。