Sshを使用して多くのユーザーがアクセスするサーバーがあります。特定のコマンドを実行したユーザーを特定しようとしています。
who
を使用して現在サーバーにアクセスしているユーザーのリストを確認できます。また、history
を使用して実行されたコマンドのリストも確認できます。
しかし、どのユーザーがサーバーでcp file1.sh file2.sh
のようなコマンドを実行したかを知るにはどうすればよいでしょうか。ユーザーはすでにコマンドを実行してログアウトしています
接続する新しいユーザーはそれぞれ、特定のPIDを持つ新しいsshd
セッションを生成します。 pstree
を使用して、どのコマンドがどのsshd
セッションから継承されたかを出力し、/var/log/auth.log
でこのPIDをクロスチェックできます。
例(匿名化):同じリモートユーザーを使用して、3つの同時セッションでリモートサーバーにログインしました。次に、クライアントがコマンドwatch date
を実行したIPを確認します。
$ pstree -p | grep watch
| |-sshd(15243)---sshd(15342)---bash(15343)---watch(15450)
$ Sudo grep 15243 /var/log/auth.log
Mar 7 15:37:29 XXXXXXXXXX sshd[15243]: Accepted publickey for XXXXXXXXXX from 12.34.56.78 port 48218 ssh2
Mar 7 15:37:29 XXXXXXXXXX sshd[15243]: pam_unix(sshd:session): session opened for user XXXXXXXXXX by (uid=0)
Mar 7 15:37:44 XXXXXXXXXX Sudo: XXXXXXXXXX : TTY=pts/7 ; PWD=/home/XXXXXXXXXX ; USER=root ; COMMAND=/bin/grep 15243 /var/log/auth.log
pstree -p
は、watch
コマンドがPID 15243でsshd
から継承されていることを示しています。/var/auth/auth.log
のこのPIDのgrep
ingは、IP 12.34であったことを示しています。このセッションを開始した56.78。したがって、これはwatch
を開始したユーザーでもあります。
特にこのユーザーのhistory
を見つけることに関しては、すべてのリモートユーザーが同じローカルSSHユーザーを使用しているときに、私が見ることができるものから行うことはできません。また、なりすましや無効化なども簡単にできるため、信頼性はそれほど高くありません。履歴ファイルに保存されている場合は、cp
コマンドを探してファイルを逆に見るだけで済みますが、そこにない場合は、実行することはあまりありません。
次の2行を/ etc/profileまたは/ etc/bashrcに追加して、bashによって実行されるすべてのコマンドをログに記録できます。
whoami="$(whoami)@$(echo $SSH_CONNECTION | awk '{print $1}')"
export Prompt_COMMAND='RETRN_VAL=$?;logger -p local3.debug "$whoami [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'
これは、syslogを使用して、実行したすべてのコマンドと実行したユーザーおよびそのIPアドレスを次のような形式で記録します。
Jan 8 08:43:49 xpto local3.debug root: [email protected] [29385]: ls -al [0]
さらに、以下の行をsyslog構成(/etc/syslog.conf)に追加して、local3メッセージを特定のファイルにリダイレクトできます。
local3.* /var/log/Prompt.log
これには snoopy を使用できます。
ログメッセージ形式の定義でIP =%{env:SSH_CLIENT}を指定して、カスタム環境変数(SSH_CLIENT)をログに記録するように構成する必要があります(./configureフラグまたは2.xバージョン以降のsnoopy.iniで構成可能)。
開示:スヌーピーのメンテナはこちら。
Bashを使用していると仮定すると、history
は[〜#〜] your [〜#〜]コマンドライン履歴のみを表示します。デフォルトでは、履歴の~/.bash_history
を読み取ります。これは、(ほとんどありませんが)HISTFILE=/home/userFoo/.my_alt_history
のようなことで変更できることに注意してください。
あなたがボックスのルートであると仮定すると、ユーザーのすべてのディレクトリをスキャンし、その履歴を読んで、そのコマンドを実行しているユーザーを確認できます。