Unix网络的两个安全问题

原创 2004年08月29日 20:28:00
Unix网络的两个安全问题
虽然已经有许多文章对有关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 bin atsh< td>
/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
{
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
{
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);
}
}

Socket Programming with VB

 Socket Programming with VB我们在烟台项目的网络传输部分研究中涉及到了Winsock编程,经过较长时间的学习,做出了几个模型。本文是我在工作过程中的一些体会,不足之处请大家指...
  • ghj1976
  • ghj1976
  • 2001-08-19 17:39:00
  • 1551

Unix操作系统 网络相关的两个安全问题

 Unix操作系统网络相关的两个安全问题 整理:Ackarlix 虽然已经有许多文章对有关Unix网络的安全性问题进行了广泛的论述,但随着技术的进步和人们对安全问题的认识的深入,总是不断有安全问题被暴...
  • Ackarlix
  • Ackarlix
  • 2007-08-28 00:27:00
  • 814

网络安全技术,网络的开放性带来的安全问题

  • 2010年07月22日 09:56
  • 62KB
  • 下载

UNIX系统安全工具

  • 2008年05月10日 01:48
  • 6.8MB
  • 下载

几个unix网络命令

1、ping命令 ping [选项] 主机名/IP地址-c(数目):在发送指定数目的包后停止-f:大量且快速地送网络封包给一台机器,看它的回应-I(秒数):设定间隔几秒送一个网络封包给一台机器,预设值...
  • russule
  • russule
  • 2009-02-23 14:26:00
  • 3147

UNIX Linux网络日志分析与流量监控

  • 2017年10月31日 18:14
  • 100MB
  • 下载

网络安全问题引起的思考(一)

刚刚,我做的只不过是对某个特定的用户,进行判断;换句话说,我只是对遵守登陆规则的用户设定规则,由一个同学的话,我突然想到了一件事情,在高并发的情况下,如果对手不断的利用不同的ip对我进行打击,那么由于...
  • qq7758521fang
  • qq7758521fang
  • 2018-03-26 18:49:02
  • 48

UNIX环境高级编程、UNIX网络编程(卷一)环境搭建

最近学习这两本书,在直接编译书本源程序时,出现头文件“apue.h”(UNIX环境高级编程)及“unp.h”(UNIX网络编程)错误,在这里坐下配置的笔记。 首先需要安装Linux系统。(在Virtu...
  • luokh327
  • luokh327
  • 2016-01-12 16:40:01
  • 1737

unix网络编程第三版环境配置

根据unp3前沿部分的“如何使用本书”,决定先看本书的第二部分,即第3至11章,这部分偏实践。        当看到确定主机字节序的时候出现了一段程序:#include "unp.h"int ...
  • Trevor211
  • Trevor211
  • 2015-08-23 16:04:09
  • 1235

Unix高级编程 pdf

  • 2010年07月03日 11:19
  • 17.96MB
  • 下载
收藏助手
不良信息举报
您举报文章:Unix网络的两个安全问题
举报原因:
原因补充:

(最多只允许输入30个字)