安全问题 一些会影响到X server的安全问题,包括: 程序的安全问题 访问显示设备 访问X server自己一个简单的关于系统安全的规则是避免使用root用户来运行进程,并且要注意尽量不对程序使用setuid和setgid。上面给出的xsun.server和xvfb.server这两个脚本就可以通过配置变量RUN_AS_USER(在脚本中)来用非root的用户身份运行。Xvfb和Xsun这两个进程在默认情况下都不允许别的系统访问,并且它们只允许本地系统中运行X server的用户的进程访问。所以配置好xsun.server和svfb.server这两个文件是十分重要的, RUN_AS_USER变量指出了运行serlets引擎的用户。在Solaris9中,你可以关闭访问X server的TCP端口,只允许在系统上的应用程序通过UNIX® domain sockets来访问。xsun.server脚本通过使用-nolisten tcp选项来实现这个功能。 控制对显示设备的访问也是提高安全性的一种方法。通常这是由Dtlogin和login进程(ttymon)来管理的。但我们现在将dtlogin禁止了,那么这个任务必须由xsun.server来完成。xsun.server通过改变显示设备的所有权来控制用户对servlets的运行。当一个用户登陆到系统控制台的时候,loging进程(ttymon)将把各种设备的所有权以及限制赋予用户。而现在因为是xsun.server控制着显示设备,所以要通过修改ttymon的配置文件/etc/logindevperm来去禁止对显示设备访问。 如何运行? 你要如何来运行你的java图形平台呢?下面几个问题的答案将有助于你配置你的系统。 是否你的应用要使用Java 3D,还是这个图形要用到硬件加速(OpenGL相关的库) 你的系统是否能使用J2SE 1.4或后面的版本? 你的服务是否能跑在solaris9或以后的系统上? 你的服务是否能跑在solaris8的系统上? 回答下面的问题,决定下一步的方向。 是否使用带有硬件加速的图形适配卡来处理图象?(是的话参照下面的 是否使用图象卡 问题) 如果不是,继续:你是否使用J2SE v1.4呢?(是的话参照 设置没有X server的无头运行的Java平台这一节) 如果不是,继续:你是否使用solaris9呢?(是的话参照 在solaris上设置Xvfb 这一节) 如果不是,继续:你是否使用图象卡呢? 你的机器上是不是有图象卡,或者你的机器上是不是有可以插卡的插槽? 有些服务器上无法安装图象卡 继续:你是否使用solaris8?(是的话参照 在没有键盘和鼠标的情况下设置Xsun 这一节) 如果不是,参照 在有键盘和鼠标的情况下设置Xsun 这一节。 如果以上都不满足,则参照 在solaris8以及更早的系统上设置Xvfb(不支持的)这一节。 一个使用Java 3D的应用需要系统的Xsun 服务运行在一个图形加速卡上。在solaris上的Java 3D需要一个兼容OpenGl的显卡,例如Sun XVR-500 或者 Sun XVR-1000。最好使用最新版本的OpenGL,因为它将提高很多性能。在写这篇文章的时候,在Sun's OpenGL Site(http://wwws.sun.com/software/graphics/OpenGL)上最新的版本是OpenGL 1.2.3 过程: 设置使Tomcat或别的servlet引擎可以使用X display变量 将DISPLAY这个环境变量设置成和xsun.server 或者xvfb.server脚本中DISPLAY_NUMBER参数一致 设置没有X server的无头运行的Java平台 这个工作只适用于J2SE v1.4以及以后的版本。在java后面加上-Djava.awt.headless=true选项,例如: java -Djava.awt.headless=true 在Tomcat4.0环境中,把-Djava.awt.headless加到环境变量CATALINA_OPTS中。 在solaris上设置Xvfb 在你自己的目录下,保存一份xvfb.server和install.xvfb脚本的拷贝。当你调试好xvfb.server后,运行install.xvfb xvfb.server预定是装在/etc/init.d下。它将使用一个非root 的用户来运行(默认为tomcat的用户)。X display将是:1,默认情况下你可以根据你系统的需要更改用户和显示变量。下面是一段需要更改的部分: # CONFIGURE THESE OPTIONS FOR YOUR INSTALLATION # change this to avoid conflict with existing X servers DISPLAY_NUMBER=:1 忽略这些行: # NOTE: Solaris 8 and earlier: set the directory # for the user-supplied copy of Xvfb XVFB_DIR=/usr/X11R6/bin 更改为你系统上运行servlet引擎的用户: # Avoid running X server as root user # For Java3D servlets, the same user must # run the X server and the servlet engine. RUN_AS_USER=tomcatds # END CONFIGURATION 当你更改完后,你可以测试一下你的Xvfb服务。使用root用户: # ./xvfb.server start Starting Xvfb as tomcat user for display :1 你可以看到它在运行: # ./xvfb.server status PID TT S TIME COMMAND 15467 ? S 0:02 /usr/openwin/bin/Xvfb :1 -screen 0 1280x1024x8 -fbdir /tmp 现在停止它: # ./xvfb.server stop Stopping Xvfb for display :1 ... 当你确定这个服务运行正常,你可以使用install.xvfb。它将把xvfb.server拷到/etc/init.d下,并建立一个连接到/etc/rc*.d目录下。 /bin/ln -s /etc/init.d/xvfb.server /etc/rc0.d/K09xvfb.server /bin/ln -s /etc/init.d/xvfb.server /etc/rc1.d/K09xvfb.server /bin/ln -s /etc/init.d/xvfb.server /etc/rcS.d/K09xvfb.server /bin/ln -s /etc/init.d/xvfb.server /etc/rc2.d/S98xvfb.server 现在,你可以通过/etc/init.d/xvfb.server来启动和停止你的服务了,或者如果可以,你也可以重新启动机器,来观看在启动后Xvfb将自动运行起来。 在没有键盘和鼠标的情况下设置Xsun 在服务器上安装显示卡。如果要使用java 3D则要使用Sun XVR-500 或 Sun XVR-1000等显卡(见前面)。安装所需要的包,如最新的OpenGL。
因为没有键盘和鼠标,所以你不能使用这个显示器做你的控制台。设法从串口或者网口上登陆到系统。使用telnet或其他文字终端程序来操作。 把下面两个脚本拷贝到服务器上一个临时的空间 xsun.server install.xsun 更改xsun.server中下面这部分内容,使它和你的系统一致。默认是使用tomcat用户来运行。 # CONFIGURE THESE OPTIONS FOR YOUR INSTALLATION # allow another device to be specified, e.g. /dev/fb1 DISPLAY_DEVICE="/dev/fb" DISPLAY_NUMBER=:2 RUN_AS_USER=tomcat # END CONFIGURATION 使用root身份登陆,运行install.xsun脚本。它建立一个连接,并停止掉dtlogin进程。脚本内容如下: /bin/cp xsun.server /etc/init.d /bin/chmod 0544 /etc/init.d/xsun.server # create links for the various run levels /bin/ln -s /etc/init.d/xsun.server /etc/rc1.d/K09xsun.server /bin/ln -s /etc/init.d/xsun.server /etc/rc0.d/K09xsun.server /bin/ln -s /etc/init.d/xsun.server /etc/rcS.d/K09xsun.server /bin/ln -s /etc/init.d/xsun.server /etc/rc2.d/S99xsun.server # terminate DtLogin /etc/init.d/dtlogin stop # prevent DtLogin startup /bin/mv /etc/rc2.d/S99dtlogin /etc/rc2.d/.S99dtlogin 现在可以运行xsun.server来启动xsun服务,当你确定服务运行正常后,重新启动系统,并确定Xsun在启动后运行正常。 现在你可以以root用户的身份来检测一下: # cd /etc/init.d # ./xsun.server start Starting Xsun as tomcat user for display :2 你可以看到: # ./xsun.server status PID TT S TIME COMMAND 19665 ? S 0:03 /usr/openwin/bin/Xsun :2 -clients 1024 -nobanner -dev $DISPLAY_DEVICE defdepth 24 +nmouse +nkeyboard -nolisten tcp 停止: # ./xsun.server stop Stopping Xsun for display :1 .. 在有键盘和鼠标的情况下设置Xsun 连接上键盘和鼠标,登陆到系统中,剩下的配置方法和上节一样。 在solaris8以及更早的系统上设置Xvfb(不支持的) 如果你使用google搜索,你会找到很多已经编译好的Xvfb程序。你也可以得到源代码自己编译。我不赞成使用那些预先编译好的Xvfb--确定你要遵守你的网站关于下载和使用软件包的规定。你最好下载一个X 资源并且自己来编译Xvfb。
如果你下载并安装了一个Xvfb,你最好将它放在/usr/local/bin或者/usr/X11R6/bin目录下。 xvfb.server脚本将把setuid权限设置给该程序。 把xvfb的脚本从这个文章中拷贝出来,并放到一个临时的目录中,记的把X_DIR参数改为你放置Xvfb命令的路径: # CONFIGURE THESE OPTIONS FOR YOUR INSTALLATION DISPLAY_NUMBER=:1 X_DIR=/usr/X11R6/bin # pre-Solaris 9: wherever Xvfb lives RUN_AS_USER=tomcat # END CONFIGURATION 现在,你可以遵照上面介绍的在solaris9下的配置Xvfb的方法来进行了。 测试: 当X server运行正常,你可以使用你的servlets应用来确定Java 图形平台工作正常。如果你有麻烦,请检查X server是否出现问题。使用刚才你选用的用户的身份登陆(默认是tomcat),使用下面的-display参数来检查: % /usr/openwin/bin/xclock -display :2 & 你可以使用xwd(一个X windows dump)来抓图。在solaris9下,我发现/usr/openwin/bin/xwd有问题(可以参考Sun bug id 4766571)所以我使用一个从X11 下拷贝到/usr/X11R6/bin下的xwd命令。 % /usr/X11R6/bin/xwd -display :2 -root -out /tmp/xclock.xwd 并将输出的图片拷贝到别的系统上,使用xwud来观看。 % /usr/openwin/bin/xwud -in /tmp/xclock.xwd 如果xclock没有运行,那么你服务器上的服务可能没有起来。检查你的xsun.server和svfb.server是不是配置的没有问题。 其他的资料以及将来的工作 一个支持多实例的servlet引擎可以让你在一个服务器上支持更多的客户端。这个可以根据java 2的运行环境来具体调整。你可以在一个系统上运行多个X server,并且使用不同的Display环境变量来区分多个单独的实例。如何配置/etc/init.d和/etc/rc*.d就留给读者自己去考虑了。 在写这个文章的时候,solaris9下的Xvfb还不能支持24位色。如果你需要支持24位色,那么你可以使用X11 提供的Xvfb。在未来的升级中,Solaris9将支持一个特出的伪设备--vfb。这个伪设备将允许Xsun提供和Xvfb现在提供的同样的功能。如果这个实现了,上面的xsun.server脚本也仍然可以使用。 参考文档和附录 略
作者介绍 Tom Gould是sun Market Development Engineering group的工程师 原文 http://soldc.sun.com/articles/solaris_graphics.html |