【目标】 系统管理员不能对安全毫无认识。随着网络技术的快速发展和应用的日渐普及,骇客工具不仅变得越来越先进,而且也越来越容易被一般人获取和滥用。骇客技术的提升和工具的泛滥,造成各行各业大量的企业、机构的电脑系统遭受程度不同的入侵和攻击,或面临随时被攻击的危险。本章介绍了Linux系统面临的各种安全问题及其解决方法,希望大家在学习Linux运行与管理的同时,扎实地掌握安全设置与管理。 【重点内容】
安全管理
补丁的重要作用
主机安全
PAM
用户设置
文件权限
setuid和setgid
缓冲区溢出
网络安全设置
简单攻击检测
使用安全工具 18.1 安全漏洞
|
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: uucp:x: 。 。 。 |
各个域依次为:用户名:原密码存放位置:用户ID:组ID:注释:主目录:外壳
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::: uucp:*:12328:0:99999:7::: 。 。 。 |
各个域依次为:用户名:加密口令:上次修改日期:最短改变口令时间:最长改变口令时间:口令失效警告时间:不使用时间:失效日期:保留
文件/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是“除了”的意思。例如:除了用户wheel、shutdown、sync禁止所有的控制台登录:
-: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远程登录。
做为系统管理员,可能会碰到过有这样的情况不好处理:有的时候不得不把服务器的root权限交给一个普通的工作人员,比如服务器正在安装补丁,然后重启一下机器,你因事要突然离开,只能委托给别人重启一下;而做这项工作(使用reboot命令)是需要root权限的,你必须先把口令告诉受托人,今后回来了再改成新的。但即使这样也会在前后的时间差里产生不安全的因素:受托人可以利用root权限去做一些其他的事情,象查看秘密的文件,系统情况甚至非法安装软件等等。
这时你也许会想,我只让这个用户以root身份执行reboot命令就行了。完全没错,可惜在早期Linux通常的系统安装下这个要求无法达到。不过令人高兴的是已经有了软件可以实现这样的功能,它就是sudo。
Sudo是安装在Linux系统平台上,许可其他用户以root身份去执行特定指令的软件。有了sudo,上面的问题就解决了,管理员可以进行配置,允许那个普通用户使用reboot命令,但不可以用root身份执行其他命令。而且也不必把root的口令告诉普通用户。
/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”,后面跟所要执行的命令。
在visudo时,还可以利用别名来简化配置文件。别名类似组的概念,有用户别名、主机别名和命令别名。多个用户可以首先用一个别名来定义,然后在规定他们可以执行什么命令的时候使用别名就可以了,这个配置对所有用户都生效。主机别名和命令别名也是如此。注意使用前先要visudo中定义:
Host_Alias:用来创建主机别名[可选],列表中的主机必须用逗号隔开,如果要设置多个别名,可以用冒号隔开,保留关键字ALL代表所有主机。例如:
Host_Alias bluesun=grind,glass |
这里用别名bluesun来统称grind和glass两台机器,grind和glass分别是这两台机器的机器名。
User_Alias:用来创建用户别名[可选],列表中的用户名必须以逗号隔开。其格式同主机别名,保留关键字ALL代表所有命令。
Cmnd_alias:用来创建命令别名[可选],列表中的命令必须用逗号隔开,如果要定义一个命令无效,可以在该命令前加!号。
后面加入相应的名称就可以了,也以逗号分隔开。
在运行sudo时,使用sudo直接跟上命令就可以了。sudo这个命令还可以加上一些参数执行,完成一些辅助的功能。如
$ sudo –l:会显示出类似这样的信息:
User xyd may run the following commands on this host: (root) /usr/sbin/reboot
说明用户xyd被root允许执行/usr/sbin/reboot命令。这个参数可以使用户查看自己目前可以在sudo中执行哪些命令,方便使用。
其他一些参数还有:
-V 显示版本编号
-h 会显示版本编号及指令的使用方式说明
-l 显示出自己(执行 sudo 的使用者)的权限
-v 因为 sudo 在第一次执行时或是在 N 分钟内没有执行(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 )
当创建一个新用户时,如果没有指定用户目录,系统就为其创建一个登录目录,这个登录目录就是用/etc/skel为模板,所有的文件都和/etc/skel中的文件相同。系统管理员能够在/etc/skel中建立文件,这些文件可以为用户提供一个很好的缺省环境。
例如,用户可以建立一个/etc/skel/.profile文件,定义用户登录后的一些属性的设置。但是如果对/etc/skel这个文件夹进行改动后,肯定会导致改动前创建的用户和改动后创建的用户的一些文件不一样,所以只要可能,尽量将全局配置放入全局文件中,例如如/etc/profile,以实现系统用户一些设置的统一。
/etc/skel的存在的意义很多,比如一台专门开虚拟主机的服务器上面就可以只在/etc/skel中放一个index.html,让每个新加的用户不会有系统安装时缺省的那些.bashrc等文件,又可以确保未放置主页的用户的页面的统一。
密码设置应按照一定的规则。在Linux系统中,为了强制用户使用合格的口令,用户修改口令时推荐必须最少有6个字符,而且至少包括2个数字或者特殊字符。不过要注意在以root的身份进行密码修改时是不受这个限制的。下面是在进行密码设置的时候推荐的一些方式:
密码至少应有6个字符
密码至少应该包含2个英文字母及一个数字或特殊符号。
密码应与用户名完全不同,且不能使用原有名称的变化(如反序、位移等)
新旧密码至少有3个字符不相同
用户应该定期改变自己的口令,例如一个月换一次。如果口令被偷去就会引起安全问题,经常更换口令可以帮助减少损失。假设一个骇客偷了用户的密码,但并没有被发觉,这样给用户造成的损失是不可估计的。陨一段时间换一次口令总比一直保留原有口令损失要小。我们可以为口令设定有效时间,这样当有效时间结束后,系统就会强制用户更改系统密码。另外,有些系统会将用户以前的口令记录下来,不允许用户使用以前的口令,而要求用户输入一个新的口令。这样就增强了系统的安全性。
如果需要暂时让某个帐户停用,而不是删除时,最简单的方法就是确保用户口令终止。我们可以手工更改/etc/shadow文件中的帐户终止时间字段区域。就像前面介绍的一样,利用用/etc/shadow文件字段中的日期是自1970年1月1日以后的帐户将被终止的天数,而shadow文件中第三个子段区域表示表示自1970年1月1日以来至最后一次更改口令的天数。我们可以首先变更用户的口令,然后第三字段将显示出新的日期数字。将该数字减1,并在帐户终止时间字段区域(第八区域)插入运算的结果,然后保存文件即可。
在帐户重新重用的时候,将日期重新设置就可以继续使用了。
Linux系统中的文件权限,是指对文件的访问权限,包括对文件的读、写、删除、执行。Linux 是一个多用户操作系统,它允许多个用户同时登录和工作。因此 Linux 将一个文件或目录与一个用户和组联系起来。请看下面的例子:
drwxr-xr-x
5 root root 1024 Sep 13
与文件权限相关联的是第一、第三、第四个域。第三个域是文件的所有者,第四个域是文件的所属组,而第一个域则限制了文件的访问权限。在这个例子中,文件的所有者是 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 个,分别用 r、w、x 来表示,分别对应 owner、group、world。
权限位对于文件和目录的含义有些许不同。每组 3 个字符对应的含义从左至右的顺序,对于文件来说是:读文件的内容(r)、写数据到文件(w)、做为命令执行该文件(x)。对于目录来说是:读包含在目录中的文件名称(r)、写信息到目录中去(增加和删除索引点的连接)、搜索目录(能用该目录名称作为路径名去访问它所包含的文件或子目录)。具体来说就是:
有只读权限的用户不能用 cd 进入该目录;还必须有执行权限才能进入
有执行权限的用户只有在知道文件名并拥有该文件的读权限的情况下才可以访问目录下的文件。
必须有读和执行权限才可以使用 ls 列出目录清单,或使用 cd 进入目录。
如用户有目录的写权限,则可以创建、删除或修改目录下的任何文件或子目录,既是该文件或子目录属于其他用户。
改变文件的属主,即所有者。
例:# chown xyd scan.sh
上面的命令把scan.sh文件的所有者改为了用户xyd。这个命令还有以下选项:
-c, 详尽地描述每个 file 实际改变了哪些所有权。
-f, 不打印文件所有权不能修改的报错信息。
-h, 只作用于其本身的符号链接,而不修改它们所指向的文件。 这只在提供了 lchown 系统调用的情况下才可用。
-v, 详尽地描述对每个 file 所执行的操作(或者无操作)。
-R, 递归地修改目录及其下面内容的所有权。
改变文件的属组。
例:# chgrp admin scan.sh
就是把scan.sh文件的属组更改为admin组。它还有下列选项:
-H ,(当和 -R 一起给出) 给出的文件操作数书指向目录的符号链接时,改变这个目录和目录中文件的组所有权。
-L,(当和 -R 一起给出) 给出的文件,不论是命令行操作数还是遍历整个树,操作数书指向目录的符号链接时, 改变这个目录和目录中文件的组所有权。
-P ,(当和 -R 一起给出) 对于一个文件,不论是命令行操作数还是遍历整个树, 是符号链接的,只改变它本身, 优于(改变)指向的对象如果系统不支持符号链接的组所有权,那就对它不起作用。这是默认值。
-R ,递归的改变目录和它的内容的组所有权
改变文件的访问权限。这是非常重要的一个命令,要熟练地使用它。
使用chmod命令改变指定文件访问权限有两种方式:一种是用符号标记所进行更改,另一种方式是采用8进制数指定新的访问权限。使用下面的语法格式来使用符号改变方式 `[ugoa。。。][[+-=][rwxXstugo。。。]。。。][,。。。]'。
在这种格式下,所带参数是一个用逗号分隔的字符列表。每个符号方式的改变命令以零或者字'ugoa'开始;'ugoa'控制哪些用户对该文件访问权限将被改变:文件的所有者(u),与文件所有者同组的用户(g),其他组的用户(o),所有用户(a)。因此,a在这里等同于ugo。如果没有带参数,则缺省设置为a,运行效果相同,但是在umask中设置的位将不会受影响。
操作符'+'使得用户选择的权限被追加到每个指定文件,(操作给指定文件添加所选权限);操作符'-'使得这些权限被撤消;'='使得指定文件只具有这些权限。
字符串'rwxXstugo' 给用户选择新的属性:(r)读权限、(w)写权限、 (x)执行权(或对目录的访问权),(X)只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x属性,(s)setuID或setgID,(t)粘滞位(保存程序的文本到交换设备上),(u)目标文件属主,(g)目标文件属主所在的组,(o)其他用户。(因此,'chmod g-s file' 撤消sgid位,'chmod ug+s file'同时设置了suid和sgid位,'chmod o+s file' 则没有进行任何设置)
数字模式是一到4个八进制数,每个数由位权为4,2,1的3位叠加而得。 被省略掉的数字缺省设置为零。 第一位为4时为suid,2时为sgid,1时为粘滞位,。第二位设置文件所有者的权限:可读(4),可写(2),可执行(1); 第三位设置了文件所在组其他用户的权限,值如上;第四位设置了其他组的用户的权限,值同上。
由于chmod的系统调用不支持,chomd命令不能改变符号链接的权限。 由于符号链接的权限从不使用,所以这也不成问题。无论如何,由于每个符号连接都可在命令行中列出,chmod改变了所指文件的属性。 相反,chmod在递归目录遍历时忽略所碰到的符号连接。
对于root用户新创建的文件与目录,注意在没有必要的情况下,一定要使任何一个用户没有访问的权限。超级用户的权限最好设置为077。如果某些文件或者目录需要被别人访问,生成后再修改权限就行了。麻烦一点总比被攻击好。
我们在前面章节已经介绍了umask的概念,它是Linux系统中的一个值,决定了在创建新文件和目录的时候为它赋予的默认权限。每个用户可以改变自己的umask值。在创建文件或者目录的时候,它以数值形式决定了默认情况下将不会赋予这个文件或者目录哪些权限,例如,有个用户的umask设置为027,这个数值可以分解为0、2、7。0表示用户将获得所有权限;2表示用户所在的组将不会被赋予2-写权限;7表示其他用户将不会赋予任何权限。
在Linux中,文件除了读、写、执行权限外,还有一些特殊权限。setuid和setgid是其中的一类。它与Linux系统的安全关系紧密。 Setuid是指设置程序的有效的执行用户身份(uid)为该文件的主人,而不是调用该程序的进程的uid。Setgid与之类似。Setuid和setgid存在于主人和属组的执行权限的位置上。
这种权限怎么用 举个例子来说,假如某一命令(程序)的主人是root用户,并且该文件有setuid属性,但是该文件的读、写、执行权限的属性表明普通用户user1可以执行该命令,那么就表示:当user1执行该命令时,他具有root的执行身份,并获得相应的权限。一旦该命令执行完成,root身份也随之消失。
在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权限的文件。大家可以思考一下为什么它也需要这个权限。
虽然setuid权限对Linux操作系统有着重大的意义,但有些文件是不能有setuid权限的,例如cat、more、vi、tail等可以起显示和编辑作用的命令。如果有的话会产生什么效果?就会让普通用户看到他本不应该看到的文件,如/etc/shadow,这里存放着所有用户加密后的口令。一旦骇客得到root的口令加密串,即使密码很复杂,强度很高,一台性能好的计算机也可能在几小时时间就把root口令算出来,从而非法提升权限。
如果/bin/ksh这样的外壳程序有setuid权限就更厉害了,普通用户执行后就马上成为超级用户。
在骇客攻击了系统之后,往往会修改一些文件与目录的属性,来达到留后门和其他的目的,我们可以通过下列的手段来找出这些文件,消除隐患。
在当前目录及其子目录查找所有的SetUID文件:
# find / -perm -4000 -print
在当前目录及其子目录查找setgid的文件:
# find / -perm -2000 -print
在当前目录及其子目录查找所有用户都可写的文件:
# find / -perm -o+w –print
查找属于某个用户的文件,这在确定一个帐户被非法使用后是有用的:
# find / -user xyd -print
这可以列出系统中所有属主是用户xyd的文件
UNIX本身以及其上的许多应用程序都是用C语言编写的,C语言不检查缓冲区的边界。在某些情况下,如果用户输入的数据长度超过应用程序给定的缓冲区,就会覆盖其他数据区。这称作“堆栈溢出或缓冲溢出”。
一般情况下,覆盖其他数据区的数据是没有意义的,最多造成应用程序错误。但是,如果输入的数据是经过“黑客”精心设计的,覆盖堆栈的数据恰恰是黑客的入侵程序代码,黑客就获取了程序的控制权。如果该程序恰好是以root运行的,黑客就获得了root权限,然后他就可以编译黑客程序、留下入侵后门等,实施进一步地攻击。按照这种原理进行的黑客入侵就叫做“堆栈溢出攻击”。
缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权, 如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root的shell,但不一直是这样的。为了达到这个目的,攻击者必须达到如下的两个目标:
1. 在程序的地址空间里安排适当的代码。
2. 通过适当地初始化寄存器和存储器,让程序跳转到我们安排的地址空间执行。
1、开放程序时仔细检查溢出情况,不允许数据溢出缓冲区。由于编程和编程语言的原因,这非常困难,而且不适合大量已经在使用的程序;
2、使用检查堆栈溢出的编译器或者在程序中加入某些记号,以便程序运行时确认禁止黑客有意造成的溢出。问题是无法针对已有程序,对新程序来讲,需要修改编译器;
3、经常检查你的操作系统和应用程序提供商的站点,只要发现他们提供补丁程序,就马上下载并且应用在系统上,这是最好的方法。但是系统管理员总要比攻击者慢一步,如果这个有问题的软件是可选的或者是临时的,把它从你的系统中删除。
每一个开放的网络服务就象一扇开着的门,为骇客提供了攻击的可能。在进行网络安全设置的时候,有一个原则就是禁用不需要的服务。在系统不需要telnet时(可以用ssh代替,来进行远程管理),禁止它,如果不需要其他rloing、rsh等服务,也禁止它。
在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重新读入配置文件,该服务才会真正被停止。
TCP Wrappers的主要功能是,对本地的Internet网络服务进行访问控制:控制哪个客户端可以访问本地系统的哪个服务,哪些客户端不可以。
TCP Wrappers提供了一个守护进程,“wrapper”是指对于很多程序来说,它象一个在外面的包装物一样,起到保护的做用。TCP Wrappers安装的时候并不需要对现有的软件进行很大的改动,运行之后,它会检查所请求的服务和相应的客户端进行安全验证,在这个过程中不会与客户端和服务器交换信息和建立连接,是一个轻量级的保护程序。
TCP Wrappers配置的时候需要首先理解系统inetd – 超级守护进程的作用原理和/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.ftpd、in.telnetd、fingerd等程序都可以以这种方式定义成需要TCP Wrappers来保护的。/etc/inetd.conf文件修改之后,配置工作就完成了第一步。注意这时配置还没有生效,必须重启inetd守护进程来读取修改过的inetd.conf文件,使其生效。
# kill –HUP inetd PID |
下一步需要配置/etc/hosts.allow和/etc/hosts.deny文件,TCP Wrappers检查哪些远程客户端可以访问本地的哪些服务,就是由这个两个文件所限定的。
文件语法
服务类型:本服务有效ip范围 :许可或拒绝
文件范例
/etc/hosts.allow in.telnetd:192.168.0.185:ALLOW in.ftpd:192.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_finger是TCP Wrappers自带的程序。
/etc/hosts.deny ALL:ALL:DENY |
它的含义是拒绝所有的连接请求。
TCP Wrappers的/etc/hosts.allow与hosts.deny文件设定时,类似包过滤防火墙的规则定制。TCP Wrappers会按照由上至下的顺序逐一核对每一条规则(先hosts.allow后hosts.deny文件),只要有一条规则符合当前连接的条件,此规则就会生效建立连接了。在hosts.deny中规定拒绝所有连接,会在hosts.allow文件中没有允许连接时生效,这样没有在hosts.allow文件中允许的连接都会由于这条规则而被拒绝掉。
从1.1内核开始,linux就已经具有包过虑功能了,在2.0的内核中我们采用ipfwadm来操作内核包过虑规则。之后在2.2内核中,采用了大家并不陌生的ipchains来控制内核包过虑规则。现在最新linux内核版本是
iptables只是一个管理内核包过滤的工具,iptables 可以加入、插入或删除核心包过滤表格(链)中的规则。实际上真正来执行这些过虑规则的是netfilter(Linux 核心中一个通用架构)及其相关模块(如iptables模块和nat模块),下面我们一起来看看netfilter的工作原理。
netfilter是Linux 核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组成。我们可以这样来理解,netfilter是表的容器,表是链的容器,而链又是规则的容器(如下图所示)。
系统缺省的表为"filter",该表中包含了INPUT、FORWARD和OUTPUT 3个链。每一条链中可以有一条或数条规则,每一条规则都是这样定义的“如果数据包头符合这样的条件,就这样处理这个数据包”。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件: 如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则。最后,如果该数据包不符合该链中任一条规则的话,系统就会根据该链预先定义的策略(policy)来处理该数据包。
数据包在filter表中的流程如图二所示。有数据包进入系统时,系统首先根据路由表决定将数据包发给哪一条链,则可能有三种情况:
1.如果数据包的目的地址是本机,则系统将数据包送往INPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉;
2.如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往FORWARD链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉;
3.如果数据包是由本地系统进程产生的,则系统将其送往OUTPUT链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉。
从以上我们可以看出,netfilter比起以前的ipfwadm和ipchains思路上清晰了好多,也好理解了好多,这对于原先对ipfwadm和ipchains总是感到一头雾水的用户来说无疑是一个福音。
要使用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:指定记录信息的级别,级别有debug、info、notice、warning、err、crit、alert、emerg分别对应7到0的数字。其含义请参看syslog.conf的man手册。
--log-prefix:后接一个最长为30个字符的字符串,该字符串将出现在每一条日志的前面。
4.12 REJECT目标扩展
该目标扩展完全和DORP标准目标一样,除了向发送方返回一个“port unreachable”的icmp信息外。
还有其他一些扩展是常用的,如果你想了解可以参考Packet-Filtering - HOWTO。当然,最直接获得帮助的办法是查看iptables的在线帮助,比如想得到关于mac匹配扩展的帮助可以执行“iptables -m mac -help”命令,想得到LOG目标扩展的帮助可以执行“iptables -j LOG -help”命令。
在Linux平台上目前只有几种病毒,而且并没有广泛传播,不必考虑防毒问题。不过当前Windows做为主要的桌面操作系统,深受病毒的困扰。系统管理员又不能不对其进行处理。为此我们在本章对网络中病毒的防治给出一些建议。
在目前的邮件服务器前段安装网关防毒产品,从网关过滤邮件病毒。虽然Linux服务器本身不会染毒,但如果做为网关使用,病毒会通过Linux服务器传播。如果借助适合的杀毒产品, 在Linux服务器进行病毒查杀,会有很好的效果;同样在目前邮件服务器上安装邮件防毒产品,需要进行合理配置,禁止危险附件邮件的接收和发送。现在已经有一些杀毒软件公司开发出支持Linux平台的网关和邮件服务器查毒软件。
所有用户必须强制安装网络防毒客户端,不允许关闭、删除或者禁用,一旦发现将予以警告记录。
采用域策略禁止任何人使用弱口令,并发布口令策略说明,指导用户设置强度较高的口令。使用弱口令的扫描和审计工具定期检测网络中的弱口令和开放共享,对于存在弱口令用户的设备使用者进行通告,未能按期修补的,按照病毒防范策略进行断网或记入公司考评处理。使用漏洞扫描器定期检查网络中存在漏洞的主机,对于存在严重安全问题的设备使用者进行通告,未能按期修补的,按照防范策略进行断网或记入公司考评处理。
网络防毒产品根据病毒防范策略定期定时进行扫描。每月进行汇总,对感染病毒次数最多的用户进行通报。移动用户在可能的情况下,需要首先进行查杀病毒后方可接入网络。
对于存在问题的尚未感染或已经感染病毒的服务器,通知到人,并且必须在当天完成杀毒和修补工作,否则将进行断网设置和通报备案。 对于高层管理人员的设备,安全管理员将协同系统管理员一起,直接为此类用户进行杀毒和修补的工作。
根据安全服务商的其他建议,要求集成商或网络管理员进行临时性的访问控制、流量限制等工作。
总体策略上来看,对于普通用户,尤其是非技术员工,尽量以自动和强制性执行的策略进行管理;对于服务器管理员,应该通过自主修补,安全管理员监督的方式管理;对于高层管理用户,则建议由安全管理员直接支持的方式进行。
审计和日志功能对于系统来说是非常重要的,可以把我们感兴趣的操作都记录下来,供分析和检查。Linux采用了syslog工具来实现此功能,如果配置正确的话,所有在主机上发生的事情都会被记录下来,不管是好的还是坏的。
syslog已被许多日志系统采纳,它用在许多保护措施中--任何程序都可以通过syslog记录事件。syslog可以记录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能记录本地事件或通过网络纪录另一个主机上的事件。
syslog依据两个重要的文件:/sbin/syslogd(守护进程)和/etc/syslog.conf配置文件,习惯上,多数syslog信息被写到/var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog纪录包括生成程序的名字和一个文本信息。它还包括一个设备和一个行为级别(但不在日志中出现)。
/etc/syslog.conf的一般格式如下:
设备.行为级别 [;设备.行为级别] 记录行为
设备 描述 auth
认证系统:login、su、getty等,即询问用户名和口令 authpriv 同LOG_AUTH,但只登录到所选择的单个用户可读的文件中 cron cron守护进程 daemon 其他系统守护进程,如routed kern 内核产生的消息 lpr
打印机系统:lpr、lpd 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 传送消息给用户 * 传送消息给所有的在线用户 |
有个小命令logger为syslog系统日志文件提供一个shell命令接口,使用户能创建日志文件中的条目。用法:logger 例如:logger This is a test!
它将产生一个如下的syslog纪录:Apr 26
Logcheck是一个安全软件包,用来实现自动检查日志文件,以发现安全入侵和不正常的活动。Logcheck用logtail程序来记录读到的日志文件的位置,下一次运行的时候从记录下的位置开始处理新的信息。所有的源代码都是公开的,实现方法也非常简单。
Logcheck SHELL脚本和logtail.c程序用关键字查找的方法进行日志检测。在这儿提到的关键字就是指在日志文件中出现的关键字,会触发向系统管理员发的报警信息。Logcheck的配置文件自带了缺省的关键字,适用于大多数的*inx系统。但是最好还是自己检查一下配置文件,看看自带的关键字是否符合自己的需要。
Logcheck脚本是简单的SHELL程序,logtail.c程序只调用了标准的ANSI C函数。Logcheck要在cron守护进程中配置,至少要每小时运行一次。脚本用简单的grep命令来从日志文件检查不正常的活动,如果发现了就发MAIL给管理员。如果没有发现异常活动,就不会收到MAIL。
logcheck.sh 主脚本文件。控制所有的处理过程,用grep命令检查日志文件,发现问题报告系统管理员。由cron定时启动。
logtail 记录日志文件上次处理到的位置。被logcheck程序调用,避免重复处理已处理过的日志文件。所有的日志文件都由此程序处理,在同一目录下会产生文件######.offset,其中######是检查的日志文件名。文件中记录了logtail开始处理的偏移量,如果删除掉,则从文件开始处进行处理。Logcheck跟踪日志文件的inode号和文件大小,如果inode号发生变化,或者是文件大小比上次运行时的小, logtail会重置偏移量,处理整个文件。
Logcheck.hacking 文件中包含了系统受到攻击时的关键字。这个文件的关键字比较稀少,除非能知道某种特定的攻击方式的特征。缺省的关键字是ISS(Internet Security Scanner)攻击产生的,或者是sendmail中的地址栏里的非法语法。在日志文件中找到了关键字就会给管理员发信。
logcheck.violations 文件中包含了产生否定或拒绝信息的系统事件。如denied,refused等。
logcheck.violations.ignore 文件中包含了要对logcheck.violations进行反向查找的关键字。
为了使logcheck运行正常,先要对syslog.conf进行配置,你应该根据自己的需要进行配置,下面给出的只是一个例子。
把下面的内容加到/etc/syslog.conf中
#记录mail,news以外的消息
*.*;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分钟运行一次。
SAINT全称安全管理员集成网络工具(Security Administrator's Integrated Network Tool)。它脱胎于著名的网络脆弱性检测工具SATAN(Security Administrator Tool for Analyzing Network,安全管理员网络分析工具),也就是通常说撒旦:)。但是,SATAN的两位作者Dan Farmer和Wietse Venema并没有参与SAINT的开发。特点SAINT是一个集成化的网络脆弱性评估环境。它可以帮助系统安全管理人员收集网络主机信息,发现存在或者潜在的系统缺陷;提供主机安全性评估报告;进行主机安全策略测试。SAINT还具有非常友好的界面,用户可以在本地或者远程通过Netscape、Mozilla、lynx等浏览器对其进行管理,自然还包括Micro$oft Internet Explorer(远程管理模式下)。工作模式SAINT有两种工作模式:简单模式(simple mode)和探究模式(exploratory mode)。简单模式(simple mode)在这种模式下,SIANT通过测试各种网络服务,例如:finger、NFS、NIS、ftp、tftp、rexd、statd等,来尽可能地收集远程主机和网络的信息。除了系统提供的各种服务之外,这些信息还包括系统现有或潜在的安全缺陷,包括:网络服务的错误配置;系统或者网络工具的安全缺陷;脆弱的安全策略。然后,SAINT把这些信息以HTML格式输出到浏览器,用户可以通过浏览器对数据进行分析、查询收集的信息。探究模式SAINT真正强大之处还在于其探究模式。基于开始搜集的数据和用户配置的规则集,通过扫描次级主机来测试主机之间的信任通道、主机之间的依赖性,以及实现更深入的信息收集。这样用户不但可以使用分析主机和网络的,而且可以通过测试主机或者网络之间信任的继承关系,帮助用户对系统的安全级别作出合理的判断。工作机制在SAINT软件包中有一个目标捕捉程序,通常这个程序使用fping判断某台主机或者摸个子网中的主机是否正在运行。如果主机在防火墙之后,就通过tcp_scan进行端口扫描来判断目标主机是否正在运行。接着把目标主机列表传递给数据收集引擎进行信息收集。最后SAINT把收集的信息和安全分析/评估报告以HTML格式输出到用户界面(浏览器)。
传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到"中间人"(man-in-the-middle)这种方式的攻击。所谓"中间人"的攻击方式,就是"中间人"冒充真正的服务器接收你的传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被"中间人"一转手做了手脚之后,就会出现很严重的问题。
SSH的英文全称是Secure SHell。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替telnet,又可以为ftp、pop、甚至ppp提供一个安全的"通道"。
最初SSH是由芬兰的一家公司开发的。但是因为受版权和加密算法的限制,现在很多人都转而使用OpenSSH。OpenSSH是SSH的替代软件,而且是免费的,可以预计将来会有越来越多的人使用它而不是SSH。
SSH是由客户端和服务端的软件组成的,有两个不兼容的版本分别是:1.x和2.x。用SSH 2.x的客户程序是不能连接到SSH 1.x的服务程序上去的。OpenSSH 2.x同时支持SSH 1.x和2.x。
tcplogd可以记录TCP协议的连接情况,与操作系统本身的TCP连接记录不同的是,tcplogd能够记录半连接的状态,以此来判断是否发生了SYN DoS攻击。它还可以检测是否发生了FTP bounce 攻击,FIN packet 扫描和Null扫描等攻击。
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
-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
其他的地方可以仿造别的同目录下的文件。
Linux作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是必不可少的。我们会使用Sniffer,这种工具实际上就是一个网络上的抓包工具,同时还可以对抓到的包进行分析。
由于在共享式的网络中,信息包是会广播到网络中所有主机的网络接口,只不过在没有使用sniffer工具之前,主机的网络设备会判断该信息包是否应该接收,这样它就会抛弃不应该接收的信息包,sniffer工具却使主机的网络设备接收所有到达的信息包,这样就达到了网络监听的效果。其实,sniffer工具既可以适合于黑客的使用,也同样有利于网络管理员和网络程序员。对于网络管理人员来说,使用sniffer可以随时掌握网络的实际情况,在网络性能急剧下降的时候,可以通过sniffer工具来分析原因,找出造成网络阻塞的来源。对于网络程序员来说,通过sniffer工具来调试程序。
Linux系统中的网络数据采集分析工具tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它功能强大,支持正则表达式,针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
whois的作用是从网上的Whois数据库中,查询曾在Who服务器上登记过的用户或站点的联络信息,比如查询对象的名称、Email地址和电话号码等等。如果觉得某个IP地址或者计算机比较可疑,可以用whois命令查看一下它的信息,辅助你进行攻击的判断。
|