見た目からすると、履歴の変更を不可能にするためにkshを修正するのはかなり簡単です。 HIST *環境変数を読み取り専用にするためのすべての推奨事項と、chattrを使用して履歴ファイルを追加専用にする(chattr + a .sh_historyを使用)ことを確認しました。
ただし、Bashには、履歴の変更を防ぐことが不可能と思われる2つのことがあります。履歴コマンド(history-cおよびhistory-dを使用)と、履歴ファイルを実際の実行時履歴から分離する(メモリに保持) 。また、serverfaultで、現在のシェルを強制終了すると、履歴が書き出されないことも読みました。
Bashの履歴の変更を防ぐ方法はありますか?ユーザーが履歴から何も削除できなくても、すべてのユーザーコマンドを保存できるようにしたい。
KornShellに関するその他のヒントも歓迎します。 (ksh-93監査について知っています...それを使用できるかどうかわかりません。)
実行されたすべてのコマンドをsyslogサーバーに送信するためのソリューションは次のとおりです。
http://blog.rootshell.be/2009/02/28/bash-history-to-syslog/
ブログ投稿からの抜粋
ユーザーが実行したすべてのコマンドのコピーをSyslogサーバーに送信する2つの方法を次に示します。 1つ目は、Bashの「トラップ」機能を使用します。 2つ目は、Bashソースコードに適用するパッチです。
トラップの使用
/ etc/profileに次の行を追加するだけです。
function log2syslog
{
declare command
command=$(fc -ln -0)
logger -p local1.notice -t bash -i — $USER : $command
}
trap log2syslog DEBUG
/etc/profile
は、Bashの開始時に解析および実行されます。目標は、トラップ機能を使用して、ユーザーがアクティビティを生成するたびに関数を呼び出すことです。トラップ関数(log2syslog)は、履歴から最後のコマンドを抽出し、loggerコマンドを使用してSyslogに記録します。実装は非常に簡単ですが、この方法は次のとおりです。
spawns new process at each command logged (can have a negative effect when the server activity is high)
is not transparent to the user (regular users can’t edit /etc/profile but can read it!)
そのため、2番目の方法が推奨されます。 パッチの使用
この方法は、Bashソースツリーにパッチを適用し、シェルを再コンパイルすることです。コンパイラとソースコードを備えた環境が必要ですが、このメソッドはCPUの使用量が少なく、完全に透過的です。
パッチの例が利用可能です ここ 。パッチをBash4ソースツリーに手動で適用するには5分かかります。
Syslogメッセージの例を次に示します。
Feb 27 19:30:51 honey bash: HISTORY: PID=21099 UID=1000 echo foo!
ユーザーの行動を記録したい場合は、 snoopy をご覧ください。 CentOS用にインストールするパッケージとしても入手できます。