免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4249 | 回复: 6

Unix高级安全设置 [复制链接]

论坛徽章:
0
发表于 2003-09-13 00:17 |显示全部楼层
第一部分 Unix历史与发展

1.1 UNIX简介
UNIX 已有数十年的历史,在这期间,它的改变即使没有上亿次,也有数百万次了,有成千上
万的个人和公司实现了上千种不同的版本,有上百万系统管理员在从微型嵌入式系统到超级
计算机上都安装过它。无可争论,没有两个实际的UNIX操作系统是完全相同的。
  UNIX”一词是属于Open Group的一个商标,该组织是一个要求符号得到正确归属的国际
协会。在这数十年当中,该标识已经被冲淡到没有具体含义。虽然如此,Open Group仍发布
了“The Single UNIX Specification”,这可以在http://www.UNIX-systems.org/online.
html上看到。
  “Unix”是双关语,表示名字Multics,它最初被写作“Unics”,表示UNiplexed Info
rmation and Computing System。“Unix”和“UNIX”在如今都被广泛使用。曾经有一段时
间,Dennis Ritchie试图宣布用小写版本,因为“UNIX”不是开头字母组成。
  许多运行Linux等类似UNIX系统的人认为他们运行的是UNIX。正式UNIX系统和非正式UNI
X系统通常被认为属于一类----不论是书中、媒介、网上还是社会公认。
  按照UNIX FAQ的定义,UNIX是“一个用C语言编写的操作系统,它有层次文件系统并集成
了文件和设备I/O,其系统调用接口包括fork ( )和pipe ( )等服务,用户界面包括cc、tro
ff、grep、awk等工具和一个被选择的shell”。可以再加一些,UNIX为多任务提供一致的方
式,并内置有创建、同步和终止进程的操作,它可在不同种类计算机间进行移植。

1.2 UNIX发展与历史
1969年,Ken Thompson、Dennis Ritchie和其他一些人在AT&T贝尔实验室开始进行一个“li
ttle-used PDP-7 in a corner”的工作,它后来成为UNIX。10年里,UNIX在AT&T的发展经历
了数个版本。V4(1974)用C语言重写,这成为系统间操作系统可移植性的一个里程碑。V6(
1975)第一次在贝尔实验室以外使用,成为加州大学伯克利分校开发的第一个UNIX版本的基
础。
贝尔实验室继续在UNIX上工作到80年代,有1983年的System V(“五”,不是字母)版本和
1989年的System V,Release 4(缩写为SVR4)版本。同时,加利福尼亚大学的程序员改动了
AT&T发布的源代码,引发了许多主要论题。Berkeley Standard Distribution(BSD)成为第
2个主要“UNIX”版本。1984年的BSD 4.2版在大学和公司计算部门中得到广泛应用,它的一
些特征被吸收到SVR4中。
从90年代开始,AT&T的源代码许可证创造了市场的繁荣,不同开发者开发了数百种UNIX版本
。AT&T在1993年把UNIX产业卖给了Novell, Novell两年后又把它卖给了Santa Cruz Operati
on。同时,UNIX商标被转让给X/Open协会,X/Open协会后来成为了Open Group。
当UNIX的经营从一个实体到另一个实体传递时,几个长期的开发开始收获果实。传统上,要
得到一个运行的BSD系统,用户需要从AT&T得到源代码许可证。但到90年代早期,伯克利的开
发者在BSD上做了许多工作,使原始的AT&T源代码大部分被改动了。后续的程序员,从Willi
am和Lynne Jolitz开始在网络分布环境中开发BSD,后来在1992年成为386BSD 0.1版。这个最
初的“免费源代码”BSD具有三个分支,即:Net BSD、Free BSD和Open BSD,都以BSD 4.4为
基础。
1984年,程序员Richard Stallman开始开发来源于UNIX的免费GNU(GNU Not UNIX)。到90年
代早期,GNU项目出现了几个编程里程碑,包括GNU C库和Bourne Again Shell (bash)的发行
。整个系统除了一个关键因素即工作内核外基本完成。
接下来是芬兰赫尔辛基大学的学生Linus Torvalds。Linus看到了一个叫作Minix的小型UNIX
系统,觉得自己能做得更好。1991年秋天,他发行了一个叫“Linux”的免费软件内核的源代
码—是他的姓和Minux的组合。到1994年,Linus和一个内核开发小组发行了Linux 1.0版。L
inus和朋友们有一个免费内核,Stallman和朋友们拥有一个免费的UNIX克隆系统的其余部分
。人们把Linux内核和GNU合在一起组成一个完整的免费系统,该系统被称为“Linux”,尽管
Stallman更愿意取名为“GNU/Linux System”[6]。有几种不同类别的GNU/Linux:一些可以
被公司用来支持商业使用,如Red Hat、Caldera Systems和S.U.S.E;其他如Debian GNU/Li
nux,更接近于最初的免费软件概念。
Linux现已发展到内核2.2版。Linux能在几种不同体系结构的芯片上运行,并已经被各界接纳
或支持。其支持者有惠普、硅谷图像和Sun等有较长历史的UNIX供应商,还有康柏和Dell等P
C供应商以及Oracle和IBM等主要软件供应商。或许最具讽刺的是,微软承认无所不在的免费
软件的竞争性威胁,但它不愿或不能公开自己的软件源代码。
后来微软开始推出Windows NT (Windows 2000)。到90年代末,许多供应商开始放弃UNIX服务
器平台而转向Windows NT。例如Silicon Graphics 公司已决定把Intel硬件和NT作为未来的
图形平台。

论坛徽章:
0
发表于 2003-09-13 00:17 |显示全部楼层

Unix高级安全设置

第二部分 Unix典型安全隐患
2.1 RPC守护进程程序的错误使入侵者可以直接获得root权限
对Unix威胁最大可以说就是rpc上面的漏洞,远程过程调用(Remote Procedure Call)允许
一台计算机上的程序去执行另一台计算机上的程序。它们广泛的应用在各种网络服务中,如
文件共享服务NFS。有很多漏洞是RPC本身的缺陷导致的,它们正不停的涌现出来。有很明显
的证据表明,1999年末2000年初大规模的分布式拒绝服务攻击中,很多被作为攻击跳板的牺
牲品就是因为存在RPC漏洞。在Solar Sunrise事件期间,对美国陆军广为人知的成功攻击就
是因为在数百台国防部的系统中找到了一个RPC漏洞。
2.2 一些应用的远程漏洞
远程漏洞可以使远程攻击者在只对开放了有漏洞服务的应用利用的情况下,就可以得到一些
权限或者root权限。
例如:BIND程序存在的问题,利用nxt,qinv,in.named可直接得到root权限
BIND(Berkeley Internet Name Domain)软件包是域名服务(DNS)的一个应用最广泛的实现
软件--我们所有人都通过它来定位Internet上的系统,只需知道域名(如www.cnns.net)
而不用知道IP地址,由此可体会它的重要性--这使它成为最受欢迎的攻击目标。
2.3 本地漏洞
本地漏洞虽然没有上面两种漏洞那么严重,但是他也是评估系统安全与否的一个重要因素,
它可以使权限地的系统用户来提升自己的系统权限,或者使一个得到了一些权限的远程攻击
者,扩大自己的战果,提升权限。
例如,ff.core缓冲区溢出漏洞,一个普通用户只要执行一个简单的脚本,就可以令缓冲区溢
出从而的到一个root shell。
2.4 暴露系统信息
严格的说这不是漏洞,但是他核你的系统安全相关。举例子来说,finger暴露了系统合法用
户名,默认shell等等信息,这就可以被攻击者利用起来猜密码。再如某个软件的版本号暴露
,就会令攻击者,针对此版本来进行攻击,这就使攻击者更容易的入侵的系统。

论坛徽章:
0
发表于 2003-09-13 00:20 |显示全部楼层

Unix高级安全设置

第三部分 常见Unix安全设置方案
3.1 Solaris 系列
3.1.1 PROM OpenBoot 和物理安全
3.1.1.1 OpenBoot安全级别
none :不需要任何口令。所有OpenBoot设置都可以修改,任何人只要物理接触到主控台,就
可以完全控制。command:除了boot和go之外所有命令都需要口令。full:除了go命令之外所
有命令都需要口令。
3.1.1.2 改变OpenBoot安全级别
首先使用eeprom security-password 命令设置OpenBoot口令,然后在root登入状态使用eep
rom security-mode=command命令改变安全级别为command或在OK状态:ok setenv security
-mode=command的密码保护来实现。
3.1.2 文件系统的安全
3.1.2.1 基础知识
文件系统是unix系统安全的核心。在unix中,所有的事物都是文件。Unix中的基本文件类型
有正规文件、目录、特殊文件、链接、Sockets等等。这些不同类型的文件以一个分层的树结
构进行组织,以一个叫"root"的目录为起始位置("/"。整个就是一个文件系统。每个文件对
应一个"i节点","i节点"包括UID(文件拥有者)、GID(文件所在组)、模式(文件的权限)、文
件大小、文件类型、ctime("i节点"上次修改时间)、mtime(文件上次修改时间)、atime(文件
上次访问时间)、nlink(链接数)。它表示了文件的基本属性。
大家注意到,"/"下有很多的目录,那么这些目录是干什么的呢?下面简要介绍一下目录结构
。如下:
/bin 用户命令的可执行文件
/dev 特殊设备文件
/etc 系统执行文件、配置文件、管理文件,主要是配置文件
/home 用户起始目录
/lib 引导系统以及在root文件系统中运行命令所需的共享库文件
/lost+found 与特定文件系统断开连结的丢失文件
/mnt 临时安装的文件系统(如光驱、软驱)
/proc 一个伪文件系统,用来作为到内核数据结构或正在运行的进程的接口(用于调试)
/sbin 只有root使用的可执行文件和只需要引导或安装/usr的文件
/tmp 临时文件
/usr 为用户和系统命令使用的可执行文件、头文件、共享库、帮助文件、本地程序(在/usr
/local中)
/var 用于电子邮件、打印、cron等的文件,统计文件,日志文件
文件系统有多种类型,unix内核支持如下文件系统:
1) ext2 固定和可移动磁盘都支持的一种高性能文件系统,用于linux
2) msdos 由MS-DOS和Windows使用
3) umsdos Linux使用的一种扩充的DOS文件系统,支持长文件名、权限设置
4) iso9660 遵从ISO9660标准的CD-ROM文件系统
5) hpfs High Performance Filesystem,高性能文件系统,OS/2使用
6) minix 在Minux OS中使用,最早的Linux文件系统
7) nfs 用来访问远程计算机中磁盘的网络文件系统
swap 用作交换的磁盘分区
3.1.2.2 文件权限
文件权限是unix文件系统安全的关键。Unix中的每个用户有一个唯一的用户名和UID(用户ID
号),每个用户属于一个或多个组。基本分组成员在/etc/passwd中定义,附加的分组成员在
/etc/group中定义。例如,用户tiger的UID为225,分组为11(students),此外,他还是分组
185(postgraduates)的成员。每个文件和目录有三组权限,一组是文件的拥有者、一组是文
件所属组的成员、一组是其他所有用户。"r"表示可读,"w"表示可写,"x"表示可执行。一共
9位(每组3位),合起来称为模式位(mode bits)。
模式位通常由一列10个字符来表示,每个字符表示一个模式设置,第一个指明文件类型,如
(d表示目录,-表示普通文件,l表示链接文件等等)。例如,用ls -l 命令显示如下:
drwxr-xr-x 2 root root 1024 Aug 13 09:22 backup/
-rw-r--r-- 1 root root 1824 Apr 21 18:45 client.c
-rw------- 1 root root 65536 Apr 22 17:56 core
-rw-r----- 1 root root 2351 Apr 22 14:01 cry1.bak
-rwxr-xr-x 1 root root 27492 Apr 21 18:47 crypt*
-rw-r----- 1 tiger tiger 2450 Apr 22 15:16 cryption_server.c
-rw-r----- 1 tiger tiger 1544 Apr 22 15:02 myinclude.h
-rwxr-xr-x 1 root root 8280 May 3 10:35 test*
例如最后一行以"-"开始,表示test使一个普通文件,文件拥有者可以读写执行、本组其他成
员可以读执行、其他用户可以读执行。我们可以用chmod和umask命令来改变权限,这很简单
,察看相应的帮助就知道怎么修改权限。
3.1.2.3 SUID/SGID
为什么要单独把他们从文件权限中分出来讲呢?因为,这是网络入侵者非常爱用的入侵入口
。SUID表示"设置用户ID",SGID表示"设置组ID"。当用户执行一个SUID文件时,用户ID在程
序运行过程中被置为文件拥有者的用户ID。如果文件属于root,那用户就成为超级用户。同
样,当一个用户执行SGID文件时,用户的组被置为文件的组。例如,PS命令以SUID root运行
,他从系统内存中读取,这是一般用户不能做的。SUID程序代表了重要的安全漏洞,特别是
SUID设为root的程序。
Unix实际上有两种类型的用户ID。"real user ID"是在登录过程中建立的用户ID。 "effect
ive user ID"是在登录后的会话过程中通过SUID和SGID位来修改。当一个用户运行一条命令
时,进程继承了用户登录Shell的权限,这时"real user ID"和"effective user ID"是相同
的。当SUID位被设置时,进程继承了命令拥有者的权限。例如普通用户运行passwd命令时,
他能够修改/etc/passwd文件,尽管文件是属于root的。这成为可能是因为passwd命令以roo
t的SUID权限运行。那么如何识别SUID程序呢?我们检查文件的权限模式,在它的第四位如果
不是"x",而是"s",就是一个SUID程序。例如,ls -l /bin/su命令显示:
-rwsr-xr-x 1 root root 14888 Aug 15 1999 /bin/su*
表明su是一个SUID程序。
Unix系统安全的一种典型攻击就是创建一个SUID是root的shell拷贝,然后把他隐藏。通过调
用后门,攻击者就获得了root的权利。例如,某个系统管理员忘了关闭某个root的Shell,一
个坏人经过运行如下命令:

cp /bin/bash /home/badman/.bash; chmod 4777 /home/badman/.bash
badman现在就有了一个bash的SUID root拷贝任其处理。他就有完整的root权限了。因此,系
统管理员应该定期察看系统中有哪些SUID和SGID文件。用下面的命令可以实现:find / -ty
pe f \( -perm -4000 -o -perm -2000 \) -ls
当然,攻击者可以通过修改find命令来逃避检测,所以要运行专门的检测软件(如Tripwire)
来进行检查。
3.1.2.4 加密与验证
Tripwire工具提出了使用密码校验和来确定文件是否经过了未认证的修改,加密技术可以用
来保护机密文件甚至整个文件系统。加密是通过密钥将明文转化为一堆乱码的密文,从而起
到保护文件内容的作用。Unix常用的加密算法有crypt(最早的加密工具)、DES(目前最常用的
)、IDEA(国际数据加密算法)、RC4、Blowfish(简单高效的DES)、RSA等等。具体的加密算法
这里不再阐明,需要了解请阅读Bruce Schneier的《应用密码学》一书。注意单向hash函数
,他处理任意长度的信息并返回一个固定长度的hash值(128位)。常用的有MD5、SHA、HAVAL
、Snefru等等。单向hash函数经常和公开密钥算法一起来创建数字签名,提供身份证明。与
传统的签名相比,数字签名还可以指出文件是否被修改过。
PGP是unix下用来保护信息特别是电子邮件的工具。他使用IDEA算法为数据加密,使用RSA算
法来进行密钥管理和数字签名,使用MD5来作为一个单向hash函数。其特点在于安全:不仅内
容被伪装,连发送者的签名也加密。PGP还可以用来加密本地文件。现在常用的Linux下的PG
P工具为:pgpe(加密)、pgps(签名)、pgpv(确认/解密)、pgpk(管理密钥)。请参考相应的帮
助来使用。
"特洛伊木马"的故事不知道大家听说过没有。古希腊人久攻特洛伊城不下,于是假装求和,
送了一个巨大的木马作为礼物,向城主Minerva表示和解。特洛伊人将木马拉入城内,到了夜
晚,藏在木马中的希腊士兵钻出来,里应外合,攻破特洛伊城。在计算机安全领域,这种欺
骗技巧成为攻击计算机安全的一种标准方式。他藏在你的计算机里,随时可能爆发,如果攻
击者需要的话。因此,一旦一个系统被装了特洛伊木马,他就不能在信任了,必须从新安装
。怎么避免呢,要养成良好的习惯,例如:限制下载,只从有声望的站点下载东西;检验下
载的文件;避免运行已编译好的二进制代码,从源代码开始编译;不执行不信任的电子邮件
发送的程序;不执行从非信任的Web站点得到的Java applets和Java Script。
MD5校验和有时与软件一起发行,用户可以用他来检验一个软件包。用户可以运行Red Hat L
inux中包含的md5sum工具,例如:md5sum cops.1.04.tar.gz
结果:lfa416872934e5bee99068f9989cb8b0 cops.1.04.tar.gz
和软件包自带的校验和文件比较,如果不符,则说明文件在传输过程中出了问题,最好从新
下载,本文件不可靠。md5sum还可以用来检验系统文件,在第一次安装系统之后对重要的li
lo系统二进制文件进行一下校验:md5sum lilo,其结果应该一直保持不变,除非升级。
3.1.2.5 完整性检查
完整性是安全系统的核心属性。用户需要知道昨天写的文件和今天打开的文件没有被改动。
攻击者可以用很多方法破坏文件系统,从依靠错误配置的权限获益到放置特洛伊木马和病毒
。Linux中用cksum命令对一个特定文件执行16位校验和的计算,上面的md5sum也是一个检验
的命令。
RPM(Red Hat Package manager)是由Red Hat Software开发并包含在其Linux产品之中的多功
能软件安装管理器。他可以用来建立、安装、查询、检验、升级和卸载独立的软件包。
3.1.2.6 加密文件系统
加密文件系统是文件系统安全的一个更引人注目的方法。他根据一个简单的推断:如果一个
系统保存机密数据,那么就应该以加密形式保存。加密文件系统(CFS)的核心思想是: CFS为
目录和文件提供一个透明的接口,并自动使用用户的密钥加密。一条单独的命令把一个密钥
和一个目录关联起来,从这时起,目录的内容在写时自动加密,在打开时自动解密。
一个由意大利人开发的透明加密文件系统(TCFS),用户甚至不知道他们的文件倍加密了。从
下面的地址下载:http://tcfs.dia.unisa.it/
3.1.2.7 备份
备份的重要性我想不需要多说了,那么备份有那些策略呢?常见的有:系统初装时的备份、
定期备份、增量式备份(只备份改动的)、特别备份(为某些文件备份)等等。Linux系统提供了
以下备份工具:
1) cp:拷贝,例如把dir1中的所有内容拷贝到dir2:cp -R dir1 dir2
2) tar:可以创建、把文件添加到或从一个tar档案中解开文件。档案本身也是一个文件,它
包含其他的许多文件和有关信息。Tar最初用于磁带机。
3) cpio:把文件拷贝进或拷贝出一个cpio档案或tar档案,与tar类似
4) dump:得到整个文件系统并把他拷贝到备份介质上,一个确保完整备份的正规方式是跟随
定期增量备份运行一个0级或完全备份,dump支持10个级别并能把上次备份后改动的所有文件
以更低的级别备份。缺省情况dump将备份到磁盘介质。例如,把一个SCSI硬盘(/dev/rsd0a)
以0级备份到磁带(/dev/rst0)。dump 0f0 /dev/rst0 1500 /dev/sd0a
5) restore:用来恢复整个文件系统或提取单个文件。与dump相对。注意,restore命令特别
冒险,因为他运行SUID root,像任何SUID root程序一样,可以根据自己的风险来运行rest
ore。
3.1.2.8 其他常见系统安全工具导航
1)CRYPT BREAKERS WORKBENCH一个集成多种工具的平台,帮助一个加密人员读取BSD4.2加密
的文件。
ftp://coast.cs.purdue.edu/pub/tools/unix/cbw
2)HOBGOBLIN
ftp://coast.cs.purdue.edu/pub/tools/unix/hobgoblin/
3)TRIPWIRE,强烈推荐,是一个文件系统完整性检查工具。
http://www.tripwiresecurity.com/
4)TROJAN,一个可以被任何用户运行来检查特洛伊木马的perl程序。
ftp://coast.cs.purdue.edu/pub/tools/unix/trojan/trojan.pl
5)PGP,流行的邮件和文件加密程序。
http://rufus.w3.org/linux/RPM/pgp.html
6)LIBDES,建立一个DES加密库和一个DES加密程序的工具。包括一个crypt(3)的快速实现。

ftp://ftp.psy.uq.oz.au/pub/Crypto/DES/
3.1.3 用户账号和环境的安全
3.1.3.1 口令管理增强方法
可以使用如下命令及其参数来增强对用户密码的管理:
1)passwd -n 30 user #强迫用户每30天修改一次密码;
2)passwd -f user #强迫用户在下一次登录时修改口令;
3)passwd -n 2 -x 1 user #禁止用户修改口令;
4)passwd -l user #封锁用户账号,禁止登录。
3.1.3.2 CRACK
Crack可以找出/etc/shadow中那些容易猜测的口令,虽然运行crack将会使CPU的负载加重,
但它在第一次运行时就可以给出10%系统帐号的口令。
URL:ftp://sable.ox.ac.uk/pub/comp/security/software/crackers/
3.1.3.3 取消ROOT的远程登陆
默认在/etc/default/login里加上 "CONSOLE"行,在/etc/ftpusers里加上root。
3.1.3.4 配置ROOT的环境
1)将umask设为077或者027.
2)查看你的环境中路径设置情况,不要有./
3.1.3.5 删除不必要的帐号
移去或者锁定那些不是必须的帐号,比如sys\uucp\nuucp\listen等等,简单的办法是在/et
c/shadow的password域中放上NP字符。
3.1.3.6 NIS的安全问题
NIS从来就不是一个安全的服务,如果配置得当的话NIS+会更好些,就象暴力破解密码一样,
NIS域名如果被猜出来,就会给入侵者提供相当丰富的信息,要关闭这个漏洞,可以将信任主
机的地址放在/var/yp/securenets中。并且考虑使用NIS+或者secure RPC。
3.1.3.7 取消rlogin/rsh服务
移去/etc/hosts.equiv和/.rhosts以及各home目录下的.rhosts,并且在/etc/inetd.conf中
把r系列服务都杀掉,然后找出inetd的进程号,重启它。
3.1.3.8 限制通过网络进入系统
Telnet和ftp守护进程是从inetd进程启动的,inetd的配置文件是/etc/inetd.conf,还包含了
其它的各种服务,所以你可以干脆移去这个文件,新建一个只包括以下两行的文件:
ftp stream tcp nowait root /usr/local/bin/tcpd /usr/local/bin/wu-ftpd
telnet stream tcp nowait root /usr/local/bin/tcpd /usr/sbin/in.telnetd
当然这是基于你需要telnet及ftp的基础上的,如果你连这两个服务都不用的话,你就可以将
它注释掉或者删除,这样在系统启动的时候inetd就不需要启动了。
Tcpd的访问控制是由/etc/hosts.allow和/etc/hosts.deny文件控制的,tcpd先查找/etc/ho
sts.allow,如果你在这里面允许了某几台主机的telnet或ftp访问的话,那么deny访问就是
对其它所有机器的了。这是"默认拒绝"的访问控制策略,下面是一个hosts.allow文件的样本

ALL: 172.16.3.0/255.255.255.0
这将允许172.16.3.0网络的主机上任何用户访问你的telnet及ftp服务,记住在这里要放置I
P地址,因为域名比较容易受到欺骗攻击……
现在我们准备拒绝其余所有人的连接了,将下面的语句放在/etc/hosts.deny中:
ALL: /usr/bin/mailx -s "%d: connection attempt from %c" root@mydomain.com
这条指令不仅拒绝了其它所有的连接,而且能够让tcpd发送email给root--一旦有不允许的连
接尝试发生时。
现在你可能希望用syslog记录下所有的访问记录,那么在/etc/syslog.conf放进如下语句:
auth.auth.notice;auth.info /var/log/authlog
注意两段语句间的空白是tab键,否则syslog可能会不能正常工作。
3.1.3.9 配置S/Key
S/Key是一个用于实现安全的一次性口令方案的软件,它根据一系列信息(包括一个秘密口令
)通过MD5处理而形成的初始钥匙,该初始钥匙再交给MD4进行处理,资助将128位的数字签名
缩成64位,该64位信息再次传给MD5函数,这个过程一直持续直到达到期望值……
开始使用S/Key时,要建立一个以/usr/local/bin/keysh为shell的帐号:
在/etc/passwd中加入
access:100:100:Access Account:/tmp:/usr/local/bin/keysh
并且在/etc/shadow中加入
access:NP:6445::::::
然后使用passwd access命令来设定用户的访问密码。
由于/usr/local/bin/keysh不是一个标准的shell,所以你的/etc/shells文件中内容如下:
/sbin/sh
/usr/local/bin/keysh
只有使用这两种login shell的用户才允许接入。
然后建立一个文件/etc/skeykeys并赋予一定的许可权限:
touch /etc/skeykeys
chmod 600 /etc/skeykeys
chown root /etc/skeykeys
chgrp root /etc/skeykeys
使用keyinit access命令来初始化S/Key秘密口令。
现在你可以配置允许用户通过keysu命令来成为超级用户,首先改变/etc/group:
root::0:root,access
只有在这里列出来的用户才允许通过keysu成为超级用户。现在可以使用不着keyinit root命
令来初始化超级用户的S/Key秘密口令,建议该口令要与user的有所区别。
本来你可以将/bin/su删掉以确定用户只能使用keysu……,但不幸的是,许多脚本使用/bin
/su来开启进程,所以只需用chmod 500 /bin/su来改变它的权限就行了。
3.1.3.10 X的安全配置
使用SUN-DES-1选项来调用Secure RPC来通过X鉴别,可以使用xhost +user@host来通过访问
请求。
3.1.3.11 开启SUN-DES-1鉴别机制
set DisplayManager*authorize: true
set DisplayManager._0.authName: SUN-DES-1
rm ~/.Xauthority
增加对localhost的许可权限,通过
xauth local/unix:0 SUN-DES-1 unix.local@nisdomain
xauth local:0 SUN-DES-1 unix.local@nisdomain
Start X via xinit -- -auth ~/.Xauthority
把你自己加入,并移去其他所有人:
xhost +user@ +unix.local@nisdomain -local -localhost
赋予用户foo进入主机"node"的权限:
允许foo进入node: xhost +foo@
建立适当的foo的xauthority: xauth add node:0 SUN-DES-1 unix.node@nisdomain
foo现在就能连上"node"了: xload -display node:0
3.1.4 系统的启动和关闭
3.1.4.1 更改不必要的启动文件
通常情况下,你要检查所有在/etc/rc2.d和/etc/rc3.d以S开头的文件,所有并非必要的设备
或者服务都可以重命名(不要再以S开头),然后你可以重新启动,从/var/adm/messages中来
观察自启动的情况,并且从ps -elf的输出中加以检查。
3.1.4.2 系统里的Strip
在Solaris下,你可以通过对/etc/rc[S0-3].d文件来修改启动时自引导的动作。考虑移去/e
tc/rc2.d中在你系统中用不到的服务,我还建议你移除/etc/init.d里除下以下列表中文件外
的所有东西:
K15rrcd S05RMTMPFILES K15solved S20sysetup
S72inetsvc S99audit S21perf
S99dtlogin K25snmpd S30sysid.net S99netconfig
K50pop3 S74syslog S75cron S92rtvc-config
K60nfs.server K65nfs.client S69inet
K92volmgt README S95SUNWmd.sync
S01MOUNTFSYS S71sysid.sys S88utmpd S95rrcd
这些文件可能会与你的不同--这取决于你机器里的图形卡/是否使用Solaris DiskSuits等等
。移除/etc/rc3.d里的文件........。
3.1.4.3 取消NFS服务
NFS的共享输出是由/etc/dfs/dfstab文件管理的.可以删除它。要将NFS服务器的守护进程关
闭则可以重命名/etc/rc3.d/S15nfs.server。要防止一台机器成为NFS客户机,可以重命名文
件/etc/rc2.d/S73nfs.client--当重命名这些自启动文件时,要注意不要将文件的首字母设
为"S"。
3.1.4.4 rpcbind中的安全问题
Rpcbind是允许rpc请求和rpc服务之间相互连接的程序,但标准的rpc是不安全的,它使用的
是"AUTH_UNIX"验证, 也就是说它依靠的是远程系统的IP地址和远程用户的UID来验证。一般
的系统可能需要某些rpc存在,但对各种服务器如Web servers, ftp servers, mail server
s, etc)最好将rpc服务关闭,你也可以通过一些安全工具来确定rpc服务是否会影响到你系统
的安全性。可以通过将/etc/rc2.d/S71RPC改名来禁止rpc。
3.1.4.5 in.finger的安全问题
in.fingerd在过去有一些安全问题,如果你想提供finger工具,用nobody来运行它。
3.1.4.6 sendmail的设置
/usr/lib/sendmail守护程序并没有打开,因为你不必总在25端口监听mail的列表请求,你可
以在root的crontab文件中增加:
0 * * * * /usr/lib/sendmail -q >; /var/adm/sendmail.log 2>;&1
这条命令要以每小时调用sendmail进程处理排队中的邮件。
3.1.5 cron 和 at
3.1.5.1 cron任务的注意事项
1) 查看所有的cron任务--在/var/spool/cron/crontabs文件中可以找到它们。
2) 必须在/etc/default/cron里设置了"CRONLOG=yes" 来记录corn的动作。
3.1.5.2 cron用户配置
/etc/cron.d/cron.allow和/etc/cron.d/cron.deny两个文件决定了一个特定用户是否可以运
行crontab命令。daemon、bin、smtp、nuucp、listen、nobody、noaccess这些用户不应该有
执行crontab权限。
3.1.5.3 at 用户配置
/etc/cron.d/at.allow和/etc/cron.d/at.deny两个文件决定了一个特定用户是否可以运行a
t命令。daemon、bin、smtp、nuucp、listen、nobody、noaccess这些用户不应该有执行at权
限。
3.1.5.4 cron和Tripwire
Tripwire应该配置成定期检查下面文件和目录:/etc/cron.d、/etc/default、/var/cron、
/var/spool/cron、/etc/cron.d/cron.allow、/etc/cron.d/at.allow、/etc/cron.d/at.de
ny
3.1.6 系统日志
创建所有重要的日志文件的硬拷贝
保证在“/var/log”目录下的不同日志文件的完整性是保证系统安全所要考虑的非常重要的
一个方面。如果我们在服务器上已经加上了很多安全措施,黑客还是能够成功入侵,那么日
志文件就是我们最后的防范措施。因此,很有必要考虑一下用什么方法才能保证日志文件的
完整性。如果服务器上或网络中的其它服务器上已经安装了打印机,就可以把重要的日志文
件打印出来。这要求有一个可以连续打印的打印机,并用syslog把所有重要的日志文件传到
“/dev/lp0”(打印设备)。黑客可以改变服务器上的文件、程序,等等,但是,把重要的日
志文件打印出来之后,他就无能为力了。
例如,记录下服务器上所有的telnet、mail、引导信息和ssh连接,并打印到连接在这台服务
器上的打印机。需要在“/etc/syslog.conf”文件中加入一行。编辑syslog.conf文件(vi /
etc/syslog.conf),在文件末尾加入下面这一行:
authpriv.*;mail.*;local7.*;auth.*;daemon.info /dev/lp0
“mail”是接收日志文件的计算机主机名。如果有人试图黑你的计算机并且威胁把所有重要
的系统日志文件都删掉,你就不用怕了,因为你已经打印出来或者在别的地方还有一个拷贝
。这样就可以根据这些日志文件分析出黑客在什么地方,然后出理这次入侵事件。
authpriv.*;mail.*;local7.*;auth.*;daemon.info@mail
3.1.7 Solaris ndd命令
ndd命令能容易的在不重新配置系统内核和重起系统的情况下,修改核心和TCP/IP的设备的一
些参数。使用如下命令可看到相应的帮助。
[root@ /]>; ndd /dev/arp \?
? (read only)
arp_cache_report (read only)
arp_debug (read and write)
arp_cleanup_interval (read and write)
[root@ /]>; ndd /dev/icmp \?
? (read only)
icmp_wroff_extra (read and write)
icmp_def_ttl (read and write)
icmp_bsd_compat (read and write)
icmp_xmit_hiwat (read and write)
icmp_xmit_lowat (read and write)
icmp_recv_hiwat (read and write)
icmp_max_buf (read and write)
icmp_status (read only)
[root@ /]>; ndd /dev/ip \?
? (read only)
ip_forwarding (read and write)
ip_respond_to_address_mask_broadcast(read and write)
ip_respond_to_echo_broadcast (read and write)
ip_respond_to_timestamp (read and write)
ip_respond_to_timestamp_broadcast(read and write)
ip_send_redirects (read and write)
ip_forward_directed_broadcasts(read and write)
ip_debug (read and write)
ip_mrtdebug (read and write)
ip_ire_cleanup_interval (read and write)
ip_ire_flush_interval (read and write)
ip_ire_redirect_interval (read and write)
ip_def_ttl (read and write)
ip_forward_src_routed (read and write)
ip_wroff_extra (read and write)
ip_ire_pathmtu_interval (read and write)
ip_icmp_return_data_bytes (read and write)
ip_send_source_quench (read and write)
ip_path_mtu_discovery (read and write)
ip_ignore_delete_time (read and write)
ip_ignore_redirect (read and write)
ip_output_queue (read and write)
ip_broadcast_ttl (read and write)
ip_icmp_err_interval (read and write)
ip_reass_queue_bytes (read and write)
ip_strict_dst_multihoming (read and write)
ip_addrs_per_if (read and write)
ip_ill_status (read only)
ip_ipif_status (read only)
ip_ire_status (read only)
ip_ipc_status (read only)
ip_rput_pullups (read and write)
ip_enable_group_ifs (read and write)
[root@ /]>; ndd /dev/tcp \?
? (read only)
tcp_close_wait_interval (read and write)
tcp_conn_req_max_q (read and write)
tcp_conn_req_max_q0 (read and write)
tcp_conn_req_min (read and write)
tcp_conn_grace_period (read and write)
tcp_cwnd_max (read and write)
tcp_debug (read and write)
tcp_smallest_nonpriv_port (read and write)
tcp_ip_abort_cinterval (read and write)
tcp_ip_abort_linterval (read and write)
tcp_ip_abort_interval (read and write)
tcp_ip_notify_cinterval (read and write)
tcp_ip_notify_interval (read and write)
tcp_ip_ttl (read and write)
tcp_keepalive_interval (read and write)
tcp_maxpsz_multiplier (read and write)
tcp_mss_def (read and write)
tcp_mss_max (read and write)
tcp_mss_min (read and write)
tcp_naglim_def (read and write)
tcp_rexmit_interval_initial (read and write)
tcp_rexmit_interval_max (read and write)
tcp_rexmit_interval_min (read and write)
tcp_wroff_xtra (read and write)
tcp_deferred_ack_interval (read and write)
tcp_snd_lowat_fraction (read and write)
tcp_sth_rcv_hiwat (read and write)
tcp_sth_rcv_lowat (read and write)
tcp_dupack_fast_retransmit (read and write)
tcp_ignore_path_mtu (read and write)
tcp_rcv_push_wait (read and write)
tcp_smallest_anon_port (read and write)
tcp_largest_anon_port (read and write)
tcp_xmit_hiwat (read and write)
tcp_xmit_lowat (read and write)
tcp_recv_hiwat (read and write)
tcp_recv_hiwat_minmss (read and write)
tcp_fin_wait_2_flush_interval (read and write)
tcp_co_min (read and write)
tcp_max_buf (read and write)
tcp_zero_win_probesize (read and write)
tcp_strong_iss (read and write)
tcp_rtt_updates (read and write)
tcp_wscale_always (read and write)
tcp_tstamp_always (read and write)
tcp_tstamp_if_wscale (read and write)
tcp_rexmit_interval_extra (read and write)
tcp_deferred_acks_max (read and write)
tcp_slow_start_after_idle (read and write)
tcp_slow_start_initial (read and write)
tcp_co_timer_interval (read and write)
tcp_extra_priv_ports (read only)
tcp_extra_priv_ports_add (write only)
tcp_extra_priv_ports_del (write only)
tcp_status (read only)
tcp_bind_hash (read only)
tcp_listen_hash (read only)
tcp_conn_hash (read only)
tcp_queue_hash (read only)
tcp_host_param (read and write)
tcp_1948_phrase (write only)
显示当前值
#ndd /dev/arp arp_debug 0
0: 代表特性禁止
ndd -set /dev/arp arp_debug 1
1: 代表特性允许
由于这些参数一般是经过优化过的,而且一旦改变失误,可能导致系统的不正常工作。所以
sun不提供文档供人随意调节。
3.1.8 系统补丁
跟所有的复杂系统一样,SUN有它的漏洞,其中的一些从性质上来说是相当严重的。SUN公司
有向它的客户甚至是没有技术支持的客户提供补丁的优良传统。这些补丁或者以集合包或者
以单个补丁的形式存在的。不幸的是,要完全修补你的系统,既需要大的补丁集合包,又需
要单个的补丁。然而我们将介绍一种把补丁包和单个补丁结合起来使用的方法。
用patchadd -p 或 showrev -p命令来察看补丁在系统里的安装情况,在你想保护的主机以及
大众都可以访问的主机上,你应该到SUN公司的主页上去查找相关的补丁包来安装,并且应该
常常查看最新的补丁发布情况。
补丁步骤:
1) 变成 root
2) 键入 umask 022来设置你的许可模式--给系统打补丁不仅要求所有的补丁被"nobody"用
户可读,而且包括补丁之前的所有目录(不要问为什么,反正是一般这么干的)。
3) 创建一个叫“patch“的目录,并进入它,我一般是这样做的:
mkdir /var/tmp/patch
cd /var/tmp/patch
在你建“patch“目录的文件系统中要保证有足够的磁盘空间(提示:你可以试着键入:df
-k来看看文件系统上可用的磁盘空间,不要用/tmp!
4) 用ftp连接sunsolve站ftp sunsolve.sun.com
你的登录用户名是“anonymous“,口令是你的电子邮件地址。
5) 转到二进制模式,键入: bin
关闭提示,键入: prompt
你不需要为下载每个补丁回答是,我需要下那个补丁。
6) 补丁位于sunsolve站的/pub/patches目录,所以键入: cd /pub/patches
7) 得到对应于你操作系统版本的PatchReport文件,你可以用以下命令列出那些文:
ls *.PatchReport
例如:
-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-
ftp>; ls *.PatchReport
200 PORT command successful.
150 Opening ASCII mode data connection for file list.
Solaris1.1.1.PatchReport
Solaris1.1.2.PatchReport
Solaris1.1.PatchReport
Solaris2.3.PatchReport
Solaris2.4.PatchReport
Solaris2.4_x86.PatchReport
Solaris2.5.1.PatchReport
Solaris2.5.1_x86.PatchReport
Solaris2.5.PatchReport
Solaris2.5_x86.PatchReport
Solaris2.6.PatchReport
Solaris2.6_x86.PatchReport
Solaris7.PatchReport
Solaris7_x86.PatchReport
226 Transfer complete.
remote: *.PatchReport
360 bytes received in 0.0044 seconds (79.16 Kbytes/s)
-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-
对x86和sparc文件有不同的补丁报告文件,sparc版本的是那些没有“x86“字样的。
得到一份补丁报告文件,比如:get Solaris2.6.PatchReport
9) 得到一份对应于你系统版本的推荐补丁集合包和它的README文件,可以用如下命令列出推
荐的文件:ls *Recommended*
输出可能是这样的:
-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-
ftp>; ls *Recommended*
200 PORT command successful.
150 Opening ASCII mode data connection for file list.
2.3_Recommended.README
2.3_Recommended.tar.Z
2.4_Recommended.README
2.4_Recommended.tar.Z
2.4_x86_Recommended.README
2.4_x86_Recommended.tar.Z
2.5.1_Recommended.README
2.5.1_Recommended.tar.Z
2.5.1_x86_Recommended.README
2.5.1_x86_Recommended.tar.Z
2.5_Recommended.README
2.5_Recommended.tar.Z
2.5_x86_Recommended.README
2.5_x86_Recommended.tar.Z
2.6_Recommended.README
2.6_Recommended.tar.Z
2.6_x86_Recommended.README
2.6_x86_Recommended.tar.Z
7_Recommended.README
7_Recommended.zip
7_x86_Recommended.README
7_x86_Recommended.zip
-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-
你可以用mget命令把推荐文件和readme都拿下来,比如:
mget 7_x86_Recommended*
这可能要等上一会儿。
10) 在下载推荐文件的时候,你可以打开补丁报告文件看看,里面会有关于安全修补的一节
可能是这样的:
-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-

Solaris 2.5.1 Patches Containing Security Fixes:
------------------------------------------------

103594-19 SunOS 5.5.1: sendmail fixes
103603-10 SunOS 5.5.1: ftp, in.ftpd, in.rexecd and in.rshd patch
103627-11 SunOS 5.5.1: Linker patch
103630-14 SunOS 5.5.1: ip ifconfig arp udp icmp patch
106689-01 * SunOS 5.5.1: /usr/sbin/in.uucpd patch
106905-01 * SunOS 5.5.1: apropos/catman/man/whatis patch
103566-43 OpenWindows 3.5.1: Xsun patch
106411-06 * OpenWindows 3.5.1: xdm patch
(& c.)
-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-=+=-
“*“标记的补丁没有包括在推荐补丁集合包里,我们要把它们包括进来。
11) 当推荐补丁集合包下载完后,你需要下载补丁报告中所标记的单个补丁,最快的方法是
用mget,这样用: mget 106689* 106905* 106411*
重要:你可能想用一个mget命令得到所有的补丁,但mget的参数的个数是有限制的!而且,
我并没有指定版本号,这不仅仅是为了少输入字符和得到相关的README文件,也是因为在补
丁报告发布过程中,版本号可能是会变化的。
12) 下载完所有的东西后,键入:quit来结束ftp会话。
13) 到现在,你已经下载了补丁集合包和单个补丁,因为继续下去打单个的补丁包太费体力
,我们将先把补丁包和单个补丁合并起来。
首先解压补丁包:
如果你用的是Solaris 2.6或更早的,
uncompress 2*Recommended.tar.Z
tar -xvf 2*Recommended.tar
如果用的是Solaris 7,
unzip 7*Recommended.zip
其次,把所有的单个补丁移到你的建立的Recommended目录:
mv 1* *Recommende d
然后,进到保存有全部补丁的Recommended目录:
cd *Recommended
14) 现在我们可以把所有单个的补丁加到patch_order文件中,在这个文件中列出了所有将被
install_cluster脚本安装的补丁,你可以手工把它们加进去(提示:这是错误的选择)或者
用UNIX的命令工具来帮你做这件事。
如果你是Solaris 7,用下面的命令:
ls *.zip | cut -d"." -f1 >;>; patch_order
如果是Solaris 2.6或以前的:
ls *.tar.Z | cut -d"." -f1 >;>; patch_order
15) 现在是解压所有单个补丁包的时候了,因为它们还是压缩格式的。
如果你用Solaris 7,你可以用unzip一次解压一个文件:
unzip 108723.zip
讨厌的是,你不能用“unzip *.zip“,因为unzip不能这样工作,为了避免多次地输入unzi
p,你可以用下面的UNIX命令让unzip为你解压所有的东西:
ls *.zip | xargs -n1 unzip
如果用的是Solaris 2.6或更低的,键入:
uncompress *.tar.Z
现在你必须用tar分离出单个的补丁,你可以用以下命令一次处理一个文件:
tar -xvf 108723.tar
讨厌的是,你不能用“tar -xvf *.tar“,因为tar不能这样工作,为了避免多次地
输入tar,你可以用下面的UNIX命令让tar为你分离所有的东西:
ls *.zip | xargs -n1 tar -xvf
16) 到现在所有的补丁都准备好了,关闭计算机:
/usr/sbin/shutdown -y -g0 -i0
启到到单用户模式,对sparc: boot -s
对x86, 启动时, 键入:b -s
系统引导后,在提示符后输入root口令后,键入:mountall
来mount所有的文件系统。
然后输入:
cd /var/tmp/patch/*Recommended
进到保存所有补丁的目录,现在你可以键入以下命令来安装“所有”的补丁了:
./install_cluster
跟着提示做就行了。如果这是个Solaris 2.5.1或是个Solaris 2.6的系统,可以走
开搞杯咖啡喝喝,因为要花点时间的。不要太担心补丁安装过程中的错误,很多时候出现错
误是因为你没有安装一个特定的软件或已经打了某个补丁。
打完补丁后,关机重启,输入:
/usr/sbin/shutdown -y -g0 -i6
3.1.9 高级指南
3.1.9.1如何防止在堆栈中执行代码?
入侵者常常使用的一种利用系统漏洞的方式是堆栈溢出,他们在堆栈里巧妙地插入一段代码
,利用它们的溢出来执行,以获得对系统的某种权限。
要让你的系统在堆栈缓冲溢出攻击中更不易受侵害,你可以在/etc/system里加上如下语句:
set noexec_user_stack=1
set noexec_user_stack_log =1
第一句可以防止在堆栈中执行插入的代码,第二句则是在入侵者想运行exploit的时候会做记
录,一旦重启机器,这些改变就会生效。如果这不是一个你可以关闭的系统,那么你用adb来
改变一个运行中的系统的参数也是可能的。
当然会有些合法使用可执行堆栈的程序在你做出如上改变后而不能正常运行。所幸的是这样
的程序的并不多,我们所知的就只有GNU ada 编译器。
3.1.9.2 ARP
有关ARP协议的细节,在这里我们就不再详细介绍了。对于sun的系统,核心默认的ARP表过期
的时间是5分钟,并且可以调节.另外一张表是ip层的路由表,它和arp表配合记录动态路由信
息,20分钟过期,最后一个特性是”无偿ARP” ,即系统广播自己的硬件地址。这个特性用来
诊断是否存在相同的硬件地址,另外也用来生成硬件地址的变动通知。
1)ARP攻击
针对ARP的攻击主要有两种,一种是DOS,一种是Spoof。ARP欺骗往往应用于一个内部网络,我
们可以用它来扩大一个已经存在的网络安全漏洞。
如果你可以入侵一个子网内的机器,其它的机器安全也将受到ARP欺骗的威胁。同样,利用A
PR的DOS甚至能使整个子网瘫痪。
2)对ARP攻击的防护
防止ARP攻击是比较困难的,修改协议也是不大可能。但是有一些工作是可以提高本地网络的
安全性。
首先,你要知道,如果一个错误的记录被插入ARP或者IP route表,可以用两种方式来删除:
a. 使用arp -d host_entry
b. 自动过期,由系统删除
这样,可以采用以下的一些方法:
1). 减少过期时间
#ndd -set /dev/arp arp_cleanup_interval 60000
#ndd -set /dev/ip ip_ire_flush_interval 60000
60000=60000毫秒 默认是300000
加快过期时间,并不能避免攻击,但是使得攻击更加困难,带来的影响是在网络中会大量的
出现ARP请求和回复,请不要在繁忙的网络上使用。
2). 建立静态ARP表
这是一种很有效的方法,而且对系统影响不大。缺点是破坏了动态ARP协议。可以建立如下的
文件:
test.cnns.net 08:00:20:ba:a1:f2
user. cnns.net 08:00:20:ee:de:1f
使用arp -f filename加载进去,这样的ARP映射将不会过期和被新的ARP数据刷新,除非使用
arp -d才能删除。但是一旦合法主机的网卡硬件地址改变,就必须手工刷新这个arp文件。这
个方法,不适合于经常变动的网络环境。
3).禁止ARP
可以通过ifconfig interface -arp 完全禁止ARP,这样,网卡不会发送ARP和接受ARP包。但
是使用前提是使用静态的ARP表,如果不在apr表中的计算机 ,将不能通信。这个方法不适用
与大多数网络环境,因为这增加了网络管理的成本。但是对小规模的安全网络来说,还是有
效和可行的。
3)IP Forwarding (IP转发)
IP是用来传输数据的底层协议。IP 转发是在不同网卡之间路由包数据的过程。一般是用路由
器来实现,但是拥有多网络接口的主机也可以实现。当有两个网络接口的时候,Solairs系统
默认打开ip转发。
1) 关闭IP转发
对于多宿主主机,存在可能的安全问题是,攻击者可能通过ip转发的方式访问到私有网络。
在solaisr系统中,包转发能很的容易关闭。简单的生成一个文件 /etc/notrouter,就能在
下次启动的时候关闭ip转发。另外通过ndd命令也能在系统运行的时候关闭ip转发:
#ndd -set /dev/ip ip_forwarding 0
2) 严格限定多主宿主机
如果是多宿主机,还可以加上更严格的限定防止ip spoof的攻击
#ndd -set /dev/ip ip_strict_dst_multihoning 1
默认是关闭的(值为0)
3) 转发包广播
由于在转发状态下默认是允许的,为了防止被用来实施smurf攻击,关闭这一特性。 (参见c
ert-98.01)
#ndd -set /dev/ip ip-forward_directed_broadcasts 0
4)路由
路由的过程就是检查路由信息,从而决定如何从哪个接口传输数据包的过程。即使一个桌面
系统,也要有路由设置。路由表需要实时的升级。现在有多种路由协议可以用来路由数据。
Solaris系统使用in.routed守护程序支持RIP version 1,使用in.rdisc守护进程支持ICMP路
由更新。当solairs系统配置成为一个路由设备来转发数据包的时候,它通过上面的两种方式
动态更新路由信息。
5)攻击
有多种方法能威胁动态路由协议。攻击者能伪造虚假的路由更新信息发送过来,从而达到DO
S的效果;同样的方法,还能使数据报文转发到其他的网络上,使攻击者能监听数据。
默认的solairs系统使用系统守护程序动态管理路由信息。静态路由很好的防止路由信息被远
程动态改变。使用/etc/defaultrouter来设置本地子网的路由。使用route命令来设置其他路
由信息。
但是对于一个简单网络来说,使用静态路由是合适的,一旦网络中有较多的路由设备,必须
使用动态路由。Solairs系统将来也会继续支持动态路由协议。
l 转发源路由包
源路由包中包含了了指定数据如何路由的信息。因此攻击者可能使用源路由包绕过某些特定
的路由器和防火墙设备,也可能用来避开一个已知的IDS系统的监控范围。在大多数solairs
的应用系统上,是不需要这个特性的。由于solairs在打开ip转发以后默认支持源路由转发,
所以我们必须手动关闭它:
#ndd -set /dev/ip ip_forward_src_routed 0
6)ICMP
ICMP:网络控制信息协议。下面讨论在IP驱动上配置solaris的ICMP特性。
1) 广播:
ICMP广播经常会带来麻烦,这里有一条原则来防止广播风暴-控制ICMP的错误信息不被生成
。为来防止攻击者利用ICMP实施DOS攻击,最好禁止本地网络对ICMP广播的响应。Solairs系
统能调节三种ICMP广播的参数。
2)响应Echo广播:
Echo广播通常用来诊断网络主机的存活情况,一旦主机收到一个对广播地址的echo请求,默
认情况下所有系统会回复这个广播要求。当有人恶意定制过量的echo包,系统中的流量将大
为增加。因此我们可以关闭对echo广播的响应
#ndd -set /dev/ip ip_respond_to_echo_boadcast 0
3)响应时间戳广播
时间戳通常用来同步两个不同系统的时钟,但是系统没有必要回复对广播地址发送的时间戳
请求,所以我们可以关闭这种回应。
#ndd -set /dev/ip ip_respond_to_timestamp_broadcast 0
4)地址掩码广播
地址掩码请求被用来确定本地掩码,通常是网络中无盘工作站在启动的时候发送。用下面的
命令能禁止对这样请求的应答
#ndd -set /dev/ip ip_respind_to_address_mask_broadcast 0
7)重定向错误
1)重定向错误
通常是路由器用来通知主机使用另一个路由器来传输数据的指示报文。报文重指定的路由器
必须和发送路由器一样连接同一个子网,而收到报文的主机必须在自己的路由表里新增一条
到那个子网的路由。不像ARP的包,这个路由不会过期也不会自动删除。很多系统检测这样的
报文用来发现错误和潜在的问题,从而优先更改自己的路由表。
2)接受重定向错误
一个攻击者能伪造重定向错误的报文从而给目标主机装载一个新的路由,而这个路由也许更
本就是错误的,这样主机就不会和一些特定的主机或网络通信,这是一种DOS攻击。虽然重定
向报文本身有一些校验规则,但是这些规则能很容易的被欺骗。而且目前存在大量的工具来
达到这个目的。大多数只有一条默认路由主机系统是不需要理会这种报文的,因此我们可以
使用ndd命令忽略ICMP重定向错误报文。(solairs默认是不忽略的)
#ndd -set /dev/ip ip_ignore_redirect 1
3)发送重定向错误报文
只有路由器才需要重定向错误,任何主机即使是多宿主主机也不需要发送这种报文,因此我
们可以使用ndd来禁止本机发送错误重定向报文。
#ndd -set /dev/ip ip_send_redirects 0
4)时间戳响应
就像前面提到的,时间戳广播报文在大多数环境下是不需要的。而solaris系统还能够完全不
接受这种报文。
#ndd -set /dev/ip ip_respond_to_timestamp 0
关闭这个特性以后,有些使用rdate系统命令的unix主机将不能再同步时钟。但是solaris 2
.6和7使用更好的时钟同步方式-NTP(网络时间协议),请参见xntpd的帮助。
8)SYN_flood攻击
TCP-SYN flood又称半开式连接攻击,每当我们进行一次标准的TCP连接(如WWW浏览,下载文
件等)会有一个一个三次握手的过程,首先是请求方向服务方发送一个SYN消息,服务方收到
SYN后,会向请求方回送一个SYN-ACK表示确认,当请求方收到SYN-ACK后则再次向服务方发送
一个ACK消息,一次成功的TCP连接由此就建立,可以进行后续工作了,如图所示:
请求方 服务方
--------------------->; SYN
SYN-ACK <----------------
---------------------->; ACK
而TCP-SYN flood在它的实现过程中只有前两个步骤,当服务方收到请求方的SYN并回送SYN-
ACK确认消息后, 请求方由于采用源地址欺骗等手段,致使服务方得不到ACK回应,这样,服
务方会在一定时间处于等待接收请求方ACK消息的状态,一台服务器可用的TCP连接是有限的
,如果恶意攻击方快速连续的发送此类连接请求,则服务器可用TCP连接队列很快将会阻塞,
系统可用资源,网络可用带宽急剧下降,无法向用户提供正常的网络服务。
对于solaris 2.5.1,只有安装了patch 103582-1(或以上)才能防止syn_flood.在synflood没
有流行以前,连接队列和backlog队列是相同的,solairs 2.6/7和安装了patch以后的2.5.1
系统,现在存在两条队列,一个是已连接的队列,一条是未连接完成的队列。SYN攻击时只能
填充后一条队列,而且,一旦队列满,将随机丢弃老的syn包。系统还会监控这个队列被短时
间填充的情况,一旦怀疑是syn_flood,将在系统的messages中记录下来。
Mar 8 19:24:01 example unix: WARNING: High TCP connect timeout rate!
System (port 80) may be under a SYN flood attack!
新队列的大小也是可以调节的,繁忙的web服务器需要提高未连接队列的大小。默认的大小是
1024,我们可以提高到4096。
#ndd -set /dev/tcp tcp_conn_req_max_q0 4096
当然,一般情况下,核心的队列增大,系统的内存最好也应有相应的增加。
9)连接耗尽攻击
和SYN flood攻击不同,连接耗尽攻击不太常见。因为这种攻击必须使用真实IP,攻击的目标
是已连接队列。许多系统有一个同时连接的上限,取决于核心参数和系统内存情况。作为通
常的web服务器,这个上限值很难达到,因为http的连接是典型的短时连接。但是一个攻击者
可能快速发送大量的连接请求,同时保持连接,这样正常访问者的连接就可能被服务器拒绝

我们可以通过优化系统核心和增加内存来缓解,但不是根本的方法。因为攻击者可能同时调
动多台机器同时攻击。当然,我们可以在发现攻击以后,在防火墙或路由器上拒绝这些IP来
源的连接。
如果不通过网络设备,仅仅通过调节系统参数来缓解攻击。一方面,可以调节web server,如
apache的timeout参数,减短连接保持时间,另一方面,我们可以将核心以连接队列参数增大
(默认是12
#ndd -set /dev/tcp tcp_conn_req_max_q 1024
以上的方法能阻止大多数连接耗尽的攻击企图,除非攻击者调动更多的资源,发动大规模的D
DOS,但这样会使攻击者更容易暴露。
10)IP 欺骗
IP欺骗基本原理:
TCP连接的建立 :为了利用TCP连接交换数据,主机间首先必须建立一个连接。TCP建立连接时
可以分为3个 步骤,称为三步握手法。如果主机A运行rlogin客户程序,并且希望连接到主机
B上的rlogin daemon 服务器程序上,连接过程如图二所示。
1 A ---SYN--->; B
2 A <--SYN/ACK--- B
3 A ---ACK--->; B
需要提醒大家的是,主机A和B的TCP模块分别使用自己的序列编号。在时刻1时,客户端 通过
设置标志位SYN=1告诉服务器它需要建立连接。同时,客户端在其TCP头中的序列号域SEQ放置
了它的初始序列号(ISN),并且告诉服务器序列号标示域是有效的,应该被检查。在时刻2
时,服务器端在接收了上面的SYN后,作出的反应是将自己的ISN和对客户端的ACKA发向客户
端并且告知下一个期待获得的数据序列号是(ISN+1)。客户端在第一流时刻,对服务器的I
SN进行确认。这时,数据传输就可以进行了。ISN与序列号的递增了解序数编号如何选择初始
序列号和如何根据时间变化是很重要的。似乎应该有这种情况,当主机启动后序列编号初始
化为1,但实际上并非如此。初始序列号是由tcp_init函 数确定的。ISN每秒增加序列号128
000,如果有连接出现,每次连接将反计数器的数值增加 64000。很显然,这使得用于表示I
SN的32位计数器在没有连接的情况下每9.32小时复位 一次。之所以这样,是因为这样有利于
最大限度地减少旧有连接的信息干扰当前连接的 机会。这里运用了望2MSL等待时间的概念(
不在本文讨论的范围之内。)如果初始序列 号是随意选择的,那么不能保证现有序列号是不
同于先前的。假设有这样一种情况,在 一个路由回路中的数据包最终跳出了循环,回到了“
旧有”的连接(此时其实是不同于 前者的现有连接(,显然会发生对现有连接的干扰。 端
口号 为了提供对TCP模块的并行访问,TCP提供了叫做端口的用户接口。端口被操作系统内核
利用来标示不同的网络进程,也就是严格区分传输层入口的标示(就是说,IP不关心他 们
的存在)。TCP端口与IP地址一起提供网络端到端的通信。事实上,在任何时刻任何I ntern
et连接都能由4个要素来措述:源IP地址、源地址端口号、目的IP地址和目的地址。采样目标
主机发出的TCP序列号,猜测出它的数据序列号。然后,伪装成被信任的主机, 同时建立起
与目标主机基于地址验证的应用连接。如果成功,黑客可以使用一种简单的命令放置一个系
统后门,以进行非授权操作。
目前,RFC 1498定义了更好的随机ISN生成方法,使得这种攻击很难成功。对于solaris系统
ISN生成有三种方式。
0: 可预测的ISN
1: 增强的ISN 随机生成
2: RFC 1948描述的ISN生成方式
所有版本的solaris默认生成方式值是1。2.5.1只有 0,1两种方式,2.6/7拥有0,1,2三种ISN
生成方式。
我们可以修改/etc/default/inetinit文件来提高ISN的生成强度。将 TCP_STRONG_ISS=1改为
TCP_STRONG_ISS=2重起系统使他生效。对于solair 2.5.1,此方法无效。
11)增加私有端口
一般的情况下,1-1024端口被称为私有端口,只允许具有根权限的进程连接。但是有些大于1
024的端口,即使需要这样的限制,却无法定义,如NFS的服务器端口2049,当然还有一些其
他定义的高于1024的私有端口。
在solairs2.5.1/2.6/7下使用如下方式,可以自定义最小的非私有端口
ndd -set /dev/tcp tcp_smallest_nonpriv_port 205
这样以来,0-2049都被定义为私有端口。在solaris 2.6/7下,还能使用另一个参数单独指
定私有端口。
#ndd /dev/tcp tcp_extra_priv_ports
2049
4045
用来显示已经定义的扩展私有端口
#ndd -set /dev/tcp tcp_extra_priv_ports_add 6112
来增加新的私有端口定义。
使用 ndd -set /dev/tcp tcp_extra_priv_ports_del 来删除定义。
要注意的是,不要随便定义私有端口,因为有些非根权限的进程会使用这些端口。特别是改
变最小非私有端口这个参数,经常会引起问题。应仔细分析你的需求再用扩展私有端口定义
的方式单独增加。

论坛徽章:
0
发表于 2003-09-13 00:21 |显示全部楼层

Unix高级安全设置

3.2 Linux 系列
3.2.1物理安全
3.2.1.1 BIOS安全,设定引导口令
禁止从软盘启动,并且给BIOS加上密码。每次启动的时候都手工检查一下BIOS,这样可以提
高系统的安全性。禁止从软盘启动,可以阻止别人用特殊的软盘启动你的计算机;给BIOS加
上密码,可以防止有人改变BIOS的参数,比如:允许从软盘启动或不用输入口令就可以引导
计算机。
3.2.1.2 安全策略
有一点很重要而且必须指出的是:如果你不知道要保护什么,那么更本没有办法保证系统的
安全。所以必须要有一个安全策略,基于这样的一个策略才可以决定哪些东西允许别人访问
,哪些不允许。如何制定一个安全策略完全依赖于你对于安全的定义。下面的这些问题提供
一些一般性的指导方针:
1)如何定义保密的和敏感的信息?
2)重点防范
3)远程用户有必要访问你的系统吗?
4)系统中有保密的或敏感的信息吗?
5)如果这些信息被泄露给你的竞争者和外面的人有什么后果?
6)口令和加密能够提供足够的保护吗?
7)你想访问Internet吗?
8)你允许系统在Internet上有多大的访问量?
8) 如果发现系统被黑客入侵了,下一步该怎么做?
这个列表很短,真正的安全策略可能包含比这多得多的内容。可能你要做的第一件是:评估
一下自己的偏执程度。任何一个安全策略多少都有一定程度的“偏执”:确定到底在多大程
度上相信别人,包括内部的人和外部的人。安全策略必须在允许用户合理地使用可以完成工
作所必须的信息和完全禁止用户使用信息之间找到平衡点。这个平衡点就是由系统策略决定
的。
3.2.1.3 口令
这章的Linux安全概要就从口令的安全开始讲起。许多人都把所有的东西保存在计算机上,防
止别人查看这些信息的方法就是用口令把计算机保护起来。没有什么东西是绝对安全的。与
常识相反的是:无法破解的口令是不存在的。只要给足时间和资源,所有的口令都能用社会
工程(译者注:原文是social engineering,找不出更好的翻译,大致的意思是用社会和心理
学的知识,而不是用纯粹的技术手段)或强行计算的方法猜出来。
通过社会工程或其它方法获得服务器的口令是最简单和最流行的入侵服务器的方法。决大多
数的技术支持人员很容易获得其他用户的口令,因为用户的安全意识很差而且很轻易就相信
自己的同事,特别是帮助自己解决问题的人。有很多登记在案的成功入侵就是因为一些别有
用心的人利用安全管理上的松懈而获得成功的。有时候,在特定的时间在特定的地点,上级
或老板对员工喊话就有可能泄露机密,导致可怕的后果。
因为破解口令是一项很耗时间和资源的工作,所以应该使得口令文件难于破解,这样即使黑
客获取了口令文件也不能轻易破解。作为一个系统管理员,自己在每个周末运行一下口令破
解程序,是保证系统安全的好方法。这有利于尽早地发现和替换那些很容易被猜出来的口令
。而且,还要有一个好的口令检查机制,在用户选择新口令或改变旧口令的时候,来排除那
些有安全隐患的口令。那些字典里的单词、或者全是大写或全是小写的以及没有包含数字或
特殊字符的字符串是不能用来做口令的。我建议用下面的规则选择有效的口令:
口令至少要有6个字符,最好包含一个以上的数字或特殊字符。
口令不能太简单,所谓的简单就是很容易猜出来,也就是用自己的名字,电话号码、生日、
职业或者其它个人信息作为口令。
口令必须是有有效期的,在一段时间之后就要更换口令。
口令在这种情况下必须作废或者重新设定:如果发现有人试图猜测你的口令,而且已经试过
很多次了。
安装完Linux系统之后默认的最小口令长度为5。这就是说一个新的用户可以访问服务器,那
么他的口令必须多于5字符。但是这样是不够安全的,最好口令的长度能够大于8。可以强制
用户使用8个字符以上的口令。编辑“/etc/login.defs”文件,把最小口令长度由5改成8。
找到PASS_MIN_LEN 5 这一行,改为:PASS_MIN_LEN 8 。“login.defs”是很重要的配置文
件。可以在这个文件中设定一些其它的安全策略,比如:口令的有效期。
3.2.1.4 root帐号
“root”帐号是Unix系统中享有特权的帐号。“root”帐号是不受任何限制和制约的。因为
系统认为root知道自己在做些什么,而且会按root说的做,不问任何问题。因此,可能会因
为敲错了一个命令,导致重要的系统文件被删除。用root帐号的时候,要非常非常小心。因
为安全原因,在不是绝对必要的情况下,不要用root帐号登录。特别要注意的是:不在自己
的服务器上的时候,千万不要在别的计算机上用“root”登录自己的服务器。这是非常非常
非常糟糕的一件事。
3.2.1.5 加密
加密时要用到密匙,密匙是一个特殊的数字,把密匙和需要加密的信息经过加密算法加密之
后,只有知道密匙的人才能把信息读出来。如果所有的计算机主机都在你的控制下,加密当
然是一个好方法,但是,如果其中一台“被信任的”主机被黑客控制了,你马上就有危险了
。这就不仅仅是用户的帐号和口令有危险了。在通常情况下,加密是用来保证机密信息在系
统中传送的安全。如果一台计算机被控制了,那么这些加密信息就会让人知道或是泄密了。
有一个好的安全策略,这种危险的可能性会降到最低,但是如果某台主机的密匙被泄露出去
,那么危险始终存在。
3.2.2 安全配置
3.2.2.1 “/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是允许访问这个目录的计算
机。<ro>;代表只读,<root_squash>;代表不允许对根目录进行写操作。使这些改变生效,你还
要运行“/usr/sbin/exportfs -a”命令。
注意:在服务器上装NFS服务是会有安全隐患的,就我个人而言,不建议你使用NFS。
3.2.2.2 “/etc/inetd.conf”文件
Inetd,也叫作“超级服务器”,根据网络请求装入网络程序。“inetd.conf”文件告诉ine
td监听哪些网络端口,为每个端口启动哪个服务。把Linux系统放在任何的网络环境中,第一
件要做的事就是了解一下服务器到底要提供哪些服务。不需要的那些服务应该被禁止掉,最
好卸载掉,这样黑客就少了一些攻击系统的机会。查看“/etc/inetd.conf”文件,了解一下
inetd提供哪些服务。用加上注释的方法(在一行的开头加上#号),禁止任何不需要的服务,
再给inetd进程发一个SIGHUP信号。
第一步:把文件的许可权限改成600。
[root@cnns]# chmod 600 /etc/inetd.conf
第二步:确信文件的所有者是root。
[root@cnns]# stat /etc/inetd.conf
这个命令显示出来的信息应该是:
File: "/etc/inetd.conf"
Size: 2869 Filetype: Regular File
Mode: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 8,6 Inode: 18219 Links: 1
Access: Wed Sep 22 16:24:16 1999(00000.00:10:44)
Modify: Mon Sep 20 10:22:44 1999(00002.06:12:16)
Change: Mon Sep 20 10:22:44 1999(00002.06:12:16)
第三步:编辑“inetd.conf”文件(vi /etc/inetd.conf),禁止所有不需要的服务,如:ft
p、 telnet、 shell、 login、 exec、talk、ntalk、 imap、 pop-2、pop-3、finger、au
th,等等。如果你觉得某些服务有用,可以不禁止这些服务。但是,把这些服务禁止掉,系
统受攻击的可能性就会小很多。改变后的“inetd.conf”文件的内容如下面所示:
# To re-read this file after changes, just do a 'killall -HUP inetd'
#
#echo stream tcp nowait root internal
#echo dgram udp wait root internal
#discard stream tcp nowait root internal
#discard dgram udp wait root internal
#daytime stream tcp nowait root internal
#daytime dgram udp wait root internal
#chargen stream tcp nowait root internal
#chargen dgram udp wait root internal
#time stream tcp nowait root internal
#time dgram udp wait root internal
#
# These are standard services.
#
#ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a
#telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
#
# Shell, login, exec, comsat and talk are BSD protocols.
#
#shell stream tcp nowait root /usr/sbin/tcpd in.rshd
#login stream tcp nowait root /usr/sbin/tcpd in.rlogind
#exec stream tcp nowait root /usr/sbin/tcpd in.rexecd
#comsat dgram udp wait root /usr/sbin/tcpd in.comsat
#talk dgram udp wait root /usr/sbin/tcpd in.talkd
#ntalk dgram udp wait root /usr/sbin/tcpd in.ntalkd
#dtalk stream tcp wait nobody /usr/sbin/tcpd in.dtalkd
#
# Pop and imap mail services et al
#
#pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d
#pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
#imap stream tcp nowait root /usr/sbin/tcpd imapd
#
# The Internet UUCP service.
#
#uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/lib/uucp/uucico -l
#
# Tftp service is provided primarily for booting. Most sites
# run this only on machines acting as "boot servers." Do not uncomment
# this unless you *need* it.
#
#tftp dgram udp wait root /usr/sbin/tcpd in.tftpd
#bootps dgram udp wait root /usr/sbin/tcpd bootpd
#
# Finger, systat and netstat give out user information which may be
# valuable to potential "system crackers." Many sites choose to disable
# some or all of these services to improve security.
#
#finger stream tcp nowait root /usr/sbin/tcpd in.fingerd
#cfinger stream tcp nowait root /usr/sbin/tcpd in.cfingerd
#systat stream tcp nowait guest /usr/sbin/tcpd /bin/ps -auwwx
#netstat stream tcp nowait guest /usr/sbin/tcpd /bin/netstat -f inet
#
# Authentication
#
#auth stream tcp nowait nobody /usr/sbin/in.identd in.identd -l -e -o
#
# End of inetd.conf
注意:改变了“inetd.conf”文件之后,别忘了给inetd进程发一个SIGHUP信号(killall -H
UP inetd)。
[root@cnns /root]# killall -HUP inetd
第四步: 为了保证“inetd.conf”文件的安全,可以用chattr命令把它设成不可改变。把
文件设成不可改变的只要用下面的命令:
[root@cnns]# chattr +i /etc/inetd.conf
这样可以避免“inetd.conf”文件的任何改变(意外或是别的原因)。一个有“i”属性的文件
是不能被改动的:不能删除或重命名,不能创建这个文件的连接,不能往这个文件里写数据
。只有系统管理员才能设置和清除这个属性。如果要改变inetd.conf文件,你必须先清除这
个不允许改变的标志:
[root@cnns]# chattr -i /etc/inetd.conf
3.2.2.3 TCP_WRAPPERS
在默认情况下,RedHat Linux允许所有的服务请求。用TCP_WRAPPERS来保护服务器的安全,
使其免受外部的攻击,比想象的要简单和轻松得多。在“/etc/hosts.deny”文件中加入“A
LL: ALL@ALL, PARANOID”以禁止所有计算机访问你的服务器,然后在“/etc/hosts.allow”
文件中一个一个加入允许访问你的服务器的计算机。这种作法是最安全的。
TCP_WRAPPERS是由两个文件控制的,依次是:“/etc/hosts.allow”和“/etc/hosts.deny”
。判断是依次进行的,具体的规则如下:
如果在在/etc/hosts.allow文件中有匹配的项(daemon, client),那么允许访问;否则,查
看/etc/hosts.deny,如果找到匹配的项,那么访问被禁止;否则,访问被允许。
第一步:编辑hosts.deny文件(vi /etc/hosts.deny)加入下面这些行:
Access is denied by default.
# Deny access to everyone.
ALL: ALL@ALL, PARANOID #Matches any host whose name does not match
its address, see bellow.
这样做的意思是:所有的服务、访问位置,如果没有被明确地允许,也就是在“/etc/hosts
.allow”中找不到匹配的项,就是被禁止的。
注意:加上“PARANOID”参数之后,如果要在服务器上使用telnet或ftp服务,就要在服务器
的“/etc/hosts”文件中加入允许使用telnet和ftp服务的客户端计算机的名字和IP地址。否
则,在显示登录提示之前,因为DNS的域名解析,可能要等上几分钟时间。
第二步:编辑“hosts.allow”文件(vi /etc/hosts.allow)。例如,可以加入下面这些行(被
授权访问的计算机要被明确地列出来):
sshd: 208.164.186.1 gate.openarch.com
被授权访问的计算机的IP地址是:208.164.186.1,主机名是:gate.openarch.com,允许使
用的服务是:sshd。
第三步:tcpdchk是检查TCP_WAPPERS配置的程序。它检查TCP_WAPPERS的配置,并报告它可以
发现的问题或潜在的问题。在所有的配置都完成了之后,请运行tcpdchk程序:[root@cnns]
# tcpdchk
3.2.2.4 “/etc/aliases”文件
Aliases文件如果管理错误或管理得太粗心了就会造成安全隐患。例如:很多的软件产商都把
“decode”这个别名放在aliases文件里。这样做的目的是为了方便通过email传送二进制文
件。在发送邮件的时候,用户把二进制文件用“uuencode”转成ASCII文件,然后把结果发给
接收端的“decode”。由这个别名让邮件信息通过“/usr/bin/uuencode”程序把二进制文件
重新转换成ASCII文件。如果允许“decode”出现在aliases文件中,可以想象将会有什么样
的安全隐患。
把定义“decode”这个别名的行从aliases文件中删除。同样地,每一个会运行程序的别名都
要好好查看一下,很有可能要把它们删除掉。要使改动生效,还必须运行:
[root@cnns]# /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 ? remove or comment out.
#ingres: root ? remove or comment out.
nobody: root
#system: root ? remove or comment out.
#toor: root ? remove or comment out.

#uucp: root ? remove or comment out.
# Well-known aliases.
#manager: root ? remove or comment out.
#dumper: root ? remove or comment out.
#operator: root ? remove or comment out.
# trap decode to catch security attacks
#decode: root
# Person who should get root's mail
#root: marc
别忘了运行“/usr/bin/newaliases”使改变生效。
3.2.2.5 防止sendmail被没有授权的用户滥用
最新版的sendmail(8.9.3)集成了很强大的防止垃圾邮件(anti-spam)的功能,可以防止邮件
服务器被没有授权的用户滥用。要实现这个功能可以通过编辑“/etc/sendmail.cf”文件,
改变配置文件以阻止那些发垃圾邮件的人。
编辑“sendmail.cf”文件(vi /etc/sendmail.cf),把这一行:
O PrivacyOptions=authwarnings
改为:
O PrivacyOptions=authwarnings,noexpn,novrfy
这些改变可以防止发垃圾邮件的人使用sendmail中的“EXPN”和“VRFY”命令。这些命令经
常被没有授权的人使用。参考本书sendmail配置这一节以获得更多这方面的信息。
编辑“sendmail.cf”文件(vi /etc/sendmail.cf),把这一行:
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b
改为:
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b NO UCE C=xx L=xx
这将改变sendmail接受连接时所显示的提示信息。你要把“C=xx L=xx”中的“xx”改成你所
在的国家和地区编码。例如:我是这样写的“C=CN L=JL”,代表中国,吉林。这个改变不会
对sendmail有什么影响,但是news.admin.net-abuse.email新闻组的人建议这么做,主要是
为了预防法律上的问题。
3.2.2.6 不要显示系统提示信息
如果你不想让远程登录的用户看到系统的提示信息,你可以改变“/etc/inetd.conf”文件中
的telnet设置:
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h
在末尾加上“-h”参数可以让daemon不显示任何系统信息,只显示登录提示。当然,只有在
服务器上装了telnet服务器才有这样做的必要。
3.2.2.7 “/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。
3.2.2.8 路由协议
路由和路由协议会导致一些问题。IP原路径路由(IP source routing),也就是IP包包含到达
底目的地址的详细路径信息,是非常危险的,因为根据RFC 1122规定目的主机必须按原路径
返回这样的IP包。如果黑客能够伪造原路径路由的信息包,那么它就能截取返回的信息包,
并且欺骗你的计算机,让它觉得正在和它交换信息的是可以信任的主机。我强烈建议你禁止
IP原路径路由以避免这个安全漏洞。
用下面的命令在你的服务器上禁止IP原路径路由:
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 >; $f
done
把上面的命令加到“/etc/rc.d/rc.local”文件中去,你就不用在系统重新启动之后再把这
些命令敲一遍。注意,上面的命令将禁止所有的网络界面(lo、ethN、pppN,等等)的原路径
路由包。如果你打算安装书中介绍的IPCHAINS防火墙,就不必用这些命令了,因为在防火墙
的脚本文件中已经包含这些命令了。
3.2.2.9 使TCP SYN Cookie保护生效
“SYN Attack”是一种拒绝服务(DoS)的攻击方式,会消耗掉系统中的所有资源,迫使服务
器重新启动。拒绝服务(这种攻击方式用巨大的信息流来消耗系统的资源,以至于服务器不能
够响应正常的连接请求)是很容易被黑客利用的。在2.1系列的内核中,“syn cookie”只是
一个可选项,并没有使其生效。想要使其生效必须用下面的命令:
[root@cnns]# echo 1 >; /proc/sys/net/ipv4/tcp_syncookies
把这个命令加入“/etc/rc.d/rc.local”文件中,等下次系统重新启动的时候就不必重新敲
一遍了。如果打算安装IPCHAINS防火墙,你就没有必要用这个命令,因为它已经包含在防火
墙的脚本文件里了。
3.2.2.10 防火墙
安全问题的另一个解决方案是把计算机主机和内部计算机间的信息传送同外部的网络隔离开
,只让内部网络与外部网络之间的信息交流,通过一个安全的网关进行。这样一个网关叫做
防火墙,在下面的一些章节我们会用很大的篇幅介绍防火墙。
3.2.2.11 “/etc/services”文件
端口号和标准服务之间的对应关系在RFC 1700 “Assigned Numbers”中有详细的定义。“
/etc/services”文件使得服务器和客户端的程序能够把服务的名字转成端口号,这张表在每
一台主机上都存在,其文件名是“/etc/services”。只有“root”用户才有权限修改这个文
件,而且在通常情况下这个文件是没有必要修改的,因为这个文件中已经包含了常用的服务
所对应的端口号。为了提高安全性,我们可以给这个文件加上保护以避免没有经过授权的删
除和改变。为了保护这个文件可以用下面的命令:
[root@cnns]# chattr +i /etc/services
3.2.2.12 “/etc/securetty”文件
“/etc/securetty”文件允许你规定“root”用户可以从那个TTY设备登录。登录程序(通常
是“/bin/login”)需要读取“/etc/securetty”文件。它的格式是:列出来的tty设备都是
允许登录的,注释掉或是在这个文件中不存在的都是不允许root登录的。
注释掉(在这一行的开头加上#号)所有你想不让root登录的tty设备。
编辑securetty文件(vi /etc/securetty)象下面一样,注释掉一些行:
tty1
#tty2
#tty3
#tty4
#tty5
#tty6
#tty7
#tty8
上面这样做的意思是只允许root在tty1上登录。我建议只允许root在一个tty设备上登录,如
果从其它tty上登录,用“su”命令把身份转成“root”。
3.2.2.13 特殊的帐号
禁止操作系统中不必要的预置帐号(每次升级或安装完都要检查一下)。Linux系统中就提供这
样一些你可能不需要的预置帐号。如果确实不需要这些帐号,就把它们删掉。系统中有越多
的帐号,就越容易受到攻击。
我们假定你已经在系统中使用shadow口令。如果不是这样,最好在系统中加上shadow口令的
支持,因为这样系统会更安全。如果你是按照上一章介绍的方法安装服务器,那么在“安全
验证配置”这一步就已经选上“Enable Shaow Passwords”这个选项了。
在系统中删除一个用户可以用这个命令:
[root@cnns]# userdel username
在系统中删除一个组可以用这个命令:
[root@cnns]# groupdel username
第一步 用下面的命令删除一些不必要的用户:
[root@cnns]# userdel adm
[root@cnns]# userdel lp
[root@cnns]# userdel sync
[root@cnns]# userdel shutdown
[root@cnns]# userdel halt
[root@cnns]# userdel news
[root@cnns]# userdel uucp
[root@cnns]# userdel operator
[root@cnns]# userdel games (如果不用X Window服务器,可以删除这个用户)
[root@cnns]# userdel gopher
[root@cnns]# userdel ftp (如果没安装匿名ftp服务器,可以删除这个用户)
第二步 输入下面的命令删除一些不必要的组:
[root@cnns]# groupdel adm
[root@cnns]# groupdel lp
[root@cnns]# groupdel news
[root@cnns]# groupdel uucp
[root@cnns]# groupdel games (delete this group if you don’t use X Window Server
).
[root@cnns]# groupdel dip
[root@cnns]# groupdel pppusers
[root@cnns]# groupdel popusers (delete this group if you don’t use pop server f
or email).
[root@cnns]# groupdel slipusers
第三步 在系统中加入必要的用户:
在系统中添加用户,用这个命令:
[root@cnns]# useradd username
给系统中的用户添加或改变口令,用这个命令:
[root@cnns]# passwd username
例如:
[root@cnns]# useradd admin
[root@cnns]# passwd admin
这些命令的输出是这样的:
Changing password for user admin
New UNIX password: somepasswd
passwd: all authentication tokens updated successfully
第四步 “不许改变”位可以用来保护文件使其不被意外地删除或重写,也可以防止有些人
创建这个文件的符号连接。删除“/etc/passwd”、“/etc/shadow”、“/etc/group”或“
/etc/gshadow”都是黑客的攻击方法。
给口令文件和组文件设置不可改变位,可以用下面的命令:
[root@cnns]# chattr +i /etc/passwd
[root@cnns]# chattr +i /etc/shadow
[root@cnns]# chattr +i /etc/group
[root@cnns]# chattr +i /etc/gshadow
注意:如果将来要在口令或组文件中增加或删除用户,就必须先清除这些文件的不可改变位
,否则就不能做任何改变。如果没有清除这些文件的不可改变位,安装那些会自动在口令文
件和组文件中加入新用户的rpm软件包的时候,在安装过程中就会出现出错的提示。
3.2.2.14 防止任何人都可以用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”组是系统
中用于这个目的的特殊帐号。不能用别的组名。把这节介绍的方法和《22. “/etc/securet
ty”文件》中介绍的方法结合起来,可以更好地加强系统的安全性。
第二步:如果在“/etc/pam.d/su”配置文件中定义了“wheel”组,现在介绍一下怎样让一
些用户可以用“su”命令成为“root”。下面是一个例子,让admin用户成为“wheel”组的
成员,这样就可以用“su”命令成为“root”:[root@cnns]# usermod -G10 admin
“G”是表示用户所在的其它组。“10”是“wheel”组的ID值,“admin”是我们加到“whe
el”组的用户。用同样的命令可以让其他的用户可以用su命令成为root。
3.2.2.15 资源限制
限制用户对系统资源的使用,可以避免拒绝服务(如:创建很多进程、消耗系统的内存,等等
)这种攻击方式。这些限制必须在用户登录之前设定。例如,可以用下面的方法对系统中用户
加以。
第一步:
编辑limits.conf文件(vi /etc/security/limits.conf),加入或改变下面这些行:
* hard core 0
* hard rss 5000
* hard nproc 20
这些行的的意思是:“core 0”表示禁止创?ore文件;“nproc 20”把最多进程数限制到20
;“rss 5000”表示除了root之外,其他用户都最多只能用5M内存。上面这些都只对登录到
系统中的用户有效。通过上面这些限制,就能更好地控制系统中的用户对进程、core文件和
内存的使用情况。星号“*”表示的是所有登录到系统中的用户。
第二步
必须编辑“/etc/pam.d/login”文件,在文件末尾加入下面这一行:
session required /lib/security/pam_limits.so
加入这一行后“/etc/pam.d/login”文件是这样的:
#%PAM-1.0
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_pwdb.so shadow nullok
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_pwdb.so
password required /lib/security/pam_cracklib.so
password required /lib/security/pam_pwdb.so nullok use_authtok md5 shadow
session required /lib/security/pam_pwdb.so
session required /lib/security/pam_limits.so
#session optional /lib/security/pam_console.so
3.2.2.16 更好地控制mount上的文件系统
可以用一些选项,如:noexec、nodev和nosuid,更好地控制mount上的文件系统,如:“/h
ome”和“/tmp”。这些都在“/etc/fstab”文件中设定。fstab文件包含了各个文件系统的
描述信息。如果想知道在这个文件中可以设定哪些选项,请用man命令查看关于mount的帮助

编辑fstab文件(vi /etc/fstab),并根据需要把这两行:
/dev/sda11 /tmp ext2 defaults 1 2
/dev/sda6 /home ext2 defaults 1 2
改变成:
/dev/sda11 /tmp ext2 nosuid,nodev,noexec 1 2
/dev/sda6 /home ext2 nosuid,nodev 1 2
“nodev”表示不允许在这个文件系统上有字符或特殊的块设备。“nosuid”表示不允许设定
文件的suid(set-user-identifier)和sgid(set-group-identifier)许可位。“noexec”表示
不允许文件系统上有任何可执行的二进制文件。
注意:上面的例子中,“/dev/sda11”mount到“/tmp”目录上,而“/dev/sd6”mount到“
/home”目录上。当然这和你的实际情况会有所不同,这些取决于你是怎么分区的以及用什么
样的硬盘,例如:IDE硬盘是hda、hdb,等等,而SCSI硬盘是sda、sdb,等等。
3.2.2.17 把rpm程序转移到一个安全的地方,并改变默认的访问许可
一旦在Linux服务器上用rpm命令安装完所有需要的软件,最好把rpm程序转移到一个安全的地
方,如:软盘或其它你认为安全的地方。因为如果有人入侵了你的服务器,他就不能用rpm命
令安装那些有害的软件。当然,如果将来要用rpm安装新的软件,你就要把rpm程序拷回原来
的目录。
把rpm程序移到软盘上,用下面的命令:
[root@cnns]# mount /dev/fd0 /mnt/floppy/
[root@cnns]# mv /bin/rpm /mnt/floppy/
[root@cnns]# umount /mnt/floppy
注意:千万不要把rpm程序从系统中卸载掉,否则以后就不能重新安装它,因为安装rpm程序
或其它软件包本身就要用rpm命令。
还有一点要注意的是,把rpm命令的访问许可从默认的755改成700。这样非root用户就不能使
用rpm命令了。特别是考虑到万一在安装完新软件之后忘了把rpm程序移到一个安全的地方,
这样做就更有必要了。
改变“/bin/rpm”默认的访问权限,用下面这个命令:
[root@cnns]# chmod 700 /bin/rpm
3.2.2.18 登录shell
为了方便重复输入很长的命令,bash shell可以在“~/.bash_history”文件(“~/”是家目
录,每个用户都是不一样的)中存500个曾经输入过的命令。每一个有自己帐号的用户,在自
己的家目录中,都会有“.bash_history”文件。可能会有这种情况,用户在不该输入口令的
地方输入了口令,而输入的口令会在“.bash_history”文件中保存下来。而且“.bash_his
tory”文件越大这种可能性也越大。
在“/etc/profile”文件中HISTFILESIZE和HISTSIZE这两行决定了系统中所有用户的“.bas
h_history”文件可以保存多少命令。我建议把“/etc/profile”文件中的HISTFILESIZE和H
ISTSIZE都设成一个比较小的值,如:20。
编辑profile文件(vi /etc/profile),把这些行改成:
HISTFILESIZE=20
HISTSIZE=20
这样每个用户家目录下的“.bash_history”就最多只能存20个命令。如果黑客试图在用户的
“~/.bash_history”文件中发现一些口令,他就没有什么机会了。
3.2.2.19 “/etc/lilo.conf”文件
LILO是Linux上一个多功能的引导程序。它可以用于多种文件系统,也可以从软盘或硬盘上引
导Linux并装入内核,还可以做为其它操作系统的“引导管理器”。根(/)文件系统对LILO来
说很重要,有下面这两个原因:第一:LILO要告诉内核到那里去找根文件系统;第二:LILO
要用到的一些东西,如:引导扇区、“/boot”目录和内核就存放在根文件系统中。引导扇区
包括LILO引导程序的第一部分,这个部分在引导阶段的后半部分还要装入更大的引导程序。
这两个引导程序通常存在“/boot/boot.b”文件中。内核是由引导程序装入并启动的。在Re
dHat Linux系统中,内核通常在根目录或“/boot”目录下。
因为LILO对Linux系统非常重要,所以我们要尽可能地保护好它。LILO最重要的配置文件是“
/etc”目录下的“lilo.conf”文件。用这个文件我们可以配置或提高LILO程序以及Linux系
统的安全性。下面是LILO程序的三个重要的选项设置。
1)加入:timeout=00
这项设置设定LILO在引导默认的系统之前,等候用户输入的时间。C2安全等级规定这个时间
间隔必须设成0,因为多重引导会使系统的安全措施形同虚设。除非想用多重引导,否则最好
把这项设成0。
2)加入:restricted
当LILO引导的时候,输入参数linux single,进入单用户(single)模式。因为单用户模式没
有口令验证,所以可以在LILO引导时,加上口令保护。“restricted”选项只能和“passwo
rd”合起来用。注意要给每个内核都要加上口令保护。
3)加入:password=<password>;
用单用户模式启动Linux系统的时候,系统要求用户输入这个口令。口令是大小写敏感的,而
且要注意,要让“/etc/lilo.conf”文件,除了root之外,其他用户没有读的权限,这样也
就看不到口令了。下面是用“lilo.conf”文件保护LILO的一个具体例子。
第一步:
编辑lilo.conf文件(vi /etc/lilo.conf),加上或改变下面介绍的三个设置:
boot=/dev/sda
map=/boot/map
install=/boot/boot.b
prompt
timeout=00 ? change this line to 00.
Default=linux
restricted ? add this line.
password=<password>; ? add this line and put your password.
image=/boot/vmlinuz-2.2.12-20
label=linux
initrd=/boot/initrd-2.2.12-10.img
root=/dev/sda6
read-only
第二步
因为“/etc/lilo.conf”配置文件里,存在没有经过加密的口令,所以只有root才能有读的
权限。用下面的命令改变文件的权限:
[root@cnns]# chmod 600 /etc/lilo.conf (will be no longer world readable).
第三步
使改变后的“/etc/lilo.conf”配置文件生效:
[root@cnns]# /sbin/lilo -v (to update the lilo.conf file).
第四步
为了更安全一点,可以用chattr命令给“lilo.conf”文件加上不可改变的权限。让文件不可
改变用下面的命令:
[root@cnns]# chattr +i /etc/lilo.conf
这样可以避免“lilo.conf”文件因为意外或其它原因而被改变。如果想要改变“lilo.conf
”文件,必须先清除它的不可改变标志。
清除不可改变的标记用下面的命令:
[root@cnns]# chattr -i /etc/lilo.conf
3.2.2.20 使Control-Alt-Delete关机键无效
把“/etc/inittab”文件中的一行注释掉可以禁止用Control-Alt-Delete关闭计算机。如果
服务器不是放在一个安全的地方,这非常重要。
编辑inittab文件(vi /etc/inittab)把这一行:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
改为:
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
用下面的命令使改变生效:
[root@cnns]# /sbin/init q
3.2.2.21 改变“/etc/rc.d/init.d/”目录下的脚本文件的访问许可
改变启动和停止daemon的脚本文件的权限。
[root@cnns]# chmod -R 700 /etc/rc.d/init.d/*
这样只有root可以读、写和执行这个目录下的脚本。我想一般用户没有什么必要知道脚本文
件的内容。
注意:如果你安装或升级了一个程序,要用到“/etc/rc.d/init.d/”中system V脚本,不要
忘记再检查一下改变和检查这个脚本文件的许可。
3.2.2.22 “/etc/rc.d/rc.local”文件
在默认情况下,当登录装有Linux系统的计算机时,系统会告诉你Linux发行版的名字、版本
号、内核版本和服务器名称。这泄露了太多的系统信息。最好只显示一个“Login:”的提示
信息。
第一步
编辑“/ect/rc.d/rc.local”文件,在下面这些行的前面加上“#”:
--
# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo "" >; /etc/issue
#echo "$R" >;>; /etc/issue
#echo "Kernel $(uname -r) on $a $(uname -m)" >;>; /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >;>; /etc/issue
--
第二步
删除“/etc”目录下的“issue.net”和“issue”文件:
[root@cnns]# rm -f /etc/issue
[root@cnns]# rm -f /etc/issue.net
注意:“/etc/issue.net”文件是用户从网络登录计算机时(例如:telnet、SSH),看到的登
录提示。同样在“/etc”目录下还有一个“issue”文件,是用户从本地登录时看到的提示。
这两个文件都是文本文件,可以根据需要改变。但是,如果想删掉这两个文件,必须向上面
介绍的那样把“/etc/rc.d/rc.local”脚本中的那些行注释掉,否则每次重新启动的时候,
系统又会重新创建这两个文件。
3.2.2.23 带“s”位的程序
用ls -l命令列出来的文件,如果文件的权限位中出现“s”,则这些文件的SUID(-rwsr-xr-
x)或SGID(-r-xr-sr-x)位被设定了。因为这些程序给执行它的用户一些特权,所以如果不需
要用到这些特权,最好把这些程序的“s”位移去。可以用下面这个命令“chmod a-s <文件
名>;”移去相应文件的“s”位。
可以清除“s”位的程序包括但不限于:
1)从来不用的程序
2)不希望非root用户运行的程序
3)偶尔用用,但是不介意先用su命令变为root后再运行。
下面加了星号(*)的程序,我个人认为有必要移去“s”位。注意,系统可能需要一些SUID的
程序才能正常运行,所以要千万小心。
用下面的命令查找所有带“s”位的程序:
[root@cnns]#find / -type f \( -perm -04000 -o -perm -02000 \) \-exec
ls -lg {} \;

*-rwsr-xr-x 1 root root 35168 Sep 22 23:35 /usr/bin/chage
*-rwsr-xr-x 1 root root 36756 Sep 22 23:35 /usr/bin/gpasswd
*-r-xr-sr-x 1 root tty 6788 Sep 6 18:17 /usr/bin/wall
-rwsr-xr-x 1 root root 33152 Aug 16 16:35 /usr/bin/at
-rwxr-sr-x 1 root man 34656 Sep 13 20:26 /usr/bin/man
-r-s--x--x 1 root root 22312 Sep 25 11:52 /usr/bin/passwd
-rws--x--x 2 root root 518140 Aug 30 23:12 /usr/bin/suidperl
-rws--x--x 2 root root 518140 Aug 30 23:12 /usr/bin/sperl5.0050
3
-rwxr-sr-x 1 root slocate 24744 Sep 20 10:29 /usr/bin/slocate
*-rws--x--x 1 root root 14024 Sep 9 01:01 /usr/bin/chfn
*-rws--x--x 1 root root 13768 Sep 9 01:01 /usr/bin/chsh
*-rws--x--x 1 root root 5576 Sep 9 01:01 /usr/bin/newgrp
*-rwxr-sr-x 1 root tty 8328 Sep 9 01:01 /usr/bin/write
-rwsr-xr-x 1 root root 21816 Sep 10 16:03 /usr/bin/crontab
*-rwsr-xr-x 1 root root 5896 Nov 23 21:59 /usr/sbin/usernetctl
*-rwsr-xr-x 1 root bin 16488 Jul 2 10:21 /usr/sbin/traceroute
-rwxr-sr-x 1 root utmp 6096 Sep 13 20:11 /usr/sbin/utempter
-rwsr-xr-x 1 root root 14124 Aug 17 22:31 /bin/su
*-rwsr-xr-x 1 root root 53620 Sep 13 20:26 /bin/mount
*-rwsr-xr-x 1 root root 26700 Sep 13 20:26 /bin/umount
*-rwsr-xr-x 1 root root 18228 Sep 10 16:04 /bin/ping
*-rwxr-sr-x 1 root root 3860 Nov 23 21:59 /sbin/netreport
-r-sr-xr-x 1 root root 26309 Oct 11 20:48 /sbin/pwdb_chkpwd
用下面的命令禁止上面选出来的SUID的程序:
[root@cnns]# chmod a-s /usr/bin/chage
[root@cnns]# chmod a-s /usr/bin/gpasswd
[root@cnns]# chmod a-s /usr/bin/wall
[root@cnns]# chmod a-s /usr/bin/chfn
[root@cnns]# chmod a-s /usr/bin/chsh
[root@cnns]# chmod a-s /usr/bin/newgrp
[root@cnns]# chmod a-s /usr/bin/write
[root@cnns]# chmod a-s /usr/sbin/usernetctl
[root@cnns]# chmod a-s /usr/sbin/traceroute
[root@cnns]# chmod a-s /bin/mount
[root@cnns]# chmod a-s /bin/umount
[root@cnns]# chmod a-s /bin/ping
[root@cnns]# chmod a-s /sbin/netreport
如果你想知道这些程序到底有什么用,可以用man命令查看帮助。
例如:[root@cnns]# man netreport
3.2.3 高级安全
3.2.3.1 使系统对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"
3.2.3.2 禁止使用控制台程序
一个最简单而且最常用的保证系统安全的方法就是禁止使用所有的控制台程序,如:shutdo
wn和halt。可以运行下面的命令来实现:
[root@cnns]# rm -f /etc/security/console.apps/servicename
这里servicename是你要禁止的控制台程序名。除非你使用xdm,否则不要把xserver文件删掉
,如果这样除了root之外,没有人可以启动X服务器了。(如果使用xdm启动X服务器,这时ro
ot是唯一需要启动X服务器的用户,这才有必要把xserver文件删掉)。例如:
[root@cnns]# rm -f /etc/security/console.apps/halt
[root@cnns]# rm -f /etc/security/console.apps/poweroff
[root@cnns]# rm -f /etc/security/console.apps/reboot
[root@cnns]# rm -f /etc/security/console.apps/shutdown
[root@cnns]# rm -f /etc/security/console.apps/xserver (如果删除,只有root可以启动
X).
这些命令就可以禁止所有的控制台程序:halt、poweroff、reboot和shutdown。记住,只有
装了Xwindow,删除xerver文件才会有效果。
注意:根据我们前一章的介绍安装服务器,Xwindow是没有安装上的,上面说的那些文件可能
不会出现在“/etc/security”目录下的,如果这样就可以不管这一节介绍的方法。
3.2.3.3 禁止控制台的访问
为了禁止所有的控制台访问,包括程序和文件,请在“/etc/pam.d/”目录下的所有文件中,
给那些包含pam_console.so的行加上注释。这一步是上一节《禁止使用控制台程序》的延续
。下面的脚本可以自动完成这项工作。转成root身份,创建disabling.sh脚本文件(touch d
isabling.sh),接着加入下面这些行:
# !/bin/sh
cd /etc/pam.d
for i in * ; do
sed '/[^#].*pam_console.so/s/^/#/' < $i >; foo && mv foo $I
done
用下面的命令使脚本有可执行的权限,并执行它:
[root@cnns]# chmod 700 disabling.sh
[root@cnns]# ./disabling.sh
这样“/etc/pam.d”目录下所有文件中包含“pam_console.so”的行都被加上注释。这个脚
本运行完之后,可以把它从系统中删掉。
3.2.3.4 创建所有重要的日志文件的硬拷贝
保证在“/var/log”目录下的不同日志文件的完整性是保证系统安全所要考虑的非常重要的
一个方面。如果我们在服务器上已经加上了很多安全措施,黑客还是能够成功入侵,那么日
志文件就是我们最后的防范措施。因此,很有必要考虑一下用什么方法才能保证日志文件的
完整性。如果服务器上或网络中的其它服务器上已经安装了打印机,就可以把重要的日志文
件打印出来。这要求有一个可以连续打印的打印机,并用syslog把所有重要的日志文件传到
“/dev/lp0”(打印设备)。黑客可以改变服务器上的文件、程序,等等,但是,把重要的日
志文件打印出来之后,他就无能为力了。
例如:记录下服务器上所有的telnet、mail、引导信息和ssh连接,并打印到连接在这台服务
器上的打印机。需要在“/etc/syslog.conf”文件中加入一行。
编辑syslog.conf文件(vi /etc/syslog.conf),在文件末尾加入下面这一行:
authpriv.*;mail.*;local7.*;auth.*;daemon.info /dev/lp0
重新启动syslog daemon使改动生效:
[root@cnns]# /etc/rc.d/init.d/syslog restart
又例如:
记录下服务器上所有的telnet、mail、引导信息和ssh连接,并打印到本地网络中其它服务器
上连接的打印机,要在这台接收日志文件的服务器的“/etc/syslog.conf”文件中加入一行
。如果本地网中没有打印机,可以把所有的日志文件拷贝到别的服务器上,只要忽略下面第
一步,把“/dev/lp0”加到其它服务器的“syslog.conf”文件中,直接跳到在其它服务器上
设置“-r”参数那一步。把所有日志文件拷贝到其它计算机上,使你可以在一台计算机上管
理多台计算机的日志文件,从而简化管理工作。
编辑接收日志文件的服务器(例如:mail.openarch.com)上的syslog.conf文件(vi /etc/sys
log.conf),在文件的末尾加入下面这一行:
authpriv.*;mail.*;local7.*;auth.*;daemon.info/dev/lp0
因为syslog daemon的默认配置是拒绝接收来自网络上的信息,我们必须使它能够接收来自网
络上的信息,在syslog daemon的脚本文件(指的是接收日志文件的服务器上的脚本文件)中加
入下面的“-r”参数。
编辑syslog脚本文件(vi +24 /etc/rc.d/init.d/syslog),把这一行:
daemon syslogd -m 0
改为:
daemon syslogd -r -m 0
重新启动syslog daemon使改动生效:
[root@mail]# /etc/rc.d/init.d/syslog restart
如果接收日志文件的服务器上有防火墙,你可以检查一下防火墙的脚本文件中有没有下面几
行(没有就加上):
ipchains -A input -i $EXTERNAL_INTERFACE -p udp \
-s $SYSLOG_CLIENT \
-d $IPADDR 514 -j ACCEPT
在这个例子中防火墙的脚本文件中定义了EXTERNAL_INTERFACE="eth0"。
IPADDR="208.164.186.2";
SYSLOG_CLIENT=”208.164.168.0/24"
重新启动接收日志文件的服务器上的防火墙,使改动生效:
[root@mail]# /etc/rc.d/init.d/firewall restart
这个防火墙规则允许接收日志文件的服务器接收来自端口514(syslog的端口)的UDP包。
最后,编辑一下发送日志文件的服务器上的“syslog.conf”文件(vi /etc/syslog.conf),
在末尾加上这一行:
authpriv.*;mail.*;local7.*;auth.*;daemon.info @mail
“mail”是接收日志文件的计算机主机名。如果有人试图黑你的计算机并且威胁把所有重要
的系统日志文件都删掉,你就不用怕了,因为你已经打印出来或者在别的地方还有一个拷贝
。这样就可以根据这些日志文件分析出黑客在什么地方,然后出理这次入侵事件。
重新启动syslog daemon,使改变生效:
[root@cnns]# /etc/rc.d/init.d/syslog restart
同样也要看看发送日志文件的服务器的防火墙的脚本文件中有没有这几行(没有加上)。
ipchains -A output -i $EXTERNAL_INTERFACE -p udp \
-s $IPADDR 514 \
-d $SYSLOG_SERVER 514 -j ACCEPT
这里防火墙的脚本文件中定义了:
EXTERNAL_INTERFACE="eth0"
IPADDR="208.164.186.1"
SYSLOG_SERVER="mail.openarch.com"
重新启动防火墙,使改变生效:
[root@cnns]# /etc/rc.d/init.d/firewall restart
这个防火墙的规则允许发送日志文件的服务器通过端口514(syslog端口)发送UDP包。
注意:千万不要用网关服务器来收集和管理所有的系统日志信息。有关syslogd程序的其它一
些参数和策略,可以用man命令查看帮助:syslogd(、syslog(2)和syslog.conf(5)。
3.2.4 系统补丁
http://www.redhat.com网站提供了最新的内核和应用程序的升级或补丁包。可以把.rpm包下
载到服务器的/var/tmp里面然后用命令 rpm –ivh soft.pkg.rpm来升级软件包,或者用rpm ?CUvh soft.pkg.rpm 来修补系统里面带有漏洞的软件。
3.2.5 附录 Linux上面各种常用软件的下载网址
1)FTP:
ftp://ftp.wu-ftpd.org/pub/wu-ftpd/
2)SSH:
ftp://ftp.ssh.com/pub/ssh/
3)DNS:
ftp://ftp.isc.org/isc/bind/
4)dhcp:
ftp://ftp.isc.org/isc/dhcp/dhcp-3.0b2pl18-solaris-2.6.tar.gz
5)SMTP:
ftp://ftp.sendmail.org/pub/sendmail/
6)SSL:
ftp://ftp.openssl.org/source/
7)IMAP/POP:
ftp://ftp.cac.washington.edu/imap/
8)inn:
ftp://ftp.isc.org/isc/inn/inn-2.3.1.tar.gz
9)Linux MM:
http://www.engelschall.com/sw/mm/
10)pine:
ftp://ftp.cac.washington.edu/pine/
11)samba:
http://us1.samba.org/samba/download.html
12)openLDAP:
http://www.openldap.org/software/download/
13)PostgreSQL Db:
ftp://ftp.postgresql.org/pub/
14)Squid Proxy:
http://www.squid-cache.org/Versions/
15)Apache:
http://httpd.apache.org/dist/
16)Mod_ssl:
http://www.modssl.org/source/
17)Perl:
http://perl.apache.org/dist/
18)PHP:
http://www.php.net/downloads.php
19)MySQL
http://www.mysql.com/Downloads/MySQL-3.23/mysql-3.25.13-pc-linux-gnu-i686.tar.gz

20)SXID
ftp://marcus.seva.net/pub/sxid/
21)tripwire:
http://www.tripwiresecurity.com/downloads/index.cfml?dl=asr&
22)GUN PG
http://www.gnupg.org/download.html

论坛徽章:
0
发表于 2003-09-13 10:50 |显示全部楼层

Unix高级安全设置

UP

论坛徽章:
0
发表于 2003-09-14 00:30 |显示全部楼层

Unix高级安全设置

不错,精华
不过,不知道有没有关于AIX的。

论坛徽章:
0
发表于 2003-09-14 10:15 |显示全部楼层

Unix高级安全设置

dang 了先~   3ks
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP