ターミナルの操作ログを自動で残したい


セキュリティと監査証跡の目的で自動的に操作ログを残すにはどうしたらよいでしょうか。  
ユーザが気が付かないうちにひっそりとログを取るのが理想です。  
ログに残したい情報は次の通りです。

  * ユーザ名
  * ユーザが入力したコマンドライン
  * 端末への出力
  * タイムスタンプ




ログインシェルをttyrecなどでラップしたシェルにすれば取れます（取っていました）。




プロセスアカウンティング用に広く利用できる物として "[Process Accounting
Utility](http://www.gnu.org/software/acct/)" があります。環境によって、パッケージの名前が、 `psacct`
もしくは `acct` になっているものです。

[code]

    $ # インストール (ubuntu)
    $ apt-get install acct
    
[/code]

## 用意されているコマンド

  * `lastcomm`: 実行されたコマンドの表示
  * `ac` : ユーザの接続時間の表示
  * `sa`: 過去に実行されたコマンドの集計／フィルタ

※ 質問の要件を満たすために、一般ユーザーからはこれらのコマンドが実行できないようにしてください。

## アカウンティングサービスの実行

[code]

    $ # サービスの開始
    $ /etc/init.d/acct start
    
    $ # サービスの停止
    $ /etc/init.d/acct stop
    
[/code]

実際は、`accton` コマンドによってプロセス監視が始められます。収集情報の格納先は、デフォルトで `/var/log/account/pacct`
または `/var/account/pacct` になります。

## 過去に実行されたコマンド情報を知る

`lastcomm` コマンドを利用します。

[code]

    $ lastcomm higon
    
    byobu-status      F    higon    __         0.00 secs Wed Jan  7 03:23
    sed                    higon    __         0.00 secs Wed Jan  7 03:23
    sudo             S     root     pts/18     0.03 secs Wed Jan  7 03:21
    apt-get          S     root     pts/18     1.85 secs Wed Jan  7 03:23
    dpkg                   root     pts/18     0.00 secs Wed Jan  7 03:23
    dpkg                   root     pts/18     0.00 secs Wed Jan  7 03:23
    dpkg                   root     pts/18     0.00 secs Wed Jan  7 03:23
    apt-get           F    root     pts/18     0.00 secs Wed Jan  7 03:23
    sh                     root     pts/18     0.00 secs Wed Jan  7 03:23
    touch                  root     pts/18     0.00 secs Wed Jan  7 03:23
    ...
    
[/code]

※ 終了したコマンドのみ記録されています。実行中のコマンドは取れません。

以下のように、絞り込みやグループ化のオプションが用意されています。

特定の接続の履歴を知る:

[code]

    $ lastcomm --tty pts/18
    
[/code]

特定のコマンドの実行を知る:

[code]

    $ lastcomm --strict-match --command vi
    
[/code]

## ユーザの接続時間の表示

ユーザ毎日付毎の接続時間:

[code]

    $ ac -d -p
    
[/code]

## サマライズ

ユーザ毎に履歴を表示:

[code]

    $ sa --print-users
    
[/code]

ユーザ毎にサマライズを表示:

[code]

    $ sa --user-summary
    
[/code]

出力例:

[code]

       9000    3794.72re       0.09cp         0avio      2914k
          23      94.46re       0.05cp         0avio      3516k   ***other*
          11       0.35re       0.01cp         0avio      2890k   lastcomm
           2       0.01re       0.01cp         0avio     18432k   command-not-fou
           2    3699.26re       0.00cp         0avio     54160k   apache2*
           2       0.00re       0.00cp         0avio      8518k   lsb_release
           4       0.01re       0.00cp         0avio      5465k   dpkg
           2       0.01re       0.00cp         0avio      4092k   grep
           3       0.00re       0.00cp         0avio     33328k   php5
        1108       0.34re       0.00cp         0avio      1111k   sh
        1104       0.00re       0.00cp         0avio      3950k   tmux
        1104       0.00re       0.00cp         0avio      4618k   sed
           2       0.00re       0.00cp         0avio      4282k   sadc
    
[/code]

各カラムの説明は `man sa` に任せます。

## `logrotate` の設定

環境によってはパッケージ導入時に logrotate.d 以下に設定ファイルがおかれます。 Ubuntu
だと以下のようなファイルで良いでしょう。（ログは圧縮されています。 過去ログを `sa -f`
オプションで指定するときには、展開したデータを渡す必要があります。）

[code]

    /var/log/account/pacct {
        compress
        delaycompress
        notifempty
        daily
        rotate 31
    
        rotate 31
        create 0600 root root
        missingok
        postrotate
            /etc/init.d/acct restart
        endscript
    }
    
[/code]

以上です。使用にあたっては、監視の粒度に注意したいところです。`acct`
は、大量にコマンド実行履歴を集めますが、コマンドの引数は見ません。ディレクトリ監視、ネットワーク監視、負荷監視などとあわせることで、より細かなことがわかるようになるでしょう。

最初から細かな記録を取りたい場合は、プロセス監視デーモンとして、 [auditd](http://linux.die.net/man/8/auditd)
があります。こちらは Linux
カーネルのシステムコールレベルで環境を記録するもので、事細かなシステムのログを取ります。コマンドの引数なども記録するのですが、漏れのない徹底的な監視環境を目指していない限り、
`acct` の利用が適切かと思います。

参考:

  * GNU, [Process Accounting Utility](http://www.gnu.org/software/acct/)
  * ITMedia, [アカウントの利用統計が知りたい](http://www.itmedia.co.jp/help/tips/linux/l0677.html)
  * [How to keep a detailed audit trail of what’s being done on your Linux systems](http://www.cyberciti.biz/tips/howto-log-user-activity-using-process-accounting.html)

