免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1234 | 回复: 0
打印 上一主题 下一主题

Unix安全设置和常见攻击手段的防范 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-10 14:37 |只看该作者 |倒序浏览
转一篇关于Unix安全的文章,一起学习一下!
                  第一部分 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 Information and Computing System。“Unix”和“UNIX”在如今都被广泛使用。曾经有一段时间,Dennis Ritchie试图宣布用小写版本,因为“UNIX”不是开头字母组成。
  许多运行Linux等类似UNIX系统的人认为他们运行的是UNIX。正式UNIX系统和非正式UNIX系统通常被认为属于一类----不论是书中、媒介、网上还是社会公认。
  按照UNIX FAQ的定义,UNIX是“一个用C语言编写的操作系统,它有层次文件系统并集成了文件和设备I/O,其系统调用接口包括fork ( )和pipe ( )等服务,用户界面包括cc、troff、grep、awk等工具和一个被选择的shell”。可以再加一些,UNIX为多任务提供一致的方式,并内置有创建、同步和终止进程的操作,它可在不同种类计算机间进行移植。  
1.2 UNIX发展与历史
1969年,Ken Thompson、Dennis Ritchie和其他一些人在AT&T贝尔实验室开始进行一个“little-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 Operation。同时,UNIX商标被转让给X/Open协会,X/Open协会后来成为了Open Group。
当UNIX的经营从一个实体到另一个实体传递时,几个长期的开发开始收获果实。传统上,要得到一个运行的BSD系统,用户需要从AT&T得到源代码许可证。但到90年代早期,伯克利的开发者在BSD上做了许多工作,使原始的AT&T源代码大部分被改动了。后续的程序员,从William和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版。Linus和朋友们有一个免费内核,Stallman和朋友们拥有一个免费的UNIX克隆系统的其余部分。人们把Linux内核和GNU合在一起组成一个完整的免费系统,该系统被称为“Linux”,尽管Stallman更愿意取名为“GNU/Linux System”[6]。有几种不同类别的GNU/Linux:一些可以被公司用来支持商业使用,如Red Hat、Caldera Systems和S.U.S.E;其他如Debian GNU/Linux,更接近于最初的免费软件概念。
Linux现已发展到内核2.2版。Linux能在几种不同体系结构的芯片上运行,并已经被各界接纳或支持。其支持者有惠普、硅谷图像和Sun等有较长历史的UNIX供应商,还有康柏和Dell等PC供应商以及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登入状态使用eeprom 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。 "effective user ID"是在登录后的会话过程中通过SUID和SGID位来修改。当一个用户运行一条命令时,进程继承了用户登录Shell的权限,这时"real user ID"和"effective user ID"是相同的。当SUID位被设置时,进程继承了命令拥有者的权限。例如普通用户运行passwd命令时,他能够修改/etc/passwd文件,尽管文件是属于root的。这成为可能是因为passwd命令以root的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 / -type 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下的PGP工具为:pgpe(加密)、pgps(签名)、pgpv(确认/解密)、pgpk(管理密钥)。请参考相应的帮助来使用。
"特洛伊木马"的故事不知道大家听说过没有。古希腊人久攻特洛伊城不下,于是假装求和,送了一个巨大的木马作为礼物,向城主Minerva表示和解。特洛伊人将木马拉入城内,到了夜晚,藏在木马中的希腊士兵钻出来,里应外合,攻破特洛伊城。在计算机安全领域,这种欺骗技巧成为攻击计算机安全的一种标准方式。他藏在你的计算机里,随时可能爆发,如果攻击者需要的话。因此,一旦一个系统被装了特洛伊木马,他就不能在信任了,必须从新安装。怎么避免呢,要养成良好的习惯,例如:限制下载,只从有声望的站点下载东西;检验下载的文件;避免运行已编译好的二进制代码,从源代码开始编译;不执行不信任的电子邮件发送的程序;不执行从非信任的Web站点得到的Java applets和Java Script。
MD5校验和有时与软件一起发行,用户可以用他来检验一个软件包。用户可以运行Red Hat Linux中包含的md5sum工具,例如:md5sum cops.1.04.tar.gz
结果:lfa416872934e5bee99068f9989cb8b0 cops.1.04.tar.gz
和软件包自带的校验和文件比较,如果不符,则说明文件在传输过程中出了问题,最好从新下载,本文件不可靠。md5sum还可以用来检验系统文件,在第一次安装系统之后对重要的lilo系统二进制文件进行一下校验: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程序一样,可以根据自己的风险来运行restore。
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等等,简单的办法是在/etc/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/hosts.allow,如果你在这里面允许了某几台主机的telnet或ftp访问的话,那么deny访问就是对其它所有机器的了。这是"默认拒绝"的访问控制策略,下面是一个hosts.allow文件的样本:
      ALL: 172.16.3.0/255.255.255.0
这将允许172.16.3.0网络的主机上任何用户访问你的telnet及ftp服务,记住在这里要放置IP地址,因为域名比较容易受到欺骗攻击……
现在我们准备拒绝其余所有人的连接了,将下面的语句放在/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文件来修改启动时自引导的动作。考虑移去/etc/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 servers, 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两个文件决定了一个特定用户是否可以运行at命令。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.deny
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不能这样工作,为了避免多次地输入unzip,你可以用下面的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 编译器。(待续)........

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/12245/showart_229505.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP