サーバー上のユーザーのオペレーションをお手軽に記録する

Linux/Unixサーバー上で、ユーザーにオペレーション権限を与えたいが無制限に開放するとセキュリティ上好ましくないので、ユーザーに改竄されない形でオペレーションを記録しておいて後で追跡できるようにしたい。

ただし、以下の制約が存在する。

  • パッケージ増やすとそれに応じて管理コストも増えるのでなるべく避けたい
  • パフォーマンスの低下は確実に避けたい

そのため、以下の手段を取るのが難しい。

これらを満たすお手軽なロギング環境の構築についてbashzshのときで考えた。
(bashzshの理由は単に自分の置かれてる環境でメインに使われてるのがこの2つだけだったから)

bash

下記の記述を.bashrcに記述する。

export PROMPT_COMMAND='¥logger `¥history | ¥tail -n 1 | ¥sed "s/^[ ]*[0-9]+[ ]*//"`'
readonly PROMPT_COMMAND

PROMPT_COMMANDでhistoryの最新1件をloggerに与えてsyslogに記録する。
history | tail -n 1 のところは単に history -n 1でも良い場合もある。
sedの部分は実行履歴の番号を消しているだけ。
各実行コマンドに¥をつけているのはaliasなどで各コマンド自体を改竄されるのを防ぐため。

zsh

PROMPT_COMMAND相当のことをadd-zsh-hookで実現する。
以下の内容を.zshrcに記述する。

autoload -Uz add-zsh-hook
add-zsh-hook precmd log_command
log_command() {
    ¥logger `¥history | ¥tail -n 1 | ¥sed "s/^[ ]*[0-9]+[ ]*//"`
}

ただ、add-zsh-hook -d precmd log_commandとするとキャンセルできてしまう…。

参考