すべてのSSHコマンドのローカルタイムスタンプロギング?

すべてのSSHコマンドのローカルタイムスタンプロギング?

で使用されているすべてのリモートコマンドssh(を通じて起動されたコマンドラインopensshクライアント)のローカルタイムスタンプ履歴をどのように維持しますか?bash

必要:

  • 基本的な:

    • 100%クライアント側、サーバーのログ記録に依存しない
    • ユーザーが設定またはインストールすると、ログはユーザーのホームディレクトリに保存されます。
    • 異なるユーザーとホストとの複数の同時セッションの区別をサポートします。
    • 非侵害的(毎回有効にする必要はなく、SSHの使用を大幅に妨げない)
  • 高い優先順位:

    • 出力を記録しないか、可能であれば出力をフィルタリングします。
    • パスワードエントリが記録されていないか、ファイルが暗号化されています。
    • 実際に使用されたコマンドを示します(タブ/書き込み完了、バックスペース、CTRL+Cなど...が処理されました)。
  • 持ってもいい:

    • また、接続されたセッションのコマンドを記録します(リモートでsshまたはセッション中にsu <user>入力されたコマンド)。
    • セッションの開始と終了を記録する必要があります。
    • ルートではなく単純なbashベースソリューションが最適です(コマンドベースaliasまたはbashラッパースクリプトかもしれませんssh)。

私の技術レベル:

  • 私はプログラミングは初めてではありませんが、まだbash「Linux方式」を学んでいるので、簡単な説明を含むコード例をお寄せいただきありがとうございます。

考えられる戦略

  • キーロガー- 問題:タブ/記録が完了していないパスワードロギング(参照)グレンの答え)
  • screen毎秒ロールバックし、diffその間に新しいロールバック行を探します。- 質問:便利で自動化された方法でこれを達成するにはどうすればよいですか?
  • ssh "$@" | tee >(some_cleaner_function >> $logfile)- 問題:リンクされたセッションで複数行のコマンドや履歴を処理できず、慎重にクリーンアップする必要があります(私の答えを参照)。
  • 上記の内容の一部を組み合わせたもの

一例

次のSSHセッション:

user@local:~$ ssh user@remote
Last login: Tue Jun 17 16:34:23 2014 from local
user@remote:~$ cd test
user@remote:~/test$ ls
a  b
user@remote:~/test$ exit

~/logs/ssh.log次のログが生成されることがあります。

2014-06-17 16:34:50   [user@remote - start]
2014-06-17 16:34:51   [user@remote] cd test
2014-06-17 16:34:52   [user@remote] ls
2014-06-17 16:34:53   [user@remote] exit
2014-06-17 16:34:53   [user@remote - end]

または、ファイルの上部からセッションを開始するために使用されるコマンドラインを使用して、各セッションに対して別々のログを生成することもできます。

ベストアンサー1

私はあなたの質問に非常に興味があります。答えをしようとしませんでしたが、抜けました。

これはexpect実際にキーロガーです。

#!/usr/bin/expect -f

proc log {msg} {
    puts $::fh "[timestamp -format {%Y-%m-%d %H:%M:%S}]: $msg"
}

set ssh_host [lindex $argv 0]
set ::fh [open "sshlog.$ssh_host" a]

log "{session starts}"

spawn ssh $ssh_host

interact {
    -re "(.)" {
        set char $interact_out(1,string)
        if {$char eq "\r"} {
            log $keystrokes
            set keystrokes ""
        } else {
            append keystrokes $char
        }
        send -- $char
    }
    eof
}

log "{session ends}"

メモ:

  • 名前にsshターゲットが含まれているファイルに追加されます。
  • キーロガーです。 SSHキーをまだ設定していない場合は、ログファイルからユーザーパスワードを取得できます。
  • タブの完成により失敗します。ユーザーがコマンドを入力すると、uptTabログuptimeファイルに「uptime」ではなく「upt \ t」と表示されます。
  • 「生」モードで文字を取得します。ユーザーが入力に失敗した場合、^?ログファイルに多くのバックスペース文字が表示されます。

おすすめ記事