2007年4月7日土曜日

(X Window System) 昔、xhostって使っちゃいけないコマンドだと教わったのですが・・・xauthをよろしく

私がX Window Systemを使い始めてすぐに教わったことなので、もう10年以上前から、言われてきたことです。

xhostコマンドはセキュリティホールになるから、絶対に使ってはいけない。

ところが、21世紀にもなって、いまだに、「xhost +ホストと実行してください」なんて、どうどうと書いてあるのを見かけることがあります。つい最近も、とある商用ソフトのインストール方法の説明書、使用方法の説明書で見かけました。



危険性を知らないでxhostを使えと書いているのかも知れませんし、ひょっとすると、(xhostの代わりとして使用すべき)xauthコマンドの使い方を説明するのがメンドクサイので、確信犯でxhostを使わせているのかも知れません。





Microsoft Windowsとかと違って(いやWindowsの仕組みはよく知らないのですが)、X Window Systemでは、クライアントサーバー方式でGUIが実現されていて、



  1. 画面を描画するソフトウェア(Xサーバ。画面に絵を描く以外に、キーボードやマウスなどの入力デバイスの面倒も見る)


  2. こんなの描画してね、と指示をするソフトウェア(Xクライアント。ようするにXのアプリケーション。xtermとかfirefoxとか全部そう)


の2つは、かならずしも同じマシン上で実行する必要はありません。特別なソフトウェアを利用することなく、ネットワークでつながってさえいれば、別々のマシンで実行できます。たとえば、



  • aliceというマシンを使っていて、alice上でXサーバが動いている


  • bobというマシンにログインして、bob上でXクライアントを実行し、その画面をalice上に表示させ、alice上でbobのソフトウェアを操作する


ということができます。



さすがに、あっちこっちのホストから、勝手にaliceの上であれやこれやと、Xアプリケーションのウインドウを開かれちゃったら大変なので、alice側での設定で、「かってにaliceのXサーバを使わないでよねっ!」って制限することができます。

なお、最近では、そもそもデフォルトでは、別のホスト(bob)で実行したXクライアントが、aliceのXサーバを利用できないように設定されていることが多いようです(Xサーバが、TCP socketをlistenしていない)。たぶんセキュリティ対策のためだと思うのですが・・・昔からワークステーションなどでXを使ってきたユーザーは、たまに戸惑うことがあるようです。


さて、勝手にaliceのXサーバを利用させないようにする、その制限手段としては、2通りの方法があります。それがxhostと、もう1つがxauthです。



xhostは、ホスト単位で、アクセス許可を出すコマンドです。alice上で、「xhost +bob」と実行すると、bob上で実行したXクライアントがaliceのXサーバに接続できるようになります。これで何が問題かというと、bobにログインできる人なら、だれでもaliceのXサーバに接続できるようになってしまうのです。



一方のxauthは、秘密の合言葉を知っているXクライアントだけが、Xサーバに接続できる、というものです。秘密の合言葉は、aliceのXサーバがあらかじめ決めておきます。bobで実行したXクライアントが、aliceに接続するとき、秘密の合言葉が一致していれば、aliceがbobのXクライアントを受け入れます。合言葉が一致していなければ、拒絶して、Xクライアントはウインドウを開くことも何もできず、エラー終了してしまいます。



秘密の合言葉は、ユーザーの$HOME/.Xauthority(設定によって異なる)というファイルに保存されるようになっています。bobでXクライアントを実行すると、そのXクライアントは、.Xauthorityファイルを見て、alice用の秘密の合言葉を読み取ります。DISPLAY環境変数や-display引数で、どのXサーバを利用するか(どこに画面表示するか)を指定できますので、.Xauthorityには、Xサーバごとに、秘密の合言葉を保存するようになっています。「xauth list」というコマンドで、一覧が表示されます。



xauthがxhostと違うのは、たとえbobにログイン中のユーザーであっても、秘密の合言葉を知らなかったら、aliceにウインドウを開くことができない点です。



aliceのXサーバを使っているユーザーは、aliceの秘密の合言葉を知ることができます。そのユーザーが、bob上での$HOME/.Xauthorityに秘密の合言葉を登録すれば、aliceにウインドウを開くことができます。秘密の合言葉が厳重に管理されていれば、aliceを利用できるユーザーを完璧にコントロールできるわけです。



なお、aliceとbobとで、ホームディレクトリがNFS共有されていれば、$HOME/.Xauthorityは同一のファイルですから、aliceの合言葉をbobで登録する手間は不要になります。



ところで、xhost +bobとしたときの危険性というのは何があるでしょうか。勝手にaliceにウインドウを開かれるくらい、別にいいじゃないか、と思われるかもしれません。たとえば、bobにログイン中のユーザーが、aliceを使っているユーザーにいたずらをするつもりで、aliceの画面に恥ずかしい画像を表示させたり、とかできます。まー、そんなのはまだかわいいものです。



よく危険な例として取り上げられるのが、aliceの画面イメージを、bob上で盗み取ることができる、というものです。Windows上で、ウイルスに感染して、デスクトップ画面のイメージが勝手にキャプチャされて、ネットワーク上でばらまかれる、というのがありましたが、あれと同じことができてしまうのです。ウイルスに感染することなく、xhost +bobというコマンドを実行するだけで、です。画面にメールの文章が表示されてたら、そのメールの文章が読まれてしまいますね。



もしもaliceにてxhost +bobとされているとします。



manuke@alice % xhost +bob
bob being added to access control list

ちなみにbobから使わせないようにするには、「xhost -bob」とやります。

bob上にログイン中のユーザーnhhが、次のようなコマンドを実行すると、aliceのXサーバの画面を、/tmp/hoge.pnmというファイルに保存することができます。



nhh@bob % xwd -display alice:0 -root -silent | xwdtopnm >/tmp/hoge.pnm



-rootは、rootウインドウの意味、つまり画面全体のこと(rootユーザーという意味じゃない)。-silentは、画面をキャプチャするときに音を鳴らさない、という意味らしいです(気づかれないようにこっそりとやるために)。



画面キャプチャを勝手に撮る以外にも、たぶん、aliceで、キーボードのどのキーが押されているか、なんてことも可能になっちゃうんじゃないかと思います。それってパスワードを盗み取るキーロガーと同じですよね。


xhostコマンドを使わずにxauthを使っていれば、nhhはaliceの秘密の合言葉がわからないので、画面キャプチャを撮ることはできません。



ただxauthって、xhostと比べて使い方が面倒なんです。ホームディレクトリがNFS共有されているときは何もしなくていいのですが、ホームディレクトリが別々のとき、合言葉をコピーする操作が必要です。次のようなことをやります。



alice上でxauthコマンドを実行します。xauth>というプロンプトがでるので、そこでlistというコマンドを実行すると、.Xauthorityに保存されている秘密の合言葉が一覧表示されます(xauth listでもかまいません)。



kashikoi@alice % xauth
Using authority file /home/kashikoi/.Xauthority
xauth> list
alice/unix:0  MIT-MAGIC-COOKIE-1  00112233445566778899aabbccddeeff
alice:0  MIT-MAGIC-COOKIE-1  00112233445566778899aabbccddeeff
(ほかにもいろいろ出るかもしれません)



こうやって、合言葉「001122~」を調べておきます。

(備考) aliceの秘密の合言葉は、ユーザー(kashikoi)が、aliceでXサーバを起動したりxdmなどでログインしたときに、自動的に生成・保存されます(ちなみに設定をしそこねてたり、名前引きなどのネットワークトラブルが発生すると、aliceで実行したXクライアントがaliceのXサーバを利用できなくなる、という珍現象がおきますよ)。

ユーザーkashikoiがbobにログインして、bob上でxauthコマンドを実行します。そして、addというコマンドを使って、さきほど調べたaliceの秘密の合言葉を書き込みます。最後にexitコマンドを入力。



kashikoi@bob % xauth
Using authority file /home/kashikoi/.Xauthority
xauth> add alice:0  MIT-MAGIC-COOKIE-1  00112233445566778899aabbccddeeff
xauth> exit
Writing authority file /home/kashikoi/.Xauthority



xauthをexitではなくquitコマンドで終了すると、.Xauthorityが更新されません。





xauth> quit
Aborting changes to authority file /home/kashikoi/.Xauthority





以上のようにxauthコマンドで準備をしておけば、bobでXクライアントを実行して、alice上に画面表示させることができます。こんな感じですね。



kashikoi@bob % xterm -display alice:0 &



aliceのXサーバを立ち上げなおさないかぎり、普通は秘密の合言葉は変わりませんので、何度bobにログインしなおしても、xauthは不要です。



aliceのXを立ち上げなおして、秘密の合言葉が変わってしまったら、もう一度xauthで登録しなおします。





以上のような操作が面倒なので、私は、次のようなシェルスクリプト(xcookie)を使っています。



% cat xcookie
#! /bin/sh



R=$1



if [ x$R = x ]
then
    echo usage $0 HOSTNAME
    exit 1
fi



COOKIE=`xauth list | sed -n -e '/\/unix:0/s:.*unix\:0 *::p'`
IP=`hostname`



ssh $R "xauth add ${IP}:0 ${COOKIE}"











alice上で、「xcookie bob」と実行します。これでaliceの合言葉がbob側で登録されます。



kashikoi@alice % xcookie bob



シェルスクリプトxcookieでやっていること。
まずalice上でxauth listコマンドを実行して秘密の合言葉を抜きだしたあと、sshでbobに接続して、「xauth add  alice:0 抜き出した合言葉」コマンドが実行され、合言葉が登録される、というものです。



3分くらいで作った手抜きのシェルスクリプトなので、aliceからbobにsshできるようになっていなければならない、aliceでのhostnameを使ってbobからaliceに接続できる(名前引きができるようになっていること)、aliceのディスプレイ番号が0であること(違うなら変更すればいい)、などなど、いろいろと条件がそろっていないと、うまく動きません。注意してください。



昔、Windowsマシンで、CygwinのXサーバを実行しておき、Linuxマシンにログインして、そこでXクライアントを実行し、画面はWindowsのほうに表示する、ということをするために作ったものです。そのときは、実は名前引きができなくて、ipconfigコマンドから抜き出すとか、sshログイン先でコネクション元を調べるとか($REMOTEHOSTでわかるかもしれない)、なんか苦心してやってました。





(2007/7/3 追記)



すっかり忘れてたのですが、上に書いた手抜きシェルスクリプトなぞを使わずに、スマートにやる方法があったのでした。どうやるかっていうと・・・「man xauth」でそのものずばりが見られるのですが、xauthのマニュアルの、EXAMPLEのところに、こんな実行方法がのってます。これで、一発でできます。



% xauth extract - $DISPLAY | rsh otherhost xauth merge -



otherhostが、リモートホストの名前で、先の例だとbobです。ただし、もう何年も前からセキュリティ的にナニな感じのするrshコマンドは使えなくなっているホストが多いですから、rshの代わりに、sshコマンドを使うことになるでしょう。



kashikoi@alice % xauth extract - $DISPLAY | ssh bob xauth merge -



みたいに。



0 件のコメント:

コメントを投稿