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


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]=‘’;s1[1]=‘’;s1[2]=‘’;
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
#include
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’;

推荐阅读