ttt

getttyent

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

2007-04-06 22:10:24 | デジタル・インターネット

私が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 -

みたいに。


コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。