サーバー・クライアントシステム

  1. 前準備
  2. X クライアントを表示するサーバと画面の選択
  3. X サーバ側からのアクセス制御
  4. X のセキュリティー
  5. 参考文献

1. 前準備

[1.1] 必須作業

「startx」をする前に root になり, 以下の作業を行ってください.

$ sudo -s Enter
# cd /usr/X11R6/lib/X11/xinitEnter
# cp xserverrc xserverrc-orgEnter
# vi xserverrcEnter

xserverrc ファイル中の

exec /usr/bin/X11/X -dpi 100 -nolisten tcp

を下記のように書き換えます.

exec /usr/bin/X11/X -dpi 100

次に, 前回の授業で編集した /etc/hosts.allow が以下のようになっていることを念のため確認して下さい.

# vi /etc/hosts.allowEnter
... (コメント文)
ALL: 192.168.16.1?? 
(または ALL: ALL)

# exitEnter

< cat を用いて /etc/hosts.allow を見る

< 全てのデーモンに対して, 192.168.0.1?? からのアクセスのみを許可
  (?? は隣の実験機番号)

< root を抜ける

作業が終了したら,

$ startxEnter

[1.2] 任意での作業

今回の実習で用いる X クライアントとしては xeyes を上げていますが, もしも他の X クライアントを使いたいのであれば自由に変更してください. 以下に, 簡単に使える X クライアントをとりあえずリストしておきます. 中にはパッケージ (= コマンド名) をインストールする必要があるものも あるかもしれません. (何が出るかはお楽しみ)

xlogo, xclock, xfontsel, xload, xcalc, oneko, xsnow, xearch, xteddy, xpenguins

2. X クライアントを表示するサーバと画面の選択

[2.1] xhost によるアクセス許可

まず X サーバの制御プログラム「xhost」を使って 3n+1 or 3n+2 の X クライアント からのアクセスを許可します.

$ xhost +192.168.16.1??Enter
< joho??からの要求を受け付ける

このようなやり方もあります.

$ xhost +Enter
< すべてのマシンからの要求を受け付ける

[2.2] DISPLAY の設定

環境変数 DISPLAY に示されるサーバに X クライアント(以下 X と略することがある) が表示されます. 自分が使っている端末に表示するように設定します. 設定の書式は以下の通りです.

(ホスト名):(ディスプレイ番号).(スクリーン番号)

設定例

$ export DISPLAY=localhost:0.0

または (joho6 の場合)

$ export DISPLAY=joho6.ep.sci.hokudai.ac.jp:0.0

IP アドレスで指定することも可能です. (joho01 の場合)

$ export DISPLAY=192.168.16.101:0.0

設定を確認してみましょう.

$ printenv | grep DISPLAYEnter

DISPLAY が先程設定した値になっていれば設定完了です. 試しに xeyes を実行してみましょう.

$ xeyes &Enter

目玉のウインドウが出て来ましたね?

停止するには, jobs または ps ux コマンドで確認した後, kill コマンドで 停止します.

$ jobs Enter
[2]+  Running                 xeyes &

$ kill %2Enter
$ ps ux | grep xeyes Enter
hoge 15881  0.6  0.7  4448 1796 ttyp5    S    15:48   0:00 xeyes

$ kill 15881Enter

[2.3] X を飛ばしてみる

X は環境変数 DISPLAY の値に設定されている場所へ表示されます. DISPLAY に他のマシン (X サーバ) を指定すれば,そこにクライアントの 画面を飛ばせます. 3n+1 マシンは 3n+2 マシンへ, 3n+2 マシンは 3n+1 マシンへ xeyes を 飛ばしてみましょう. IP アドレスは相手のマシンのアドレスを入力してください.

$ export DISPLAY=192.168.16.1??:0.0Enter
$ xeyes &Enter

3. X サーバ側からのアクセス制限

[3.1] xhost によるアクセス制限

次に「xhost」を X クライアントからのアクセス制限に使います.

$ export DISPLAY=:0.0 Enter
$ xhost -192.168.16.1??Enter
< joho??からの要求に答えない

[3.2] 再び X を飛ばしてみる

制限を加えた状態で X が飛ばせるか試してみましょう. [2.3]と同様にお互いのマシンに xeyes を飛ばしてみよう.

$ export DISPLAY=192.168.16.1??:0.0Enter  # 相手のホストの IP を指定
$ xeyes &Enter

[3.3] もっと厳しいアクセス制限

「xhost」はホスト(マシン)単位でアクセスを制御します. 「xauth」でさらに厳しく制限することができます(ユーザ単位での制限). 詳しくは man で確認してください. 「xauth」を使用するときは必ず 「xhost -」 としておくこと忘れないようにしてください.

サーバ側(例 joho11: 画面を飛ばされる方)

$ xhost -Enter            # xhost によるアクセス許可を行わないようにします
$ xauth list :0.0Enter
joho11/unix:0 MIT-MAGIC-COOKIE-1 174bakcfd407df4fa7cc5f4457c11147

この174bakcfd407df4fa7cc5f4457c11147は, ログインしているユーザ, ホストによって決まる文字列で, X を起動する毎 (startx する毎) に変化します.

サーバで表示された174bakcfd407df4fa7cc5f4457c11147 (暗号化された文字列) をクライアント側に設定します. (当然資料のこの文字を そのまま設定しても無効です).

クライアント側(例 joho12: 画面を飛ばす方)

$ xauthEnter
Using authority file /home/hoge/.Xauthority
xauth> add 192.168.16.1??:0.0 . 174bakcfd407df4fa7cc5f4457c11147Enter
xauth> exitEnter
$ export DISPLAY=192.168.16.1??:0.0Enter  # 相手のホストの IP を指定
$ xeyes &Enter

暗号化された文字列がサーバとクライアントで一致したときのみ目玉が表示されます.

設定の削除方法

$ xauthEnter
xauth> remove 192.168.16.1??:0.0Enter
xauth> exitEnter

時間に余裕がある場合は, 再度 xauth を実行し, add の部分の 赤字の文字列をわざと間違えてみて, 本当に目玉が表示できないことを 確かめてみよう.

[3.4] ssh による X 転送

相手のコンピュータに接続し, X を自分のコンピュータのディスプレイに表 示します. 接続先のコンピュータにアカウントが必要です. ssh を 使うと,自動的に画面が転送されます.このとき xhost などの設定は 不要です(内部で xauth を設定しています).

$ ssh -X 192.168.16.1??Enter
password:
joho??$ xeyes &Enter
< ?? は相手のマシン番号

-X の代わりに -x オプションを指定したり, オプションを指定しないで X の転送を試してみましょう. これらの場合には -X オプションを 指定した場合とは挙動が異なるはずです. 理由は man ssh で調べてみてください.

$ ssh -x 192.168.16.1??Enter
password:
joho??$ xeyes &Enter
< ?? は相手のマシン番号
$ ssh 192.168.16.1??Enter
password:
joho??$ xeyes &Enter
< ?? は相手のマシン番号

4. X のセキュリティ

[4.1] 画面を盗み見る

3n+1 マシンおよび 3n+2 マシンで「xhost +」を設定し, お互いに覗き見てみよう.

サーバー側

$ export DISPLAY=:0.0 Enter
$ xhost +Enter

クライアント側

$ xwd -display 192.168.16.1??:0.0 -root -silent -out xhost.xwdEnter

$ display xhost.xwd &Enter
< xhost.xwd ファイルに画像をダンプ(記録)する
  ?? は相手のマシンの番号
< ダンプした画像を表示

xwd X のイメージ(画像)をダンプする X クライアント
display 画像ビューワー

display コマンドで画像を表示しようとすると, 始めは縮小して表示される と思いますが, ウィンドウの端を広げるなどすると原寸大表示に 近づけることが出来ます.


[4.2] 入力を監視する

3n+1 マシンおよび 3n+2 マシンで, お互いに仮想端末を検索し, お互いの入力を 監視してみよう.

サーバー側

$ xhost +Enter

クライアント側

$ xwininfo -display 192.168.16.1??:0.0 -root -tree | lessEnter
xwininfo: Window id: 0x31 (the root window) (has no name)

  Root window id: 0x31 (the root window) (has no name)
  ...
  ...
  ...

$ xev -display 192.168.16.1??:0.0 -id 0x31Enter
< 仮想端末らしいウインドウのIDを探す 
  ?? は相手のマシン番号






< 探し出した ID を設定しのぞく

xwininfo ウィンドウの属性を表示
xev 指定したウインドウで発生したイベントを表示

[4.3] セキュリティー上の注意点

これまで試してきて分かるように xhost + と設定すると全てのホストからの ウィンドウ表示要求を受け入れることになってしまいます. これは密かに誰かから 監視される可能性があることを意味しています. セキュリティー上好ましくないので なるべく xauth を使うようにしましょう.

5. 参考文献





最終更新日: 2006/01/17 (森川 靖大) Copyright © 2007 inex