电子邮件的邮件头

电子邮件的邮件头,第1张

Email邮件头揭密

一、简介

这一部分内容将详细讨论email头的方方面面。主要为用户架设邮件服务器提供理论基础并为管理员在出现电子邮件垃圾骚扰时提供发现垃圾邮件的真正源头。根据邮件头的知识有助于发现伪造的邮件。对于希望了解邮件是如何在网络中传输的用户同样会有帮助。

虽然在讨论中尽量有意避免如何伪造一封邮件的讨论,但是在讨论中的内容可能被恶意读者用作创建伪造邮件的基础。因为要在文章中举例说明,因此在文章中有若干虚构的域名和随意分配的IP地址作为示例使用。这些域名和IP都是任意任意选择和伪造的,和Internet上真实的域名和IP没有任何关系。

二、Email的传输过程

这部分包含一个简单的对一个电子邮件生命周期的分析。这对于理解邮件头能为你提供哪些信息是非常重要的背景信息。

从表面上看来邮件似乎是直接从发送者机器传递到接收者地址,但通常情况下事情并不是这样。一个典型的电子邮件在其生命周期中至少要经过四台计算机。

这是因为大多数企业或组织都有一个被称为“邮件服务器”专用服务器来处理电子邮件,而这一般并不是用户阅读邮件的计算机。对于ISP来说,用户从家里面的计算机拨号接入ISP网络,这里将用户家中的计算机称为客户机,而将ISP专门处理邮件的计算机称为邮件服务器。当一个用户发送邮件,他一般是在自己的计算机上编辑邮件,然后将邮件发送到ISP的邮件服务器上。客户机就此已经完成了自己的工作,而后面的工作则由ISP的邮件服务器来完成。首先ISP邮件服务器查找接收者指定的邮件服务器的IP地址,然后将邮件发送给该目的服务器。现在邮件则存储在接收者邮件服务器上等待接收者收取。当接收者从接受邮件服务器取得发送给他的邮件到自己的PC机以后,通常该邮件将被删除。

假设若干个虚构的用户<demo@263.net>和<lili@alpha.com.cn>。demo是263这个ISP的拨号用户。使用outook express这个邮件客户程序收发邮件。lisi是中科院的一个虚构用户,他使用工作站通过单位局域网连接进入互联网。

如果lisi想给lili发送邮件,他在工作站(假设名字为lili.alpha.com.cn)上编辑邮件,编辑好的信件从工作站发送到中科院的邮件服务器:mail.alpha.com.cn。一旦信件被发送到mail.alpha.com.cn,以后的信件发送过程就和lisi没有关系了。中科院的邮件服务器发现这是发送给263.net的某个用户的信件,则和263的邮件服务器-比如说是mail.263.net-通信,并将邮件传送给它。现在邮件则被存储在mail.263.net 之上直到lili在自己的PC机上拨号连接到263网络察看并收取信件,这时mail.263.net将存储的邮件传送到lili的个人PC机上。

在这个过程中,邮件头将三次被加到邮件中:在编辑时由邮件客户程序加入;当邮件传输到mail.alpha.com.cn时被mail.alpha.com.cn加入;当从mail.alpha.com.cn传送到mail.263.net时被mail.263.net加入;通常来说客户收取信件时并不添加邮件头。下面我们就仔细看看这些邮件头是如何产生的。

当lisi的邮件客户程序编辑邮件并将其发送给mail.alpha.com.cn时,邮件内容如下。这些内容都是由邮件编辑程序(outlook express)添加的:

From: lili@sina.com (Li Si)

To: demo@hotmail

Date: Tue, Mar 18 1997 14:36:14 PST

X-Mailer: Outlook Express 5.5

Subject: 明天放假?

当邮件从mail.alpha.com.cn传送到mail.263.net后,邮件内容变为(新添加的内容是由mail.alpha.com.cn):

Received: from lili.alpha.com.cn (lili.alpha.com.cn [124.211.3.11]) by mail.alpha.com.cn (8.8.5) id 004A21Tue, Mar 18 1997 14:36:17 -0800 (PST)

From: lili@sina.com (Li Si)

To: demo@hotmail

Date: Tue, Mar 18 1997 14:36:14 PST

Message-Id: <lisi031897143614-00000298@mail.alpha.com.cn>

X-Mailer: Outlook Express 5.5

Subject: 明天放假?

当mail.263.net收到信件并存储等待lili收取时,邮件内容变为,(新添加的内容是由mail.263.com添加的):

Received: from mail.alpha.com.cn (mail.alpha.com.cn [124.211.3.78]) by mail.263.net (8.8.5/8.7.2) with ESMTP id LAA20869 for <demo@hotmail>Tue, 18 Mar 1997 14:39:24 -0800 (PST)

Received: from lili.alpha.com.cn (lili.alpha.com.cn [124.211.3.11]) by mail.alpha.com.cn (8.8.5) id 004A21Tue, Mar 18 1997 14:36:17 -0800 (PST)

From: lili@sina.com (Li Si)

To: demo@hotmail

Date: Tue, Mar 18 1997 14:36:14 PST

Message-Id: <lisi031897143614-00000298@mail.alpha.com.cn>

X-Mailer: Outlook Express 5.5

Subject: 明天放假?

最后这封信的内容才是lili收取并阅读的内容。下面是对其中内容的详细分析:

Received: from mail.alpha.com.cn

上面的内容表示该邮件是来自于自称是mail.alpha.com.cn的服务器。

(mail.alpha.com.cn [124.211.3.78])

这句话表示该服务器的真实名字的确是mail.alpha.com.cn,也就是说它自称的身份是正确的,其IP地址为124.211.3.78。

by mail.263.net (8.8.5/8.7.2)

接收这封邮件的机器是mail.263.net。其运行的邮件程序为sendmail,版本为8.8.5/8.7.2。

with ESMTP id LAA20869

接收邮件的服务器为该邮件赋有ID号LAA20869(通常该号码是邮件服务器内部使用的,但是管理员可以根据该ID号在log文件中查找关于该信件的相关信息,但是通常该号都是没有意义的) 。

for <demo@hotmail>

该邮件是发送给地址demo@hotmail的。可以看到该邮件头没有To:相关内容。

Tue, 18 Mar 1997 14:39:24 -0800 (PST)

这次邮件传输发生时间为:太平洋时间Tuesday, March 18, 1997, at 14:39:24(太平洋时间,因为它比格林威治时间晚8个小时,因此是"-0800")。

Received: from lili.alpha.com.cn (lili.alpha.com.cn [124.211.3.11]) by mail.alpha.com.cn (8.8.5) id 004A21Tue, Mar 18 1997 14:36:17 -0800 (PST)

该邮件头记录了邮件是从lili.alpha.com.cn(lisi的工作站)传送到到邮件服务器mail.alpha.com.cn的。传送发生在太平洋时间14:36:17。发送计算机自称是lili.alpha.com.cn,其真实名经dns查询的确是lili.alpha.com.cn,其IP地址为124.211.3.11,邮件服务器软件为sendmail v8.8.5。该信件被邮件服务器的mail.alpha.com.cn赋给的ID号为004A21。

From: lili@sina.com (Li Si)

该邮件是由lili@sina.com发送的,其名字为Li Si。

To: demo@hotmail

邮件目的地址为:demo@hotmail。

Date: Tue, Mar 18 1997 14:36:14 PST

邮件编辑时间为14:36:14 Pacific Standard Time on Tuesday, March 18, 1997。

Message-Id: <lisi031897143614-00000298@mail.alpha.com.cn

mail.alpha.com.cn给该邮件分配了这个号码来标识它。它和Received头中的SMTP机ESMTP ID号是不一样的。因为该号码是一直伴随整个邮件的。而其它ID则仅仅在特定的邮件服务器上的邮件传输阶段相关联。因此该机器ID号对其它机器来说没有任何意义。有时候Message-ID包含了发送者邮件地址在其中。

X-Mailer: Outlook Express 5.5

该消息是使用Outlook Express发送的,版本号为5.5。

Subject: 明天放假?

邮件标题。

三、邮件协议

这部分内容相对其它部分来说具有更多原理性内容,主要讨论邮件是如何从一点传输到另外一点的细节。你不需要理解每一句话,但是熟悉这方面的内容有助于在邮件传输出现奇怪现象时弄明白问题所在。由于垃圾电子邮件发送者常常故意制造一些奇怪的情况以掩饰自己的身份,因此能理解这些奇怪的现象对对付这些家伙是非常有用的。

为了在网络上传输数据,计算机网络协议使用了称为端口的访问入口,你可以将端口看做是一个通道,通过它计算机可以监听网络通信以提供服务。为了同时监听多个通信,计算机需要有使用端口号码标识多个不同的端口以区别这些通信。而和电子邮件传输相关的端口是25。

正常情况

让我们重新讨论上面的例子,但是这次我们仅仅关心mail.alpha.com.cn到mail.263.net之间的通信过程。首先mail.zky.edu.cn打开一个到mail.263.net的25号端口的连接,然后通过该连接发送邮件,当然在发送邮件过程中会有一些管理命令交互过程。交互中的命令和相应都或多或少的是可读的。命令是SMTP协议规定的。如果监听两者之间的通信,可能有以下内容:(粗体部分是mail.alpha.com.cn发出的)

220 mail.263.net ESMTP Sendmail 8.8.5/1.4/8.7.2/1.13Tue, Mar 18 1997 14:38:58 -0800 (PST)

HELO mail.alpha.com.cn

250 mail.263.net Hello mail.alpha.com.cn [124.211.3.78], pleased to meet you

MAIL FROM: lili@sina.com

250 lili@sina.com... Sender ok

RCPT TO: demo@hotmail

250 demo@hotmail... Recipient ok

DATA

354 Enter mail, end with "." on a line by itself

Received: from lili.alpha.com.cn (lili.alpha.com.cn [124.211.3.11]) by mail.alpha.com.cn (8.8.5) id 004A21Tue, Mar 18 1997 14:36:17 -0800 (PST)

From: lili@sina.com (R.T. Hood)

To: demo@hotmail

Date: Tue, Mar 18 1997 14:36:14 PST

Message-Id: <lisi031897143614-00000298@mail.alpha.com.cn>

X-Mailer: Outlook Express 5.5

Subject: 明天放假?

Do you have time to meet for lunch?

--lisi

.

250 LAA20869 Message accepted for delivery

QUIT

221 mail.263.net closing connection

整个传输依赖于五个SMTP核心命令(当然SMTP还有一些其它命令,但是它们并不是用来完成真正的邮件传输):HELO,MAIL FROM,RCPT TO,DATA和QUIT。

邮件发送者HELO命令用来标识自己的身份。HELO mail.alpha.com.cn可以被解读为"嗨,我是mail.alpha.com.cn"。当然这里发送者可能会撒谎,但是没有任何机制能防止发送者mail.alpha.com.cn 说"嗨,我是mail.xxx.com"或是"嗨,我是mail.yyy.com"。然而在大多数情况下接收者都有一些方法来确认发送者的真实身份。

MAIL FROM命令标识开始邮件传输,含义是"我有从某人发送来的邮件",该命令后跟的地址就是所谓的“信封地址”(在后面我们将深入讨论),信封from地址不一定是发送者自己的地址。这个明显的安全漏洞是不可避免的(因为接收者并不知道发送者机器上有哪些地址),但是在特定的情况下这又是一个有用处的特色。

RCPT TO和MAIL FROM是相辅相成的。其指定邮件接收者。通过多个RCPT TO命令一个邮件可以被发送给多个接收者。(在后面的邮件中继部分将解释该特色可能针对某些不安全的系统滥用)。该命令后跟的地址称为"envelope to"地址。其指定了邮件将被投递给哪些用户,而和信件中的To:指定的地址没有关系。

DATA命令指示开始实际的邮件内容传输。DATA命令后输入的任何内容都被看做是邮件的一部分。而格式并没有任何限制。以一个英文单词加冒号开始的行一般被邮件程序看做是邮件头。以英文句号符号(.)开始的行被认为是邮件内容结束。

QUIT命令终止连接。

SMTP协议规范定义在RFC 821中。

非正常情况

上面的例子有些过于简单。上面的例子有一个假设前提:两个组织的邮件服务器相互之间能直接访问,而不需要经过代理、防火墙等安全设备。这在当前Internet环境下情况往往是这样的。但由于安全对于某些组织来说非常重要,而且网络或组织可能变得越来越庞大,情况就不那么简单了。对于具有代理型防火墙系统的邮件传输来说,区别就在于在邮件的头中多了一次转发过程的记录,也就是邮件首先从发送者邮件服务器发送到防火墙上,然后再从防火墙发送到目的邮件服务器。

四、邮件中继

对于某些具有特殊的“生命”周期的邮件头可能和前面讨论的情况完全不同:

Received: from unwilling.intermedia.com (unwilling.intermedia.com [98.134.11.32]) by mail.alpha.com.cn (8.8.5) id 004B32 for <lili@sina.com>Wed, Jul 30 1997 16:39:50 -0800 (PST)

Received: from linuxaid.com.cn ([202.99.11.120]) by unwilling.intermedia.com (8.6.5/8.5.8) with SMTP id LAA12741Wed, Jul 30 1997 19:36:28 -0500 (EST)

From: Anonymous Spammer <junkmail@linuxaid.com.cn>

To: (recipient list suppressed)

Message-Id: <w45qxz23-34ls5@unwilling.intermedia.com>

X-Mailer: Massive Annoyance

Subject: WANT TO MAKE ALOT OF MONEY???

这个邮件头和以前的不同之处可能会令你认为这是一封垃圾邮件,但是这里引起你的怀疑的是"Received:"头。从"Received:"头看来,邮件是来自linuxaid.com.cn,然后从这里传输给unwilling.intermedia.com,然后从这里再次传输到最终目的地址:mail.alpha.com.cn。从"Received:"头看来事情就是这样的,但是中间为什么会出现unwilling.intermedia.com呢?因为它和发送者和接收者都没有直接的关系。

要理解原因需要对SMTP协议进行一些了解。本质上来讲,传输过程是这样的:linuxaid.com.cn连接unwilling.intermedia.com的SMTP端口。告诉它“请发送这封邮件到lili@sina.com。它可能是以最直接的方法来实现:RCPT TO:lili@sina.com。到现在为止,unwilling.intermedia.com接管对该邮件的处理。因为它被告知将该信件转发给其他一个域:zky.ac.cn,它就查找对于域名zky.ac.cn的邮件服务器然后将邮件转发给zky.ac.cn。这个过程通常被称作邮件中继(mail relaying)。

出现邮件中继是由于历史的原因,使用邮件中继是有它的好处的。到八十年代末期,很多网络中的计算机都不是直接通信来传输邮件。而是通过邮件路由来传递邮件,通过邮件路由服务器一步一步地进行邮件传输。这样做是非常麻烦的,发送者往往需要手工指定一封邮件需要经过哪些邮件路由服务器,比如需要从San Francisco发送一封邮件到New York,则需要在信封中添加如下内容:

San Francisco, Sacramento, Reno, Salt Lake City, Rock Springs, Laramie, North Platte, Lincoln, Omaha, Des Moines, Cedar Rapids, Dubuque, Rockford, Chicago, Gary, Elkhart, Fort Wayne, Toledo, Cleveland, Erie, Elmira, Williamsport, Newark, New York City, Greenwich Village, #12 Desolation Row, Apt. #35, R.A. Zimmermann

如果从邮局工作人员的角度来考虑,这种模型是非常有用的。在Gary的邮局只需要知道如何和临近的邮局Chicago和Elkhart通信,而无需消耗资源计算如何将邮件发送到New York(这时候就很清楚为什么这种模式对于邮件发送者来说非常糟糕,为什么这种方法被抛弃了)。但是这就是邮件被传输的过程。因此服务器具有这样的中继的能力在那时是很重要的。

而现在中继通常被用作不道德的广告商用来隐藏它们的原始地址,将埋怨转嫁给被用来中继的服务器而不是其所在ISP的技术。同样通过中继可以实现将发送信件的负载转移到中继服务器上,从而实现盗用中继服务器的服务资源。在这里最重要的一点是理解邮件内容是在发送点linuxaid.com.cn被编辑。中间的服务器unwilling.intermedia.com只是参加了中间的传输工作,它并不能对发送者有任何的约束力。

在上面的例子中应该注意的另外一点是"Message-Id:"并不是由发送者服务器(linuxaid.com.cn)而是中继计算机(unwilling.intermedia. com)填写的。这是被中继的邮件的一个典型特性,该特性反映了发送服务器并没有提供Message-Id的事实。

上面关于SMTP的讨论部分提到了“消息”头和“信封”头的不同之处。这种区别和导致的后果将在这里详细地讨论。

简单地说,“信封”头实际上是由接收消息的邮件服务器产生的,而不是发送者服务器。按照这个定义,“Received:”头是信封头,而一般来说常常使用"envelope From"和"envelope To"来指示它们。

"envelope From"头是从MAIL FROM命令得到的。如发送者邮件服务器发出命令MAIL FROM: ideal@linuxaid.com.cn,则接收者服务器则产生一个"envelope From"头:>From ideal@linuxaid.com.cn。

注意这里少了一个冒号—"From"而不是"From:"。也就是说信封头在其后没有冒号。当然这个惯例并不是标准,但是这时一个值得注意的惯例。

对应的是"envelope To"同样来自于RCPT TO命令。如果发送者服务器发出命令RCPT TO: ideal@btamail.net.cn。则"envelope To"为ideal@btamail.net.cn。一般来说实际上并没有这样一个邮件头,它常常是包含在Received:头中。

存在信封信息的一个重要结果就是消息From:和To:变得毫无意义。From:头是由发送者提供的,同样To:也是由发送者提供的。因此邮件仅仅基于"envelope To"来进行转发路由,而不是基于消息To:。

为了从实际中理解这个概念,看看下面这样的邮件传输:

HELO galangal.org

250 mail.alpha.com.cn Hello linuxaid.com.cn [202.99.11.120], pleased to meet you

MAIL FROM: forged-address@galangal.org

250 forged-address@galangal.org... Sender ok

RCPT TO: lili@sina.com

250 lili@sina.com... Recipient OK

DATA

354 Enter mail, end with "." on a line by itself

From: another-forged-address@lemongrass.org

To: (这里你的地址被隐瞒以实现秘密邮件转发和骚扰)

.

250 OAA08757 Message accepted for delivery

下面是对应的邮件头:

>From forged-address@galangal.org

Received: from galangal.org ([202.99.11.120]) by mail.alpha.com.cn (8.8.5) for <tmh@zky.ac.cn>...

From: another-forged-address@lemongrass.org

To: (这里你的地址被隐瞒以实现秘密邮件转发和骚扰)

注意到"envelope From"的内容和消息From:的内容和消息To:的内容都是发送者指定的,因此他们都是不可靠的。这个例子说明了为什么信封From、消息From:及消息To:在可能是伪造的邮件中是不可靠的,因为它们太容易伪造了。

"Received:"头的重要性

在上面的例子中我们已经看到,"Received:"头提供了详细的消息传输历史记录,因此即使在其他邮件头是被伪造的情况下也可能根据"Received:"头得到某些关于该信件原始出处和传输过程的结论。这部分将详细探讨某些和异常的重要消息头相关的问题,特别是如何挫败那些常见的伪造技术。

毫无疑问的是,在"Received:"头中唯一重要且有价值的伪造防护就是由接收服务器记录的那些信息。前面提到发送者能伪造自己的身份( 通过在HELO命令中报告错误的身份)。幸运的是现代邮件服务器程序都可以检测到这种错误信息并加以修正。

如果服务器linuxaid.com.cn的真实IP地址是202.99.11.120,发送邮件给mail.alpha.com.cn,但是使用HELO galangal.org命令来伪造自己的身份,则对应该次传输的"Received:"可能如下所示:

Received: from galangal.org ([202.99.11.120]) by mail.alpha.com.cn (8.8.5)...

(后面的其他信息被省略以更加清晰)。注意虽然zky.ac.cn没有明确地说galangal.org不是发送者的真实身份,但是它记录了发送者正确的IP地址。如果某接收者认为消息头中的galangal.org是伪造者伪造的身份,他可以查看IP地址202.99.11.120来得到对应的正确域名是linuxaid.com.cn,而不是galangal.org。也就是说记录发送服务器的IP地址提供了足够的信息来确认可以的伪造行为。

很多现代邮件程序实际上将根据IP查看对应域名的过程自动化了。(这种查看过程被称为反向DNS解析)。如果mail.alpha.com.cn使用这种软件,则"Received:"头则变为

Received: from galangal.org (linuxaid.com.cn [202.99.11.120]) by mail.alpha.com.cn...

从这里可以清楚地看到伪造行为。这个消息头明确地说linuxaid.com.cn的IP地址是202.99.11.120,但是却宣称自己的身份为galangal.org。这样的信息对于对于验证和追踪伪造信件是非常有用的。(因此,垃圾邮件发送者往往避免使用那些记录发送者地址的邮件服务器进行垃圾邮件转发。有时候它们可以找到不记录发送者服务器,但是现在网络上这样的服务器已经很少了)

伪造者伪造邮件的另外一个日益常见的技巧是在发送垃圾邮件以前添加伪造的"Received:"头。这意味着从linuxaid.com.cn发送的假设的邮件的"Received:"头的内容可能为:

Received: from galangal.org ([202.99.11.120]) by mail.alpha.com.cn (8.8.5)...

Received: from nowhere by fictitious-site (8.8.3/8.7.2)...

Received: No Information Here, Go Away!

很明显,最后两行内容完全是毫无疑义的,是由发送者编写并在发送以前附在邮件中的。由于一旦邮件离开linuxaid.com.cn,发送者对邮件完全失去了控制。而且新的"Received:"头总是出现添加在消息的头部,因此伪造的"Received:"头总是出现在"Received:"头列表的尾部。这意味着任何人从头到尾读取"Received:"头列表,追踪邮件传输历史,都能安全地剔除在第一个伪造头以后的内容。即使"Received:"头看上去似乎是真实的,但是实际上都是伪造的。

当然,发送者不一定会用明显的垃圾信息来迷惑你,一个处心积虑的伪造者可能创建如下所示的看似真实的"Received:"头列表:

Received: from galangal.org ([202.99.11.120]) by mail.alpha.com.cn (8.8.5)...

Received: from lemongrass.org by galangal.org (8.7.3/8.5.1)...

Received: from graprao.com by lemongrass.org (8.6.4)...

这里泄漏伪造问题的唯一地方是第一个"Received:"头中的galangal.org的IP地址。如果伪造者这里填写了lemongrass.org和graprao.com 的真实IP地址,则这样的伪造伪造仍然非常难以检测。但是第一个"Received:"头中的域名和IP的不匹配仍然揭露了消息是伪造的,并且该邮件是有网络中地址为202.99.11.120的服务器注入到网络中。然而大多数邮件头伪造者一般都没有这么狡猾,一般额外添加的"Received:"头一般都很明显地是伪造的垃圾。

http://leongling.blog.163.com/blog/static/10961657220100903651221/

一、关闭不必要的服务

Linux的服务分为两种,一种是由inetd超级服务器来启动的,如:ftp、telnet等;对于这些服务来说,系统并不总是运行telnetd、 ftpd等服务进程,而是由inetd进程监听这些服务的服务端口,一旦有服务请求到达就启动对应的服务进程(如:telnetd等)来提供服务。另外一种是独立的服务器,系统一直运行有对应的服务进程。

关闭这两种服务的方法是不同的,对于inetd启动的进程:

inetd超级服务器的配置文件为/etc/inetd.conf,该文件指示了inetd应该监听哪些服务请求,并在请求时启动对应的服务。因此只要通过编辑/etc/inetd.conf文件就可以实现关闭不需要的服务,例如希望关闭pop3服务,则在编辑/etc/inetd.conf文件以前文件中有如下的内容:

pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d

要关闭pop3服务则在该行前添加注释符即可:

#pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d

通过编辑该文件,实现关闭不需要的服务(例如我的系统我仅仅开放了telnet和ftp服务)以后,则需要重新启动inetd超级服务器。首先找到inetd的进程号:

[root@aid /etc]# ps ax|grep inetd

358 ? S 0:00 inetd

然后重新启动inetd服务器:

[root@aid /etc]# kill -HUP 358

最后因为inetd.conf应该不允许普通用户读写,因此设置其访问权限为600:

chmod 600 /etc/inetd.conf

而且该文件应该不被任何用户修改,包括root用户。因此为了防止用户错误的修改该文件,为该文件添加不可修改位:

chattr i /etc/inetd.conf

对于独立服务器,则需要通过/usr/sbin/ntsysv命令来修改:

只需要服务前面通过空格键来选择是否在系统启动时启动该服务就可以实现关闭某个服务器,如:希望系统关闭dhcpd服务,则通过上下键选中该服务器,然后通过空格键去掉该服务前[ ]内的星号即表示系统启动时不开放该服务。若希望了解某个服务的具体含义,可以选择该服务以后按F1键来查看该服务的含义。

设置完毕以后,只有希望打开的服务前的[ ]内才会有星号。然后通过Tab键选择OK,按空格键。重新启动机器。

重新启动机器以后,可以通过下面的命令来察看系统打开了哪些服务,来决定是否已经关闭了不需要的服务,例如我仅仅希望提供telnet服务则:

[ideal@aid ideal]$ netstat -ln

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN

raw 0 0 0.0.0.0:1 0.0.0.0:* 7

raw 0 0 0.0.0.0:6 0.0.0.0:* 7

Active UNIX domain sockets (only servers)

Proto RefCnt Flags Type State I-Node Path

从上面的命令输出可以看到系统仅仅开放了23号端口,也就是telnet服务。

二、控制使用开放的服务的用户

在上面提到的/etc/inetd.conf的配置文件中,我们看到pop3服务配置一行的最后两个字段为:

/usr/sbin/tcpd ipop3d

很显然,pop3的服务器程序为ipop3d,那么/usr/sbin/tcpd又是什么含义呢?这是一个称为Tcp wrapper的安全程序。该程序用来在启动某个服务以前查看两个配置文件来决定该用户是否允许使用该服务。在/etc目录下,有两个文件: hosts.deny hosts.allow。

通过配置这两个文件,你可以指定哪些客户机允许使用这些服务。配置这两个文件是通过一种简单的访问控制语言来实现的,访问控制语句的基本格式为: 程序名列表,主机名/IP地址列表。

程序名列表指定一个或者多个提供相应服务的程序的名字,名字之间用逗号或者空格分隔,可以在inetd.conf文件里查看提供相应服务的程序名:如上面的文件示例中,pop所在行的最后一项就是所需的程序名:ipop3d。

主机名/IP地址列表指定允许或者禁止使用该服务的一个或者多个主机的标识,主机名之间用逗号或空格分隔。程序名和主机地址都可以使用通配符,实现方便的指定多项服务和多个主机。 当服务请求到达服务器时,访问控制软件就按照下列顺序查询这两个文件,直到遇到一个匹配为止:

1. 当在/etc/hosts.allow里面有一项与请求服务的主机地址项匹配,那么就允许该主机获取该服务

2. 否则,如果在/etc/hosts.deny里面有一项与请求服务的主机地址项匹配,就禁止该主机使用该项服务

3. 若均没有匹配,则允许使用该服务。若相应的配置文件不存在,访问控制软件就认为是一个空文件,所以可以通过删除或者移走配置文件实现对所有主机关闭所有服务。

在文件中,空白行或者以#开头的行被忽略,你可以通过在行前加 # 实 现注释功能。Linux提供了下面灵活的方式指定进程或者主机列表:

1. 一个以"."起始的域名串,如 .amms.ac.cn 那么www.amms.ac.cn就和这一项匹配成功

2. 以.结尾的IP串如 202.37.152. 那么IP地址包括202.37.152.的主机都与这一项匹配

3. 格式为n.n.n.n/m.m.m.m表示网络/掩码,如果请求服务的主机的IP地址与掩码的位与的结果等于n.n.n.n 那么该主机与该项匹配。

4. ALL表示匹配所有可能性

5. EXPECT表示除去后面所定义的主机。如:list_1 EXCEPT list_2 表示list_1主机列表中除去List_2所列 出的主机

6. LOCAL表示匹配所有主机名中不包含.的主机

上面的几种方式只是Linux提供的方式中的几种,但是对于我们的一般应用来说是足够了。我们通过举几个例子来说明这个问题:

例一:我们只希望允许同一个局域网的机器使用服务器的ftp功能,而禁止上面的ftp服务请求,本地局域网由 202.39.154. 、202.39.153. 和202.39.152. 三个网段组成。在hosts.deny文件中,我们定义禁止所有机器请求所有服务: ALL:ALL 在hosts.allow文件中,我们定义只允许局域网访问ftp功能:

in.ftpd: 202.39.154 202.39.153. 202.39.152.

这样,当非局域网的机器请求ftp服务时,就会被拒绝。而局域网的机器可以使用ftp服务。

然后重新启动你的 inetd进程:

/etc/rc.d/init.d/inet restart

但是hosts.deny|allow文件只控制/etc/inetd.conf文件中包含的服务的访问这些服务有/usr/bin/tcpd管理,监听接入的网络请求,然后与在hosts.allow和hosts.deny的中的服务比较,然后做出允许或拒绝的决定。

最后因为hosts.allow|hosts.deny应该不允许普通用户读写,因此设置其访问权限为600:

chmod 600 /etc/hosts.*

并且该文件应该不被任何用户修改,包括root用户。因此为了防止用户错误的修改该文件,为该文件添加不可修改位:

chattr i /etc/hosts.*

三、"/etc/exports"文件设置

如果通过NFS把文件共享出来,那么一定要配置"/etc/exports"文件,使得访问限制尽可能的严。这就是说,不要用通配符,不允许对根目录有写权限,而且尽可能只给只读权限。编辑exports文件(vi /etc/exports)加入:

例如:

/dir/to/export host1.mydomain.com(ro,root_squash)

/dir/to/export host2.mydomain.com(ro,root_squash)

"/dir/to/export"是你想共享出来的目录,host.mydomain.com是允许访问这个目录的计算机。

代表只读,代表不允许对根目录进行写 *** 作。使这些改变生效,你还要运行 "/usr/sbin/exportfs -a"命令。

注意:在服务器上装NFS服务是会有安全隐患的,就我个人而言,不建议你使用NFS。

四、禁止使用控制台程序

一个最简单而且最常用的保证系统安全的方法就是禁止使用所有的控制台程序,如:shutdown和halt。可以运行下面的命令来实现:

[root@aid /]# rm -f /etc/security/console.apps/servicename

这里servicename是你要禁止的控制台程序名。除非你使用xdm,否则不要把xserver文件删掉,如果这样除了root之外,没有人可以启动 X服务器了。(如果使用xdm启动X服务器,这时root是唯一需要启动X服务器的用户,这才有必要把xserver文件删掉)。例如:

[root@deep]# rm -f /etc/security/console.apps/halt

[root@deep]# rm -f /etc/security/console.apps/poweroff

[root@deep]# rm -f /etc/security/console.apps/reboot

[root@deep]# rm -f /etc/security/console.apps/shutdown

[root@deep]# rm -f /etc/security/console.apps/xserver (如果删除,只有root可以启动X).

这些命令就可以禁止所有的控制台程序:halt、poweroff、reboot和shutdown。记住,只有装了Xwindow,删除xerver文件才会有效果。

五、"/etc/aliases"文件

aliases文件可能会造成安全隐患。例如:很多的软件产商都把 "decode"这个别名放在aliases文件里。这样做的目的是为了方便通过email传送二进制文件。在发送邮件的时候,用户把二进制文件用 "uuencode"转成ASCII文件,然后把结果发给接收端的"decode"。由这个别名让邮件信息通过"/usr/bin/uuencode"程序把二进制文件重新转换成ASCII文件。如果允许"decode"出现在aliases文件中,可以想象将会有什么样的安全隐患。

把定义"decode"这个别名的行从aliases文件中删除。同样地,每一个会运行程序的别名都要好好查看一下,很有可能要把它们删除掉。要使改动生效,还必须运行:

[root@deep]# /usr/bin/newaliases

编辑aliases文件(vi /etc/aliases),删除或注释掉下面这些行:

# Basic system aliases -- these MUST be present.

MAILER-DAEMON: postmaster

postmaster: root

# General redirections for pseudo accounts.

bin: root

daemon: root

#games: root

#ingres: root

nobody: root

#system: root

#toor: root

#uucp: root

# Well-known aliases.

#manager: root

#dumper: root

#operator: root

# trap decode to catch security attacks

#decode: root

# Person who should get roots mail

#root: marc

最后记得运行"/usr/bin/newaliases"使改变生效。

六、使系统对ping没有反应

防止你的系统对ping请求做出反应,对于网络安全很有好处,因为没人能够ping你的服务器并得到任何反应。TCP/IP协议本身有很多的弱点,黑客可以利用一些技术,把传输正常数据包的通道用来偷偷地传送数据。使你的系统对ping请求没有反应可以把这个危险减到最小。用下面的命令:

echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all

运行完这个命令后,系统对ping就没有反应了。可以把这一行加到"/etc/rc.d/rc.local"文件中去,这样当系统重新启动的时候,该命令就会自动运行。对ping命令没有反应,至少可以把绝大多数的黑客排除到系统之外,因为黑客不可能知道你的服务器在哪里。重新恢复对ping的响应,可以用下面的命令:

echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all"

七、不要显示系统提示信息

如果你不想让远程登录的用户看到系统的提示信息,你可以改变"/etc/inetd.conf"文件中的telnet设置:

telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h

在末尾加上"-h"参数可以让daemon不显示任何系统信息,只显示登录提示。当然,只有在服务器上装了telnet服务器才有这样做的必要。

八、"/etc/host.conf"文件

Linux用解析器(resolver)库把主机名翻译成IP地址。"/etc/host.conf"文件定义主机名是怎样解析的。"/etc/host.conf"文件中的项告诉解析器库用什么服务,以什么顺序解析主机名。

编辑"host.conf"文件(vi /etc/host.conf)加入下面这些行:

# Lookup names via DNS first then fall back to /etc/hosts.

order bind,hosts

# We have machines with multiple IP addresses.

multi on

# Check for IP address spoofing.

nospoof on

order选项指明的是选择服务的顺序。上面"order bind, hosts"说的是解析器库解析文件名的时候先查询域名服务器,然后再查看"/etc/hosts"文件。因为性能和安全上的原因,最好将解析器库的查找顺序设成先查域名服务器(bind)。当然也要先安装了DNS/BIND软件,否则这样配置根本没有任何作用。

multi选项决定在"/etc/hosts"文件中出现的主机能不能有多个IP地址(多个网络界面)。具有多个IP网络界面的主机被称为具有多个网络界面(multiomed),因为同时有多个IP地址也就意味着这台主机有多个网络界面。例如:网关服务器就有多个IP地址,必须把这个选项设成ON。

nospoof选项指明不允许IP伪装。IP伪装是把自己伪装成别的计算机去欺骗其它的计算机,获得它的信任。这种攻击方法把自己伪装成别的服务器,并且与其它客户机、服务器和大型数据存储系统建立网络连接或其它类型的网络活动。不管对任何类型的服务器,这个选项都要设成ON。

九、防止源路由

路由和路由协议会导致一些问题。IP源路径路由(IP source routing),也就是IP包包含到达底目的地址的详细路径信息,是非常危险的,因为根据RFC 1122规定目的主机必须按原路径返回这样的IP包。如果黑客能够伪造原路径路由的信息包,那么它就能截取返回的信息包,并且欺骗你的计算机,让它觉得正在和它交换信息的是可以信任的主机。我强烈建议你禁止IP原路径路由以避免这个安全漏洞。

用下面的命令在你的服务器上禁止IP原路径路由:

for f in /proc/sys/net/ipv4/conf/*/accept_source_routedo

echo 0 >$f

done

把上面的命令加到"/etc/rc.d/rc.local"文件中去,你就不用在系统重新启动之后再把这些命令敲一遍。注意,上面的命令将禁止所有的网络界面(lo、ethN、pppN,等等)的源路径路由包。

十、使TCP SYN Cookie保护生效

"SYN Attack"是一种拒绝服务(DoS)的攻击方式,会消耗掉系统中的所有资源,迫使服务器重新启动。拒绝服务(这种攻击方式用巨大的信息流来消耗系统的资源,以至于服务器不能够响应正常的连接请求)是很容易被黑客利用的。在2.1系列的内核中,"syn cookie"只是一个可选项,并没有使其生效。想要使其生效必须用下面的命令:

[root@aid /]# echo 1 >/proc/sys/net/ipv4/tcp_syncookies

把这个命令加入"/etc/rc.d/rc.local"文件中,等下次系统重新启动的时候就不必重新敲一遍了。如果打算安装IPCHAINS防火墙,你就没有必要用这个命令,因为它已经包含在防火墙的脚本文件里了。

十一、特殊的帐号

禁止中不必要的预置帐号(每次升级或安装完都要检查一下)。Linux系统中就提供这样一些你可能不需要的预置帐号。如果确实不需要这些帐号,就把它们删掉。系统中有越多的帐号,就越容易受到攻击。

我们假定你已经在系统中使用shadow口令。如果不是这样,最好在系统中加上shadow口令的支持,因为这样系统会更安全。如果你是按照上一章介绍的方法安装服务器,那么在"安全验证配置"这一步就已经选上"Enable Shaow Passwords"这个选项了。

在系统中删除一个用户可以用这个命令:

[root@deep]# userdel username

在系统中删除一个组可以用这个命令:

[root@deep]# groupdel username

第一步 用下面的命令删除一些不必要的用户:

[root@deep]# userdel adm

[root@deep]# userdel lp

[root@deep]# userdel sync

[root@deep]# userdel shutdown

[root@deep]# userdel halt

[root@deep]# userdel news

[root@deep]# userdel uucp

[root@deep]# userdel operator

[root@deep]# userdel games (如果不用X Window服务器,可以删除这个用户)

[root@deep]# userdel gopher

[root@deep]# userdel ftp (如果没安装匿名ftp服务器,可以删除这个用户)

第二步 输入下面的命令删除一些不必要的组:

[root@deep]# groupdel adm

[root@deep]# groupdel lp

[root@deep]# groupdel news

[root@deep]# groupdel uucp

[root@deep]# groupdel games (delete this group if you don use X Window Server).

[root@deep]# groupdel dip

[root@deep]# groupdel pppusers

[root@deep]# groupdel popusers (delete this group if you don use pop server for email).

[root@deep]# groupdel slipusers

第三步

"不允许改变"位可以用来保护文件使其不被意外地删除或重写,也可以防止有些人创建这个文件的符号连接。删除"/etc/passwd"、 "/etc/shadow"、"/etc/group"或"/etc/gshadow"都是黑客的攻击方法。给口令文件和组文件设置不可改变位,可以用下面的命令:

[root@deep]# chattr i /etc/passwd

[root@deep]# chattr i /etc/shadow

[root@deep]# chattr i /etc/group

[root@deep]# chattr i /etc/gshadow

注意:如果将来要在口令或组文件中增加或删除用户,就必须先清除这些文件的不可改变位,否则就不能做任何改变。如果没有清除这些文件的不可改变位,安装那些会自动在口令文件和组文件中加入新用户的rpm软件包的时候,在安装过程中就会出现出错的提示。

十二、防止任何人都可以用su命令成为root

如果不想任何人都可以用"su"命令成为root或只让某些用户有权使用"su"命令,那么在"/etc/pam.d/su"文件中加入下面两行。建议尽量限制用户通过"su"命令成为root。

第一步

编辑su文件(vi /etc/pam.d/su)在文件的头部加入下面两行:

auth sufficient /lib/security/pam_rootok.so debug

auth required /lib/security/pam_wheel.so group=wheel

加入这两行之后,"/etc/pam.d/su"文件变为:

#%PAM-1.0

auth sufficient /lib/security/pam_rootok.so debug

auth required /lib/security/pam_wheel.so group=wheel

auth required /lib/security/pam_pwdb.so shadow nullok

account required /lib/security/pam_pwdb.so

password required /lib/security/pam_cracklib.so

password required /lib/security/pam_pwdb.so shadow use_authtok nullok

session required /lib/security/pam_pwdb.so

session optional /lib/security/pam_xauth.so

这两行的意思是只有"wheel"组的成员才能用su命令成为root。注意,"wheel"组是系统中用于这个目的的特殊帐号。不能用别的组名。

第二步

在"/etc/pam.d/su"配置文件中定义有"wheel"组,现在介绍一下怎样让一些用户可以用"su"命令成为"root"。下面是一个例子,让admin用户成为"wheel"组的成员,这样就可以用"su"命令成为"root":

[root@deep]# usermod -G10 admin

"G"是表示用户所在的其它组。"10"是"wheel"组的ID值,"admin"是我们加到"wheel"组的用户。用同样的命令可以让其他的用户可以用su命令成为root。

十三、 把rpm程序转移到一个安全的地方,并改变默认的访问许可

一旦在上用rpm命令安装完所有需要的软件,最好把rpm程序转移到一个安全的地方,如:软盘或其它你认为安全的地方。因为如果有人入侵了你的服务器,他就不能用rpm命令安装那些有害的软件。当然,如果将来要用rpm安装新的软件,你就要把rpm程序拷回原来的目录。把rpm程序移到软盘上,用下面的命令:

[root@deep]# mount /dev/fd0 /mnt/floppy/

[root@deep]# mv /bin/rpm /mnt/floppy/

[root@deep]# umount /mnt/floppy

注意:千万不要把rpm程序从系统中卸载掉,否则以后就不能重新安装它,因为安装rpm程序或其它软件包本身就要用rpm命令。

还有一点要注意的是,把rpm命令的访问许可从默认的755改成700。这样非root用户就不能使用rpm命令了。特别是考虑到万一在安装完新软件之后忘了把rpm程序移到一个安全的地方,这样做就更有必要了。

改变"/bin/rpm"默认的访问权限,用下面这个命令:

[root@deep]# chmod 700 /bin/rpm

十四、登录shell

为了方便重复输入很长的命令,bash shell可以在"~/.bash_history"文件("~/"是家目录,每个用户都是不一样的)中存500个曾经输入过的命令。每一个有自己帐号的用户,在自己的家目录中,都会有".bash_history"文件。可能会有这种情况,用户在不该输入口令的地方输入了口令,而输入的口令会在 ".bash_history"文件中保存下来。而且".bash_history"文件越大这种可能性也越大。

在"/etc/profile"文件中HISTFILESIZE和HISTSIZE这两行决定了系统中所有用户的 ".bash_history"文件可以保存多少命令。我建议把"/etc/profile"文件中的HISTFILESIZE和HISTSIZE都设成一个比较小的值,如:20。

编辑profile文件(vi /etc/profile),把这些行改成:

HISTFILESIZE=20

HISTSIZE=20

这样每个用户家目录下的".bash_history"就最多只能存20个命令。如果黑客试图在用户的"~/.bash_history"文件中发现一些口令,他就没有什么机会了。

十五、改变"/etc/rc.d/init.d/"目录下的脚本文件的访问许可

改变启动和停止daemon的脚本文件的权限。

[root@deep]# chmod -R 700 /etc/rc.d/init.d/*

这样只有root可以读、写和执行这个目录下的脚本。我想一般用户没有什么必要知道脚本文件的内容。

注意:如果你安装或升级了一个程序,要用到"/etc/rc.d/init.d/"中system V脚本,不要忘记再检查一下改变和检查这个脚本文件的许可。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7227106.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存