web-dev-qa-db-ja.com

Linuxでのbash(およびksh)履歴の変更の防止

見た目からすると、履歴の変更を不可能にするためにkshを修正するのはかなり簡単です。 HIST *環境変数を読み取り専用にするためのすべての推奨事項と、chattrを使用して履歴ファイルを追加専用にする(chattr + a .sh_historyを使用)ことを確認しました。

ただし、Bashには、履歴の変更を防ぐことが不可能と思われる2つのことがあります。履歴コマンド(history-cおよびhistory-dを使用)と、履歴ファイルを実際の実行時履歴から分離する(メモリに保持) 。また、serverfaultで、現在のシェルを強制終了すると、履歴が書き出されないことも読みました。

Bashの履歴の変更を防ぐ方法はありますか?ユーザーが履歴から何も削除できなくても、すべてのユーザーコマンドを保存できるようにしたい。

KornShellに関するその他のヒントも歓迎します。 (ksh-93監査について知っています...それを使用できるかどうかわかりません。)

3
Mei

実行されたすべてのコマンドを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!
4
freethinker

ユーザーの行動を記録したい場合は、 snoopy をご覧ください。 CentOS用にインストールするパッケージとしても入手できます。

5
user9517