web-dev-qa-db-ja.com

スクリプトユーティリティを使用してすべてのターミナルセッションを自動的に記録する方法

私が達成したいのは、ヤクアケ/コンソーレを使用するときはいつでも、ターミナルセッションを自動的にファイルに記録できることです。

セッションの開始時に次のようにすると、簡単に達成できます。

script -f /home/$USER/bin/Shell_logs/$(date +"%d-%b-%y_%H-%M-%S")_Shell.log

しかし、ヤクアケを起動するか、新しいタブを開くたびに、上記を自動的に実行したいと思います。

.bashrcを使用すると、「スクリプト」が新しいセッションを開いて.bashrcを読み取り、別の「スクリプト」を開始するなどして無限ループが発生するため、機能しません。

新しいタブが開かれたときに一度「スクリプト」を実行するために、どういうわけかヤクアケ/コンソーレをスクリプト化する必要があるでしょう。問題はどのようにですか?

31
Stan

誰かがscriptユーティリティを使用して、SSHセッション(!)を含むターミナルセッションを自動的に記録したい場合は、次のようにします。

ホームディレクトリの.bashrcの最後に次の行を追加します。または、すべてのユーザーのセッションのみを記録する場合は/etc/bash.bashrcを追加します。 Shellの親プロセスがscriptでないことをテストしてから、scriptを実行します。

Linuxの場合:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -f $HOME/$(date +"%d-%b-%y_%H-%M-%S")_Shell.log)

BSDおよびmacOSの場合、script -fscript -Fに変更します。

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -F $HOME/$(date +"%d-%b-%y_%H-%M-%S")_Shell.log)

それで全部です!

新しいターミナルを開くと、次のように表示されます。

Script started, file is /home/username/file_name.log

scriptは、ホームディレクトリのファイルにセッションを書き込み、結果として30-Nov-11_00-11-12_Shell.logのような名前を付けます。

より多くのカスタマイズ:

  • script -a /path/to/single_log_fileを使用して、セッションごとに新しいファイルを作成するのではなく、1つの大きなファイルにセッションを追加できます。
  • script -f(Linux)またはscript -F(BSDおよびmacOS)の後のパスを変更することにより、ファイルの書き込み先を調整できます

この回答は、もちろんscriptがインストールされていることを前提としています。 Debianベースのディストリビューションでは、scriptbsdutilsパッケージの一部です。

27
Stan

この質問は、自分のセッションを記録したい個人から寄せられたものですが、別のユースケースは、さまざまなユーザーが何をしているかを追跡したいシステム管理者かもしれません。

システム全体のscript内でbashrcを実行することは、マシンのユーザーがセッションの記録を作成することに消極的である場合には適さないかもしれません。

シークレットモードのままにしたいユーザーは、sshdに別のシェル(zshなど)を開くように要求するか、bash --rcfile ___を実行して/etc/bash.bashrcが読み込まれないようにして、ログをバイパスできます。

代替アプローチ

2008年のこのガイドアーカイブ済み )は、異なるメソッドを使用して、scriptを強制的に実行しますユーザーがsshを使用してログインする場合、ユーザーは公開鍵/秘密鍵を使用してログインする必要があります。

これは、キーの前にあるユーザーの.ssh/authorized_keysファイルにスクリプトを追加することによって行われます。

command="/usr/local/sbin/log-session" ssh-dss AAAAB3NzaC1kc3MAAAEBAMKr1HxJz.....

log-sessionarchived )スクリプトは、/usr/bin/scriptを実行してこのユーザーのセッションをログに記録するかどうかを決定します。

exec script -a -f -q -c "$SSH_ORIGINAL_COMMAND" $LOGFILE

ユーザーが追加されたコマンドを削除できないようにするには、管理者がユーザーのauthorized_keysファイルの所有権を引き受ける必要があります。

chown root:root ~user/.ssh/authorized_keys

残念ながら、これはユーザーが自分で追加のキーを追加することができないことを意味します。または、さらに重要なことに、侵害された場合に既存のキーを取り消すことは理想的ではありません。

注意事項

Sshdのデフォルト設定では、ユーザーがsshログインを介してSFTPを実行できるようにするのが一般的です。これにより、ユーザーは変更をログに記録せずにファイルを編集できます。管理者がユーザーにそれを許可しない場合は、SFTPのログを有効にするか、サービスを無効にする必要があります。それでも、ユーザーはターミナルで次のようなものを実行することにより、ファイルに目に見えない変更を加えることができます。

curl "http://users.own.server/server/new_data" > existing_file

すべてのファイル履歴を記録するコピーオンライトファイルシステムを使用することで、そのような変更を監視できる場合があります。

しかし、同様のトリックにより、ユーザーはログに記録されることなくコマンドを実行できます。

curl "http://users.own.server/server/secret_commands_824" | sh

簡単な解決策は知りません。次の可能性があります。

  • すべてのネットワークデータをログに記録します(後でそれを解きます)。
  • すべてのシステムコールのロギング。

このようなことは auditd で可能になるかもしれません。

とにかく...

ユーザーセッションをログに記録しても、管理者に実際のセキュリティが提供されることはほとんどありません。デフォルトでは、ユーザーは自分のファイルのみを操作でき、システムに害を与えることはできません。悪意のあるユーザーが特権をエスカレートできた場合、ログを無効にしてログを削除できます(管理者がログを別のマシンに保存するように構成している場合を除きます)。

ユーザーセッションを自動的にログに記録する管理者は、おそらくこれが行われていることをユーザーに通知する必要があります。管轄区域によっては、この形式のデータ収集はデータまたはプライバシー法に違反する可能性があります。そして、少なくとも、ユーザーに気づかせるのは敬意を払うことです。

管理者がSudoユーザーのセッションをログに記録することに関心を持つ可能性が高くなります。それはおそらく別の答え、または実際に別の質問で取り組むことができます。

10
joeytwiddle

の代わりに:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' ||

私は使うだろう:

grep -qx "$PPID" <(pgrep -x "script") ||

この場合、二重引用符は必要ありませんが、とにかく標準的な方法として使用する傾向があります。まれですが問題のある部分文字列との一致を避けるために、grepとpgrepの両方に「x」スイッチを使用することをお勧めします。

2
William Dye