博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

tomqq & security

网络安全/IDS/SSL-VPN/WEB技术/java/
  tomqq.cublog.cn

关于作者
姓名:tomqq
职业:挨踢的
位置:成都
个人介绍:2004年毕业于四川大学计算机应用专业,硕士学历,毕业后一直从事IDS和SSL-VPN的研发至今。Email:hekong@gmail.com

|| << >> ||
我的分类


设计支持多os的ssl-vpn客户端(三)——如何给java主控赋予root权限
设计支持多os的ssl-vpn客户端(三)
——如何给java主控赋予root权限
Tomqq 5/27/2008
 
    最近比较忙,下午抽时间继续写这个专题。
    如何给java主控赋予root权限,这是个很重要的问题,也是必须解决的问题。因为vpn的客户端组件安装和升级,以及卸载,涉及到驱动和内核部分,在linux(Mac)下都是需要root权限才能完成的,而为了安全考虑,很多系统不允许用root权限登录,或者网管没有给一般用户以root权限;另一方面,applet本身就是不允许执行本地相关操作的,首先就要解决java的自身权限问题,下面来一一阐述。
    Applet本身没有权限来执行各种本地操作,如建立文件、建立socket监听程序等等,方法一个是修改java安全定义文件,但是这个不可取,修改这个安全文件本身就需要权限呀,可是这会还没有得到权限呢,再说让用户自己去修改也不方便;我采用了另一种方式绕过,applet拉起一个主控线程,这个线程就不受applet的沙箱限制了,如下:
 public static MainControl MC;
//Applet start
 public void start(){
  MC.start();
}
    另一个问题就是需要给java进程赋予root权限了,因为客户端用户往往不是、也无法用root登录,这个时候,需要在执行安装的时候,弹出一个密码框来让用户输入root密码,就可以继续下去了,就像普通用户在ubuntu下执行root操作的时候一样,如图:
 
其他linux也是一样。
   不过这里我首先要强调一点,就是mac的安全机制和这个是不一样的,在这里要分开来讲。
   首先讲linux下的,大家很多人可能都认为,用java的exec函数执行su命令,然后捕获标准出错输出流,在这里再填入密码就可以了,我告诉你们:这样是不行的,因为linux系统会显示出错提示:su命令必须要从终端运行,而javaexec函数显然不是,所以你会失败。该怎么做呢?开始我也没有经验,后来hack了juniper的产品,原来他是用脚本做的,然后用javaexec来拉这个脚本,简单点说,要这样子:
    你的shell脚本里面要有这一句,
    xterm -e $TMP_DIR/install.sh $DST_DIR $TMP_DIR,
    然后用java的system.exec执行这个shell,这样你就有了一个终端了,执行后如果不是root,会弹出要求输入密码的窗口,如果是就不弹出。
    Mac下面的安全机制是不一样的,给java这个线程赋予root权限,要怎么做呢?xterm这个办法是不行的,不支持。有一个办法,就是你去查一下AuthKit这个开源项目,http://www.amug.org/~glguerin/sw/authkit/overview.html#introduction
    它是在mac下采用做了一套赋予一个线程的本地api,然后试用jni技术来实现的,详细内容自己去看吧,不过我要告诉你,就算你看了,实际用的时候还是会有问题,主要问题存在于:
    Jni有一些本地包需要下载到标准的系统路径下,叫做libAuthKit.jnilib。在Mac下,需要提前下载到这个路径下面:
System.getProperty("user.home")+File.separator+"Library"+File.separator+"Java"+File.separator+"Extensions"+File.separator;
    下载是很ok,但是问题出在这里:如果是第一次安装,那么是用java下载了这个lib的,jvm由于之前就启动了,jni加载路径已经扫描过了,所以jvm系统不会知道这个东西后来已经有了,所以在authkit的包的api去加载这个jni的时候,会提示找不到库。当然,退出虚拟机以后第二次再安装,不会有这个问题,但是用户会很迷惑。怎么办?继续hack javaauthkit的源码,找到了加载的这一句代码:
 
package glguerin.util.LibLoader.java (L:177),
this.load( libName, dirFallback );  // use fallback scheme.
改为硬加载模式:
System.out.println("+=+= First Installation!");
   String locallib = System.getProperty("user.home")+File.separator+"Library"+File.separator+"Java"+File.separator+"Extensions"+File.separator+"libAuthKit.jnilib";
   System.load(locallib);
这样子就很ok了。
    具体怎么得到Mac的root权限,自己慢慢看authkit的文档罗,里面有例子的。
    主要的问题就是上面几点,小问题还会有很多会阻止住你的脚步,这个需要时间和经验来一一debug,再次就不赘述了。

不过还是大概讲一下安装的总流程:
1) 首先,安装进程被拉起后,通过https下载服务器上的几个安装脚本;
2) 给脚本赋予chomod +x权限后,运行第一个检查脚本,运行后根据脚本返回的值,决定下载哪些另外几个文件;
3) 根据不同的os类型,执行不同的安装或者升级脚本。如果是mac,还要做获取权限的上面说的那一堆事情;
4) 安装顺利完成后,安装脚本进入精灵进程,java安装进程返回给主控,主控继续往下面走。
安装的类主要有如下方法实现:

ok,下次继续前面的内容。


发表于: 2008-05-27,修改于: 2008-05-27 17:46,已浏览38次,有评论0条 推荐 投诉


网友评论
 发表评论