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);
}
}

UNIX网络编程之源代码的编译和使用

源码的使用
  • it_wjw
  • it_wjw
  • 2016年07月09日 13:23
  • 2752

网络基础安全:TCP/IP协议的安全问题分析

TCP/IP协议作为当前最流行的互联网协议,却在设计时并未考虑到未来的安全需要,因此协议中有诸多安全问题。而协议的安全缺陷与电脑病毒的存 在,使得网络环境面临极大的危险。本文在分析了TCP/IP及...
  • chengfangang
  • chengfangang
  • 2013年05月16日 16:50
  • 1822

Unix网络编程第三版源码编译

环境: $ cat /etc/issue Ubuntu 12.04.1 LTS \n \l $ cat /proc/version Linux version 3.2.0-48-generic (...
  • HanTangSongMing
  • HanTangSongMing
  • 2014年03月04日 11:56
  • 4664

《Unix网络编程》(第三版)源码使用方法

《Unix网络编程》中的源代码大都是基于作者提供的头文件跟库,所以使用前需要适当配置好运行环境。 搭建步骤: 一、下载源代码及相应头文件和库文件 下载链接: http://down...
  • mengxiang_tianji
  • mengxiang_tianji
  • 2016年04月11日 09:29
  • 1117

《unix网络编程》(1)源代码的使用方法

《unix网络编程(卷1)》源码下载地址 可以从这里免费下载源码 Ubuntu下源码的使用方法 将下载的源码在Ubuntu下解压;控制台内进入解压后源码所在的目录。 打开文件README,其内容如下:...
  • u013074465
  • u013074465
  • 2015年03月15日 20:27
  • 1987

《UNIX网络编程》中的unp.h和config.h

下载源代码包  www.unpbook.com 3.进入unp13e 查看readme,照下列提示操作  1)chmod u+x configure       ./config...
  • bood123
  • bood123
  • 2015年10月06日 20:59
  • 978

Unix网络编程学习日记

今天开始拜读《Unix网络编程》。找到的源代码在Linux下有各种问题,最后决定还是自己从头写比较好。 从第一个时间服务程序开始学习。今天先看一下主要的头文件的作用。 在common.h中(参照 ...
  • pdcxs007
  • pdcxs007
  • 2015年02月11日 17:34
  • 2387

UNIX网络编程卷1(第三版)关于源程序编译出错问题的详细解决方法

 环境说明(应该也使用于其他Linux版本): Linux系统: Ubuntu10.04 gcc  版本: gcc –version的结果 gcc (Ubuntu 4.4....
  • gujinjin2008
  • gujinjin2008
  • 2014年04月19日 19:15
  • 2028

《unix网络编程》(12)五种I/O模型

《unix网络编程》(11)tcp服务器的几种常见状况分析的“服务器进程终止”提到客户阻塞于fgets所以没办法收到服务器发的FIN,只有当客户再次输入文本并发送给服务器后才会从套接字中读取,这时才知...
  • u013074465
  • u013074465
  • 2015年04月04日 21:09
  • 2052

UNIX网络编程(一)一个简易的TCP C/S模型(echo sever)

简易的TCP C/S模型实现
  • zero_witty
  • zero_witty
  • 2017年02月08日 16:22
  • 338
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unix网络的两个安全问题
举报原因:
原因补充:

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