分享好友 技术首页 频道列表

Unix网络的两个安全问题

2012-04-11

虽然已经有许多文章对有关Unix网络的安全性问题进行了广泛的论述,但随着技术的进步和人们对安全问题的认识的深入,总是不断有安全问题被暴露出来,并被加以修正。本文介绍两个由于技术上认识不足而造成的安全问题,并给出解决方法。 
关机用户的安全问题。 
      近年来,许多文章相继介绍了一种所谓最安全的Unix的关机用户。其主要思想是直接在/etc/passwd文件或/etc/shadow文件中的关机用户一行的末尾加入/etc/shutdown命令或加入/etc/haltsys命令以代替/bin/sh命令。这样即使有人知道了关机用户的密码(或没有设置关机用户的密码),也不能通过关机用户进入Unix系统,关机用户被严格界定为有且仅有关机功能的超级用户。这一关机用户已被公认为“最安全的关机用户”。 
      该用户和其他的关机方法相比安全性有所提高,特别是在单机状态下,其安全性值得信赖。但令人遗憾的是,该关机用户在Unix网络中也存在着一定的安全隐患。这主要是由关机用户本身的用途所造成的,首先由于网络中的用户几乎都需要关机用户,所以关机用户往往不设密码或由多人同时掌握密码;另一方面要关闭Unix系统就必须使关机用户具有超级用户的权限。这样,虽然不能用DEL键中断或su命令等手段非法侵入Unix系统, 但利用一些网络远程命令却有可能通过关机用户侵入Unix系统,甚至进入超级用户root的sh状态。 
1.提出问题 
      假设计算机A中有一个关机用户名为shutdown,其设置和权限控制按“最安全的关机用户”的方法设定,因为系统管理员、软件管理员、一般操作员都要使用该用户, 故而未对其设置密码。设计算机A的IP地址为129.15.21.77。 
      此时如果想从另一台计算机(假设为计算机B)中向计算机A发起攻击,则利用Unix系统网络远程命令, 通过计算机A的“最安全的关机用户”:shutdown即可达到目的。首先在计算机B中的/etc/hosts文件中加入如下代码: 
129.15.21.77 hostshut 
然后在计算机B中进入任何一个普通用户,键入以下命令: 
rcmd hostshut -l shutdown vi /etc/passwd 
或 rcmd hostshut -l shutdown vi /etc/shadow 
      这样,该普通计算机用户已在计算机B中用vi命令打开了计算机A中包括root超级用户在内的所有用户的密码文本。接下来只要改动或删除这些密码,就可以轻松地用telnet、rlogin等远程命令登录到计算机A的任何一个用户中。如果此时闯入的是一个恶意用户, 对计算机A来说其后果将不堪设想。 
2.解决问题 
      为了解决这个安全问题,首先可以封闭inetd守护进程中的部分远程功能,如telnet、shell、login、exec等,方法是直接用vi修改/etc/inetd.conf文件,在上述功能前添加#号,然后执行/etc/inetd命令即可。但这样大大削弱了Unix系统的网络功能,并可能影响到其他计算机应用方案的实施。 
经过实践,笔者发现了一种相当安全的关机方法,该方法采用了输入/输出重定向、Unix哑终端技术和Unix定时系统来实现安全的关机。具体做法如下: 
首先在超级用户中输入如下命令,使tty12终端成为哑终端: 
#disable /dev/tty12 
由于需要在哑终端tty12中运行关机程序,而哑终端的窗口在原始模式下工作, 所以不能用Unix系统命令read进行输入,必须自己编写一个能在原始模式下实现输入/输出功能的程序。用cc -lcurses命令编译以下源程序,并生成可执行文件safehalt: 
file://安全关机程序 
#include<curses.h> 
#include<termio.h> 
#include<stdio.h> 
#include<string.h> 
main() 


WINDOW *win; 

char til[]=“是否现在关机?确认请按yes:”,s1[4],sum[100]; 
struct termio save,term; 
initscr(); raw(); noecho(); 
keypad(stdscr,TRUE); clear(); 
ioctl(0,TCGETA,&term); 
save=term; 
win=newwin(24,80,0,0); 
while(s1[0]!=‘q’) 

s1[0]=‘\0’;s1[1]=‘\0’;s1[2]=‘\0’; 
mvwaddstr(win,5,0,til); 
wrefresh(win); 
read(0,&s1[0],1); 
if(s1[0]==‘y’) 

sprintf(sum,“%s%s”,til,s1); 
mvwaddstr(win,5,0,sum); 
wrefresh(win); 
read(0,&s1[1],1); 
if(s1[1]==‘e’) 

sprintf(sum,“%s%s”,til,s1); 
mvwaddstr(win,5,0,sum); 
wrefresh(win); 
read(0,&s1[2],1); 
if(s1[2]==‘s’) 
system(“/etc/shutdown -g0 -y”); 



keypad(stdscr,FALSE); echo(); 
noraw(); endwin(); 

最后编制一个Unix的shell脚本atsh,包括以下内容: 
at now +1 day 
/usr/bin/safehalt 
执行一次atsh脚本程序后,该程序以后会自动执行。 
      这样每天在tty12屏幕上都会自动运行一个关机程序,当输入yes后,机器将被关闭,当然也可以在程序中设置关机密码。该方法彻底排除了由关机用户引起的安全性问题。 
自动传输数据的安全问题 
      在Unix系统中自动批量发送数据文件的方法主要有两种:一种方法是在用户的宿主目录下增加.netrc文件, 并在文件中加入远程机器的host名、用户名和密码,然后在建有.netrc文件的用户登录后用ftp自动批量发送文件;另一种方法是用Unix的shell编写一个批处理的脚本文件, 以执行该脚本文件来自动批量发送数据。上述两种方法虽然都可以实现自动批量发送数据文件的目的,但却存在一些安全隐患。这两种方法都使用了纯文本文件的方式来存放远程机器的host名、IP地址、用户名和密码,因此只要用简单的Unix命令如cat、vi、more等就可以对远程机器的主要秘密一览无遗。 
      为增加安全性,必须对这些秘密信息进行隐藏和加密。笔者用C语言程序的二进制代码封装远程机器的IP地址、host名、用户名和密码以增加其安全性。在用C语言进行编程封装时,注意不能在程序中把远程机器的IP地址、host名、用户名和密码等重要信息直接赋值给字符串变量。如果直接赋值给字符串变量,就很容易被人用Unix命令strings、hd和DOS操作系统的常用工具pctools从C程序的二进制代码中找到上述重要信息。还要注意不能在程序执行过程中产生带有上述远程机器重要信息的中间文件。如果出现这些中间文件,虽然可以在程序结束前删除它们,但遇到发送的数据文件数量多时间长时, 这些中间文件就有可能被调看而泄密,所以最好不要在程序中产生中间文件。 
      下面这个简短的程序例子是从本地机器的超级用户中把数据文件发送到另一台机器的超级用户中, 可以实现多个文件的连续自动批量发送。尽管该程序使用了超级用户进行数据发送,但由于编程时进行了巧妙的设计,所以当它被编译成可执行代码后,很难从这些二进制代码中发现有关本地计算机和远程计算机的安全方面的重要信息。同时,该程序采用了管道通信方法从而在执行过程中不会产生任何中间文件,安全性相对较高。实现代码如下: 
file://安全发送数据 
#include<stdio.h> 
#include<string.h> 
main(int argc,char *argv[]) 

int i,u1,u2,u3,u4; 
float ip1,ip2; 
char pw[10]=“”,us[5]=“”,ftpn[4]=“”; 
char ftpcmd[500]=“”,runl[10]=“”; 
char ftpprt[256]=“”; 
FILE *fftp; 
if(argc>1) 

us[0]=‘u’;us[1]=‘s’;us[2]=‘e’;us[3]=‘r’; 
u1=‘r’;u2=‘o’;u3=‘o’;u4=‘t’; 
pw[0]=‘5’;pw[1]=‘1’;pw[2]=‘2’; 
pw[3]=‘7’;pw[4]=‘3’; 
pw[5]=‘7’;pw[6]=‘4’; 
ftpn[0]=‘f’;ftpn[1]=‘t’;ftpn[2]=‘p’; 
ip1=106.73;ip2=168.13; 
printf(“\f 从本机数据:\n”); 
for(i=1;i<argc;i++) 

sprintf(runl,“l %s”,argv[i]); 
system(runl); 

sprintf(ftpcmd,“%s%s -n -i %.2f.%.2f < 
sprintf(ftpcmd,“%s%s %c%c%c%c %s \n”,ftpcmd,us,u1,u2,u3,u4,pw); 
sprintf(ftpcmd,“%scd /usr/tmp \n”,ftpcmd); 
for(i=1;i<argc;i++) 

sprintf(ftpcmd,“%sput %s \n”,ftpcmd,argv[i]); 
sprintf(ftpcmd,“%sls %s \n”,ftpcmd,argv[i]); 


sprintf(ftpcmd,“%sCMD\n”,ftpcmd); 

printf(“\n正在发送……\n”); 

fftp=popen(ftpcmd,“r”); 

i=0; 

while(fgets(ftpprt,256,fftp)!=NULL) 



i++; 

if(i>0) 

printf(“%s”,ftpprt); 



pclose(fftp); 






收藏
最新型5米法暗室的建造
在四年前,我们注意到来自汽车工业的EMC测试的需求增长。随着现在轿车和卡车搭载各种电子装置,使得它们越来越易于受到杂散辐射的

0评论2009-09-17

信息化条件下的计算机安全和保密问题
随着信息技术的飞速发展,计算机及网络在政治、经济、社会、文化等各个领域起着越来越大的作用。与此同时,信息安全与保密的问

0评论2008-09-12

自动识别技术市场分析
条形码自动识别技术是一种快速、适时、准确收集、储存、处理信息的高新技术,是实现国民经济现代化建设大市场,搞活大流通、发展

0评论2007-03-01

Wi-Fi共享新技术 邻里安全共享宽带连接
研究人员已经开发出一种技术,使邻居们可以将他们的Wi-Fi网络连接汇集起来,以便提供更好的性能,并且充分利用原本闲置的带宽。

0评论2006-07-11

一种基于二阶统计量的盲信道辨识与均衡
陈洪sup1/sup,舒勤sup1/sup,孟川杰sup1/sup,王韬sup1/sup,王凤兰sup2/sup (1.四川大学电气信息学院,四川成都610065;2.眉

0评论2006-06-19

安全监控系统防雷保护设计浅谈
一、引言   随着安全监控系统在银行、交通、小区、库房管理中的迅速普及应用,监控系统设备因雷击破坏的可能性就大大增加了。

0评论2006-06-07

可信赖计算安全开发生命周期
摘要:本文介绍可信赖计算安全开发生命周期(或SDL),即Microsoft在开发需要抵御恶意攻击的软件时采用的一套流程。该流程在Micr

0评论2006-03-22

密码技术和信息安全
一般来讲,信息安全主要包括系统安全及数据安全两方面的内容。系统安全一般采用防火墙、病毒查杀、防范等被动措施;而数据安全则

0评论2006-03-22

入侵检测技术:网络安全的第三种力量
网络安全技术发展到今天,除了防火墙和杀毒系统的防护,入侵检测技术也成为抵御黑客攻击的有效方式。尽管入侵检测技术还在不断完

0评论2006-03-22

浅论网络防火墙技术
随着网络技术的发展,因特网已经走进千家万户。因而,网络的安全将成为人们最为关注的问题。目前,保护内部网免遭外部入侵的比较

0评论2006-03-22