以前、sshサーバ側で自動的に操作ログを取得する方法について記述したが、今回は操作ログを自動取得し、かつその内容をSyslogとして記録させるように設定してみる。
Syslogへの記録については、loggerコマンドを利用する。

今回は、踏み台サーバとして利用する事を想定し、ユーザ「test」での設定例を記述する。
やり方は簡単。対象ユーザの「.bash_profile」に、以下の内容を追記するだけだ。

P_PROC=`ps aux | grep $PPID | grep sshd | awk '{ print $11 }'`
if [ "$P_PROC" = sshd: ]; then
    SCRIPT_FILE="scriptコマンドのPATH"
    TERMINAL=`tty`
    touch $SCRIPT_FILE
    tail -F $SCRIPT_FILE | logger -i -p プライオリティ.ファシリティ -t $USER.$TERMINAL &
    SCRIPT_PROCESS=&!
    script -fq $SCRIPT_FILE
    exit
    kill $SCRIPT_PROCESS
fi

これで、scriptコマンドで出力しているファイルの内容をsyslogに出力することが可能になる。

…のだが、このままだと、scriptで記録しているログファイルが削除された場合、それ以降scriptのログファイルにも、syslogにも記録されなくなるという不具合がある。
sudoでscriptコマンドを実行することも考えたが、それだとrootユーザーでbashが起動するという致命的な不具合があるため断念。

PROMPT_COMMANDに手を加え、更にユーザーのスイッチをさせないように設定を変更、その上でchattrコマンドを利用し、scriptコマンドのログ・ファイルを追記専用・削除不可ファイルにすることで、その辺りの不具合は解消させることは出来た。
「.bash_profile」の記述を、上記内容から以下に書き換える。

# Operation Log.
P_PROC=`ps aux | grep $PPID | grep sshd | awk '{ print $11 }'`
if [ "$P_PROC" = sshd: ]; then
    SCRIPT_FILE="/var/log/ssh_operation/`date +%Y%m%d_%H%M%S`_$USER.log"
    TERMINAL=`tty`
    touch $SCRIPT_FILE
    tail -F $SCRIPT_FILE | logger -i -p local0.info -t $USER.$TERMINAL &
    LOGGER_PROCESS=&!
    export SCRIPT_FILE
    SSHD_PID=`echo $SSH_TTY | sed 's|/dev/||g'`
    export SSHD_PID
    PROMPT_COMMAND='sudo chattr +ia $SCRIPT_FILE; \
        if [ ! -e $SCRIPT_FILE ]; then \
        SSHD_PROCESS=`ps -x | grep $SSHD_PID | grep sshd | cut -d " " -f1` \
        echo $SSHD_PROCESS; \
        kill `ps -x | grep $SSHD_PID | grep sshd | cut -d " " -f1`; \
        fi;'
    export PROMPT_COMMAND
    script -fq $SCRIPT_FILE
    exit
    kill $SCRIPT_PROCESS
fi

とりあえず、以上。PROMPT_COMMANDにchattrの処理を記述することで、保護を解除されても即座に保護をするため、削除することができなくなる。念のため、sudoでの実行可能コマンドをchattrコマンドに制限しておいた方がいいだろう。
今回、色々と調べて見たところ、おなじような事をやろうとしている人もいたのだが…いかんせん、fifoでの手法はあまり好まないため利用しなかった。
というのも、fifoは書き込みプロセスが一度終了しないとファイルに書き込まれないため、いつどのタイミングでどのコマンドが実行されたのかがわからなくなってしまうからだ。

scriptコマンドがsudoで実行できれば問題が無かったのだが…いたし方がない。
まだまだ改善していく必要がありそうだ。