Linux下架设安全的Web邮件服务器

    [多云 April 26, 2007 19:08 | by ]
我们讲述如何把Linux机器配置成一个基于Web的电子邮件系统。这个电子邮件系统可以用于一个小团体或者组织之中。当然,如果你家里有一个Internet连接(比如DSL),那么它也可以用安全的方式远程检测你的电子邮件。

我们使用的软件是带有mod_ssl和PHP4的Apache,还有Webmail软件Aeromail。之所以选择这一组合,是因为它们的开发和维护都非常活跃,安装非常简单,功能也非常丰富。

假设系统上还没有安装Web服务器或者SSL库。首先要安装基本的邮件服务器、IMAP服务器,并且确保它们只接收本地连接。接着,要构建一个强大的Web服务器,它支持SSL(加密套接字协议层)连接和PHP脚本语言。接下来,安装用于在一个Web页面上显示邮件的软件就非常简单了。

下面是要下载的文件表:

-rw-r--r--   1 jose jose   22841 Nov 19 15:18 aeromail-1.40.tar.gz
-rw-r--r--   1 jose jose 2847497 Oct 25 19:14 apache_1.3.14.tar.Z
-rw-r--r--   1 jose jose 1866035 Oct 25 13:27 imap.tar.Z
-rw-r--r--   1 jose jose   748253 Oct 25 19:15 mod_ssl-2.7.1-1.3.14.tar.gz
-rw-r--r--   1 jose jose 2086131 Sep 24 11:46 openssl-0.9.6.tar.gz
-rw-r--r--   1 jose jose 2225976 Nov 5 13:31 php-4.0.3pl1.tar.gz

之所以选择这些版本是因为它们提供了大部分的功能,并且非常稳定。在自己架设服务器时,建议最好使用最新的可用版本,并且随时关注补丁的发布。

现在有了所需要的软件就可以开始工作了。应该说,整个配置过程不会花太多的时间,在本文中,我们把所有的文件都置于同一个目录之下(/webmail),而Apache则安装于缺省的目录之下,即/usr/local/apache/htdocs。

安装前的准备
我们要在电脑中安装一个软件包用于实现监听服务。一般来说,Linux工作站在安装过程中不会安装该软件。这个程序就是inetd服务器,它可以监听一些邮件收发的后台程序。在Red Hat 6.2的安装中,包含该程序的RPM文件是inetd-0.16-4.i386.rpm。在Red Hat 6.2中,下面的步骤将完成inetd后台程序的安装:

# rpm -ivh inetd-0.16-4.i386.rpm
# /usr/sbin/inetd
# /sbin/chkconfig inetd on

构建IMAP服务器
IMAP(Internet Message Access Protocol)是用户从不同的计算机访问邮件的一种方式。它的工作方式是在一台中央计算机上存储信息,并且允许用户访问信息的一个拷贝。你可以让本地工作站和服务器同步,此外也可以为邮件创建一个文件夹,并且具有完全的访问权限。这一点和POP3不同。

首先,下载文件,并且将其解压缩:

$ tar -zxvf imap.tar.Z

然后进入新建的目录中并且编译IMAP服务器。因为使用的是Linux,所以这个过程非常简单:

$ cd imap-2000
$ make slx
(输出结果省略)

安装新的IMAP服务器也非常简单,只需将其放到合适的位置即可:

# cd imapd
# cp imapd /usr/sbin/imapd

现在要告诉计算机如何监听imapd连接,以及如何处理这些连接。首先,编辑inetd配置文件inetd.conf:

# vi /etc/inetd.conf

修改经常要读取的行:

#imap stream tcp nowait root /usr/sbin/tcpd imapd

将其改为:

imap stream tcp nowait root /usr/sbin/tcpd imapd

也就是去掉行前的“#”号,告诉inetd该行不是注释行。然后告诉inetd重新读取这些配置。我们通过向inetd进程发送HUP信号来达到这一目的。首先要得到进程的ID号:

# ps -ax | grep inetd
7699 ?     S     0:00 inetd

此处的7699指的是inetd的进程ID号,当然你自己配置时ID号可能会不同。下面告诉inetd重新读取配置文件:

# kill -HUP 7699

最后,要确保inetd拒绝任何不速之客。在现实中,很多黑客喜欢通过突破imapd服务来突破系统,为此,我们限制该服务器仅限于连接本地机器。这就意味着只有本地的Web服务器可以连接它。我们通过编辑以下文件来实现这一目的:

# vi /etc/hosts.deny

在其中加入用于IMAP程序的一行:

imapd:ALL

接下来编辑允许连接的文件:

# vi /etc/hosts.allow

并且在文件的未尾加上下面的内容:

imapd: 127.0.0.1

到此为止,第一部分的安装就完成了。

配置SSL库
下面要为安全的Web服务器编译所需的库。这些库提供了SSL需要的功能。在你查看电子邮件时,需要有一个安全的Web服务器来保护你的密码,以及所有流到Web服务器的信息。这样可以避免别有用心的人通过监听会话来获取密码。

编译和安装库的过程非常简单。从包含所需文档的目录开始,首先解开文档:

$ tar -zxvf openssl-0.9.6.tar.gz

然后,要配置和编译库。配置过程很方便,系统可以自动找出所需信息,编译过程也是自动进行的。

$ cd openssl-0.9.6
$ ./config
(输出结果省略)
$ make
(输出结果省略)

下面,以root的身份在缺省目录下安装软件。因为使用OpenSSL的程序通常认为它位于默认位置(/usr/local/ssl),因此最好不要对其进行更改。

#make install

现在就完成了所需库的安装。其它的程序也可以使用这些库了。

支持PHP4
下面是本例中最耗时间的一个过程,但是实现起来也不是很困难。我们要构建一个强大的Web服务器,它要支持PHP4脚本语言,并且可以通过SSL进行安全连接。要做到这一点,首先要把这些部件和服务器软件结合起来,然后编译它。

首先解开在安装过程中所需的源代码:

$ tar -zxvf Apache_1.3.14.tar.gz
$ tar -zxvf mod_ssl-2.7.1-1.3.14.tar.gz
$ tar -zxvf php-4.0.3pl1.tar.gz

注意,在此mod_ssl有两个版本号,即2.7.1和1.3.14。这是因为其中有一些针对Apache的补丁和附加的代码。我们一定要使用和Apache源代码相对应的版本,否则将无法正常工作。

首先要做的事情是把这些来自mod_ssl的源代码补丁应用到Apache中。在这个过程中,只需指明Apache源代码所处的位置即可:

$ cd mod_ssl-2.7.1-1.3.14
$ ./configure --with-Apache=../Apache_1.3.14
$ cd ..

在这一步骤中,要注意是否有错误提示,否则它很有可能和下面步骤的错误混杂在一起。如果的确有错误提示,那么请检查mod_ssl的版本是否和所用的Apache版本一致。

下面,要对Apache源代码的目录树进行预配置。这样做的目的是为了让PHP源代码知道所有有关Apache系统的信息。

$ cd Apache_1.3.14
$ ./configure --prefix=/usr/local/Apache --without-confadjust
$ cd ..

现在就已经完成了PHP在Apache中的安装。在这个部分,要编译PHP的大部分模块,因此可能要花一些时间。此外,还要PHP能够支持IMAP客户端功能。该功能是基于Web的电子邮件系统所需要的。

$ cd php-4.0.3pl1
$ ./configure --with-Apache=../Apache_1.3.14 --with-imap=../imap-2000

现在开始安装:

$ make install
$ cd ..

现在已经做好了编译Apache服务器的准备。它要能够支持SSL和PHP4,因此要在配置时告诉它要包括这些部分,还要指明SSL库的位置,也就是上述安装OpenSSL的位置。

$ cd Apache_1.3.14
$ SSL_BASE=/usr/local/ssl ./configure \ --enable-module=ssl --without-
confadjust \ --activate-module=src/modules/php4/libphp4.a

这里需要注意的是,libphp4.a还不存在,但这一步要确保它被编译进服务器中。下面就可以编译和安装Web服务器和SSL证书了。

$ make
$ make certificate

这一步骤可以为服务器生成一个交互式的证书。这用于和Web终端之间用密码的信息交流中。与此同时,还要回答以下问题:

Signature Algorithm ((R)SA or (D)SA) [R]: R
(omitted)
1. Country Name (2 letter code) [XY]: China
2. State or Province Name (full name) [Snake Desert]: BeiJing
3. Locality Name (eg, city) [Snake Town]: BeiJing
4. Organization Name (eg, company) [Snake Oil, Ltd]: Home
5. Organizational Unit Name (eg, section) [Webserver Team]: Parents
6. Common Name (eg, FQDN) [www.snakeoil.dom]: friend.dsl.isp.com
7. E-mail Address (eg, name@FQDN) [www@snakeoil.dom]: friend@isp.com
8. Certificate Validity (days) [365]: 365
STEP 3: Generating X.509 certificate signed by Snake Oil CA [server.crt]
Certificate Version (1 or 3) [3]: 3
(输出结果省略)
Encrypt the private key now? [Y/n]:n
(输出结果省略)

最后,可以安装整个服务器、配置和证书:

#make install

为了能够读懂PHP文件(该过程由服务器处理),需要编辑配置文件。同时,还要强迫Webmail终端使用SSL。

# cd /usr/local/Apache/conf
# vi httpd.conf

首先更改服务器,使它可以解释PHP文件。我们只需去掉下列行前面的“#”即可:

AddType application/x-httpd-php .php3
AddType application/x-httpd-php-source .phps
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

虽然PHP4是向后兼容的,但是如果处理PHP3文件,将不能够正确解析,所以就只把它作为一般的PHP文件来处理。也就是说把上述第一行的“3”删去。

接下来要设置服务器,以确保在读取电子邮件时需要SSL。这是避免在网络上使用普通文本传送密码。通过添加下列几行来实现这一功能。

<Directory /usr/local/Apache/htdocs/aeromail>
SSLRequireSSL
<Directory>

保存好配置文件,再进行下一个部分的安装和设置。

安装Aeromail
现在就可以安装Webmail软件了。在本例中,选择的是Aeromail。之所以选择它是由于它简单、易于安装和设置。

首先将文件包解压缩至Web文档目录之下:

# cp aeromail-1.40.tar.gz /usr/local/Apache/htdocs/
# cd /usr/local/Apache/htdocs/
# tar -zxvf aeromail-1.40.tar.gz
# cd aeromail

下面来编辑Aeromail配置文件:config.inc。

#vi config.inc

这里面要做的最重要改变就是当退出登录或者取消登录时对页面进行重定向。应该把它定向到自己的Web服务器上。要做到这一点,只需下面的行即可:

$SERVER_REDIR = "http://the.cushman.net/";

其它的变量,比如每一屏显示的信息数、颜色主题等都是可以配置的。配置文件中的注解可以帮助你找到这些相关的内容。

测试服务器
现在要进行一些测试。首先要启动服务器:

# /usr/local/Apache/bin/Apachectl startssl

将看到如下内容:

Apachectl startssl: httpd started

如果没有看到上述内容,那么可能是什么地方出现了问题。最好的办法是查看诊断日志文件,该文件位于../logs/error_log。

现在来看一看是否在监听两个新的端口。使用netstat来查看这些内容:

# netstat -na | grep LISTEN
tcp   0 0 0.0.0.0:80   0.0.0.0:*   LISTEN
tcp   0 0 0.0.0.0:443   0.0.0.0:*   LISTEN

很显然,有两个正在监听的套接字,80/TCP和433/TCP端口。现在我们要连接到服务器,并且测试安全Webmail连接。启动一个浏览器(Netscape、Konqueror等),并且在其URL中输入服务器名,本例中为friend.dsl.isp.com,而安全的Aeromail站点的URL应该是:https://friend.dsl.isp.com/aeromail/

接下来要做的是接受证书。对于Netscape,需要有几个步骤,现简述如下:

首先出现的是一个突出窗口,提示该站点是加密的,Netscape并不能识别这一签字权。点击“Next”继续(如图1)。

1

图1 加密提示窗口
第二步将告诉一些有关证书的内容,如果点击“More Info”钮,那么可以看到更多的相关信息。在此点击“Next”钮继续(如图2)。

2

图2 有关证书的一些内容
接下来要选择是否接受证书以及接受多长时间,一般都选择第三项,即“Accept this certificate forever”,之后点击“Next”(如图3)。

3

图3 确认是否接受证书
接下来选择是否在每次提交信息时都会有一个警告。应该说这非常有用,但这也是很让人讨厌的。我一般都喜欢忽略警告并且不让它弹出,所以只需选择“Next”继续(如图4)。

4

图4 选择是否弹出警告
现在可以点击“Finish”来完成这个过程了。

我们可以从三个地方知道正在使用安全的连接。首先是URL以https://开头,而不是以http://开头。此外,在顶部的按钮条上有一个突出的小锁图标,在浏览器的左下角也有一个突出的小锁图标(如图5)。

5

图5 结果设置过程
如果没有看到这些内容,那么就需要进行诊断了。可以查看一些地方:首先确信在监听着80/TCP和443/TCP端口用于一般和SSL Web连接。其次是确信用于Web服务器的SSL引擎正常工作。最后,确保确处于连机状态。

使用Aeromail
现在已经连接到了服务器上,这时会弹出一个认证窗口。这是平常使用的用户名和密码,它将使用SSL加密连接来传送(如图6)。

6

图6 人证窗口
现在,就已经工作在一个完全安全的Web服务器下了。使用这一服务器可以保护诸如电子邮件连接等很多Web事务。

一旦认证通过后,软件就会读取邮箱,并且准备一个Web页面。这是通过PHP软件来实现的,它连接到IMAP服务器,并且读取文件夹中的信息。这个页面如图7所示,可见我们收到了两条信息。

7

图7 收到两条信息
信息以收到的时间为序进行排列,最新的信息显示在顶部。显示的内容有主题、发件人、收到时间以及信件大小。信息前面的选择框用于信息的选择,以便进行删除或者移动操作。顶部的环状箭头用于检测是否有新的邮件。底部的复选框用于选中所有显示在本页的信息,数字表示信息的页数。我们可以通过编辑config.inc文件里的$MSG_COUNT变量来改变每屏显示的信息数量。从图7的页面,我们可以看出它和平时使用的263等Webmail系统基本相同,只是功能要少一些。

到目前为止,我们已经配置好了一个小的、安全的Webmail服务器。它可以让你在世界的任何一个地方访问你的邮件。此外,这个服务器还可以扩展一些其它的功能,这就需要你在使用的过程中自己来发现了。

Tags: ,
Technology | Comments(0) | Trackbacks(0) | Reads(17340)
Add a comment
Emots
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
Enable HTML
Enable UBB
Enable Emots
Hidden
Nickname   Password   Optional
Site URI   Email   [Register]
               

Security code Case insensitive