[Exp2012]X Window System
実習の前準備
必須の作業
X server の設定
情報実験機を立ち上げたときにディスプレイマネージャが起動しないようにします.
# apt-get remove gdm
次に, 以下の作業を行ってください.
# cd /etc/X11/xinit # cp xserverrc xserverrc-org # vi xserverrc
xserverrc ファイル中の記述
exec /usr/bin/X -nolisten tcp "$@"
のうち, << -nolisten tcp>> の部分を消します.
exec /usr/bin/X "$@"
作業を終えたら 再起動, ログイン後 X を手動で起動します.
$ startx
アカウントの作成
今回の実習は, 二班一組になって行います. 情報実験機番号 (01, 02), (04, 05), (07, 08), (10, 11), (13, 14) で組になってください. 組になった情報実験機の間で, お互いにアカウントを作ります (前回の実習で作成済みの人が多いと思います). アカウントの作り方は, [Exp2012]情報実験機のアカウント作成 を参照してください.
実習の進め方
実習の中で, サーバ側とクライアント側に分かれて作業を行うところがあります. 画面を飛ばしたり, 画面を盗み見る作業が確認できれば, サーバ側とクライアント側を交代して作業を行ってください.
アクセス制御の設定
/etc/hosts.allow を編集して以下のようにして下さい.
# vi /etc/hosts.allow ... (コメント文) ALL: 133.30.109.?? < 全てのデーモンに対して, 133.30.109.?? からのアクセスのみを許可 (または ALL: ALL) (組になった情報実験機の間で, 互いのIPアドレスを入れる.)
ssh のインストールと設定
ssh サーバをインストールします. (前回インストール済みかと思いますが, 念のため行ってください)
# apt-get install openssh-server
次に, ssh を用いて X (画像, アニメーションなど) をリモートホストと送受信するための, ssh の設定確認をします.
# cat /etc/ssh/sshd_config ・・・・・・ ・・・・・・ ・・・・・・ X11Forwarding yes < X11Forwarding の設定が yes であることを確認する.
ImageMagick のインストール
ImageMagick をインストールします.
# apt-get install imagemagick
任意での作業
今回の実習で用いる X クライアントとしては xeyes (これは x11-apps に含まれています) を挙げていますが, もしも他の X クライアントを使いたいのであれば自由に変更してください. 以下に, 簡単に使える X クライアントをとりあえずリストしておきます. 中にはパッケージ (= コマンド名) をインストールする必要があるものもあるかもしれません.
x11-apps oneko xpenguins-applet debroster electricsheep
X クライアントを表示するサーバと画面の選択
xhost によるアクセス許可
まず X サーバの制御プログラム「xhost」を使って, 情報実験機の間で互いの X クライアントからのアクセスを許可します.「xhost」とは X クライアントからのアクセスを許可または制限を設定するコマンドです.
$ xhost +133.30.109.?? < 相手の情報実験機からの要求を受け付ける
アクセス許可がされたかどうかを確認してみましょう.
$ xhost access control enabled, only authorized clients can connect INET:joho??-itpass.local < アクセス許可をしたホストのリストを表示
こんな設定方法もあります.
$ xhost + < すべての情報実験機からの要求を受け付ける
DISPLAY の設定
自分の使っている端末に X クライアント (以下 X と略します) を表示するように設定します. 環境変数 DISPLAY で設定しているサーバに X クライアントが表示されます.
- 設定の書式
DISPLAY=(ホスト名):(ディスプレイ番号).(スクリーン番号)
- 設定例
$ export DISPLAY=localhost:0.0
IP アドレスでホストを指定することも可能です.
$ export DISPLAY=133.30.109.??:0.0 < 自分の情報実験機の IP アドレスを指定
設定を確認してみましょう.
$ printenv | grep DISPLAY $ echo $DISPLAY
DISPLAY が先程設定した値になっていれば成功です. 試しに xeyes を実行してみましょう.
$ xeyes &
目玉のウインドウが出て来ましたか?
停止するには, jobs でジョブ番号を, または ps ux コマンドで pid を確認した後, kill コマンドを使います.
$ jobs [1]+ Running xeyes & $ kill %1 $ ps ux | grep xeyes hoge 15881 0.6 0.7 4448 1796 ttyp5 S 15:48 0:00 xeyes $ kill 15881
X を飛ばす
X は環境変数 DISPLAY で指定している場所に表示されます. DISPLAY に他の情報実験機 (X サーバ) を指定すれば,そこにクライアントの画面を飛ばせます. 組になった情報実験機の間で互いに xeyes を飛ばしてみましょう.
$ export DISPLAY=133.30.109.??:0.0 < 相手の情報実験機の IP アドレスを指定 $ xeyes &
X サーバ側からのアクセス制限
xhost によるアクセス制限
次に「xhost」を X クライアントからのアクセス制限に使います.
$ export DISPLAY=:0.0 $ xhost -133.30.109.?? < 相手の情報実験機からの要求に答えない
再び X を飛ばしてみる
制限を加えた状態で X を飛ばせるか試してみましょう. X を飛ばすと同様に互いの情報実験機に xeyes を飛ばしてみよう.
$ export DISPLAY=133.30.109.??:0.0 < 相手の情報実験機の IP アドレスを指定 $ xeyes &
より厳しいアクセス制限
「xhost」はホスト(マシン)単位でアクセスを制御します. 「xauth」でさらに厳しく制限することができます(ユーザ単位での制限). 詳しくは man で確認してください. 「xauth」を使用するときは必ず 「xhost -」 としておくこと忘れないでください.
サーバ側 (X クライアントを飛ばされる方)
$ export DISPLAY=:0.0 $ xhost - < xhost によるアクセス許可を行わないようにします $ xauth list :0.0 joho01/unix:0 MIT-MAGIC-COOKIE-1 174bakcfd407df4fa7cc5f4457c11147
この174bakcfd407df4fa7cc5f4457c11147は, ログインしているユーザ, ホストによって決まる文字列で, X を起動する度 (startx する度) に変化します.
クライアント側 (X クライアントを飛ばす方)
サーバで表示された174bakcfd407df4fa7cc5f4457c11147 (暗号化された文字列) をクライアント側に設定します. (当然資料のこの文字をそのまま設定しても無駄です).
$ xauth Using authority file /home/hoge/.Xauthority xauth> add 133.30.109.??:0.0 . 174bakcfd407df4fa7cc5f4457c11147 xauth> exit $ export DISPLAY=133.30.109.??:0.0 < 相手の情報実験機の IP アドレスを指定 $ xeyes &
暗号化された文字列がサーバ側とクライアント側で一致したときのみ目玉が表示されます.
- 設定の削除方法
$ xauth xauth> remove 133.30.109.??:0.0 xauth> exit
時間に余裕がある場合は, 再度 xauth を実行し, add の部分の暗号化された文字列をわざと間違えてみて, 本当に目玉が表示できないことを確かめてみましょう.
設定を元に戻す
現在, X クライアントを飛ばす先は相手方ディスプレイに設定されているので, それを自分のディスプレイに戻します.
$ export DISPLAY=localhost:0.0
ssh による X 転送
相手のコンピュータに接続し, X を自分のホストのディスプレイに表示します. 接続先のコンピュータにアカウントが必要です. ssh を使うと,自動的に画面が転送されます.この場合は xhost などの設定は不要です(ssh の内部で xauth を設定しています).
$ ssh -X 133.30.109.?? < 相手の情報実験機の IP アドレス password: joho??-itpass$ xeyes &
-X の代わりに -x オプションを指定したり, オプションを指定しないで X の転送を試してみましょう. これらの場合には -X オプションを指定した場合とは挙動が異なるはずです. 理由は man ssh で調べてみてください.
$ ssh -x 133.30.109.?? < 相手の情報実験機の IP アドレス password: joho??-itpass$ xeyes & $ ssh 133.30.109.?? < 相手の情報実験機の IP アドレス password: joho??-itpass$ xeyes &
X のセキュリティ
画面を盗み見る
組になった情報実験機の間で「xhost +」を設定し, 互いに覗き見してみましょう.
サーバ側
$ export DISPLAY=:0.0 $ xhost +
クライアント側
$ xwd -display 133.30.109.??:0.0 -root -silent -out xhost.xwd < xhost.xwd ファイルに画像をダンプ(記録)する. 相手の情報実験機の IP アドレス $ display xhost.xwd & < ダンプした画像を表示
使用しているコマンドの解説
xwd X のイメージ(画像)をダンプする X クライアント display 画像ビューワー
display コマンドで画像を表示しようとすると, 始めは縮小して表示されると思いますが, ウィンドウの端を広げるなどすると原寸大に近づけることが出来ます.
入力を監視する
組になった情報実験機の間で, 互いの仮想端末を検索し, その入力を監視してみましょう.
サーバ側
$ xhost +
クライアント側
$ xwininfo -display 133.30.109.??:0.0 -root -tree | less < 仮想端末らしいウインドウのIDを探す 相手の情報実験機の IP アドレス xwininfo: Window id: 0x3e (the root window) (has no name) Root window id: 0x3e (the root window) (has no name) ... ... ... $ xev -display 133.30.109.??:0.0 -id 0x3e < 探し出した ID を設定しのぞく
ここで 0x3e は the root window の ID なので, the root window (背景画面) でのマウス等の操作を監視できる.
使用しているコマンドの解説
xwininfo ウィンドウの属性を表示 xev 指定したウインドウで発生したイベントを表示
セキュリティ上の注意点
これまで試してきて分かるように, X の設定において xhost + と設定すると全てのホストからのウィンドウ表示要求を受け入れてしまいます. これは密かに誰かから監視される可能性があることを意味します. セキュリティ上危険が大きいので xauth を使うようにしてください.
実習後の作業
実習の始めに行った変更を元に戻します.
X server の設定を元に戻す
X server の設定を以下の作業で元に戻します.
$ sudo -s # cd /etc/X11/xinit # cp xserverrc-org xserverrc
アクセス制御の設定を元に戻す
/etc/hosts.allow のアクセス制御の設定を元に戻します. コメント文の下に書き加えた以下の記述を消してください
ALL: 133.30.109.?? (または ALL: ALL)
以上で今日の実習は終わりです. お疲れさまでした.
参考資料
- 松田晃一, 暦本純一 著「入門X Window」 アスキー, ISBN4-7561-0166-6
- 山口和紀, 古瀬一隆 監修「新 The UNIX Super Text (上・下)」 技術評論社, (上巻)ISBN4-7741-1682-2, (下巻)ISBN4-7741-1683-1
- Linux Software Search -- スクリーンマスコット
このページは 北海道大学 理学院 情報実験 (INEX) : サーバ・クライアントシステム(2007 年度資料) を基に作成しました.
Keyword(s):
References:[[Exp2012]スケジュール表・各回資料]