私が達成したいのは、Yakuake / Konsoleを使用するたびにターミナルセッションを自動的に記録してアーカイブすることです。
クラスの始めに次のようにすると、実装が簡単です。
script -f /home/$USER/bin/shell_logs/$(date +"%d-%b-%y_%H-%M-%S")_shell.log
しかし、Yakuakeを起動するか新しいタブを開くたびに、上記の内容が自動的に実行されることを望みます。
.bashrcを使用すると、「スクリプト」が新しいセッションを開き、.bashrcを読み込み、別の「スクリプト」を起動するなど、無限ループが生成されるため、機能しません。
したがって、おそらく新しいタブが開いたときに「スクリプト」が一度実行されるように、Yakuake / Konsoleをスクリプトとして作成する必要があります。問題はどうですか?
答え1
script
このユーティリティを使用してターミナルセッション(SSHセッション(!)を含む)を自動的に記録する場合は、次の方法があります。
.bashrc
ホームディレクトリの末尾に次の行を追加するか、すべての/etc/bash.bashrc
ユーザーのセッションのみを記録するには、次の行を追加します。シェルの親プロセスが存在しないかテストし、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 -f
次のように変更しますscript -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
結果ファイルと同じ名前を付けます。
追加のカスタマイズ:
- セッションごとに新しいファイルを作成する代わりに、1つの大きなファイルにセッションを追加できます。
script -a /path/to/single_log_file
script -f
script -F
(Linux) または (BSD と macOS) 以降のパスを変更して、ファイルが書き込まれる場所を調整できます.
script
もちろん、この答えはあなたがすでにインストールされていると仮定しています。 Debianベースのディストリビューションはscript
パッケージの一部ですbsdutils
。
答え2
この質問は、自分のセッションを記録したい個人が要求したものですが、個々のユーザーが何をしているかを追跡したいシステム管理者が代替ユースケースかもしれません。
システムユーザーがセッション履歴を消した場合、
script
システム全体を実行するのが適切ではない可能性があることが心配されます。bashrc
目に見えない状態を維持したいユーザーは、sshdに他のシェル(たとえば)を開くように要求して、ロギングをバイパスしたりロードを防ぐために
zsh
実行できます。bash --rcfile ___
/etc/bash.bashrc
別の方法
このガイドは2008年から作成されました。(アーカイブ) 使用さまざまな方法ユーザーがsshを使用してログインすると、強制的に実行されますscript
。この場合、ユーザーは公開/秘密鍵を使用してログインする必要があります。
.ssh/authorized_keys
これは、ユーザーファイルのキーの前にスクリプトを追加することによって行われます。
command="/usr/local/sbin/log-session" ssh-dss AAAAB3NzaC1kc3MAAAEBAMKr1HxJz.....
これlog-session
(アーカイブ/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
すべてのファイルの履歴を記録するCopy-On-Writeファイルシステムを使用して、同様の変更を監視できます。
ただし、同様のトリックを使用すると、ユーザーはコマンドを記録せずに実行できます。
curl "http://users.own.server/server/secret_commands_824" | sh
私は簡単な解決策を知りません。可能性は次のとおりです。
- すべてのネットワークデータを記録して解凍します。
- すべてのシステムコールを記録します。
これは可能です。審査。
しかし、とにかく...
ユーザーセッションのログ記録は、管理者に実際のセキュリティを提供する可能性はありません。デフォルトでは、ユーザーは自分のファイルのみを操作でき、システムに害を及ぼすことはできません。悪意のあるユーザーが権限の昇格に成功した場合、ログを無効にしてログを削除することができます(管理者がログを追加の専用モードで別のシステムに保存するように構成していない場合)。
ユーザーセッションを自動的に記録する管理者は、おそらくこの操作が行われていることをユーザーに通知します。。一部の管轄では、この形式のデータ収集データまたはプライバシー法違反。少なくともこの事実をユーザーに知らせることは礼儀です。
sudo
管理者はユーザーセッションの記録に興味を持つ可能性が高くなります。たぶん、この問題は他の答えや他の質問で解決されるかもしれません。
答え3
変える:
test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' ||
私は次を使うでしょう:
grep -qx "$PPID" <(pgrep -x "script") ||
この場合、二重引用符は必要ありませんが、標準的な慣行として使用する傾向があります。まれですが、問題のある部分文字列の一致を避けるために、grepとpgrepで "x"スイッチを使用することをお勧めします。