当前位置:Linux教程 - Linux文化 - Linux并不绝对安全 牢记Linux下安全十二法则

Linux并不绝对安全 牢记Linux下安全十二法则


2004年,英国一家安全公司对当年一月份发生的安全攻击事件进行调查,在成功的安全攻击中,约有80%(共计13654次)是成功地攻击了Linux服务器,只有2005次是成功地攻击了Windows服务器。调查报告认为针对Linux的安全攻击成功次数上升是因为很多采用了Linux系统的公司并未正确地配置、管理Linux。该报告指出:问题出在他们的网管而不是Linux本身。这再次印证了安全学方面的一个基本观点:安全问题首先是人的问题,然后才是技术的问题。世界上没有绝对安全的系统,如果疏于管理、没有正确配置,就算是FreeBSD也照样会被攻击、入侵。这篇报告发布后,网友评论说:从这个角度来说,无论是Linux还是Windows,在安全方面最大的问题都不是产品本身,而是使用的人有没有实践一些基本的安全原则,例如“Default to a secure mode”、“Apply the principle of least privilege”、注意经常打补丁等。补丁是一定要打的,并不只是Windows才有补丁,Linux照样需要打补丁,照样会有安全漏洞。那些认为只要把Windows换成Linux就可以一劳永逸高枕无忧的人,就大错特错了。

另据伦敦安全分析及咨询机构mi2g公司最近的一份调查结果显示,从2003年11月到2004年10月份共发生了24万次攻击事件。这些攻击事件既有黑客远程手动攻击,也有通过病毒、蠕虫或其他恶意程序发动的攻击。分析结果显示,其中65%的攻击对象为Linux系统,共发生154846起攻击事件,25%的攻击对象为Windows。而最安全的操作系统要属基于BSDUnix的操作系统。Mi2g公司表示,导致Linux系统最容易遭受攻击的原因是该操作系统各项功能组件过于分散,因为它们分别来自不同的企业,拥有着不同的特性。分析结果还发现,遭到攻击的用户多为个人用户和小型企业用户。其被攻击比例为80%,而大中型企业的被攻击比例仅为8.5%。据Mi2g透露,他们的分析数据主要来自北美、欧洲和亚洲的银行和保险机构,同时还包括一些监控数据和来自黑客组织的内部数据。

2005年,另一份权威报告——《2005 North American Linux and Windows TCO Comparison Report, Part 2: Hardening Security Is Key to Reducing Risk and TCO》对Linux以及Windows的安全性进行了对比,他们对北美的550家企业安全状况进行调查并并得出了一些重要结论,下面给出部分与Linux相关具有参考意义的结论:

● 没有任何操作系统是被证明为hack-proof的,也就是说,被证明不能被攻破的,Linux也是可以被攻破的,因而需要防护;

● 人为的错误(包括不遵守安全规程,不采取必要的安全措施,实行常规的安全检查,进行及时的打补丁工作等等)是导致系统不安全的重要原因;

● 针对Linux的攻击呈现日趋上升的态势。

该报告也给出了针对性的提示:

● 加强员工的培训,包括安全意识、安全工具的使用、安全规程的培训等等;

● 及时给系统打补丁,防范攻击以及病毒入侵;

● 实行常规的安全审计以及系统风险评估。

从上述给出的几份权威的安全分析报告,我们不难看出,“世上没有不透风的墙”,Linux操作系统作为一种软件,与Windows操作系统一样,必然存在漏洞。而随着它在全世界范围内的普及使用,目前针对其的攻击越来越多,安全事件也呈上升趋势,形势非常严峻。要想在技术日益发展、纷繁芜杂的网络环境中,保证Linux系统的安全性,需要切实做好事前预防以及事后恢复的工作,这很大程度上取决于人的因素。人是决定系统安全的第一要素。

在保障Linux安全的过程中,业界经历了多年的积累,有许多重要的原则和手段可以借鉴,从系统管理到网络管理都有比较成熟的经验。本文将结合笔者的自身经验,给出这些重要的原则和手段,提供给用户参考使用,希望用户能够在使用过程中举一反三,并能够根据自己的实践总结出新的、行之有效的方法。

1、取消不必要的网络服务

早期的Linux版本中,每一个不同的网络服务都有一个服务程序(守护进程,Daemon)在后台运行,后来的版本用统一的/etc/inetd服务器程序担此重任。Inetd是Internet daemon的缩写,它同时监视多个网络端口,一旦接收到外界传来的连接信息,就执行相应的TCP或UDP网络服务。由于受inetd的统一指挥,因此Linux中的大部分TCP或UDP服务都是在/etc/inetd.conf文件中设定。所以取消不必要服务的第一步就是检查/etc/inetd.conf文件,在不要的服务前加上“#”号。

一般来说,除了http、smtp、telnet和ftp之外,其他服务都应该取消,诸如简单文件传输协议tftp、网络邮件存储及接收所用的imap/ipop传输协议、寻找和搜索资料用的gopher以及用于时间同步的daytime和time等。

还有一些报告系统状态的服务,如finger、efinger、systat和netstat等,虽然对系统查错和寻找用户非常有用,但也给黑客提供了方便之门。例如,黑客可以利用finger服务查找用户的电话、使用目录以及其他重要信息。因此,很多Linux系统将这些服务全部取消或部分取消,以增强系统的安全性。

Inetd除了利用/etc/inetd.conf设置系统服务项之外,还利用/etc/services文件查找各项服务所使用的端口。因此,用户必须仔细检查该文件中各端口的设定,以免有安全上的漏洞。

在后继的Linux版本中(比如Red Hat Linux 7.2之后),取而代之的是采用xinetd进行网络服务的管理。(关于Xinetd的具体使用方法可参阅本报2005年7月4日第25期C11版《使用Xinetd管理网络应用服务》,或访问www2.ccw.com.cn/05/0525/d/0525d04_1.asp)

在Linux中有两种不同的服务型态:一种是仅在有需要时才执行的服务,如finger服务;另一种是一直在执行的永不停顿的服务。后者在系统启动时就开始执行,因此不能靠修改inetd来停止其服务,而只能从修改/etc/rc.d/rc[n].d/文件或用Run level editor去修改它。提供文件服务的NFS服务器和提供NNTP新闻服务的news都属于这类服务,如果没有必要,最好取消这些服务。

当然,具体取消哪些服务不能一概而论,需要根据实际的应用情况来定,但是系统管理员需要做到心中有数,因为一旦系统出现安全问题,才能做到有步骤、有条不紊地进行查漏和补救工作,这一点比较重要。

2、严格审计系统的登录用户

在进入Linux系统之前,所有用户都需要登录,也就是说,用户需要输入用户账号和密码,只有通过系统验证之后,用户才能进入系统。

与其他Unix操作系统一样,Linux一般将密码加密之后,存放在/etc/passwd文件中。Linux系统上的所有用户都可以读到/etc/passwd文件,虽然文件中保存的密码已经经过加密,但仍然不太安全。因为一般的用户可以利用现成的密码破译工具,以穷举法猜测出密码。比较安全的方法是设定影子文件/etc/shadow,只允许有特殊权限的用户阅读该文件。

在Linux系统中,如果要采用影子文件,必须将所有的公用程序重新编译,才能支持影子文件。这种方法比较麻烦,比较简便的方法是采用插入式验证模块(PAM)。很多Linux系统都带有Linux的工具程序PAM,它是一种身份验证机制,可以用来动态地改变身份验证的方法和要求,而不要求重新编译其他公用程序。这是因为PAM采用封闭包的方式,将所有与身份验证有关的逻辑全部隐藏在模块内,因此它是采用影子档案的最佳帮手。

此外,PAM还有很多安全功能:它可以将传统的DES加密方法改写为其他功能更强的加密方法,以确保用户密码不会轻易地遭人破译;它可以设定每个用户使用电脑资源的上限;它甚至可以设定用户的上机时间和地点。

Linux系统管理人员只需花费几小时去安装和设定PAM,就能大大提高Linux系统的安全性,把很多攻击阻挡在系统之外。

3、随时更新系统的最新核心

Linux作为一种优秀的开源软件,其稳定性、安全性和可用性有极为可靠的保证,世界上的Linux高手共同维护着这个优秀的产品,因而其流通渠道很多,而且经常有更新的程序和系统补丁出现,因此,为了加强系统安全,一定要经常更新系统内核。

内核是Linux操作系统的核心,它常驻内存,用于加载操作系统的其他部分,并实现操作系统的基本功能。由于内核控制计算机和网络的各种功能,因此,它的安全性对整个系统安全至关重要。

早期的内核版本存在许多众所周知的安全漏洞,而且也不太稳定,只有2.0.x以上的版本才比较稳定和安全(一般说来,内核版本号为偶数的相对稳定,而为奇数的则一般为测试版本,用户们使用时要多留意),新版本的运行效率也有很大改观。在设定内核的功能时,只选择必要的功能,千万不要所有功能照单全收,否则会使内核变得很大,既占用系统资源,也给黑客留下可乘之机。

在Internet上常常有最新的安全修补程序,Linux系统管理员应该消息灵通,经常光顾安全新闻组,查阅新的修补程序。一般情况下,用户可以随时保持对Red Hat门户网站(www.redhat.com),Debian Linux门户网站(www.debian.org)、Turbolinux门户网站(www.turbolinux.com)、Slackware门户网站(www.slackware..com)、SuSE门户网站(www.suse.com/index_us.html)、Fedora门户网站(fedora.redhat.com)等优秀Linux发行套件网站的关注,及时更新系统的最新核心以及打上安全补丁,这样能较好地保证Linux系统的安全。

4、检查登录密码

设定登录密码是一项非常重要的安全措施,如果用户的密码设定不合适,就很容易被破译,尤其是拥有超级用户使用权限的用户,如果没有良好的密码,将给系统造成很大的安全漏洞。

在多用户系统中,如果强迫每个用户选择不易猜出的密码,将大大提高系统的安全性。但如果passwd程序无法强迫每个上机用户使用恰当的密码,要确保密码的安全性,就只能依靠密码破解程序了。

实际上,密码破解程序是黑客工具箱中的一种工具,它将常用的密码或者是英文字典中所有可能用来作密码的字都用程序加密成密码字,然后将其与Linux系统的/etc/passwd密码文件或/etc/shadow影子文件相比较,如果发现有吻合的密码,就可以求得明码了。

在网络上可以找到很多密码破解程序,比较有名的程序是crack。用户可以自己先执行密码破解程序,找出容易被黑客破解的密码,先行改正总比被黑客破解要有利。

目前密码破解程序大多采用字典攻击以及暴力攻击手段,而其中用户密码设定不当,则极易受到字典攻击的威胁。很多用户喜欢用自己的英文名、生日或者账户等信息来设定密码,这样,黑客可能通过字典攻击或者是社会工程的手段来破解密码。所以建议用户在设定密码的过程中,应尽量使用非字典中出现的组合字符,并且采用数字与字符相结合、大小写相结合的密码设置方式,增加密码被黑客破解的难度。而且,也可以使用定期修改密码、使密码定期作废的方式,来保护自己的登录密码。

具体列出几条参考原则如下:

● 口令长度至少为八个字符,口令越长越好。若使用MD5口令,它应该至少有15个字符。若使用DES口令,使用最长长度(8个字符)。

● 混和大小写字母。Linux区分大小写,因此混和大小写会增加口令的强壮程度。

● 混和字母和数字。在口令中添加数字,特别是在中间添加(不只在开头和结尾处)能够加强口令的强健性。

● 包括字母和数字以外的字符:&、$、和 > 之类的特殊字符可以极大地增强口令的强健性(若使用DES口令则不能使用此类字符)。

● 挑选一个可以记住的口令。如果记不住自己的口令,那么它再好也没有用,使用简写或其他记忆方法来帮助记忆口令。

● 不要在口令中只使用单词或数字。

● 不要使用现成词汇,像名称、词典中的词汇、甚至电视剧或小说中的用语,即使在两端使用数字,都应该避免使用。

● 不要使用外语中的词汇。口令破译程序经常使用多种语言的词典来检查其词汇列表。依赖外语来达到保护口令的目的通常不起作用。

● 不要使用黑客术语。

● 不要使用个人信息。如果攻击者知道你的身份,那么推导出你所用的口令会变得非常容易。以下是你在创建口令时应该避免使用的信息类型:不要倒转现存词汇,优秀的口令破译者总是倒转常用词汇,因此倒转薄弱口令并不会使它更安全;不要笔录你的口令,决不要把口令写在纸上,把它牢记在心才更为安全;不要在所有机器上都使用同样的口令,在每个机器上使用不同的口令是极其重要的,这样,如果一个系统泄密了,所有其他系统都不会立即受到威胁。

5、设定用户账号的安全等级

除密码之外,用户账号也有安全等级,这是因为在Linux上每个账号可以被赋予不同的权限,因此在建立一个新的用户ID时,系统管理员应该根据需要赋予该账号不同的权限,并且归并到不同的用户组中。

在Linux系统中的部分文件中,可以设定允许上机和不允许上机人员的名单。其中,允许上机人员名单在/etc/hosts.allow中设置,不允许上机人员名单在/etc/hosts.deny中设置。此外,Linux将自动把允许进入或不允许进入的结果记录到/var/log/secure文件中,系统管理员可以据此查出可疑的进入记录。

每个账号ID应该有专人负责。在企业中,如果负责某个ID的职员离职,管理员应立即从系统中删除该账号。很多入侵事件都是借用了那些很久不用的账号而发生的。

在用户账号之中,黑客最喜欢具有root权限的账号,这种超级用户有权修改或删除各种系统设置,可以在系统中畅行无阻。因此,在给任何账号赋予root权限之前,都必须仔细考虑。

Linux系统中的/etc/securetty文件包含了一组能够以root账号登录的终端机名称。例如,在Red Hat Linux系统中,该文件的初始值仅允许本地虚拟控制台(rtys)以root权限登录,而不允许远程用户以root权限登录。最好不要修改该文件,如果一定要从远程登录为root权限,最好是先以普通账号登录,然后利用su命令升级为超级用户。

6、谨慎使用“r”远程管理程序

在Linux系统中,有一系列r字头的公用程序,比如rlogin、rcp等等。它们非常容易被黑客用来入侵系统,因而非常危险,因此绝对不要将root账号开放给这些公用程序。由于这些公用程序都是用.rhosts文件或者hosts.equiv文件核准进入的,因此一定要确保root账号不包括在这些文件之内。

由于r字头远程指令是黑客们用来攻击系统的较好途径,因此很多安全工具都是针对这一安全漏洞而设计的。例如,PAM工具就可以用来将r字头公用程序有效地禁止掉,它在/etc/pam.d/rlogin文件中加上登录必须先核准的指令,使整个系统的用户都不能使用自己home目录下的.rhosts文件。

7、采用加密传输手段

由于协议在最初设计时候的不成熟,没有考虑到网络发展到今天会存在如此严重的安全问题,所以诸如FTP、Telnet等服务都是采用明文传输口令和数据,所以我们要尽可能地利用现在的安全技术,对传输的数据进行加密。SSH是安全Shell的简称,它可以安全地被用来取代rlogin、rsh和rcp等公用程序的一套程序组。SSH采用公开密钥技术对网络上两台主机之间的通信信息加密,并且用其密钥充当身份验证的工具。

由于SSH将网络上的信息加密,因此它可以用来安全地登录到远程主机上,并且在两台主机之间安全地传送信息。实际上,SSH不仅可以保障Linux主机之间的安全通信,Windows用户也可以通过SSH安全地连接到Linux服务器上。(关于SSH的具体使用方法可参阅本报2005年9月12 日第35期C10版《使用SHH实现Linux下的安全数据传输》,或访问www2.ccw.com.cn/05/0535/d/0535d04_3.asp)

8、限制超级用户的权力

我们在前面提到,root是Linux保护的重点,由于它权力无限,因此最好不要轻易将超级用户授权出去。但是,有些程序的安装和维护工作必须要求有超级用户的权限,在这种情况下,可以利用其他工具让这类用户有部分超级用户的权限。sudo就是这样的工具。

sudo程序允许一般用户经过组态设定后,以用户自己的密码再登录一次,取得超级用户的权限,但只能执行有限的几个指令。例如,应用sudo后,可以让管理磁带备份的管理人员每天按时登录到系统中,取得超级用户权限去执行文档备份工作,但却没有特权去做其他只有超级用户才能作的工作。

sudo不但限制了用户的权限,而且还将每次使用sudo所执行的指令记录下来,不管该指令的执行是成功还是失败。在大型企业中,有时候有许多人同时管理Linux系统的各个不同部分,每个管理人员都有用sudo授权给某些用户超级用户权限的能力,从sudo的日志中,可以追踪到谁做了什么以及改动了系统的哪些部分。

值得注意的是,sudo并不能限制所有的用户行为,尤其是当某些简单的指令没有设置限定时,就有可能被黑客滥用。例如,一般用来显示文件内容的/etc/cat指令,如果有了超级用户的权限,黑客就可以用它修改或删除一些重要的文件。

对于该程序的使用,我们将在《充分使用Linux安全防护工具》一文中对其进行详细讲述。

9、留意和追踪黑客的踪迹

当用户仔细设定了各种与Linux相关的配置(最常用日志管理选项),并且安装了必要的安全防护工具之后,Linux操作系统的安全性的确大为提高,但是却并不能保证能防止那些比较熟练的网络黑客的入侵。

在平时,网络管理人员要经常提高警惕,随时注意各种可疑状况,并且按时检查各种系统日志文件,包括一般信息日志、网络连接日志、文件传输日志以及用户登录日志等。在检查这些日志时,要注意是否有不合常理的时间记载。例如:

● 正常用户在半夜三更登录;

● 不正常的日志记录,比如日志只记录了一半就切断了,或者整个日志文件被删除了;

● 用户从陌生的网址进入系统;

● 因密码错误或用户账号错误被摈弃在外的日志记录,尤其是那些一再连续尝试进入失败但却有一定模式的试错法;

● 非法使用或不正当使用超级用户权限su的指令;

● 重新开机或重新启动各项服务的记录。

上述这些问题都需要系统管理员随时留意系统登录的用户状况以及查看相应日志文件,许多背离正常行为的蛛丝马迹都应当引起高度注意。(具体的方法请参阅本报2005年6月20日第23期C15版《使用日志系统保护Linux安全》一文,或访问www2.ccw.cow.cn/05/0523/d/0523d04_2.asp)

10、结合使用防火墙、IDS等防护手段

防火墙、IDS等防护技术已经成功地应用到网络安全的各个领域,而且都有非常成熟的产品。目前,分布式防火墙是一种新的防火墙体系结构,其包含如下产品:

● 网络防火墙:用于内部网与外部网之间(即传统的边界防火墙)和内部网子网之间的防护产品,后者区别于前者的一个特征是需支持内部网可能有的IP和非IP协议。

● 主机防火墙:对于网络中的服务器和桌面机进行防护,这些主机的物理位置可能在内部网中,也可能在内部网外,如托管服务器或移动办公的便携机。

● 中心管理:边界防火墙只是网络中的单一设备,管理是局部的。对分布式防火墙来说,每个防火墙作为安全监测机制可以根据安全性的不同要求布置在网络中的任何需要的位置上,但总体安全策略又是统一策划和管理的,安全策略的分发及日志的汇总都是中心管理应具备的功能。中心管理是分布式防火墙系统的核心和重要特征之一。

在Linux系统来说,有一个自带的Netfilter/iptables防火墙框架,通过合理地配置也能起到主机防火墙的功效。(该技术的使用请参阅本报2005年5月9日第17期C10版《Linux下的防火墙机制应用》一文,或访问www2.ccw.com.cn/05/0517/d/0517d04_2.asp)

对于IDS来说,它通过对计算机网络或计算机系统中的若干关键点收集信息并对其进行分析,从中发现网络或系统中是否有违反安全策略的行为和被攻击的迹象。按照技术以及功能来划分,入侵检测系统可以分为如下几类:

● 基于主机的入侵检测系统:其输入数据来源于系统的审计日志,一般只能检测该主机上发生的入侵。

● 基于网络的入侵检测系统:其输入数据来源于网络的信息流,能够检测该网段上发生的网络入侵。

● 采用上述两种数据来源的分布式入侵检测系统:能够同时分析来自主机系统审计日志和网络数据流的入侵检测系统,一般为分布式结构,由多个部件组成。

在Linux系统中也有相应的轻量级的Snort,使用它可以快速、高效地进行防护。(关于Snort的具体使用请参阅本报2005年4月11日第13期C16版《使用Snort塔建安全的Linux服务器》一文,或访问www2.ccw.com.cn/05/0513/d/0513d04_1.asp)

需要提醒读者注意的是:在大多数的应用情境下,我们需要综合使用这两项技术,因为防火墙相当于安全防护的第一层,它仅仅通过简单地比较IP地址/端口对来过滤网络流量,而IDS更加具体,它需要通过具体的数据包(部分或者全部)来过滤网络流量,是安全防护的第二层。综合使用它们,能够做到互补,并且发挥各自的优势。目前,基于多个安全产品间的联动的研究正在进行,这是一个很有前途的方向。

11、保持对新技术及其系统漏洞的跟踪

计算机技术、网络通信技术以及网络攻防对抗技术的发展一直就没有停止过。Linux作为一种优秀的开源软件,其自身的发展也日新月异,同时,它存在的安全问题也会在日后的应用中慢慢暴露出来。黑客对新技术的关注从一定程度上来说要高于我们防护人员,所以要想在网络攻防的战争中处于有利地位,保护Linux系统的安全,就要求我们要保持高度的警惕性和对新技术的高度关注。特别是使用Linux作为关键业务系统的企业的系统管理员,需要通过Linux的一些权威网站和论坛尽快地获取有关该系统的一些新技术以及一些新的系统漏洞的信息,做到防范于未然,提早行动,在漏洞出现后的最短时间内对其进行封堵,并且在实践中不断地提高安全防护的技能,这样才是比较好的解决办法和出路,单纯地依靠一些现有的工具是不行的。

12、综合防御,确保安全

从计算机安全的角度看,世界上没有绝对密不透风、百分之百安全的计算机系统,Linux系统也不例外。采用以上的安全法则,虽然可以使Linux系统的安全性大大提高,使一般地黑客和电脑玩家不能轻易闯入,但却不一定能阻挡那些比较高明的黑客,因此,用户需要灵活地综合采用上述原则,并且根据实际的应用场景进行调整,才能取得比较好的实践效果。

李洋,中国科学院计算技术研究所博士。主要研究方向为大规模网络信息安全、计算机软件与理论。多年来一直从事网络信息安全领域的研究与开发工作。曾参与过多项“国家自然科学基金重大专项”、“国家863计划”、“国家242信息安全计划”等重大国家项目的研发工作。