私がX Window Systemを使い始めてすぐに教わったことなので、もう10年以上前から、言われてきたことです。
xhostコマンドはセキュリティホールになるから、絶対に使ってはいけない。
ところが、21世紀にもなって、いまだに、「xhost +ホストと実行してください」なんて、どうどうと書いてあるのを見かけることがあります。つい最近も、とある商用ソフトのインストール方法の説明書、使用方法の説明書で見かけました。
危険性を知らないでxhostを使えと書いているのかも知れませんし、ひょっとすると、(xhostの代わりとして使用すべき)xauthコマンドの使い方を説明するのがメンドクサイので、確信犯でxhostを使わせているのかも知れません。
☆
Microsoft Windowsとかと違って(いやWindowsの仕組みはよく知らないのですが)、X Window Systemでは、クライアントサーバー方式でGUIが実現されていて、
- 画面を描画するソフトウェア(Xサーバ。画面に絵を描く以外に、キーボードやマウスなどの入力デバイスの面倒も見る)
- こんなの描画してね、と指示をするソフトウェア(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/shR=$1
if [ x$R = x ]
then
echo usage $0 HOSTNAME
exit 1
fiCOOKIE=`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 件のコメント:
コメントを投稿