分享

第十八章 Linux系统安全简介

 czs321 2013-02-21



目标

系统管理员不能对安全毫无认识。随着网络技术的快速发展和应用的日渐普及,骇客工具不仅变得越来越先进,而且也越来越容易被一般人获取和滥用。骇客技术的提升和工具的泛滥,造成各行各业大量的企业、机构的电脑系统遭受程度不同的入侵和攻击,或面临随时被攻击的危险。本章介绍了Linux系统面临的各种安全问题及其解决方法,希望大家在学习Linux运行与管理的同时,扎实地掌握安全设置与管理。

 

重点内容

        安全管理

        补丁的重要作用

        主机安全

        PAM

        用户设置

        文件权限

        setuidsetgid

        缓冲区溢出

        网络安全设置

        简单攻击检测

        使用安全工具


18.1  安全漏洞

18.1.1      计算机网络的发展

20世纪80年代起,很多公司构建了以太网和令牌环网,并把自己的办公与服务计算机连接到局域网上。那个时候,虽然在今天看来有很多明显的漏洞,但除了控制用户账号之外一般不需要更多的安全措施。因为这些局域网相互独立,没有连接,是信息的孤岛,不会受到来自外部的安全威胁。而到了90年代,人们开始认识到将自己的局域网和别人的局域网以及商务伙伴的局域网互连,并最终与Internet互连的好处。

本来公司里的服务器和工作站是连接到局域网上的,而在没有认真地考虑整个系统安全性的情况下,这些网络就连接到广域网和Internet上。那些本身安全性很差的网络此时受攻击的可能性就大大增加了。在独立的局域网纷纷互连和接入Internet的时候,正是网络骇客攻击事件发生的一个高峰期。

18.1.2      软件本身的问题

Internet上运行的很多系统和应用软件在最初的时候根本都没有考虑到要抵挡网络骇客的攻击。为内联网级别设计的客户机/服务器应用程序现在也连接到Internet上,也面临着被攻击的风险。即使这些服务器是在防火墙和其他手段的保护之下,这种危险仍然存在。不管一个应用程序设计得多么仔细,都无法在安全性上做到尽善尽美。程序本身,以及用来开发和运行这个程序的工具也都会有脆弱性。

从软件开发来讲,在开发生命周期中,当意识到对安全的需求时,往往已经太晚了。在开始、开发、执行、维护、退役/处理五个基本阶段中对于安全性的需求通常在执行阶段才被意识到,而直到维护阶段,一些安全措施才开始被采用。即便如此,对于很多已经成型的系统漏洞的处理方法也仅仅是进行一些简单的反思,使用一些补丁或者服务包修补了事。一个受到良好保护的系统在开始阶段就开始设计安全策略了--而不是只到执行甚至维护阶段安全性问题才被想起来--因为使用服务包和补丁可能会带来其他的安全漏洞,从而进入了修补、再修补,补丁叠补丁的循环。

18.1.3      活跃的骇客

首先简要地介绍一下骇客与黑客的区别,为黑客正名。

“黑客”(hacker)、“骇客”(cracker),这些词都来自英文翻译。我们常说的“黑客”破坏计算机安全,实际上这个词被用错了。这一类搞破坏的人在英文中被称为cracker破解者(加密软件等),或者intruder入侵者等。真正的hacker黑客是不以攻击和破坏为目的的,他们是技术上的行家或热衷于解决问题,克服限制。在精神上,hacker并不单指(限制于)这种软件hacker的文化。有人也把hacker的特质发挥在其它领域,例如:电子或者音乐方面。在任何一种科学或艺术的最高境界,你都可以发现hacker的特质。软件hacker们认为,那些类似的精神也都可以称为黑客。

而骇客,一般都怀着不良的企图,闯入甚至破坏远程机器系统完整性。骇客们利用获得的非法访问权,破坏重要数据,拒绝合法用户服务请求,或为了自己的目的制造麻烦。 一句话说,攻击我们网络的人,是“骇客”。

18.2  补丁在系统安全中的重要作用

在上面已经谈到了,计算机软件的开发不可能完美。我们进行操作系统安全加强之前,其实安装在计算机上的系统已经可以说在根本上有很多问题和漏洞的了。而目前所有软件厂商的开发模式都是强调功能和使用性,在安全上还重视不够。每一年报告给CERT/CC的漏洞数量都成倍增长。CERT/CC公布的漏洞数据2000年为1090个,2001年为2437个,2002年已经增加至4129个,就是说每天都有十几个新的漏洞被发现。可以想象,对于管理员来说想要跟上补丁的步伐是很困难的。

而且,入侵者往往能够在软件厂商修补这些漏洞之前首先发现这些漏洞。随着发现漏洞的工具的自动化趋势,留给用户打补丁的时间越来越短。尤其是缓冲区溢出类型的漏洞,其危害性非常大而又无处不在,是计算机安全的最大的威胁。在CERT和其它国际性网络安全机构的调查中,这种类型的漏洞是对服务器造成后果最严重的。通过打补丁弥补软件本身设计开发上的漏洞,已经成为安全专家的共识。

18.3  主机安全

在我们对主机系统进行安全加强之前,首先要记得不要单一地去考虑主机的安全,这样很不全面。做安全的时候很忌讳把目光只集中在一处,认为只要保护我最重要的服务器就可以了。实际上我们下面要谈到的物理安全与网络整体安全更应引起我们的注意。

18.3.1      物理安全

物理安全是指服务器做为一个硬件设备来讲,是不是处于一个安全的环境。物理安全是保护计算机网络设备、设施以及其它媒体免遭地震、水灾、火灾等环境事故,以及人为操作失误或错误及各种计算机犯罪行为导致的破坏过程。无论服务器的安全设置有多好,被水泡一泡,它还能为大家提供正常的服务吗?安全的三个基本要素“完整性、可用性、保密性”中,“可用性”是绝不可缺少的,而且是其它一切功能的基础。所以放在首位的安全考虑应该是防止“天灾人祸”,这里的人祸是指真正的人为物理偷窃、破坏。通常物理安全包括三个方面:

         环境安全

对系统所在环境的安全保护,如区域保护和灾难保护;

         设备安全

主要包括设备的防盗、防毁、防电磁信息辐射泄漏、防止线路截获、抗电磁干扰及电源保护等;

         媒体安全

包括媒体数据的安全及媒体本身的安全。

在考虑物理安全时,把服务器都放在条件良好的机房中,并建立严格的管理制度,是一个简单而有效的手段。

18.3.2      网络环境的安全

如果把服务器看作一间屋子,那么服务器所在的网络环境就可以看作是居民小区,这时我们就不难理解网络环境对服务器安全的重要性了。一户人家被盗了,户主在重修门户的同时,往往会责问小区的保安员工作不力,因为大家都有这样的认识:要是保安措施有效的话,小偷很难跑到我家的门前窗下为非作歹的。

同样道理,骇客从网络上进攻的时候,一般要经过路由器、防火墙、交换机,最后到达目标服务器。一个有很多服务器的网络,对每一台服务器进行安全设置时有可能会产生个别的失误,导致整体上存在漏洞。不过如果在网络的安全设置上多下一些工夫,就可以收到事半功倍的效果,因为骇客要攻击服务器时必须要经过上述设备,在防火墙、路由器和交换机上进行安全设置,步步为营,让骇客每前进一步就必须付出较高的代价,就会给后面的服务器减轻许多压力。

实际进行设置时,可以问自己这样几个问题:

        防火墙的规则设置是否合理?

经常看到一台几十万元的防火墙由于规则问题,变成没有任何过滤措施的“路由器”。

        路由设置、VLAN划分是否合理?

不合理的路由与VLAN设置不但会造成效率低下,而且会为骇客提供攻击的条件。

        是否采用了防御分布式拒绝服务攻击的措施?

在服务器上确实可以进行防御拒绝服务攻击的措施,但一谈到分布式拒绝服务攻击,就不是服务器自己可以应付的事情了。服务器上面的设置最多是减轻攻击造成的压力,最大部分的工作还是要在网络设备上做。

        网络设备自身的安全性如何?

网络设备本质上也是计算机,也运行了自己的操作系统与相应软件,而所有软件都会有设计上的漏洞和bug,这些都可以成为骇客的目标,这时候做为安全警卫的网络设备自身也成为攻击目标了。而一旦它们被攻陷或者是打瘫,整个网络基本上没有安全性可言了。

        网络上是否已经采取了防御与检测监听的措施?

监听只能在局域网进行,使用交换设备和监听器检测软件可以使非法监听无用武之地、无所遁形。

        网络上是否已经采取了防御扫描的措施?

在入口的防火墙处是进行扫描防御的最佳位置。

        最后,综合来看,网络设备与它们的配置是否已经提供了一个安全的基础环境?

18.4  PAM

PAMPluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。

PAM最初是集成在Linux中,目前已移植到其它系统中,如LinuxSunOSHP-UX 9.0等。

18.4.1      PAM的结构

系统管理员通过PAM配置文件来制定认证策略,即指定什么服务该采用什么样的认证方法;应用程序开发者通过在服务程序中使用PAM API而实现对认证方法的调用;而PAM服务模块(service module)的开发者则利用PAM SPIService Module API)来编写认证模块(主要是引出一些函数pam_sm_xxxx( )libpam调用),将不同的认证机制(比如传统的UNIX认证方法、Kerberos等)加入到系统中;PAM 心库(libpam)则读取配置文件,以此为根据将服务程序和相应的认证方法联系起来。

18.4.2      PAM支持的四种管理界面

1、认证管理(authentication management

主要是接受用户名和密码,进而对该用户的密码进行认证,并负责设置用户的一些秘密信息。

2、帐户管理(account management

主要是检查帐户是否被允许登录系统,账号是否已经过期,账号的登录是否有时间段的限制等等。

3、密码管理(password management

主要是用来修改用户的密码。

4、会话管理(session management

主要是提供对会话的管理和记账(accounting

18.4.3      PAM的文件

/usr/lib/libpam.so.*                  PAM核心库

/etc/pam.conf或者/etc/pam.d/          PAM配置文件

/usr/lib/security/pam_*.so            可动态加载的PAM service module

18.4.4      PAM的配置

PAM的配置是通过单个配置文件/etc/pam.conf

1、使用配置文件/etc/pam.conf

该文件是由如下的行所组成的:

service-name  module-type  control-flag  module-path  arguments

service-name 服务的名字,比如telnetloginftp等,服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务。

module-type  模块类型有四种:authaccountsessionpassword,即对应PAM所支持的四种管理方式。同一个服务可以调用多个 PAM模块进行认证,这些模块构成一个stack

control-flag 用来告诉PAM库该如何处理与该服务相关的PAM模块的成功或失败情况。它有四种可能的值:requiredrequisitesufficientoptional

required 表示本模块必须返回成功才能通过认证,但是如果该模块返回失败的话,失败结果也不会立即通知用户,而是要等到同一stack 中的所有模块全部执行完毕再将失败结果返回给应用程序。可以认为是一个必要条件。

sufficient 表明本模块返回成功已经足以通过身份认证的要求,不必再执行同一stack内的其它模块,但是如果本模块返回失败的话可以 忽略。可以认为是一个充分条件。

optional表明本模块是可选的,它的成功与否一般不会对身份认证起关键作用,其返回值一般被忽略。对于control-flag,从Linux-PAM-0.63版本起,支持一种新的语法,具体可参看LinuxPAM文档。

module-path 用来指明本模块对应的程序文件的路径名,一般采用绝对路径,如果没有给出绝对路径,默认该文件在目录/usr/lib/security 面。

arguments  是用来传递给该模块的参数。一般来说每个模块的参数都不相同,可以由该模块的开发者自己定义,但是也有以下几个共同 的参数:

debug   该模块应当用syslog( )将调试信息写入到系统日志文件中。

no_warn  表明该模块不应把警告信息发送给应用程序。

use_first_pass  表明该模块不能提示用户输入密码,而应使用前一个模块从用户那里得到的密码。

try_first_pass  表明该模块首先应当使用前一个模块从用户那里得到的密码,如果该密码验证不通过,再提示用户输入新的密码。

use_mapped_pass 该模块不能提示用户输入密码,而是使用映射过的密码。

expose_account  允许该模块显示用户的账号名等信息,一般只能在安全的环境下使用,因为泄漏用户名会对安全造成一定程度的威胁。

18.5  用户账号与口令管理

骇客要非法地访问一台计算机,最简单的办法是盗取一个合法的账号,这样就可以令人不易查觉地使用系统。在Linux系统中默认有不少账号安装,也会建立新的个人用户账号,系统管理员应对所有的账号进行安全保护,而不能只防护那些重要的账号,如只防护root账号。

18.5.1      用户管理

Linux环境下对用户的管理有多种方式,常用的包括:

        使用编辑工具vi/etc/passwd进行操作

        直接使用useradduserdel等用户管理命令

        使用pwconv命令,让/etc/passwd/etc/shadow文件保持一致

18.5.1.1  增加用户

1./etc/passwd文件中写入新用户。

2.为新登录用户建立一个HOME目录。

3./etc/group中增加新用户。

/etc/passwd文件中写入新的入口项时,口令部分可先设置为NOLOGIN,以免有人做为此新用户登录。新用户一般独立为一个新组,GID号与UID号相同(除非他要加入目前已存在的一个新组),UID号必须和其他人不同,HOME目录一般设置在/usr/home目录下,建立一个以用户登录名为名称的目录做为其主目录。

18.5.1.2  删除用户

删除用户与加用户的工作正好相反,首先在/etc/passwd/etc/group文件中删除用户的入口项,然后删除用户的HOME目录和所有文件。

rm –r /usr/loginname删除用户的整个目录。

/usr/spool/cron/crontabs中有crontab文件,也应当删除。

18.5.2      账号信息

Linux系统中,账号的信息是储存在/etc/passwd/etc/shadow文件中的。/etc/passwd文件保存着用户的名称、ID号、用户组、用户注释、主目录和登录shell/etc/shadow文件存放了用户名称和口令的加密串。下面是两个文件的例子:

18.5.2.1  /etc/passwd                        

root:x:0:0:root:/root:/bin/bash                                         

bin:x:1:1:bin:/bin:/sbin/nologin                                       

daemon:x:2:2:daemon:/sbin:/sbin/nologin                   

adm:x:3:4:adm:/var/adm:/sbin/nologin                          

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin                           

sync:x:5:0:sync:/sbin:/bin/sync                                       

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown            

halt:x:7:0:halt:/sbin:/sbin/halt                                   

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin       

news:x:9:13:news:/etc/news:                                         

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin  

                                                                                      

                                                                                      

                                                                                      

 

 

各个域依次为:用户名:原密码存放位置:用户ID:ID:注释:主目录:外壳

18.5.2.2  /etc/shadow                        

root:$1$ojgDMA/K$ydGOqgE96ka/HSpXg8e9O.:12367:0:99999:7:::      

bin:*:12328:0:99999:7:::                                                                                   

daemon:*:12328:0:99999:7:::                                                                          

adm:*:12328:0:99999:7:::                                                                                 

lp:*:12328:0:99999:7:::                                                                                      

sync:*:12328:0:99999:7:::                                                                                 

shutdown:*:12328:0:99999:7:::                                                                        

halt:*:12328:0:99999:7:::                                                                                   

mail:*:12328:0:99999:7:::                                                                                 

news:*:12328:0:99999:7:::                                                                                

uucp:*:12328:0:99999:7:::                                                                                

                                                                                                                         

                                                                                                                         

                                                                                                                  

 

各个域依次为:用户名:加密口令:上次修改日期:最短改变口令时间:最长改变口令时间:口令失效警告时间:不使用时间:失效日期:保留

18.5.3      控制用户的登录地点

文件/etc/secruity/access.conf可控制用户登录地点,为了使用access.conf,必须在文件/etc/pam.d/login中加入下面行:

account required /lib/security/pam-access.so

 access.conf文件的格式:

permission : users : origins

 其中:

permission:可以是,表示允许或拒绝。

user:可以是用户名、用户组名,如果是all则表示所有用户。

origins:登录地点。local表示本地,all表示所有地点,console表示控制台。另外,origins也可以是某一网络。

后面两个域中加上 except除了的意思。例如:除了用户wheelshutdownsync禁止所有的控制台登录:

 

:ALL EXCEPT wheel shutdown sync:console

root帐户的登录地点不在access.conf文件中控制,而是由/etc/securetty文件控制。如果要让root能从pts/0登录,就在这个文件中添加一行,内容是0就行,要从pts/1以此类推。或者修改/etc/pam.d/login,把

 

auth required /lib/security/pam_securetty.so

  注释掉也可以允许root远程登录。

18.5.4      使用sudo分配特权

做为系统管理员,可能会碰到过有这样的情况不好处理:有的时候不得不把服务器的root权限交给一个普通的工作人员,比如服务器正在安装补丁,然后重启一下机器,你因事要突然离开,只能委托给别人重启一下;而做这项工作(使用reboot命令)是需要root权限的,你必须先把口令告诉受托人,今后回来了再改成新的。但即使这样也会在前后的时间差里产生不安全的因素:受托人可以利用root权限去做一些其他的事情,象查看秘密的文件,系统情况甚至非法安装软件等等。

这时你也许会想,我只让这个用户以root身份执行reboot命令就行了。完全没错,可惜在早期Linux通常的系统安装下这个要求无法达到。不过令人高兴的是已经有了软件可以实现这样的功能,它就是sudo

Sudo是安装在Linux系统平台上,许可其他用户以root身份去执行特定指令的软件。有了sudo,上面的问题就解决了,管理员可以进行配置,允许那个普通用户使用reboot命令,但不可以用root身份执行其他命令。而且也不必把root的口令告诉普通用户。

18.5.4.1  sudo的配置

/etc/sudoers的配置规则如下:

我们需要使用“visudo”命令,这个命令在系统安装时与sudo程序一起拷贝到了/usr/bin下。visudo就是用来编辑/etc/sudoers这个文件的,只要把相应的用户名、主机名和许可的命令列表以标准的格式加入文件并保存就可以生效。例如:

管理员需要允许“xyd”用户在主机“solx”上执行“reboot”和“shutdown”命令,在visudo时加入

  

   xyd                solx = /usr/sbin/reboot /usr/sbin/shutdown                                                                             

注意:这里的命令的表示一定要使用绝对路径,避免其他目录的同名命令被执行,造成安全隐患。                                                                                             

保存退出就可以了。xyd用户想执行reboot命令时,只要在提示符下运行下列命令:

$ sudo reboot                                                                                                           就可以重启服务器了。使用sudo时,都是在命令前面加上“sudo”,后面跟所要执行的命令。

18.5.4.2  sudoalias

visudo时,还可以利用别名来简化配置文件。别名类似组的概念,有用户别名、主机别名和命令别名。多个用户可以首先用一个别名来定义,然后在规定他们可以执行什么命令的时候使用别名就可以了,这个配置对所有用户都生效。主机别名和命令别名也是如此。注意使用前先要visudo中定义:

Host_Alias:用来创建主机别名[可选],列表中的主机必须用逗号隔开,如果要设置多个别名,可以用冒号隔开,保留关键字ALL代表所有主机。例如:

 

Host_Alias bluesun=grindglass

这里用别名bluesun来统称grindglass两台机器,grindglass分别是这两台机器的机器名。

User_Alias:用来创建用户别名[可选],列表中的用户名必须以逗号隔开。其格式同主机别名,保留关键字ALL代表所有命令。

Cmnd_alias:用来创建命令别名[可选],列表中的命令必须用逗号隔开,如果要定义一个命令无效,可以在该命令前加!号。

后面加入相应的名称就可以了,也以逗号分隔开。

18.5.4.3  sudo的参数

在运行sudo时,使用sudo直接跟上命令就可以了。sudo这个命令还可以加上一些参数执行,完成一些辅助的功能。如

$ sudo –l:会显示出类似这样的信息:

User xyd may run the following commands on this host:                                       (root) /usr/sbin/reboot                                                                                

说明用户xydroot允许执行/usr/sbin/reboot命令。这个参数可以使用户查看自己目前可以在sudo中执行哪些命令,方便使用。

其他一些参数还有:

-V 显示版本编号

-h 会显示版本编号及指令的使用方式说明

-l 显示出自己(执行 sudo 的使用者)的权限

-v 因为 sudo 在第一次执行时或是在 N 分钟内没有执行(预设为五)会问密码,这个参数是重新做一次确认,如果超过 N 分钟,也会问密码

-k 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)

-b 将要执行的指令放在背景执行

-p prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的账号名称, %h 会显示主机名称

-u username/#uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码)

-s 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell

-H 将环境变数中的 HOME 指定为要变更身份的使用者HOME目录(如不加 -u 参数就是系统管理者 root 

18.5.5      初始化环境:/etc/skel

  当创建一个新用户时,如果没有指定用户目录,系统就为其创建一个登录目录,这个登录目录就是用/etc/skel为模板,所有的文件都和/etc/skel中的文件相同。系统管理员能够在/etc/skel中建立文件,这些文件可以为用户提供一个很好的缺省环境。

例如,用户可以建立一个/etc/skel/.profile文件,定义用户登录后的一些属性的设置。但是如果对/etc/skel这个文件夹进行改动后,肯定会导致改动前创建的用户和改动后创建的用户的一些文件不一样,所以只要可能,尽量将全局配置放入全局文件中,例如如/etc/profile,以实现系统用户一些设置的统一。

/etc/skel的存在的意义很多,比如一台专门开虚拟主机的服务器上面就可以只在/etc/skel中放一个index.html,让每个新加的用户不会有系统安装时缺省的那些.bashrc等文件,又可以确保未放置主页的用户的页面的统一。

18.5.6 密码设置和管理

18.5.6.1  密码的设置

密码设置应按照一定的规则。在Linux系统中,为了强制用户使用合格的口令,用户修改口令时推荐必须最少有6个字符,而且至少包括2个数字或者特殊字符。不过要注意在以root的身份进行密码修改时是不受这个限制的。下面是在进行密码设置的时候推荐的一些方式:

        密码至少应有6个字符

        密码至少应该包含2个英文字母及一个数字或特殊符号。

        密码应与用户名完全不同,且不能使用原有名称的变化(如反序、位移等)

        新旧密码至少有3个字符不相同

18.5.6.2  口令的控制

用户应该定期改变自己的口令,例如一个月换一次。如果口令被偷去就会引起安全问题,经常更换口令可以帮助减少损失。假设一个骇客偷了用户的密码,但并没有被发觉,这样给用户造成的损失是不可估计的。陨一段时间换一次口令总比一直保留原有口令损失要小。我们可以为口令设定有效时间,这样当有效时间结束后,系统就会强制用户更改系统密码。另外,有些系统会将用户以前的口令记录下来,不允许用户使用以前的口令,而要求用户输入一个新的口令。这样就增强了系统的安全性。

18.5.7 禁用帐户

如果需要暂时让某个帐户停用,而不是删除时,最简单的方法就是确保用户口令终止。我们可以手工更改/etc/shadow文件中的帐户终止时间字段区域。就像前面介绍的一样,利用用/etc/shadow文件字段中的日期是自197011日以后的帐户将被终止的天数,而shadow文件中第三个子段区域表示表示自197011日以来至最后一次更改口令的天数。我们可以首先变更用户的口令,然后第三字段将显示出新的日期数字。将该数字减1,并在帐户终止时间字段区域(第八区域)插入运算的结果,然后保存文件即可。

在帐户重新重用的时候,将日期重新设置就可以继续使用了。

18.6  文件权限

18.6.1      Linux的文件权限

Linux系统中的文件权限,是指对文件的访问权限,包括对文件的读、写、删除、执行。Linux 是一个多用户操作系统,它允许多个用户同时登录和工作。因此 Linux 将一个文件或目录与一个用户和组联系起来。请看下面的例子:

    drwxr-xr-x 5 root root 1024 Sep 13 03:27 Desktop

    与文件权限相关联的是第一、第三、第四个域。第三个域是文件的所有者,第四个域是文件的所属组,而第一个域则限制了文件的访问权限。在这个例子中,文件的所有者是 root,所属的组是 root,文件的访问权限是 drwxr-xr-x。对于文件和目录讲,每个文件和目录都有一组权限标志和它们结合在一起,在上例中就是第一个域中的内容。下面来仔细分析这个域中各个符号的意义:

    该域由 10 个字符组成,可以把它们分为四组,具体含义分别是:

    d

Rwx

       r-x

       r-x

             

  文件类型

所有者权限

组权限

其他用户权限

    文件类型:第一个字符。由于 Linux 系统对与设备、目录、文件都当作是文件来处理,因此该字符表明此文件的类型,字符与对应的意义如下表:

!!!无表

    权限标志:

    对每个文件或目录都有 4 类不同的用户。每类用户各有一组读、写和执行(搜索)文件的访问权限,这 4 类用户是:

    root:系统特权用户类,既 UID = 0 的用户。

    owner:拥有文件的用户。

    group:共享文件的组访问权限的用户类的用户组名称。

    world:不属于上面 3 类的所有其他用户。

作为 root,他们自动拥有了所有文件和目录的全面的读、写和搜索的权限,所以没有必要明确指定他们的权限。其他三类用户则可以在单个文件或者目录的基础上别授权或撤消权限。因此对另外三类用户,一共 9 个权限位与之对应,分为 3 组,每组 3 个,分别用 rwx 来表示,分别对应 ownergroupworld

权限位对于文件和目录的含义有些许不同。每组 3 个字符对应的含义从左至右的顺序,对于文件来说是:读文件的内容(r)、写数据到文件(w)、做为命令执行该文件(x)。对于目录来说是:读包含在目录中的文件名称(r)、写信息到目录中去(增加和删除索引点的连接)、搜索目录(能用该目录名称作为路径名去访问它所包含的文件或子目录)。具体来说就是:

        有只读权限的用户不能用 cd 进入该目录;还必须有执行权限才能进入

        有执行权限的用户只有在知道文件名并拥有该文件的读权限的情况下才可以访问目录下的文件。

        必须有读和执行权限才可以使用 ls 列出目录清单,或使用 cd 进入目录。

        如用户有目录的写权限,则可以创建、删除或修改目录下的任何文件或子目录,既是该文件或子目录属于其他用户。

18.6.2      文件和目录权限的相关命令

18.6.2.1  chown

改变文件的属主,即所有者。

例:# chown xyd scan.sh

上面的命令把scan.sh文件的所有者改为了用户xyd。这个命令还有以下选项:

-c 详尽地描述每个 file 实际改变了哪些所有权。

-f 不打印文件所有权不能修改的报错信息。

-h 只作用于其本身的符号链接,而不修改它们所指向的文件。 这只在提供了 lchown 系统调用的情况下才可用。

-v 详尽地描述对每个 file 所执行的操作(或者无操作)

-R 递归地修改目录及其下面内容的所有权。

18.6.2.2  chgrp

改变文件的属组。

例:# chgrp admin scan.sh

就是把scan.sh文件的属组更改为admin组。它还有下列选项:

-H (当和 -R 一起给出) 给出的文件操作数书指向目录的符号链接时,改变这个目录和目录中文件的组所有权。

-L(当和 -R 一起给出) 给出的文件,不论是命令行操作数还是遍历整个树,操作数书指向目录的符号链接时, 改变这个目录和目录中文件的组所有权。

-P (当和 -R 一起给出) 对于一个文件,不论是命令行操作数还是遍历整个树, 是符号链接的,只改变它本身, 优于(改变)指向的对象如果系统不支持符号链接的组所有权,那就对它不起作用。这是默认值。

-R ,递归的改变目录和它的内容的组所有权

18.6.2.3  chmod

改变文件的访问权限。这是非常重要的一个命令,要熟练地使用它。

使用chmod命令改变指定文件访问权限有两种方式:一种是用符号标记所进行更改,另一种方式是采用8进制数指定新的访问权限。使用下面的语法格式来使用符号改变方式 `[ugoa。。。][[+-=][rwxXstugo。。。]。。。][,。。。]'

在这种格式下,所带参数是一个用逗号分隔的字符列表。每个符号方式的改变命令以零或者字'ugoa'开始;'ugoa'控制哪些用户对该文件访问权限将被改变:文件的所有者(u),与文件所有者同组的用户(g),其他组的用户(o),所有用户(a)。因此,a在这里等同于ugo。如果没有带参数,则缺省设置为a,运行效果相同,但是在umask中设置的位将不会受影响。

操作符'+'使得用户选择的权限被追加到每个指定文件,(操作给指定文件添加所选权限);操作符'-'使得这些权限被撤消;'='使得指定文件只具有这些权限。

字符串'rwxXstugo' 给用户选择新的属性:(r)读权限、(w)写权限、 (x)执行权(或对目录的访问权),(X)只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x属性,(ssetuIDsetgID(t)粘滞位(保存程序的文本到交换设备上),(u)目标文件属主,(g)目标文件属主所在的组,(o)其他用户。(因此,'chmod g-s file' 撤消sgid位,'chmod ug+s file'同时设置了suidsgid位,'chmod o+s file' 则没有进行任何设置)

数字模式是一到4个八进制数,每个数由位权为4213位叠加而得。 被省略掉的数字缺省设置为零。 第一位为4时为suid2时为sgid1时为粘滞位,。第二位设置文件所有者的权限:可读(4),可写(2),可执行(1); 第三位设置了文件所在组其他用户的权限,值如上;第四位设置了其他组的用户的权限,值同上。

由于chmod的系统调用不支持,chomd命令不能改变符号链接的权限。 由于符号链接的权限从不使用,所以这也不成问题。无论如何,由于每个符号连接都可在命令行中列出,chmod改变了所指文件的属性。 相反,chmod在递归目录遍历时忽略所碰到的符号连接。  

18.6.2      umask

对于root用户新创建的文件与目录,注意在没有必要的情况下,一定要使任何一个用户没有访问的权限。超级用户的权限最好设置为077。如果某些文件或者目录需要被别人访问,生成后再修改权限就行了。麻烦一点总比被攻击好。

我们在前面章节已经介绍了umask的概念,它是Linux系统中的一个值,决定了在创建新文件和目录的时候为它赋予的默认权限。每个用户可以改变自己的umask值。在创建文件或者目录的时候,它以数值形式决定了默认情况下将不会赋予这个文件或者目录哪些权限,例如,有个用户的umask设置为027,这个数值可以分解为0270表示用户将获得所有权限;2表示用户所在的组将不会被赋予2-写权限;7表示其他用户将不会赋予任何权限。

18.7  setuidsetgid

Linux中,文件除了读、写、执行权限外,还有一些特殊权限。setuidsetgid是其中的一类。它与Linux系统的安全关系紧密。 Setuid是指设置程序的有效的执行用户身份(uid)为该文件的主人,而不是调用该程序的进程的uidSetgid与之类似。Setuidsetgid存在于主人和属组的执行权限的位置上。

这种权限怎么用 举个例子来说,假如某一命令(程序)的主人是root用户,并且该文件有setuid属性,但是该文件的读、写、执行权限的属性表明普通用户user1可以执行该命令,那么就表示:user1执行该命令时,他具有root的执行身份,并获得相应的权限。一旦该命令执行完成,root身份也随之消失。

18.7.1       setuid权限的作用

Linux系统中,setuid权限起着重要的作用。我们以/bin/login程序来说明这个问题。

(在使用PAM的系统中,不适用)

login是为用户本地和远程登录时提供交互界面的,用户在使用系统之前,都需要利用此程序登录进入。简单来说,登录过程中login程序会访问两个文件:/etc/passwd/etc/shadow,它们的访问权限通常是这样的:

/etc/passwd    - r - - r - - r - -

/etc/shadow    -r - - - - - - - -

login程序需要首先从/etc/passwd文件中读取用户的帐户名称,然后在/etc/shadow中取得用户已经保存的加密后的密码字符,与用户当场输入的密码进行检验。如果用户名与密码正确无误,用户就可以进入系统了。

但我们应该注意用户发起的login进程会拥有该用户对系统文件的访问权限。而在访问/etc/shadow文件的时候,做为一个普通用户,对该文件是没有任何访问权限的,也就是说现在login读不到/etc/shadow的内容。这种情况下,我们就需要setuid权限来处理了。

login程序文件,它本身是一个setuid权限的文件,属主是root。根据setuid的规则,普通用户在运行login程序的时候,login进程会获得属主root对系统文件的访问权限,这样/etc/shadow文件就可以读取了。验证过程得以进行。login是个最基本的程序,如果本身不具备setuid权限,那么用户就无法登录了,可见这个权限的重要性。

与此类似,/bin/passwd程序也是setuid权限的文件。大家可以思考一下为什么它也需要这个权限。

18.7.2       setuid权限对安全的威胁

虽然setuid权限对Linux操作系统有着重大的意义,但有些文件是不能有setuid权限的,例如catmorevitail等可以起显示和编辑作用的命令。如果有的话会产生什么效果?就会让普通用户看到他本不应该看到的文件,如/etc/shadow,这里存放着所有用户加密后的口令。一旦骇客得到root的口令加密串,即使密码很复杂,强度很高,一台性能好的计算机也可能在几小时时间就把root口令算出来,从而非法提升权限。

如果/bin/ksh这样的外壳程序有setuid权限就更厉害了,普通用户执行后就马上成为超级用户。

18.7.3       查找setuid/setgid的文件

在骇客攻击了系统之后,往往会修改一些文件与目录的属性,来达到留后门和其他的目的,我们可以通过下列的手段来找出这些文件,消除隐患。

在当前目录及其子目录查找所有的SetUID文件:

# find  /  -perm  -4000  -print

在当前目录及其子目录查找setgid的文件:

# find  /  -perm  -2000  -print

 

在当前目录及其子目录查找所有用户都可写的文件:

# find  /  -perm  -o+w  –print

查找属于某个用户的文件,这在确定一个帐户被非法使用后是有用的:

# find  /  -user  xyd  -print

这可以列出系统中所有属主是用户xyd的文件

18.8  缓冲区溢出的安全保护

18.8.1 什么是缓冲区溢出

UNIX本身以及其上的许多应用程序都是用C语言编写的,C语言不检查缓冲区的边界。在某些情况下,如果用户输入的数据长度超过应用程序给定的缓冲区,就会覆盖其他数据区。这称作堆栈溢出或缓冲溢出

一般情况下,覆盖其他数据区的数据是没有意义的,最多造成应用程序错误。但是,如果输入的数据是经过黑客精心设计的,覆盖堆栈的数据恰恰是黑客的入侵程序代码,黑客就获取了程序的控制权。如果该程序恰好是以root运行的,黑客就获得了root权限,然后他就可以编译黑客程序、留下入侵后门等,实施进一步地攻击。按照这种原理进行的黑客入侵就叫做堆栈溢出攻击

缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权, 如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得rootshell,但不一直是这样的。为了达到这个目的,攻击者必须达到如下的两个目标:

1. 在程序的地址空间里安排适当的代码。

2. 通过适当地初始化寄存器和存储器,让程序跳转到我们安排的地址空间执行。

18.8.2      防御缓冲区溢出的方法

1、开放程序时仔细检查溢出情况,不允许数据溢出缓冲区。由于编程和编程语言的原因,这非常困难,而且不适合大量已经在使用的程序;

2、使用检查堆栈溢出的编译器或者在程序中加入某些记号,以便程序运行时确认禁止黑客有意造成的溢出。问题是无法针对已有程序,对新程序来讲,需要修改编译器;

3、经常检查你的操作系统和应用程序提供商的站点,只要发现他们提供补丁程序,就马上下载并且应用在系统上,这是最好的方法。但是系统管理员总要比攻击者慢一步,如果这个有问题的软件是可选的或者是临时的,把它从你的系统中删除。

18.9  网络安全设置

18.9.1      停止不必要的网络服务

每一个开放的网络服务就象一扇开着的门,为骇客提供了攻击的可能。在进行网络安全设置的时候,有一个原则就是禁用不需要的服务。在系统不需要telnet时(可以用ssh代替,来进行远程管理),禁止它,如果不需要其他rloingrsh等服务,也禁止它。

Linux中如果禁止某个服务,我们可以在/etc/init.d目录中寻找这个服务的启动脚本,将其移动到其他备份的目录,或者干脆删除,这样系统启动时该服务就不会被运行。还要kill掉系统中正在活动的相应进程。

另外还有的服务是从xinetd超级守护进程启动的,这时该服务的启动配置存放在/etc/xinetd.conf文件或者/etc/xinetd.d目录,以单独文件的形式出现。这时要停止这项服务,只要在相应项的上面将disable选项的值改为yes,如下:

service ftp

{

        disable = yes

        socket_type             = stream

        wait                    = no

        user                    = root

        server                  = /usr/sbin/vsftpd

        nice                    = 10

}

注意此时xinetd的配置文件虽然改变,但还没有生效。应用kill –HUP的方式让xinetd重新读入配置文件,该服务才会真正被停止。

18.9.2      TCP Wrappers

18.9.2.1  TCP Wrappers的运行原理

TCP Wrappers的主要功能是,对本地的Internet网络服务进行访问控制:控制哪个客户端可以访问本地系统的哪个服务,哪些客户端不可以。

TCP Wrappers提供了一个守护进程,“wrapper”是指对于很多程序来说,它象一个在外面的包装物一样,起到保护的做用。TCP Wrappers安装的时候并不需要对现有的软件进行很大的改动,运行之后,它会检查所请求的服务和相应的客户端进行安全验证,在这个过程中不会与客户端和服务器交换信息和建立连接,是一个轻量级的保护程序。

TCP Wrappers配置的时候需要首先理解系统inetd – 超级守护进程的作用原理和/etc/inetd.conf文件的配置方法。建议不清楚的朋友先去看一看相关文档。

18.9.2.2  修改/etc/inetd.conf

前面已经介绍过了,TCP Wrappers会在正常的服务程序之外加一个“壳”。这个壳会在系统真正应答请求、建立连接之前检查远程主机名称和用户等信息,查看是否符合预先的设定。在安装完TCP Wrappers并进行设定时,第一步要做的就是修改/etc/inetd.conf文件,规定哪些服务程序需要由TCP Wrappers来进行保护。以ssh服务为例,我们在/etc/inetd.conf文件中会有这么一行条目:

   ssh  stream  tcp     nowait  root    /usr/local/bin/sshd  sshd                                

它说明了如果请求ssh服务时,inetd进程会启动/usr/local/bin目录下的sshd程序。我们需要这样修改:

        ssh  stream  tcp     nowait  root    /usr/local/bin/tcpd    /usr/local/bin/sshd    

现在这个条目说明了inetd进程会在接到sshd服务请求时首先运行/usr/local/bin目录下的tcpd程序,即TCP Wrappers的主程序,进行检查。如果符合设定,则运行后面的/usr/local/bin/sshd程序,与客户端建立连接,进行通讯;如果不符合就不运行sshd程序,那些非法的连接就被拒绝了。

其他的in.ftpdin.telnetdfingerd等程序都可以以这种方式定义成需要TCP Wrappers来保护的。/etc/inetd.conf文件修改之后,配置工作就完成了第一步。注意这时配置还没有生效,必须重启inetd守护进程来读取修改过的inetd.conf文件,使其生效。

 # kill  –HUP  inetd PID                      

18.9.2.3  配置/etc/hosts.allow/etc/hosts.deny

下一步需要配置/etc/hosts.allow/etc/hosts.deny文件,TCP Wrappers检查哪些远程客户端可以访问本地的哪些服务,就是由这个两个文件所限定的。

文件语法

服务类型:本服务有效ip范围 :许可或拒绝                                                     

文件范例

 /etc/hosts.allow                                                                   

in.telnetd192.168.0.185ALLOW                                                                            

in.ftpd192.168.0. ALLOW                                                                                    

in.rshd all/usr/local/sbin/safe_finger -l  @%h | usr/ucb/mail admin@yoursite.com     

这个配置文件的含义是对telnet服务来讲,只允许来自secu.unix.org的连接;对ftp服务来讲,允许192.168.0.0/24这个c类地址的连接。in.rshd这一部分语法稍微复杂一些,它的意思是远程任何一个客户端每次试图使用rsh连接本系统的时候系统会finger发起连接请求的远程用户,并立即将结果发mail到一个管理员的信箱 admin@yoursite.com。这是由于试图进行rsh的连接都是有很大的潜在危险性的,这说明也许系统已经被人入侵,并安装了.rhosts文件。这是一个非常危险的信号,所以需要引起极大的注意。所用的safe_fingerTCP Wrappers自带的程序。                                                                                         

/etc/hosts.deny                                                                                                                  

ALLALLDENY

它的含义是拒绝所有的连接请求。

TCP Wrappers/etc/hosts.allowhosts.deny文件设定时,类似包过滤防火墙的规则定制。TCP Wrappers会按照由上至下的顺序逐一核对每一条规则(先hosts.allowhosts.deny文件),只要有一条规则符合当前连接的条件,此规则就会生效建立连接了。在hosts.deny中规定拒绝所有连接,会在hosts.allow文件中没有允许连接时生效,这样没有在hosts.allow文件中允许的连接都会由于这条规则而被拒绝掉。

18.9.3      Linux防火墙 - iptables

18.9.3.1  iptablesnetfilter

1.1内核开始,linux就已经具有包过虑功能了,在2.0的内核中我们采用ipfwadm来操作内核包过虑规则。之后在2.2内核中,采用了大家并不陌生的ipchains来控制内核包过虑规则。现在最新linux内核版本是2.4.1,在2.4内核中我们不再使用ipchains,而是采用一个全新的内核包过虑管理工具--iptables 这个全新的内核包过虑工具将使用户更易于理解其工作原理,更容易被使用,当然也将具有更为强大的功能。

iptables只是一个管理内核包过滤的工具,iptables 可以加入、插入或删除核心包过滤表格()中的规则。实际上真正来执行这些过虑规则的是netfilter(Linux 核心中一个通用架构)及其相关模块(iptables模块和nat模块),下面我们一起来看看netfilter的工作原理。

18.9.3.2  netfilter工作原理

netfilterLinux 核心中一个通用架构,它提供了一系列的""(tables),每个表由若干""(chains)组成,而每条链中可以有一条或数条规则(rule)组成。我们可以这样来理解,netfilter是表的容器,表是链的容器,而链又是规则的容器(如下图所示)

netfilter总体结构

系统缺省的表为"filter",该表中包含了INPUTFORWARDOUTPUT 3个链。每一条链中可以有一条或数条规则,每一条规则都是这样定义的如果数据包头符合这样的条件,就这样处理这个数据包。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件: 如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则。最后,如果该数据包不符合该链中任一条规则的话,系统就会根据该链预先定义的策略(policy)来处理该数据包。

数据包在filter表中的流程图

数据包在filter表中的流程如图二所示。有数据包进入系统时,系统首先根据路由表决定将数据包发给哪一条链,则可能有三种情况:

1.如果数据包的目的地址是本机,则系统将数据包送往INPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉;

2.如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往FORWARD链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉;

3.如果数据包是由本地系统进程产生的,则系统将其送往OUTPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉。

从以上我们可以看出,netfilter比起以前的ipfwadmipchains思路上清晰了好多,也好理解了好多,这对于原先对ipfwadmipchains总是感到一头雾水的用户来说无疑是一个福音。

18.9.3.3 载入iptables模块

要使用iptables,还必须载入相关模块。可以使用以下命令载入相关模块:

#modprobe iptable_tables

modprobe命令会自动载入指定模块及其相关模块。iptables_filter模块会在运行时自动载入。

对链的操作的语法

        建立一个新链 (-N)

        删除一个空链 (-X)

        改变一个内建链的原则 (-P)

        列出一个链中的规则 (-L)

        清除一个链中的所有规则 (-F)

        归零(zero) 一个链中所有规则的封包字节(byte) 记数器 (-Z)

对规则的操作的语法

        加入(append) 一个新规则到一个链 (-A)的最后

        在链内某个位置插入(insert) 一个新规则(-I),通常是插在最前面

        在链内某个位置替换(replace) 一条规则 (-R)

        在链内某个位置删除(delete) 一条规则 (-D)

        删除(delete) 链内第一条规则 (-D)

指定源地址和目的地址

  通过--source/--src/-s来指定源地址(这里的/表示或者的意思,下同),通过--destination/--dst/-s来指定目的地址。可以使用以下四中方法来指定ip地址:

使用完整的域名,如“www.kernel.org”

使用ip地址,如“192.168.1.1”

x.x.x.x/x.x.x.x指定一个网络地址,如“192.168.1.0/255.255.255.0”;

x.x.x.x/x指定一个网络地址,如“192.168.1.0/24”这里的24表明了子网掩码的有效位数,这是UNIX环境中通常使用的表示方法。缺省的子网掩码数是32,也就是说指定192.168.1.1等效于192.168.1.1/32

指定协议

可以通过--protocol/-p选项来指定协议,比如-p tcp

指定网络接口

可以使用--in-interface/-i--out-interface/-o来指定网络接口。需要注意的是,对于INPUT链来说,只可能有-i,也即只会有进入的包;通理,对于OUTPUT链来说,只可能有-o,也即只会有出去的包。只有FORWARD链既可以有-i的网络接口,也可以有-o的网络接口。我们也可以指定一个当前并不存在的网络接口,比如ppp0,这时只有拨号成功后该规则才有效。

LOG目标扩展

netfilter缺省的目标(也就是一旦满足规则所定义以后系统对数据包的处理方法)有:

ACEEPT:接收并转发数据包

DORP:丢掉数据包

目标扩展模块提供了扩展的目标。LOG目标提供了记录数据包的功能。该目标扩展有以下几个参数:

--log-level:指定记录信息的级别,级别有debuginfonoticewarningerrcritalertemerg分别对应70的数字。其含义请参看syslog.confman手册。

--log-prefix:后接一个最长为30个字符的字符串,该字符串将出现在每一条日志的前面。

4.12 REJECT目标扩展

该目标扩展完全和DORP标准目标一样,除了向发送方返回一个“port unreachable”icmp信息外。

还有其他一些扩展是常用的,如果你想了解可以参考Packet-Filtering - HOWTO。当然,最直接获得帮助的办法是查看iptables的在线帮助,比如想得到关于mac匹配扩展的帮助可以执行“iptables -m mac -help”命令,想得到LOG目标扩展的帮助可以执行“iptables -j LOG -help”命令。

18.9.4      网络防治病毒

Linux平台上目前只有几种病毒,而且并没有广泛传播,不必考虑防毒问题。不过当前Windows做为主要的桌面操作系统,深受病毒的困扰。系统管理员又不能不对其进行处理。为此我们在本章对网络中病毒的防治给出一些建议。

18.9.4.1  网关与邮件防毒

在目前的邮件服务器前段安装网关防毒产品,从网关过滤邮件病毒。虽然Linux服务器本身不会染毒,但如果做为网关使用,病毒会通过Linux服务器传播。如果借助适合的杀毒产品, 在Linux服务器进行病毒查杀,会有很好的效果;同样在目前邮件服务器上安装邮件防毒产品,需要进行合理配置,禁止危险附件邮件的接收和发送。现在已经有一些杀毒软件公司开发出支持Linux平台的网关和邮件服务器查毒软件。

18.9.4.2  日常防毒管理

  所有用户必须强制安装网络防毒客户端,不允许关闭、删除或者禁用,一旦发现将予以警告记录。 采用域策略禁止任何人使用弱口令,并发布口令策略说明,指导用户设置强度较高的口令。使用弱口令的扫描和审计工具定期检测网络中的弱口令和开放共享,对于存在弱口令用户的设备使用者进行通告,未能按期修补的,按照病毒防范策略进行断网或记入公司考评处理。使用漏洞扫描器定期检查网络中存在漏洞的主机,对于存在严重安全问题的设备使用者进行通告,未能按期修补的,按照防范策略进行断网或记入公司考评处理。

  网络防毒产品根据病毒防范策略定期定时进行扫描。每月进行汇总,对感染病毒次数最多的用户进行通报。移动用户在可能的情况下,需要首先进行查杀病毒后方可接入网络。

18.9.4.3  病毒事件的处理

对于存在问题的尚未感染或已经感染病毒的服务器,通知到人,并且必须在当天完成杀毒和修补工作,否则将进行断网设置和通报备案。 对于高层管理人员的设备,安全管理员将协同系统管理员一起,直接为此类用户进行杀毒和修补的工作。 根据安全服务商的其他建议,要求集成商或网络管理员进行临时性的访问控制、流量限制等工作。

总体策略上来看,对于普通用户,尤其是非技术员工,尽量以自动和强制性执行的策略进行管理;对于服务器管理员,应该通过自主修补,安全管理员监督的方式管理;对于高层管理用户,则建议由安全管理员直接支持的方式进行。

18.10     简单攻击检测

18.10.1    syslog日志

审计和日志功能对于系统来说是非常重要的,可以把我们感兴趣的操作都记录下来,供分析和检查。Linux采用了syslog工具来实现此功能,如果配置正确的话,所有在主机上发生的事情都会被记录下来,不管是好的还是坏的。

syslog已被许多日志系统采纳,它用在许多保护措施中--任何程序都可以通过syslog记录事件。syslog可以记录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能记录本地事件或通过网络纪录另一个主机上的事件。

syslog依据两个重要的文件:/sbin/syslogd(守护进程)和/etc/syslog.conf配置文件,习惯上,多数syslog信息被写到/var/adm/var/log目录下的信息文件中(messages.*)。一个典型的syslog纪录包括生成程序的名字和一个文本信息。它还包括一个设备和一个行为级别(但不在日志中出现)。

/etc/syslog.conf的一般格式如下:

设备.行为级别 [;设备.行为级别]    记录行为

  设备           描述

  auth         认证系统:loginsugetty等,即询问用户名和口令

  authpriv      同LOG_AUTH,但只登录到所选择的单个用户可读的文件中

  cron         cron守护进程

  daemon       其他系统守护进程,如routed

  kern        内核产生的消息

  lpr         打印机系统:lprlpd

  mail        电子邮件系统

  news        网络新闻系统

  syslog       由syslogd产生的内部消息

  user        随机用户进程产生的消息

  uucp        UUCP子系统

  local0~local7   为本地使用保留

  

  行为级别       描述

  debug        包含调试的信息,通常旨在调试一个程序时使用

  info        情报信息

  notice       不是错误情况,但是可能需要处理

  warn(warning)   警告信息

  err(error)     错误信息

  crit        重要情况,如硬盘错误

  alert        应该被立即改正的问题,如系统数据库破坏

  emerg(panic)    紧急情况

  

  记录行为(举例)    描述

  /dev/console     发送消息到控制台

  /var/adm/messages  把消息写到文件/var/adm/messages

  @loghost       把消息发到其它的日志记录服务器

  fred,user1      传送消息给用户

  *           传送消息给所有的在线用户

  

有个小命令loggersyslog系统日志文件提供一个shell命令接口,使用户能创建日志文件中的条目。用法:logger 例如:logger This is a test

它将产生一个如下的syslog纪录:Apr 26 11:22:34 xyd: This is a test!

18.10.2    logcheck

Logcheck是一个安全软件包,用来实现自动检查日志文件,以发现安全入侵和不正常的活动。Logchecklogtail程序来记录读到的日志文件的位置,下一次运行的时候从记录下的位置开始处理新的信息。所有的源代码都是公开的,实现方法也非常简单。

Logcheck SHELL脚本和logtail.c程序用关键字查找的方法进行日志检测。在这儿提到的关键字就是指在日志文件中出现的关键字,会触发向系统管理员发的报警信息。Logcheck的配置文件自带了缺省的关键字,适用于大多数的*inx系统。但是最好还是自己检查一下配置文件,看看自带的关键字是否符合自己的需要。

Logcheck脚本是简单的SHELL程序,logtail.c程序只调用了标准的ANSI C函数。Logcheck要在cron守护进程中配置,至少要每小时运行一次。脚本用简单的grep命令来从日志文件检查不正常的活动,如果发现了就发MAIL给管理员。如果没有发现异常活动,就不会收到MAIL

18.10.3    logcheck.sh

logcheck.sh 主脚本文件。控制所有的处理过程,用grep命令检查日志文件,发现问题报告系统管理员。由cron定时启动。

logtail 记录日志文件上次处理到的位置。被logcheck程序调用,避免重复处理已处理过的日志文件。所有的日志文件都由此程序处理,在同一目录下会产生文件######.offset,其中######是检查的日志文件名。文件中记录了logtail开始处理的偏移量,如果删除掉,则从文件开始处进行处理。Logcheck跟踪日志文件的inode号和文件大小,如果inode号发生变化,或者是文件大小比上次运行时的小, logtail会重置偏移量,处理整个文件。

Logcheck.hacking 文件中包含了系统受到攻击时的关键字。这个文件的关键字比较稀少,除非能知道某种特定的攻击方式的特征。缺省的关键字是ISS(Internet Security Scanner)攻击产生的,或者是sendmail中的地址栏里的非法语法。在日志文件中找到了关键字就会给管理员发信。

logcheck.violations 文件中包含了产生否定或拒绝信息的系统事件。如deniedrefused等。

logcheck.violations.ignore 文件中包含了要对logcheck.violations进行反向查找的关键字。

18.10.4    配置syslog.conf

为了使logcheck运行正常,先要对syslog.conf进行配置,你应该根据自己的需要进行配置,下面给出的只是一个例子。

把下面的内容加到/etc/syslog.conf

#记录mailnews以外的消息

  *.*;mail.none;news.none -/var/log/messages

#记录认证请求

auth.*;authpriv.* /var/log/authlog

 

#记录所有的内核消息

kern.* /var/log/kernlog

 

#记录警告和错误消息

  *.warn;*.err /var/log/syslog

这四个文件/var/log/messages/var/log/authlog/var/log/kernlog/var/log/syslog也就是logcheck要检查的日志文件。

重启syslog,[root@xyd#/etc/rc.d/init.d/syslog restart

用编辑器(vi等)打开文件/usr/local/etc/logcheck.sh,在其中会找到下面的内容

  # Linux Red Hat Version 3.x, 4.x

  $LOGTAIL /var/log/messages > $TMPDIR/check.$$

  $LOGTAIL /var/log/secure >> $TMPDIR/check.$$

  $LOGTAIL /var/log/maillog >> $TMPDIR/check.$$

 

这是logcheck自带的内容,也就是logcheck要检查的日志文件,把它该为下面的内容,使之于syslog.conf的内容相一致:(应该根据你配置的syslog.conf进行修改)

  $LOGTAIL /var/log/messages > $TMPDIR/check.$$

  $LOGTAIL /var/log/authlog >> $TMPDIR/check.$$

  $LOGTAIL /var/log/kernlog >> $TMPDIR/check.$$

  $LOGTAIL /var/log/syslog >> $TMPDIR/check.$$

 

还可以找到一行为 SYSADMIN=root,指的是发邮件时的收信人,缺省为root@localhost,本机的root用户,如果机器与Internet相连,也可以指定真实的账号,我就把它改为了xyd@redhat.com.cn,这样就可以随时收到邮件了,不须用root账号登录到linux机器上去。

/etc/crontab中增加一项,让cron定时启动logcheck。关于cron的用法请参考相应文档。

00,10,20,30,40,50 * * * * root /usr/local/etc/logcheck.sh

10分钟运行一次。

18.11     Linux安全工具

18.11.1    saint

SAINT全称安全管理员集成网络工具(Security Administrator's Integrated Network Tool)。它脱胎于著名的网络脆弱性检测工具SATAN(Security Administrator Tool for Analyzing Network,安全管理员网络分析工具),也就是通常说撒旦:)。但是,SATAN的两位作者Dan FarmerWietse Venema并没有参与SAINT的开发。特点SAINT是一个集成化的网络脆弱性评估环境。它可以帮助系统安全管理人员收集网络主机信息,发现存在或者潜在的系统缺陷;提供主机安全性评估报告;进行主机安全策略测试。SAINT还具有非常友好的界面,用户可以在本地或者远程通过NetscapeMozillalynx等浏览器对其进行管理,自然还包括Micro$oft Internet Explorer(远程管理模式下)。工作模式SAINT有两种工作模式:简单模式(simple mode)和探究模式(exploratory mode)。简单模式(simple mode)在这种模式下,SIANT通过测试各种网络服务,例如:fingerNFSNISftptftprexdstatd等,来尽可能地收集远程主机和网络的信息。除了系统提供的各种服务之外,这些信息还包括系统现有或潜在的安全缺陷,包括:网络服务的错误配置;系统或者网络工具的安全缺陷;脆弱的安全策略。然后,SAINT把这些信息以HTML格式输出到浏览器,用户可以通过浏览器对数据进行分析、查询收集的信息。探究模式SAINT真正强大之处还在于其探究模式。基于开始搜集的数据和用户配置的规则集,通过扫描次级主机来测试主机之间的信任通道、主机之间的依赖性,以及实现更深入的信息收集。这样用户不但可以使用分析主机和网络的,而且可以通过测试主机或者网络之间信任的继承关系,帮助用户对系统的安全级别作出合理的判断。工作机制在SAINT软件包中有一个目标捕捉程序,通常这个程序使用fping判断某台主机或者摸个子网中的主机是否正在运行。如果主机在防火墙之后,就通过tcp_scan进行端口扫描来判断目标主机是否正在运行。接着把目标主机列表传递给数据收集引擎进行信息收集。最后SAINT把收集的信息和安全分析/评估报告以HTML格式输出到用户界面(浏览器)

18.11.2    SSH

传统的网络服务程序,如:ftppoptelnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到"中间人"man-in-the-middle)这种方式的攻击。所谓"中间人"的攻击方式,就是"中间人"冒充真正的服务器接收你的传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被"中间人"一转手做了手脚之后,就会出现很严重的问题。

SSH的英文全称是Secure SHell。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNSIP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替telnet,又可以为ftppop、甚至ppp提供一个安全的"通道"

最初SSH是由芬兰的一家公司开发的。但是因为受版权和加密算法的限制,现在很多人都转而使用OpenSSHOpenSSHSSH的替代软件,而且是免费的,可以预计将来会有越来越多的人使用它而不是SSH

SSH是由客户端和服务端的软件组成的,有两个不兼容的版本分别是:1.x2.x。用SSH 2.x的客户程序是不能连接到SSH 1.x的服务程序上去的。OpenSSH 2.x同时支持SSH 1.x2.x

18.11.3    tcplogd

tcplogd可以记录TCP协议的连接情况,与操作系统本身的TCP连接记录不同的是,tcplogd能够记录半连接的状态,以此来判断是否发生了SYN DoS攻击。它还可以检测是否发生了FTP bounce 攻击,FIN packet 扫描和Null扫描等攻击。

18.11.4    swatch

swatch 是一个实时的日志监控工具。您可以设置您所感兴趣的事件,它可以在事件发生的时候告诉您。Swatch 有两种运行方式:一种可以在检查日志完毕退出,另一种可以连续监视日志中的新信息。

Swatch 提供了许多通知方式,例如:email,振铃,终端输出,多种颜色等等。

您可以从下面的站点下载:ftp://ftp.stanford.edu/general/security-tools/swatch/

swatch 的安装需要一些 perl 库的支持,安装前确信您的系统已经可以支持 perl

Swatch 可以在命令行中进行一些简单的设置,例如日志循环时告诉 swatch 在循环完毕后重新启动等等。

配置文件 swatchmessage swatch 软件的重点。这个文本文件告诉 swatch 需要监视什么日志,需要寻找什么触发器,和当触发时所要执行的动作。当 swatch 发现到与 swatchmessage 中定义的触发器正则表达式相符时,它将执行在 swatchrc 中定义的通知程序。Swatch 通过使用/usr/bin/tail -f 实时监视日志文件。

在这里我们不想过多的将如何配置,配置 swatch 非常简单,您可以参考 swatch 自带的配置文件。针对每个服务例如:ftp,sendmail 等等,你必须为每个您所关心的服务配置一个 swatchmessage 文件。

Swatch 启动时可以带很多参数,但使用通常如下格式启动它就可以了:

 /usr/local/bin/swatch -c /var/log/syslogmessage -t /var/log/syslog  -r 06:00&

-c 参数用于指定配置文件,-t 参数指定实时监视的日志文件,-r 指定重起的时间,"&" 使 swatch 在后台运行。启动后,swatch 产生子进程,因此 swatch 是以两个进程运行的,在停止 swatch 时必须杀掉两个进程。

也可以通过 logrotate 配置在日志循环后重启swatch,可以在 /etc/logrotate.d 建立一个您所要关心的日志的循环文件,其中最关键的是要加入下面这行:

/usr/local/bin/swatch -c /var/log/syslogmessage -t /var/log/syslog  -r 0

其他的地方可以仿造别的同目录下的文件。

18.11.5    tcpdump

Linux作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是必不可少的。我们会使用Sniffer,这种工具实际上就是一个网络上的抓包工具,同时还可以对抓到的包进行分析。

由于在共享式的网络中,信息包是会广播到网络中所有主机的网络接口,只不过在没有使用sniffer工具之前,主机的网络设备会判断该信息包是否应该接收,这样它就会抛弃不应该接收的信息包,sniffer工具却使主机的网络设备接收所有到达的信息包,这样就达到了网络监听的效果。其实,sniffer工具既可以适合于黑客的使用,也同样有利于网络管理员和网络程序员。对于网络管理人员来说,使用sniffer可以随时掌握网络的实际情况,在网络性能急剧下降的时候,可以通过sniffer工具来分析原因,找出造成网络阻塞的来源。对于网络程序员来说,通过sniffer工具来调试程序。

Linux系统中的网络数据采集分析工具tcpdump可以将网络中传送的数据包的完全截获下来提供分析。它功能强大,支持正则表达式,针对网络层、协议、主机、网络或端口的过滤,并提供andornot等逻辑语句来帮助你去掉无用的信息。

18.11.6          whois

whois的作用是从网上的Whois数据库中,查询曾在Who服务器上登记过的用户或站点的联络信息,比如查询对象的名称、Email地址和电话号码等等。如果觉得某个IP地址或者计算机比较可疑,可以用whois命令查看一下它的信息,辅助你进行攻击的判断。

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多