当前位置:Linux教程 - Linux - X 安全

X 安全

内容
介绍
X Window如何工作
未设防的X Window
走进安全
主机认证
标志认证
主机认证
使用xhost
好处
缺点
标志认证
xauth程序
xdm程序(X Display Manager)
没有xdm时产生""magic cookie""值
Xrsh in X11R5
好处
缺点
Xterm的缺陷


X安全

介绍
在各种环境中,X Windows深受用户们的欢迎。它的客户/服务器模型使得用户能够灵活、强有力的和计算机之间进行交互。然而,它功能强大的同时是以牺牲它的安全性来获取的。如果不能够正确管理X Windows,将会出现一系列弱点。这篇文章正是揭示这些安全问题以及解决方法的。

X Windows如何工作
一个图形用户界面竟是一个潜在而严重的安全缺陷,这一点让人感到迷惑。所以对于新手,让我们来看看X Windows是如何工作的,以及它如何又产生问题。

X Windows使用了一个底层叫做X协议的协议。这个协议既能够用在单个的计算机上,又能够用在计算机网络上。它没有被捆绑在操作系统里而是能够用在多个平台上。X Windows利用网

络通信的客户/服务器模式。这个模式能够使用户在一个地方运行程序,而又在其它地方控制这个程序。

与平常的客户/服务器形式相反,用户实际上直接在X Server上工作,X Server提供屏幕、键盘以及鼠标。之所以叫做Server是因为它为客户端产生输入,并管理向客户端输出。X 客户端是一些应用程序,比如xterm,emacs,xclock等等。他们接收和处理输入并输出。

在大多数情况,服务器和客户端运行在同一台机器上。但是X协议是十分具有扩展性的,它有许多培植文件。实际上,X终端是一个屏幕,键盘和鼠标没有计算能力。即使X server运行在一台主机上,客户端也可以运行在其他主机上,即使那台主机在其他建筑或国家里。

那么,如何处理计算机安全问题?可以连接到X server的客户端应该被仔细控制。因为可以多个客户端能够连接到一个X server上,因此要保证这些客户端的行为能够被正确处理。如果一个客户能够向另一个客户发送信息或者截获发往另一个客户的信息,那么这个系统就是有缺陷的。

未设防的X Windows
一些X server与X client通讯的的例子包括下列:

X终端改变----字体管理、鼠标灵敏度、颜色和键盘映射。
X事件 ----包括键盘和鼠标等。
X数据 ---- 影响到X终端的改变,包括输出文本、建立窗口、在屏幕上画图等。
任何连接到X Server的客户程序都能够潜在的改变X的通讯。这可能包括下列:

改变会话参数。
建立/销毁窗口----你在窗口莫名其妙的消失之前是否保存好了费力写的文档?
捕捉X事件----比如在一个xterm窗口读取键盘敲击信息,这很可能就会把他人的帐号与密码得到。
产生X事件 ----比如说发送一些键盘敲击序列到EMACS窗口。
明显的,X servers有与生具来的危险性。更坏的是:许多X server在缺省时允许来自任何地方的主机连向它。

走进安全
什么是处理X server安全问题最好的办法?有两种可以着手的方法:主机认证和标志认证。

下面一一列出。

主机认证
主机认证是用IP地址来标志允许或禁止一个客户端。一旦有一个用户登录到X server上,一个叫做xhost的程序用来控制来自那个IP的客户允许连接。但是大多数主机支持多个一台客户机上用户,所以不可能控制在某一台客户机,允许他上而别人不行。

标志认证
第二种方法是校验每个客户机所提供的标志。这个工作由一个叫做""xauth""的程序来完成:每一个客户都被给予一个叫做""magic cookie""的东西,它必须向X server提供一个随机值来获得进入权利。

The second form of authentication is to verify each client based on the token they offer. Using a program called xauth, each client is given a ""magic cookie,"" a random value which it must offer to the X Server to be allowed access.

主机认证
当然了,X安全用的最广的机制就是""xhost""程序。虽然用起来很简单,但是很不灵活。

使用xhost
xhost使用起来很简单。每一个X Server维护着一个主机列表,里面写着那台主机可以进入,那台不可以。xhost程序用来改变这个列表,命令行语法如下:

显示允许连接X Server的主机列表:
xhost

增加一个主机:
xhost +bar.foo.org

于是, 任何在bar.foo.org上的用户或程序都能够与X server通讯。

删除一个主机:
xhost -bar.foo.org

使X server向全世界开放:
xhost +

访问控制被再次允许:
xhost -

利用xhost,我们可以给某一个客户机在与X server连接的短暂时间内的权限打开,当客户机连上之后再取消这个权限,这样,虽然这个权限被取消掉了,但此时的通讯还能够进行。

优点:
xhost访问控制机制的确十分容易使用,它只需要简单的参数即可。

缺点:
xhost的简单既带来好处又带来坏处:从一个客户机所来的用户要么全部允许,要么全部拒绝,而不能更细的分类----你能他不能。在许多环境里,可能有大量的用户在使用同一台客户机,因此这种机制就不能够胜任。

遗憾的是,许多X server,象NCD Servers,SGI system 以及Macintosh X,他们的X server的访问权限在缺省下是关闭的,对于不熟悉X server缺点的用户,用主机认证机制会带来安全问题。

Xhost比标志认证有更高的优先级。任何用户可以在把自己的机器加入到xhost的访问列表中而不顾自己的权限。

标志认证
X server可以通过利用""magic cookie""来控制用户级的对X server的访问。这是一个机器可以识别的、随机产生的代码。一个X client必须在被X server允许访问之前向X server提供相同的""magic cookie""值。这个值被存在文件"".Xauthority""中,它既可以在每次会话的开始对于只是想登陆到一台机器上的用户来说,这个增强的安全机制是透明的。每一个由特定用户启动的客户端能够发现这个""magic cookie""并且用此来访问X server。但是, 许多用户工作在许多个机器上,那么,一个在远程机器上的X client如何知道这个""magic cookie""呢?

下来就要介绍xauth这个程序的功能了。

xauth
xauth程序用来编辑和显示用户的""magic cookie""认证信息。一旦""magic cookie""显示成可度的形式,它就可以被送到远程主机上。在远程主机上,xauth被再次用来引入这些""magic cookie""到"".Xauthority""文件中。假设远程主机用户目录下的"".rhost""文件已经为本用户的rsh的使用准备好了,我们用下面的命令:

xauth extract - $DISPLAY | rsh ahost.foo.org xauth merge -

第一条命令打印所处的机器里""magic cookie""值到标准输出。这些信息被通过管道用rsh命令调用xauth引入到ahost.foo.org。于是能够在ahost.foo.org这个机器上运行X client。重要的是要将"".Xauthority""文件的权限设置正确。

X Display Manager
xdm是一个客户端程序,能够提供登录画面并能够同时连接多个X Server。当一个用户进行这种登陆时,xdm将一个""magic cookie""值写到用户自己目录下的"".Xauthority""文件里。X server并不常常仅仅充当独立的一个角色,它们同时也可担任X终端的角色,此时它须运行xdm来提供初始的登陆画面。xdm提供对""magic cookie""值的认证,这个认证必须首先通过配置 ""/usr/lib/X11/xdm/xdm/xdm-config""文件的这一条打开。

DisplayManager*authorize:true

用这个,xdm每次在用户登录时产生一个新的""magic cookie""值,并且把它保存在这些用户的"".Xauthority""文件中。

如果不用xdm,仍然可以用这种认证机制,下面就要谈到:

非利用xdm产生一个""magic cookie""值
Xdm用来管理"".Xauthority""文件,但是如果不用xdm,仍然可以用""magic cookie""认证机制。

唯一的问题是:在许多X11 Server上,用户需要产生一个""magic cookie""值(OpenWindows是一个例外:这个值在启动时自动产生)。这工作可以通过各种方法来完成。例如,如果有Korn shell,它里面内建有一个随机数产生器:

randomkey=``ksh -c echo $(( $RANDOM * $RANDOM * 2 ))``
xauth add ${HOST}:0.$randomkey

还有,用时间可以产生一个随机值:

randomkey=``date +""%y%m%d%H%M%S""``
xauth add ${HOST}:0 . $randomkey

Xrsh in X11R5
Xrsh是一个X11R5提供的脚本,它存在于""contrib/clients/xrsh""目录下,对于任何想要经过rsh在远程运行客户程序的用户来说,这是一个十分顺手的脚本,它利用xauth自动拷贝cookie code到远程的机器上,例如,运行在foo主机上的xterm程序,键入:

xrsh -auth xauth foo xterm

好处:
现在可以按照用户方式进行认证了。在一个主机有多人用的情况下,用这种方式进行认证很有必要。

缺点:
xdm和xauth程序对于用户和管理员来说,运行和维护起来很费时。需要在用户观点对X客户/服务器模式有深的了解。

Xterm的缺陷
xterm用来提供给用户一个命令提示符。因为频繁涉及到人与机器之间的交互,因此,它的安全性也很重要。xterm有几个弱点值得提防。

xterm有一个写访问的特性不应该被利用:SendEvents是人工产生的鼠标和键盘的事件。缺省时,xterm拒绝所有来自X server的关于SendEvent事件的请求。但这个开关可以进行设置,第一种方法是在"".Xdefaults""或""app-defaults/Xterm""中增加一条X资源定义:

xterm*allowSendEvents: True

第二种方法是允许X Server通过xterm的""Options menu""发送X 事件(通过同时按住CTRL和鼠标左键完成),这两种方法不应该被利用,因为它们打开xterm的""Secure Keyboard""功能来

截获其他客户端的输入。