RHEL8で端末の入出力を記録する

レッドハットの森若です。

RHEL 8 では、 tlog という端末の入出力を記録する仕組みが導入されています。今回はこのtlogを紹介します。

シーン1 トラブルシュート

ショートコント「チャットにて」

A> foobar.logっていうファイルがどこかにあるはずなんだけどどうやってみつけたらいい?
B> "$ locate foobar.log" ってやったらいいよ
A> command not foundってでた
B> じゃあ"$ find / -name foobar.log" で出る?
A> またcommand not foundってでた
B> さすがにそれはないでしょー?
A> でも bash: $: command not found ってでてる。
B> もしかして $ をコマンドとして入力してる?

ここまで極端でなくても、作業の厳密な記録や、試行錯誤したときに「何を入力して何が出力されたか」をはっきり人に伝えるのはなかなか難しいものです。 この問題に対して端末の入出力を記録するソフトウェアが利用されます。その一種が今回紹介するtlogです。

インストールはRHEL 8にて、tlogパッケージを導入します。

# yum install tlog

その後記録をはじめる時に、以下のように-o オプションでログファイルを指定して tlog-rec コマンドを実行します。

$ tlog-rec -o mysession.log

tlog-recの子プロセスとしてシェルが起動しますので、そのあとは普通に作業をおこない、終わったらシェルを終了します。シェルの実行が終わるとtlog-recも実行を終了し、ログファイルの中には記録された出力情報がJSON形式で記録されます。

mysession.logの中身は以下のようになっていて、おおよそ10秒毎にバッファリングして記録されます。

{"ver":"2.2","host":"rhel82","rec":"6cca1ac609954a8c9b2b5f2350c74c2c-11aa-1e1ef","user":"kmoriwak","term":"xterm-256color","session":5,"id":1,"pos":0,"timing":"=80x24+90>43+1275>1+77>1+90>2+1>534+1>43+2788>1+54>1+72>1+38>1+112>1+55>1+67>1+55>1+268>1+706>1+77>1+76>1+73>1+134>1+89>1+71>1+67>1+435>17+291>5+71>5+150>5+128>5+390>51+291>1+255>1+386>1+285>1+106>1+299>1+250>1+211>1","in_txt":"","in_bin":[],"out_txt":"\u001b]0;kmoriwak@rhel82:~\u0007[kmoriwak@rhel82 ~]$ ls\r\n3903028196380168456-key.pem  \u001b[0m\u001b[38;5;40mkubectl  (==中略==)   [C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C > huga.","out_bin":[]}

このJSONファイルは"timing" という項目で画面出力のタイミングを保持していますので、 tlog-playコマンドに処理させることで、表示の待ち時間タイミングも含めて再現できます。(早送りやジャンプの機能もあります)

$ tlog-play -i mysession.log

このファイルを送ると「何がいつ端末に表示されたか」がほとんど完全に再現されるわけです(入力はパスワードなども含むため、デフォルトでは記録しませんが、オプション指定により記録することもできます)。

tlog-playコマンドの他、Web Consoleと統合されたセッション記録のプレーヤーもあります。

f:id:mrwk:20201207160449p:plain
Web Console内でのセッション記録再生

シーン2 監査のためのセッション記録

ログイン時に、シェルのかわりに tlog-rec-session を起動することで、tlog-recと同じ仕組みでログインセッション全体を記録することができます。こちらはの利用シーンは、管理者およびユーザによる操作の監査ログとして利用したい場合に、全ての作業をログに残すため使います。

セッション記録は以下の図のような仕組みでおこない、ユーザの諸情報を管理するSSSDが設定に従い、記録対象のアカウントについてはtlog-rec-sessionをシェルとして実行し、かつ環境変数 SHELLは本来指定されていたシェルになるよう調整します。

f:id:mrwk:20201207151308p:plain
tlog + SSSDによるセッション記録概要

典型的にはSSSDを利用したログインをおこない、セッション記録をおこないます。

こちらの設定方法については以下のドキュメントをごらんください。

access.redhat.com

注意点

いくつかtlog利用時の注意点を書いていきます。

  • tlog-playで記録を再生するとき、端末のサイズが異なると表示が崩れます。timing内の =80x24 のような部分で端末のサイズを記録していますので崩れた場合は記録時の端末サイズとずれていないか確認しましょう。cockpitで表示する場合にはこの情報から自動的にブラウザ上の再生領域をリサイズしてくれます。
  • rootユーザが直接ログインできる設定や、SSSDを利用しないシステムの場合、/etc/passwd エントリを使うことが多いはずです。この場合cockpitからの設定ではrootでログインしたセッションを記録できません。上のドキュメント「2.5. SSSD を使用せずに録画するユーザーまたはユーザーグループの設定」を参考に、ログインシェルを /usr/bin/tlog-rec-session と指定することで利用できます。
  • セッション記録をrsyslogに保存する場合、MaxMessageSizeを3KB以上に設定します。デフォルトだと2KBで、記録が再現できなくなる場合があります。
  • セッション記録をjournalに保存する場合、デフォルトでは再起動すると消えてしまいます。# mkdir /var/log/journal のようにしてjournalを永続化します。
  • GUIセッションは記録されません。監査ログに利用したい場合、GUIセッションでのログインや操作は記録できません。

参考資料

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。