現在地

第13回「 TaskTracker ノススメ」


前回紹介した System Call Auditing にはいくつか不便な点があります。

例えば、システムコールに渡された数値ではない引数(文字列や構造体などへのポインタ)を数値として記録してしまうため、別の箇所でパス名として記録される一部の例外を除いて、数値ではない引数の内容を確認する目的では使えないという点があります。そのため、必要に応じて strace コマンドや ltrace コマンド、SystemTap などを併用して情報を取得することになります。ちなみに、 TOMOYOLinux では文字列や数値で表されるパラメーターを扱うことを意識しているので、取得できる項目は限られているものの、ソケットアドレス構造体の中に埋め込まれたIPアドレスとポート番号の組み合わせのような情報を取得することができます。

他にも、プロセスを特定するための手がかりが貧弱であるという点があります。SELinux が disabled になっていなければプロセスのコンテキスト情報が subj= フィールドに出力されますが、仮に SELinux のコンテキスト情報が出力されたとしてもSELinux について理解している人にしか役に立たないので、障壁が高いと考えます。そこで、今回は System Call Auditing のログの中に、プロセスを特定するための手がかりを提供する TaskTracker を紹介します。

TaskTracker はカーネル 2.6.26 以降を対象としたカーネルモジュールであるため、RHEL 6 および RHEL 7 で使用することができます。しかし、 TaskTracker はSELinux と同時に使うことができないため、カーネルコマンドラインで SELinux を無効化する必要がある点と、 RHEL に同梱されていないカーネルモジュールであるため、Red Hat 社のサポート対象外である点に注意してください。

まず、カーネルモジュールのコンパイルに必要なパッケージをインストールします。

# VERSION=$(uname -r)
# yum -y install gcc make kernel-devel-${VERSION}
# cd /usr/src/kernels/${VERSION}/

そして、 TaskTracker のソースコードをhttp://sourceforge.jp/projects/akari/scm/svn/tree/head/branches/tasktracker/ からダウンロードして tasktracker ディレクトリに展開し、コンパイルおよびインストールします。

# curl -G -L 'http://sourceforge.jp/projects/akari/svn/view/branches/tasktracker/?root=akari&view=tar' | tar -zxvf -
# make SUBDIRS=$PWD/tasktracker
# make SUBDIRS=$PWD/tasktracker modules_install

RHEL 6 の場合、以下のコマンドを実行することで tasktracker.ko をロードするための/sbin/tt-init というスクリプトを作成してから、カーネルコマンドラインにsecurity=none init=/sbin/tt-init というオプションを指定することでロードします。

# echo '#! /bin/sh' > /sbin/tt-init
# echo '/sbin/modprobe tasktracker && exec /sbin/init "$@"' >> /sbin/tt-init
# chmod 755 /sbin/tt-init

RHEL 7 の場合、カーネルコマンドラインに init= オプションを指定すると正常に起動できないので、別の方法を使用します。具体的には、以下のコマンドを実行することで tasktracker.ko を含んだ initramfs を再作成してから、カーネルコマンドラインに security=none rd.driver.pre=tasktracker というオプションを指定することでロードします。

# echo 'add_drivers+=" tasktracker "' > /etc/dracut.conf.d/tasktracker.conf
# dracut -f

カーネルコマンドラインに指定するオプションの内容は、初回は GRUB の設定ファイルに変更を加えずに GRUB の画面から手動で指定するようにし、問題なく起動できることを確認してから GRUB の設定ファイルに変更を加えることを推奨します。

参考として、 TaskTracker により得られる System Call Auditing ログの例を載せておきます。プログラムを起動した(より正確に表現すると execve システムコールによりプロセスイメージが置き換えられた)時刻が過去の分も含めて履歴としてsubj= フィールドに出力されるため、当該システムコールを発行したプロセスがどのように実行されたのかを知ることができるようになります。なお、システムの設定によっては、起動シーケンスの中で行われるシステムクロックの設定により、履歴の中の時刻が時差の分(日本の場合は9時間)だけジャンプする場合があります。

---------- RHEL 6 で ssh セッションから reboot コマンドを実行した場合 ----------
time->Sun Jan 11 21:18:48 2015
type=PATH msg=audit(1420978728.358:1388): item=1 name=(null) inode=782229 dev=fd:00 mode=0100755 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL
type=PATH msg=audit(1420978728.358:1388): item=0 name="/sbin/reboot" inode=866 dev=fd:00 mode=0100755 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL
type=CWD msg=audit(1420978728.358:1388):  cwd="/root"
type=EXECVE msg=audit(1420978728.358:1388): argc=1 a0="reboot"
type=SYSCALL msg=audit(1420978728.358:1388): arch=c000003e syscall=59 success=yes exit=0 a0=1efe8d0 a1=1efd9c0 a2=1ef6bb0 a3=7fff8d834250 items=2 ppid=1295 pid=1314 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="reboot" exe="/sbin/reboot" subj="name=tt-init;pid=1;start=20150111211701=>name=init;pid=1;start=20150111211701=>name=sh;pid=857;start=20150111121705=>name=rc;pid=857;start=20150111121705=>name=S55sshd;pid=1169;start=20150111121708=>name=sshd;pid=1178;start=20150111121708=>name=sshd;pid=1293;start=20150111121720=>name=bash;pid=1295;start=20150111121722=>name=reboot;pid=1314;start=20150111121848" key=(null)
---------- RHEL 6 で ssh セッションから reboot コマンドを実行した場合 ----------
---------- RHEL 7 で ssh セッションから reboot コマンドを実行した場合 ----------
time->Sun Jan 11 20:59:47 2015
type=PATH msg=audit(1420977587.794:367): item=1 name=(null) inode=382165972 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00 objtype=NORMAL
type=PATH msg=audit(1420977587.794:367): item=0 name="/sbin/reboot" inode=97095 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00 objtype=NORMAL
type=CWD msg=audit(1420977587.794:367):  cwd="/root"
type=EXECVE msg=audit(1420977587.794:367): argc=1 a0="reboot"
type=SYSCALL msg=audit(1420977587.794:367): arch=c000003e syscall=59 success=yes exit=0 a0=140dcc0 a1=1420750 a2=1402580 a3=7fffe2a8b630 items=2 ppid=3401 pid=3424 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="reboot" exe="/usr/bin/systemctl" subj="name=systemd;pid=1;start=20150111205847=>name=systemd;pid=1;start=20150111205849=>name=sshd;pid=2471;start=20150111115858=>name=sshd;pid=3399;start=20150111115907=>name=bash;pid=3401;start=20150111115911=>name=reboot;pid=3424;start=20150111115947" key=(null)
---------- RHEL 7 で ssh セッションから reboot コマンドを実行した場合 ----------

(半田哲夫)

コーヒーブレーク「なんとなくHP200LX」

年末年始、机の整理をしていたら、懐かしいものが出てきました。

HP製のPDA(*1)、HP200LX(*2)です。おそらく本コラムの読者の方は、名前を聞いたこともないと思うので簡単にご紹介しますと、

  • 1994年に発売された単3乾電池駆動のPC/XT互換機(*3)アーキテクチャのPC
  • 仕様は、CPU: Intel 80c186(7.91MHz)、メモリ: ROM 3MB, RAM 2MB(モデルにより異なります)、ディスプレイ: 反射型モノクロ液晶 CGA (640x200)
  • OSは、MS-DOS(*4) v5(英語)、cc:Mail, Lotus 1-2-3(*5)などDOSアプリケーションの他、専用のPIM(*6)を多数搭載
  • インタフェースは、赤外線ポート(*7)とPCMCIAカード(*8)スロット、RS-232C(*9)ポート(独自コネクタ)
  • 大きさ(面積)はほぼiPhone6 plusと同じで、分厚い手帳くらいの厚さ

WindowsやMacなど今でこそPCは当たり前のように多言語対応しており、購入後すぐに日本語が使えます。しかし、当時は有志が苦労して日本語化した成果を探して環境を作ることが必要な時代でした。1994年というと、MS-DOSをソフトウェア的に日本語化したIBMのDOS/V(*10)が存在しています。日本語が使えるPCとして、圧倒的なシェアを誇っていたNECのPC98(画面解像度640x400)に、すべての互換機で日本語を使えるようにするDOS/V(640x480)の対決という構図が始まっていたわけですが、HP200LXは98ではなく、解像度も640x480でもないので、どちらにも加われません。HP200LXに惚れ込んだユーザは、日本語版の発売を熱望していましたが、残念ながら実現しませんでした。普通なら我慢して英語だけで使う、で終わるところです。

インターネットが普及し始めたのは、Windows95(*11)が発表された1995年と言われています。HP200LXが発売された頃は利用できませんでしたが、「パソコン通信(*12)」と呼ばれる電話回線を用いたネットワークが活況を呈していました。
夜11時(*13)になるのを待ち、PCに接続したモデム(*14)でプロバイダに電話して、電話回線を用いて通信します(PCで通信している間は当然ながら電話は利用できません)。「ピーガー」というネゴシエーションが成功して回線がつながると、パソコン通信用のソフトを用いて、「フォーラム」を巡回(新しい情報をダウンロードし、自分の書き込みをアップロードする)し、そして直ちに電話を切り、PC上でゆっくり同期した結果を確認します(初期の電子メールもそのように電話回線を用いたバケツリレーでした)。
画面サイズ、CPUやメモリ等スペック上は絶望的な制約を抱えていたHP200LXですが、有志達の努力により独自の仮想メモリ管理システムが開発され、専用の日本語フォントが作成され、ATOK8やVzなどのDOS用のソフトを使う方法が整備され、不自由なく日本語を扱えるようになりました。
先駆者の成果はフォーラムで共有され、最終的にはオカヤシステムウェアから発売された「日本語化キット(jkit)」としてまとめられ、誰もがHP200LXを究極の日本語PDAとして利用できるようになったのです。

開発の範囲は、日本語化にとどまりません。HP200LXを愛する有志達によってTRAIN(電車乗り換え探索)など数多くの優れたソフトウェアが開発され、無償あるいはシェアウェアとして公開されました。
拡張はなんとハードウェアにも及びます。勇気ある挑戦の結果、クロックの倍速化の手順とドライバが開発されました。腕に自信のあるユーザーは自分で水晶を購入し、はんだごてを持ち、そうでないユーザーは若松通商などに持ち込み、倍速化を行って利用していました。クロックアップほど普及していませんが、液晶のバックライト化も実用化されています。

十数年ぶりに再会を果たしたHP200LXに、電池(メインは単3乾電池、バックアップはCR2032)をセットしてみました。CドライブをRAMディスクとして利用し、大容量あるいは重要なファイルはPCMCIAカードに保存するのがHP200LXの流儀です。CドライブにEMSを切って、Aドライブに保存されていたフォントをCドライブにコピーして起動すると、懐かしい画面が表示されました。
Aドライブに保存してあったバックアップをファイラーでCドライブにコピーすると、何もかもが最後に使っていた時のままです。指はHP200LXの固めで、しっかりしたキーボードを覚えていました。

古い友人としばし戯れて思いました。
PDAとして必要最低限なエッセンスは、実は1994年にHP200LXとして実現されていたのです。
私はiPhone 6 plusのユーザーです。もちろん、iPhoneにはHP200LXにできないことができます。でも、今から10数年後、今使っているiPhoneを使えるか、そこに登録してあるデータを操作できるか、それ以前に電源を入れることができるか考えると、懐疑的です。HP200LXについては、単3乾電池とCR2032は今後も長く入手できるでしょうし、PCMCIAカードはSDカードのアダプタがあれば、SDカードがなくなるまで問題ありません。まだまだ現役で利用できそうです。また、維持できる、長く使えるだけではありません。HP200LXには「操作する楽しさ」、「使いこなす喜び」があります。一切の無駄がないのです。

技術は進化し続けています。超小型、超高性能、超大容量に進化したPCは今や「スマホ」としてポケットに収まり、ネットワークに常時接続しています。できることが増えて、便利になったことは確かです。でもそこに終わりはなければ安心もありません。資源も使える時間も有限で限りがあります。十数年ぶりに再会したHP200LXに、「今までどこに行ってたんだよ(笑)。技術はもう十分進歩したんだから、そろそろ本当に大切なものを考えてみたほうが良いんじゃないかな?」と言われたような気がしました。


(原田季栄)