scriptedlogin

著者: A.Yoshiyama <yosshy@debian.or.jp>
バージョン: 2.0.0 (2008/9/21)

はじめに

 scriptedlogin とは、/bin/login プログラムを自動的に script コマンド環 境下に移行するプレロードライブラリです。

 従来、セキュリティ等の目的でローカルログインやリモートログインのユー ザの操作履歴を取る為に、ユーザのログインシェルの初期実行スクリプト (BASH の .bashrc 等)に script コマンドを埋め込む、カーネルにパッチを 当てる、シリアルポートのログプログラムを使用する等のアプローチが取られ てきましたが、これらの方法には様々な問題がありました。

 scriptedlogin では、上記の問題を回避する為、/bin/login プログラム実行 時点で script コマンドと同様の環境を整備し、その環境下で改めて /bin/login を実行する方式を採っています。これにより、ログファイルは一般 ユーザアカウントのアクセス不可なディレクトリ下に、一般ユーザアカウント が読み書き削除できないパーミッションのファイルとして作成されます。

 また、導入のしやすさや OS 保守(商用ライセンス等)の観点から、 scriptedlogin はプレロードライブラリ方式を採用しています。これにより、 既存の /bin/login や getty、telnet 等、ライブラリ群に一切手を加えないで 導入・運用できるようになっています。

scriptedlogin のアプローチ

 通常のコンソールログインは下記の流れになります。

  1. getty が login: プロンプトを表示
  2. ユーザがアカウント名を入力
  3. getty が /bin/login をアカウント情報付きで実行
  4. /bin/login が password: プロンプトを表示
  5. ユーザがパスワードを入力
  6. /bin/login がユーザのログインシェルを実行

 scriptedlogin を導入すると、上記の流れが下記の通りになります。

  1. getty が login: プロンプトを表示
  2. ユーザがアカウント名を入力
  3. getty が /bin/login をアカウント情報付きで実行
  4. /etc/ld.so.preload の設定に従い、 ローダが libscriptedlogin.so を /bin/loginにプレリンク
  5. /bin/login の main() 前に libscriptedlogin.so が処理を開始
  6. 子プロセスを生成し、/bin/login を再度実行させる ※ (親プロセスは標準入出力のやり取りをファイルに出力)
  7. /bin/login が password: プロンプトを表示
  8. ユーザがパスワードを入力
  9. /bin/login がユーザのログインシェルを実行

 /etc/ld.so.preload を使用している以上、OS 上で実行される全コマンドに libscriptedlogin.so はプレロードされ、main() の前に scriptedlogin のルー チンが実行されますが、scriptedlogin 内で自分自身がリンクされたコマンド の名前をチェックし、/bin/login 以外では即時処理を抜ける(→ 本来の main() が実行される)ようになっています。

 上記以外にも、scriptedlogin のルーチンでは、様々なチェックが行われて おり、どれか1つでも条件が満たない場合は即時に本来の main() に実行が移 る設計になっています。

 scriptedlogin 1.0.x では、※の箇所で script コマンドを実行し、その中で /bin/login を実行していましたが、2.0.0 より scriptedlogin 自体にscript コマンドの機能を取り込んでいます。これにより、script コマンドがインストー ルされていない環境でも使用できる上、不要なプロセスを生成しないように改 良されています。

実行環境

 main() 前の別ルーチン実行は gcc の機能に、main() 実行前のコマンド名や コマンドライン取得は Linux の /proc ファイルシステムに依存しています。 これらの条件が GNU/Linux と同様であれば、他の OS でも動作する可能性はあ ります。

 なお、プレロードライブラリ機構を使用する都合上、/bin/login がダイナミッ クリンクされている必要があります。GNU/Linux でも /bin/login がスタティッ クリンクされている場合は機能しないでしょう。

導入方法

 インストールは至ってシンプルです。

  1. ソースアーカイブを展開します。

  2. 下記コマンドを実行します:

    make
    su root
    make install
    

 デフォルトでは、/usr/local/lib 下に scriptedlogin 本体、 /usr/local/bin 下に操作再生ツール slreplay(script コマンド付属の scriptreplay コマンドの修正版)をインストールします。また、ログファイル は/var/log/scriptedlogin 下に保存されるようになっています。

 上記のデフォルト設定を変更したい場合は、Makefile や scriptedlogin.c を修正して下さい。

 アンインストールしたい場合は、下記コマンドを実行して下さい:

su root
make uninstall

 ライブラリやツールはアンインストールされますが、既にあるログファイル は削除されません。必要であれば別途削除して下さい。

使用方法

 scriptedlogin 自体は特別な使用法はありません。インストール後、普通に コンソールログインして下さい。

 ログファイルの存在ぐらいは確認しても構いませんが、間違えても現在使用 中のシェルのログファイルを cat で表示しないで下さい!無限ループになりま す。既にログアウトしたシェルの操作履歴なら、内容を表示しても問題ありま せん。

 ログファイルは2つあります:

/var/log/scriptedlogin/
  <日付>-<ログイン時刻>-<ユーザ名>-<tty名>:操作ログ
  <日付>-<ログイン時刻>-<ユーザ名>-<tty名>-t:タイミングログ

 前者は操作ログそのものです。ざっと操作履歴を確認するためにはこちらの 内容を確認して下さい。

 後者は前者の出力タイミングを記録したものです(script コマンドの同様の 機能と同じ事をしています)。こちらを使用してコンソール操作を「再生」す る為には、scriptedlogin に同梱された slreplay コマンドを下記要領で使用 します(libscriptedlogin と同時にインストールされます):

slreplay <操作ログ> [<タイミングログ>]
  ※scriptedlogin 2.0.0 より引数の扱いが変わりました

 綺麗に表示する為には、ユーザがログインしたターミナル環境と同じ環境で slreplay コマンドを実行する必要があります。

運用上の注意

重要

ユーザのログイン毎にログファイルは増えていきます。 ログファイルの整理は怠らないようにして下さい。

制限事項

 scriptedlogin は /bin/login の実行に完全に依存したツールです。このた め、下記のケースではログを採取しません。

ライセンス

 scriptedlogin 2.0.0 より、script コマンドのソースコードを流用していま すので、scriptedlogin のライセンスは script コマンドのライセンスに準じ ます(修正 BSD ライセンスのようです)。詳しくは scriptedlogin.c の先頭 部分を参照して下さい。

 slreplay は script コマンドの付属ツール、scriptreplay コマンドに手を 加えたものです。ライセンスはオリジナルのまま(パブリックドメインの模様) です。

更新履歴