赞
踩
文章阅读 The Big Green 讨论区 [Software]
--------------------------------------------------------------------------------
发信人: Mars (FangQ), 信区: Software
标 题: Unix高级安全设置[ZZ]
发信站: The Big Green (Sat Oct 5 16:58:10 2002) , 转信
http://www.20cn.net/ns/wz/sys/data/20020822032035.htm
Unix高级安全设置 (阅览 338 次)
Unix高级安全设置
作者:KCN
第一部分 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作为未来的
图形平台。
第二部分 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等等信息,这就可以被攻击者利用起来猜密码。再如某个软件的版本号暴露
,就会令攻击者,针对此版本来进行攻击,这就使攻击者更容易的入侵的系统。
第三部分 常见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 用来访问远程计算机中磁盘的网络文件系统
8) 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:x: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“字样的。
8) 得到一份补丁报告文件,比如: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参数,减短连接保持时间,另一方面,我们可以将核心以连接队列参数增大
(默认是128)。
#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 来删除定义。
要注意的是,不要随便定义私有端口,因为有些非根权限的进程会使用这些端口。特别是改
变最小非私有端口这个参数,经常会引起问题。应仔细分析你的需求再用扩展私有端口定义
的方式单独增加。
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是允许访问这个目录的计算
机。代表只读,代表不允许对根目录进行写操作。使这些改变生效,你还
要运行“/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=
用单用户模式启动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= ? 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(8)、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
? 第四部分 总结
没有绝对安全的网络系统,网络信息对抗是一个长期的研究课题,安全问题是多种多样,且
随着时间技术的变化而变化,而黑客的侵入手段也随之不断变化,所以安全防护也是非常重
要的,保持清醒正确的认识,同时掌握最新的安全问题情况,再加上完善有效的安全策略,
是可以阻止大部分的网络入侵,从而保持最小程度的经济损失。
? 第五部分 附录
5.1 Free BSD系列
FreeBSD 是一个非常安全的操作系统。也正因为它的 source code 是可以免费的取得,这个
OS 长久以来不断的有人改进加强。尽管 FreeBSD 一出厂就非常安全, 但是仍然有更多加强
安全性的措施,这份 HOW-TO 会教你一些步骤, 以更加强你机器的整体安全。
5.1.1 网络
5.1.1.1 inetd (Inet Daemon)
网络在系统安全上扮演了一个很重要的角色。FreeBSD 的根基是有着内建网络功能, 且具有
最稳最快的 TCP/IP stacks 的 4.4BSD。这个 stack 支持了非常多的协议像是telnet, ftp
, talk, rsh 等... 这些 service 的的主设定档便是 /etc/inetd.conf。要编辑这个档, 请
输入 "vi /etc/inetd.conf" (在这个例子里, 我使用 vi 。你可以使用其它你较为上手的编
辑器。或许你可以试试 pico)。如果你要使用 pico, 请在启动它时加上 -w 选项:
-w 关掉自动断行。(因此可以容许超过 80 字符的行存在)
这选项在编辑 /etc/inetd.conf 时非常有用。
当然了, 你也可以使用 ee - 它随着 FreeBSD 一起 "出厂" 的, 而且也是 root 预设的编辑
器。不过, 请再 "echo $EDITOR" 确认一次。 开启了这个档案后, 你可以看到里面怎么描
述每个 service 怎么激活, 要以那位使用者执行等等的信息。(man 5 inetd.conf)既然这个
档案是许多 internet service 的主要设定档, 好好的设定它便是一件十分重要的事。你要
关掉一个 service的话,只消在那一行前面加个 "#" 符号。基本的概念是, 关掉些你不熟悉
的 services - 如果你不知道那个 service 是啥, 或者不知道它可以干啥。理想状态下, 你
不须要把所有的 service 都打开。例如, 你的器只是要跑 web server。这种情况下, 你只
要激活 ssh 和 httpd 便够了。关于啥是ssh, 下面会说明。如果你啥 service 都不想跑,
最直接干脆的方法是-关掉 inetd。做法很简单, 只要编辑 /etc/rc.conf 并且把
inetd_enable="YES"改成inetd_enable="NO"就可以了。
如此一来没人可以 telnet, rlogin, 或 ftp 到计算机中。如果你决定要激活你的 inetd 的
话, 记得激活 log 选项, 并提高一个 service 每分钟激活的上限数目。(默认值是 256, 我
建议提高到 1024-自行参照下面解说调整吧!)为什么要这么做呢...? 就 modem user 或是低
速专线用户是没什么差别。但高速线路的人, 上限值太低会蹦出一个 DoS attack(Denial o
f Service)。某个坏心的人可以简单的用一个 shell script 同时搞出超过 256 个 connec
tions, 这么一来你的 inetd会很不幸的阵亡。换句话说, 如果你想让每分钟每个 service
可接受的connection 数多点, 记得做如下的设定, 不然来个坏心的人就可以搞垮你的计算机
。因此, 在这行inetd_enable="YES"
下面的:
inetd_flags=""
要改成:
inetd_flags="-l -R 1024"
这会将联机的动作都 log 下来(-l 参数)而且将同时最大联机数从预设的 256 增加到1024。
你还须要对你的 /etc/syslog.conf 作些修改, 这些等会儿会提到。
5.1.1.2 SSH
在以下提到的案例中, 你完全不须要 run inetd。例如, 如果你只有跑 web, news, 或是 n
fs server, 那么就没有必要在你的机器上再跑其它的services。但是你一定会问,"我要怎么
控制我的机器啊!?" 嗯嗯, 所以现在要介绍 SSH。你可以透过 SSH (SecureShell) 来登入你
的机器。Secure Shell 当初便是设计来取代 rsh, rlogin 等其它的Berkeley r* 命令。相
信你很快就会了解 SSH 是如何有用,而且开始使用它,来代替其它的程序像是 telnet 和 ft
p。SSH 具有很多功能,但是最为人知的是, 它的加密通讯方式, 也就是防止你的密码和资料
以明码的方式在网络上传输。如果你使用 telnet,你的通讯内容可能会被"窃听": 传输中的
资料被改变, 通讯内容被看到。(不是有 S/Key可以解决吗? 很不幸的, 它还是有着插入资料
和连接时被破解的问题) 我希望你可以完全的关掉 inetd 而使用 SSH。如果你认为完全不靠
inetd 来激活某些 services,是完完全全不可能的事, 那么希望你至少激活 log 功能, 而
且要增加每分钟同一个 servi-ce 可激活的次数。 (原因上面有提到)
你可以从 ftp://ftp.funet.fi/pub/unix/security/login/ssh 下载 SSH。
若你想要更简单的方法:
# cd /usr/ports/security/ssh
# make install
5.1.1.3 inetd (part II)
好吧, 你仍然执意要使用 inetd。那么我们来看看在 inetd.conf 有那些选项, 可以增进你
的系统安全。在攻击某系统之前, 攻击者都会先收集该系统的相关信息。就 telnetd 而言,
你可以试试在 telnetd 那行后面加个 -h:
telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h
从 telnetd 的 man page 可以知道:
-h Disable the printing of host-specific information before login
has been completed.
当有很多管道可以获得系统信息的同时, 这招和下面的那招是个不错的解决方案。如果你认
为跑 telnet daemon 是没有必要的, 那么只消加个 "#" 在该行的最前面就行了:
#telnet stream tcp nowait root /usr/libexec/telnetd telnetd
有个极不错的措施是, 你可以拒绝没有完整 FQDN 的人来联机。要做到这点, 也只要加个 -
U 选项到 telnetd 后面:
telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h -U
这是个小动作, 但是对你的系统安全有莫大的助益。
5.1.1.4 ftpd
现在来看看 ftp。 对于 ftp FreeBSD 已经做了一些 log 的动作 。 可以看到在/etc
/inetd.conf 里面 ftpd 那一行已经加了 "-l"。然而, 你还是要设定你的syslogd, 使它可
以接受 ftp daemon 产生的 log。从 man page 可以得知:
每个成功或是失败的 ftp 登入尝试, 都会以 LOG_FTP 机制纪录起来。如果这个选项被指定
了两次, 所有的下载 (get), 上载(put), 新增, 删除,建立目录, 及更名的动作和文件名字
都会被纪录下来。 又: LOG_FTP 讯息预设是不会被 syslogd(8) 纪录下来的。你还要在 s
yslogd(8) 的设定文件里面激活这个功能才行。
让我们开启 syslogd 纪录 ftpd log 的功能吧~ 这个档案是 /etc/syslog.conf (别忘了顺
便看看 man 5 syslog.conf)。把下面这一行加到这个设定档里:
ftp.* /var/log/ftpd
也不要忘了执行这个指令 "touch /var/log/ftpdlog", 因为 syslogd 不能写入到一个没有
被开启过的档案。如果你想要你的 ftpd 提供你更多的 log 讯息, 那么就在 ftp那一行多加
个 "-l" 吧:
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l
如果你想要确定你的使用者们都用 scp (Secure Copy, 附属在 SSH 里面), 但是又想要提供
anonymous ftp 服务, 也只消加个 "-A" 在 ftp 那行后面就行了:
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -A
你也可以编辑 /etc/ftpwelcome, 说明目前接受 anonymous ftp 登入, 但是系统内的使用者
就得使用 rcp 了。如果你有提供 anonymous ftp, 你可以使用 -S 选项来记录传输的情形:
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -A -S
5.1.1.5 fingerd
Finger 服务默认值还算安全: 它不容许不带 user name 的 query。这是一件不错的事(tm)
。然而, 就是有些人无论如何也不想 run fingerd。这种情形下, 你只要简单的给它加个 "
#" 在这行的最前面就可以了。又, 你想要 log 住谁来 finger 的话, 加个"-l" 也就行了
:
finger stream tcp nowait nobody /usr/libexec/fingerd fingerd -s -l
Fingerd 产生的 log 信息预设是写到 /var/log/messages。如果你想要这些信息写入到特定
的档案里去, 那么就在 /etc/syslog.conf 加入这一行:
daemon.notice /var/log/fingerd
/* !fingerd anyone? */
$ man 5 syslog.conf
除了 ftp, telnet 和 finger 之外, 你实在不须要在 /etc/inetd.conf 中再多激活任何东
西了。通常我都会关掉 talk 及 comsat等我个人不须要的东西。如同我之前讲的,如果你不
知到某个 servcie 是干嘛用的, 而且你也不须要它, 那么就关掉它。一些和网络有关而且很
有用的 man page 是: inetd, ftpd, telnetd, fingerd, syslogd,comsat, talkd, rshd,
rlogind, inetd.conf。并且记得要看 man page 的"SEE ALSO"部份, 以获得更多的相关信息
。
5.1.1.6 ipfw (IP FrewWall)
IP FireWall 做的是 packet 过滤的工作。没错, 就是只有这样。然而, 你要考虑的事是,
你的 kernel 要有支持 ipfw。 通常在我管的机器上, 我都会重编核心使其支持ipfw。大
概看起来是这样:
options IPFIREWALL #finger the net
options IPFIREWALL_VERBOSE #log the net
options IPFIREWALL_DEFAULT_TO_ACCEPT
第一行表示最其本的 IP FireWall 支持。第二行让 ipfw 可以把接受或拒绝 packets的纪
录 log 起来。第三行非常重要, 让 ipfw 默认值是接受任何地方来的 packets 。如果你不
这样做, 默认值拒绝任何地方来的 packets。我个比比较喜欢后者, 但我又认为在我自己的
工作站上, 或一个让人登入的工作站, 预设拒绝任何 packets 不是一件太好的事。如果你搞
不清楚自己在做啥事, 那就不要用这个选项。
就设定 firewall 而言, 这是不甚正确的。预设任何东西都该被挡掉才是正确的。如果你是
要建置一台高安全性的系统, 或一台 firewall 的话,那就千万不要加入这个选项:
options IPFIREWALL_DEFAULT_TO_ACCEPT
记住一件事: 要预设拒绝任接受任何 packets, 然后再加入 rule 来设定你想要 接受那
些 packets。查看 /etc/rc.firewall 以得到更多的信息。再一次提醒你, 不要使用这个 o
ption, 除非你只是想要防止 DoS attacks 或暂时把某些 port/network ban掉。
5.1.1.7 log_in_vain
你也可以透过 sysctl 命令, 来改变一些有用的系统变量:
# sysctl -w net.inet.tcp.log_in_vain=1
# sysctl -w net.inet.udp.log_in_vain=1
这会把尝试向你的机器要求你没有的服务的 connections log 起来。例如, 如果你在你的机
器没有跑 DNS server, 而又有个人想要向你的机器要求 DNS 服务, 这时候你就会看到
Connection attempt to UDP yourIP:53 from otherIP:X
(X 是某个 high port #)
用 "dmesg" 命令就可以看到这一行。Dmesg 秀出的是系统的 kernel messagebuffer。
然而, 这个 buffer 的空间是有限的, 所以系统也会把这些讯息写入到/var/log/messa
ges 里面去:
# tail -1 /var/log/messages
Jun 12 19:36:03 ugh /kernel: Connection attempt to UDP yourIP:53 from otherIP:X
5.1.1.8 final notes
理论上呢, 你的系统现在已经比你装好它时更安全些了。你现在可以做一些事来确定你目前
的更动:
$ netstat -na | grep LISTEN
这会告诉你那些 service 在那些 port 跑。越少越好 :) 又, 再跑一些其它的 port scann
ers (strobe, nmap) 来找出你开了那些 port。
而要确要你的 syslogd 已经开始纪下你刚刚想要 log 的事件, 可以这么做:
# cd /var/log
# tail -10 fingerd ftpd messages
在 log 档里面没看到任何东西的话, 记得重新激活 inetd 和 syslogd:
# kill -HUP `cat /var/run/syslog.pig` `cat /var/run/inetd.pid`
5.1.1.9 Filesystem
既然 Unix 把什么东西都当作档案来看待, 好好的保护你的档案系统便是很重要的事。有件
事是在你安装操作系统前便要完成的: 必须要计划并设计好你的 partition 该怎么切割。有
几个很重要的原因让你要这么做: 一个是你可以 mount 不同的档案系统以赋与不同的选项
(下面有几个例子)。别一个是,如果你想要把你的 filesystem export出去, 你须要更加细微
的控制。如果你是一个从 Linux 转入 FreeBSD 的使用者, 你会发现 Linux 是把任何东西都
往 root partition "/" 塞, 而 FreeBSD 预设便要 "/","/usr", 和 "/var"。这也使得要使
用如 dump 般的工具较容易。且让我们来讨论 security 吧! 有一件事我通常会做的是, 我
会把一般 users 可以写入的 partition 分开来割, 而这些 partitons 便可以用 "nosuid"
的方式来 mount。从 mount 的 man page 可以知道:让 suid 或 sgid bit 失效。对于像
suidperl 这些公开使用的程序, 设这个选项便没用。
因此你会有个 partition 给一般使用者使用: /home 或 /usr/home。然后你可以另外
开个 partion 给 /var/tmp 然后再把你的 /tmp 指到这里:
# rm -rf /tmp
# ln -s /var/tmp /tmp
你可以参考这个例子:
# cat /etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/sd0s1b none swap sw 0 0
/dev/sd0s1a / ufs rw 1 1
/dev/sd0s1g /usr ufs rw 2 2
/dev/sd0s1h /usr/home ufs rw 2 2
/dev/sd0s1f /var ufs rw 2 2
/dev/sd0s1e /var/tmp ufs rw,nosuid 2 2
proc /proc procfs rw 0 0
现在你可以确定一般 users 可以写入的目录不是以 "-nosuid" 的方式被 mount, 就是
没有可以写入。现在你还要关心的就是 /var/spool/uucppublic"。
你可以把 "/var" 以 "-nosuid" 的方式来 mount , 或下这个命令:
# chmod o-w /var/spool/uucppublic
如果你想要找出你所有的可写入目录, 下这个命令:
# find / -perm -0777 -type d -ls
如同 man page 指出的, 具有 suid/sgid 的程序会让你的 nosuid 失效。找出那些程式
是 suid 或 sgid 的吧:
# find / -perm -2000 -ls
# find / -perm -4000 -ls
同时你不止可以用 "-ls" 而只是知道有那些程序。你可以把不是很有用的程序 "chmod
000"。像是 uustat, uucico 等, 如果你从来不碰 uucp 的话。或是 ppp 和 pppd, 如果你
绝不会用到他们。又, 你不会去用到打印机的话, 把 lpr lprd 也 chmod 000 吧!也许改天
会有个人写个 shell script 来问你那些东西要 chmod 000 掉。
现在你也许想问, 有什么方式可以防止攻击者重新以非 "-nosuid" 的方式 mount 你的
filesystem ? Well, 没有, 除非你改变你的 securelevel。
5.1.1.10 securelevel
FreeBSD kernel 有个观念叫 securelevel。当还有人在争论这是不是够完美时,这个机
制已经够防止大部份的 "script kiddiez"。Securelevel 是指你的 kernel 在执行时的安全
等级。每一个等级具有不同的保护和检查机制。这些是 init(8) 的 man page:
Kernel 可以以四种不同的安全等级来执行。任何 superuser process 可以提高安全等级,
但是只有 init 可以降低它。这四种等级分别是:
-1 永远不安全模式 - 切换到 level 0 吧!
0 不安全模式 - "不可更动"和"只能附加"这两个旗标(flag)可以被改变。所有的
devices 可以照着它们的读写权限被读写。
1 安全模式 - "不可更动"和"只能附加" 的旗标不能被取消; mount 上来的档案系
统, /dev/mem, 和 /dev/kmem 不能写入。
2 高安全模式 - 和安全模式一样, 又多加了不管硬盘有没有被 mount 起来,除了
mount(2) 之外都不能写入。它防止一个档案系统在 umount 的时候被搞乱。而且在这个等级
也禁止在 multi-user 时执行 newfs(8)。
如果安全等级最初是 -1, 那么 init 就会保持原状。否则在 single user mode 时,in
it 会把安全等级调到 0, 而在 multiuser mode 时会以 1 来跑。如果你希望在multiuser
模式是以等级 2 在跑, 你可以先进入 single user mode, 编辑 /etc/rc,使用 sysctl 来更
动。
若是你的系统只拿来跑 web server 之类的, 你可以放心的将 securelevel调高到2。但
若是你要跑 X server, 把你的 securelevel 调至 1 或更高会导致一些问题。因为X serve
r 必须要写入 /dev/mem 和 /dev/kmem, 而 securelevel 1 不允许你这么做。有一个解决的
方法是, 在激活 X server 后再调高 securelevel。但我的意见是, 如果你跑 X server 的
话, 你已经有了其它的安全问题须要考量, 而不止是 securelevel。以下这个指令会显示出
你目前的 securelevel 设定值。
# sysctl kern.securelevel
如果要提高你的 securelevel:
# sysctl -w kern.securelevel=X
X 可以是 0, 1 或 2。
又在 securelevel 是 1 的话, 你在 "make world" 时也会有些问题。因为 "make ins
tall" 时会在 kernel 上加上 immutable flag:
# ls -lo /kernel
-r-xr-xr-x 1 root wheel schg 1061679 Jun 30 01:27 /kernel
"schg" flag 会防止你安装新的 kernel:
nfr# id
uid=0(root) gid=0(wheel) groups=0(wheel), 2(kmem)
nfr# sysctl kern.securelevel
kern.securelevel: 2
nfr# rm -rf /kernel
rm: /kernel: Operation not permitted
nfr# mv /kernel /tmp/
mv: rename /kernel to /tmp//kernel: Operation not permitted
如果你在 securelevel 1 或 2, 那么 schg flag 是不能被改变的。
# chflags noschg /kernel
chflags: /kernel: Operation not permitted
值得留意的是, /boot.config 可以改变你开机时的系统设定,要预防有心人篡改你应该
这么做:
# touch /boot.config
# chflags schg /boot.config
你可以看看系统预设还有那些执行档是有 schg flag 的。
# ls -lo /sbin | grep schg
-r-x------ 1 bin bin schg 204800 Jul 19 20:38 init
# ls -lo /bin | grep schg
-r-sr-xr-x 1 root bin schg 192512 Jul 19 20:36 rcp
再回过头来谈谈锁定系统这件事吧! 既然刚刚谈到了 immutable flags, 何不试着把整
个 /sbin 和 /bin 都设成 schg flag 呢 !? 这会给想 crack你系统的人一点小挫折。(假设
你的系统也正以适当的 securelevel 运作中)
# chflags schg /bin/*
# chflags schg /sbin/*
不过 /sbin 可能被改成别的名字,再重新创造一份新的 /sbin ,所以改变 /sbin 与/bi
n 的 schg flag 是很合理的想法,我们可以依照以下的方式改变 /sbin 和 /bin 的 schg f
lag:
# chflags schg /bin/*
# chflags schg /sbin/*
这些 schg flag 的档案会让你在 "make world" 时有问题。
("make installworld" 也是)
无论如何 ,最好是以 single user 模式来 "make world"。有关 "makr world" 的相信
息, 还有为什么要这么做, 到下面这个网页来看看:
http://www.nothing-going-on.demon.co.uk/FreeBSD/make-world/make-world.html
现在你已经适当的锁定你的系统, 也以只跑必要的的 service, 而档案系统也适当的mo
unt 上来, 且也以适合的 kernel securelevel 运作中。
与以上所述的相关 man pages 有: init(8), chflags(1), sysctl(8)。
5.1.1.11 Logging
系统纪录是很重要的。如果你的统被人攻击, 透过它你可以找到一些蛛丝马迹。Unix的
标准 log 动作是透过 syslogd(8) 来达成的。它从 /etc/rc 中被激活, 一直执行到系统关
机为止。你可以用以下的方式确定你的系统上是否正在执行 syslogd:
$ ps -axu | grep syslogd
Syslogd 会在激活时读取 /etc/syslogd.conf。这个档案很重要, 因为它告诉 syslogd
要纪录那些东西, 而这些东西又该放在那里。你也许想看看 syslod 和 syslod.conf的 m
an pages:
$ man syslogd ; man 5 syslog.conf
既然 Unix 当初就是设计作为网络操作系统, syslogd 可以而且默认值也接受其它系统
的纪录。它自己也是可以把纪录透过网络送到其它的计算机去。想当然耳, 它可以纪录下 自
己系统发生的每件事 - 而这也正是默认值。因为 syslogd 使用 UDP - 所以资料是可以被
伪造的。你至少可以作一件事: 不要让你的 syslogd 接受来自其它计算机的纪录讯息。在
/etc/rc.conf 加个 "-s" 就可以了:
syslogd_flags="-s" # Flags to syslogd (if enabled).
如果你有接受特定机器之纪录的必要 (像是你的 router, 或是 web server), 使用
"-a" 来指定特定的 hosts, domains, 或 subnets。
下次你重新激活你的系统时, syslogd便会拒绝来自其它地方的纪录讯息。如果有人尝试
送资料进来, syslogd 将会加以纪录。
如果你不想重新激活你的系统, 那么只要把 syslogd kill -9, 然后再以 root 的身份
激活 syslogd 便可以了。记得加上 "-s"这个参数。
如果有人尝试攻击你的系统而且失败了, 你的系统纪录便不会被伪造。但如果你的系统
己经被攻陷了, 而且 /var/log 整个被干掉了呢 !?还是有方法可以防止的。 其一便是在你
的网络系统中再架一台机器拿来纪录整个网络中发生的事, 而且也不要再干其它的事了。除
了 UDP port 514 之外, 其它的也都不用再开了。这样子一来你便可以纪录下所有机器 (ro
uters, firewalls, serves, workstations) 发生的所有事。你可以只送敏感的讯息给它,
或者任何你觉得重要的。这台机器可以是老旧 486, 但有颗大大的硬碟。记得要设定好正确
的 "-a" 选项, 免得搞出没收到纪录的乌龙事。你也可以接台老旧的点阵打印机给它, 以印
出敏感的事件(像是失败的登入尝试)。如果你把系统纪录印到纸上, 一位攻击者要清除它是
很困难的。还有其它的方法,例如透过 serial port (cuaaN) 或是 parallel port (lpN) 送
出纪录到别台机器上。
每个人都有不同的记录需求。但是有一件事我通常会做的是在 /etc/syslog.conf 加入
这一行:
auth.* /var/log/authlog
FreeBSD 出厂时便包含了 newsyslog。这玩意会定时压缩纪录文件并清除掉旧的纪录。
设定档位于 /etc/newsyslog.conf - 请看一下 man page 以得到更多的信息:
% man newsyslog
不像 syslogd, newsyslog 不是一直都在执行的。它是从 crontab 激活的:
% grep newsyslog /etc/crontab
0 * * * * root /usr/sbin/newsyslog
%
你可以修改 /etc/newsyslog.conf 以符合你的需求。我通常会改变它预设的档案模式,
从 664 改成 660 - 因为没有必要让一般的使用者去查看你的系统纪录。你应该这么做:
# cd /var/log
# chmod g-w,o-r * ; chmod a+r wtmp
这会防止一般使用者读取纪录文件, 除非它们在适当的 group (wheel 或之类的)。还有
,记得把记录文件的 group 都改成 wheel -- 这纯粹只是为了方便: 如果你是在 wheel 这个
group; 你当然是可以 su(1) 到 root 然后读记录文件。但是这么做以后你便可以直接读
记录文件了, 岂不方便乎!?你还要在 /etc /newsyslog.conf 中加入 "root.wheel":
/var/log/maillog root.wheel 640 7 100 * Z
/var/log/authlog root.wheel 640 7 100 * Z
/var/log/messages root.wheel 640 7 100 * Z
这会在记录文件达到 100K 时将它压缩并加以编号, 将 mode 改成 640, chown
成root.wheel, 并将旧的记录文件干掉 - 这就是我们要的。
当然,标准的 Unix 还有其它不同的 syslog 程序可供选择,其中之一是 CORE EDI 的ss
yslog (secure syslog). 可以在以下的地方找到:
http://www.core-sdi.com/ENGLISH/CoreLabs/ssyslog/download.html
另外还有 nsyslog (new syslog),这是写 bpfilter 那一伙人写出来的,你可以在
http://cheops.anu.edu.au/~avalon/nsyslog.html 找到这个程序。
不管你选用那一种程序 (标准的 syslog , ssyslog ,或 nsyslog),你应该也去看看一些
帮你分析系统 log 的程序,帮你省下去用 grep 查询 log file 的麻烦。
其中之一是 logcheck , 可以在这个地方下载:
http://www.psionic.com/abacus/abacus_logcheck.html
另外一个类似的程序叫做 logsurfer , 你可以从这个网页下载:
http://www.cert.dfn.de/eng/team/wl/logsurf/
5.1.2 Misc. hints and tips
5.1.2.1 LKM
在正式提供服务的系统上, 也许该关掉 LKM。为什么? 请看:
Phrack Magazine Volume 7, Issue 51 September 01, 1997, article 09
要关掉 LKMs, 在 kernel 设定档中加入这一行:
options NOLKM
5.1.2.2 Portmap
FreeBSD 出厂的默认值会将 portmap 这项功能打开。如果你不需要它的话,把它关掉。
如果你没有跑任何需要呼叫 RPC 的程序的话,你就不需要跑这个程序。如果要关掉portmap
这个程序,你可以去修改 /etc/rc.conf , 把
portmap_enable="YES" # Run the portmapper service (or NO).
改成
portmap_enable="NO" # Run the portmapper service (or NO).
5.1.2.3 Sendmail
FreeBSD 出厂的默认值也会执行 sendmail 的功能。从很久以前 sendmail 就以不安全
且漏洞百出闻名。最近人们努力的将 sendmail 中的错误清除,但是由于 sendmail是一个很
肥大的程序,要将所有的错误都抓出来相当的困难。换句话说:如果你不需要它的话,最好把它
关掉。如果你真的需要它的话,最好到 sendmail 的网站去看看有没有新的patches 或是 ha
cks, sendmail 的网站在 http://www.sendmail.org 。
此外,如果你的 sendmail 版本是 8.8 以后的版本,请设定好你的系统,以防止 spammer
利用你的系统去干坏事。设定 anti-spam 的信息可以在
http://www.sendmail.org/antispam.html 下找到。
如果你决定要把 sendmail 关掉的话,只要去修改 /etc/rc.conf (没错,又是它)中的:
sendmail_enable="YES" # Run the sendmail daemon (or NO).
改成
sendmail_enable="NO" # Run the sendmail daemon (or NO).
5.1.2.4 Ports and Packages
在一台高安全性的系统上, 最好不要使用 ports 或 packakges。 你不会真正知道是不
是安装 suid 的程序进你的系统 -- 而且你不会想再多这些 suid 的东西了, 相信我。尽管
你在 pkg_add 时可以使用不同的选项(如 "-v" 或 "-n"), 最好还是自己来: 抓回它的 sou
rce code, 自己 compile, 再手动安装完成。
5.1.2.5 Filesystem quota
如果你的系统是 "shell" type server,你可能希望设定使用者的 quota (可用空间)。
如此一来可以保护你的系统免受 Denial of Service 攻击方式的侵扰(不论是有意或是无意
的)。在未设定 quota 的系统上使用者可以随意的灌爆你的硬盘。要把 quota这项功能打开
,你可以修改 /etc/rc.conf 中的这项设定:
check_quotas="NO" # Check quotas (or NO).
改成
check_quotas="YES" # Check quotas (or NO).
请先看看以下的 man page,这些文件说明如何使用 quota 的各项设定,并且有一些设定
的范例: quotaon, edquota, repquota, quota
请确定在 /etc/fstab 中有加入 "userquota" , 详见 man 5 fstab。
5.1.2.6 Crontab
如果你使用了 /etc/crontab 的话,这项功能有可能提供入侵者一些额外的信息。
请确定你做过 "chmod 640 /etc/crontab"
5.1.2.7 BPF
BPF 是 berkeley packet filter 的缩写,要使用这项功能前你必须修改 kernel,以达成
监听网络的目的。像 tcpdump 和 NFR 这些程序都使用 BPF。然而 BSD的监听程序也都透过
BPF 来达成,如果有人拿到你系统的 root 权限的话,在系统上设定 BPF 功能反而帮助他们
更容易的监听你的网络。如果没有必要的话,不要设定 kernel 中 BPF的功能。 FreeBSD 出
厂的设定值是将这个功能关闭起来的。
5.1.2.8 CVSup, CVS, 等等
如果你是使用 CD-ROM 安装你的系统的话,很有可能当你拿到你的 CD-ROM时,已经发现某
些程序有错误存在了。在大部份的情况下(我们希望如此),这些错误与系统安全无关。然而,
我建议你将你的系统升级到最新的 -current (或是 -stable,视你的喜好而定) 版本。如此
你可以确定你系统上的的是最新版本的系统原始码。
你需要的信息在这边可以找到:
http://www.freebsd.org/handbook/handbook264.html#508
在更新你操作系统的原始码后你必须去 "make world",详细的文件在:
http://www.nothing-going-on.demon.co.uk/FreeBSD/make-world/make-world.html
5.1.2.9 SSH
使用 ssh 以代替 telnet, ftp, rlogin, rsh 等的重要性, 再怎么强调都是不够的。
对于使用慢速线路的人 (dial-up, 56K frame), ssh 有 -C 选项:
-C 将数据压缩后再传出去, 包括了 stdin, stdout, stderr还有透过 X11 还有
TCP/IP。压缩的算法同 gzip, 而且可以指定压缩的 level。对于 moden users 和使用慢速
线路的人, 这功能是不错的。 但有高速线路的人, 这么搞只会拖慢速度。在主机对连时可以
设默认值, 请再参照文件。
这会让你用起来快一点 :) 总之就是用 SSH 就对了啦! 拜托, 拜托, 使用 ssh。 如果
你硬是不信邪, 再也没什么安全措施可以帮助你了 !!
5.1.2.10 Related URLs
1) FreeBSD Hardening Project:
http://www.watson.org/fbsd-hardening/
2) FreeBSD ipfw Configuration Page:
http://www.metronet.com/~pgilley/freebsd/ipfw
3) FreeBSD Security advisories:
ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/
4) FreeBSD Security web page:
http://www.freebsd.org/security/security.html
5) Security tools in FreeBSD:
http://www.samag.com/archive/0705/feature.html
5.2 sco 系列
5.2.1 抓好网内主机的管理是网络安全管理的前提
用户名和密码管理永远是系统安全管理中最重要的环节之一,对网络的任何攻击,都不
可能没有合法的用户名和密码(后台网络应用程序开后门例外)。但目前绝大部分系统管理
员只注重对特权用户的管理,而忽视对普通用户的管理。主要表现在设置用户时图省事方便
,胡乱设置用户的权限(id)、组别(group)和文件权限,为非法用户窃取信息和破坏系统
留下了空隙。
金融系统UNIX的用户都是最终用户,他们只需在具体的应用系统中工作,完成某些固定
的任务,一般情况下不需执行系统命令(shell)。以农业银行全国电子汇兑为例,用户名为
dzhd,它在/etc/passwd文件中描述如下:
dzhd:x:200:50: :/usr/dzhd:/bin/sh
它的.profile内容大致如下:
COBSW=+R+N+Q-10
DD_PRINTER=“1p-s”
PATH=/etc:/bin:/usr/bin:$HOME/bin:/usr/dzhd/obj:
MAIL=/usr/spool/mail/logname
umask 007
eval`test -m ansi:ansi -m:/?ansi -c -s -Q`
export PATH MAIL COBSW DD_PRINTER
cd usr/dzhd/obj
runx hdg
exit
用户正常登录后,如果按下中断键“delete”,关掉终端电源,或同时键入“Ctrl”“
/”,那么用户将进入shell命令状态。例如他可以在自己的目录不断创建子目录而耗尽系统
的I节点号、或用yes>aa创建一个其大无比的垃圾文件而耗尽硬盘空间等导致系统的崩溃、瘫
痪;如果文件系统的权限设置不严密,他可运行、窥视甚至修改它;还可通过su等命令窃取
更高的权限;还可登录到其它主机上去捣乱……令你防不胜防,危险性可想而知。这一些问
题都与用户设置有关。所以,尽量不要把用户设置成上述形式。如果必须这样,可根据实际
需要,看看能否把用户的sh变成受限sh,如rsh等,变成如下形式:
dzhd:x:200:50: :/usr/dzhd/obj:/bin/rsh
或如下形式:
dzhd:x:200:50: :/usr/dzhd:./main
在main(.porfile)首部增加如下一行:
trap' ' 0 1 2 3 5 15
那么上述一切问题都可避免。
此外定期检查你的/etc/passwd文件,看看是否有来历不明的用户和用户的权限;定期修
改用户密码,特别是uucp、bin等不常用的用户的密码,以防有人在此开个活动的天窗--一个
可自由进出的用户;删除所有睡眠用户等。
5.2.2设置好自己的网络环境是阻止非法访问的有效途径
网上访问的常用工具有telnet、ftp、rlogin、rcp、rcmd等网络操作命令,对它们的使
用必须加以限制。最简单的方法是修改/etc/services中相应的服务端口号。但这样做会使网
外的一切访问都被拒绝,即使是否法访问也不例外。这种闭关自守的做法不值得提倡,因为
这样会使本网和网外隔绝开,也会给自己带来不便。通过对UNIXt系统的分析,我们认为有可
能做到有条件限制(允许)网上访问。
5.2.2.1 建立etc/ftpusers文件(不受欢迎的ftp用户表)。
与之相关的命令是ftp。配置如下:
#用户名
dgxt
dzhd
…
以上都是本机内的一些用户,侵入者使用以上用户名ftp访问本网会被拒之门外。
5.2.2.2 保存.netrc文件
注意保存好.netrc文件(远程注册数据文件)。与之有关的命令是ftp。.netrc包含注册到网
络上用ftp作文件转移的远程主机的数据。通常驻留在用户当前目录中,文件权限必须为060
0。格式如下:
machine对方主机名login对方主机内用户名password对方用户密码macdef init ftp的操
作命令集。
5.2.2.3 创建匿名ftp
所谓匿名ftp,是指其他主机的用户能以ftp或anonymous用户进行数据收发而不要任何密码。
建立方法如下:
1) 用sysadmsh创建ftp用户,在passwd文件表示为:
ftp:x:210:50: :/usr/ftp:/bin/sh
.profile中的路径为:
PATH=$HOME/bin:$HOME/etc
2) 在/usr/ftp目录:
#创建匿名ftp所用的目录
#mkdir bin etc dev pub shlib
#改变pub以外所有目录权限
#chmod 0555 bin etc dev shlib
#改变pub目录的所有者和同组者
#chown ftp pub
#chgrp ftp pub
#复制匿名ftp所执行文件
#cp/bin/rsh/bin/pwd/bin/1s bin
#改变所需执行文件权限
#chmod 011 bin/*
#查看所需伪设备的情况
#1/dev/socksys
#1/dev/null
#建立所需伪设备的驱动程度
#cd/usr/ftp/dev
#mkond null c 4 2
#mkond socksys c 26 0
#改变伪设备驱动程序的所有者、同组者
#chown ftp ftp/*
#chgrp ftp ftp/*
#复制共享文件
#cp/shlib/ilbe_s shlib
注意不要复制/etc/passwd、/etc/proup到etc下,这样对安全具有潜在的威胁。此外给
ftp用户加上密码,不要告诉其他任何人。
5.2.2.4 限制.rhosts用户等价文件(又叫受托用户文件)
与之有关命令有rlogin、rcp、rcmd等。
所谓用户等价,就是用户不用输入密码,即可以相同的用户信息登录到另一台主机中。
用户等价的文件名为.rhosts,存放在根下或用户主目录下。它的形式如下:
#主机名 用户名
ash020000 root
ash020001 dgxt
…
如果用户名为空,是所有用户均等价。
5.2.2.5 限制hosts.equiv主机等价文件,(又叫受托主机文件)
有关的命令为rlogin、rcp、rcmd等。主机等价类似于用户等价,在两台计算机除根目录外的
所有区域有效,主机等价文件为hosts.equiv,存放在/etc下,它的形式如下:
#主机名 用户名
ash020000
ash020001
…
当远程使用ftp访问本系统时,UNIX系统首先验证用户名和密码,无误后查看ftpusers文
件,一旦其中包含登录所用用户名则自动拒绝连接,从而达到限制作用。因此我们只要把本
机内除匿名ftp以外的所有用户列入ftpusers文件中,即使入者获得本机内正确的用户信息,
无法登录系统。需对外发布的信息,放到/usr/ftp/bub下,让远方通过匿名ftp获取。使用匿
名ftp,不需密码,不会对本机系统的安全构成威胁,因为它无法改变目录,也就无法获得本
机内的其他信息。使用.netrc配置,需注意保密,防止泄露其他相关主机的信息。
使用用户等价和主机等机这类访问,用户可以不用口令而像其他有效用户一样登录到远
程系统,远程用户可使用rlogin直接登录而不需密码,还可使用rcp命令向或从本地主机复制
文件,也可使用rcmd远程执行本机的命令等。因此主种访问具有严重的不安全性,必须严格
控制或在非常可靠的环境下使用。1998年美国发现的著名的“蠕虫”病毒,由一个叫英尔(
morris)的年青人编写的,在Internet网上流传开,造成许多UNIX系统的瘫痪,损失达数亿
美元,其重要的传播手段之一就是利用了用户等价和主机等价的配置。慎重使用(最好不用
)和经常检查上述文件,会有效加强系统安全。
UNIX系统没有直接提供对telnet的控制。但我们知道,/etc/profile是系统默认shell变
量文件,所有用户登录时必须首先执行它。如果我们在该文件首部增加如下几条shell命令:
#设置中断变量
trap' ' 0 1 2 3 4 5 15
umask 022
#获取登录终端名
dc=“'who am i |awk‘[prin $2]’`”
#检查是否受限
grep $de /etc default/aaa >dev/null 2>&1
#如果受限
if [$?=“0”]
then
echo“请输入密码:/c”
read abc
#获取正确密码
dd=“grep root /etc/edfault/aaa|awk’[pint $2]’`”
#非法用户发出警告信息到主控台
法[“$abc”!=$dd]
then
echo “非法用户!”
echo“有非法用户试图登录!”>tev/tty01
logname>/dev/tty01
#同时记载日记文件
echo“有非法用户试图登录!/c”> >/usr/tmp/err
echo $dc> >/usr/tmp/err
logname > >/usr/tmp/err
exit;
fi;
fi
其中/etc/default/aaa是受限终端名的一个文本文件,root后为密码,它的内容如下:
root qwerty
ttyp0
ttyp1
ttyp2
ttyp3
ttypa
ttypb
…
这样非法用户即例获得了合法的用户名和密码,也无法远程使用。系统管理员定时阅读
日记文件,注意控制台信息,就能获得被非法访问的情况,及时采取措施。如果用c语言实现
上述过程,把接受爱变成不可显示,效果更佳。
5.2.3 加强对重要资料的保密
它主要包括hosts表、X.25地址、路由、连接调制解调器的电脑号码及所用的通信软件的
种类、网内的用户名等,这些资料都应采取一些保密措施,防止随意扩散。如可向电信部门
申请通信专用的电话号码不刊登、不供查询等。由于公共的或普通邮电交换设备的介入,信
息通过它们后可能被篡改或泄露。
5.2.4 加强对重要网络设备的管理
路由器在网络安全计划中是很重要的一环。现在大多数路由器已具备防火墙的一些功能
,如禁止telnet的访问、禁示非法的网段访问等。通过网络路由器进行正确的存取过滤是限
制外部访问简单而有效的手段。
有条件的地方还可设置网关机,将本网和其他网隔离,网关机上不存放任何业务数据,
删除除系统正常运行所必须的用户外所用的用户,也能增强网络的安全性。
总之,只要我们从现在做起,培养网络安全意识,并注意经验的积累和学习,完全可能
保证我们信息系统的安全、正常运行。
--
你佛慈悲
※ 来源:.The Big GreenWWW BBS.Dartmouth.Edu. [FROM: 129.170.29.245]
--------------------------------------------------------------------------------
主选单 本讨论区 主题模式 上一篇 下一篇 登录
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。