web-dev-qa-db-ja.com

Linuxでsshを使用して特定のコマンドを実行したIPを知るには

Sshを使用して多くのユーザーがアクセスするサーバーがあります。特定のコマンドを実行したユーザーを特定しようとしています。

whoを使用して現在サーバーにアクセスしているユーザーのリストを確認できます。また、historyを使用して実行されたコマンドのリストも確認できます。

しかし、どのユーザーがサーバーでcp file1.sh file2.shのようなコマンドを実行したかを知るにはどうすればよいでしょうか。ユーザーはすでにコマンドを実行してログアウトしています

10
Manu K Mohan

接続する新しいユーザーはそれぞれ、特定の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のgrepingは、IP 12.34であったことを示しています。このセッションを開始した56.78。したがって、これはwatchを開始したユーザーでもあります。

特にこのユーザーのhistoryを見つけることに関しては、すべてのリモートユーザーが同じローカルSSHユーザーを使用しているときに、私が見ることができるものから行うことはできません。また、なりすましや無効化なども簡単にできるため、信頼性はそれほど高くありません。履歴ファイルに保存されている場合は、cpコマンドを探してファイルを逆に見るだけで済みますが、そこにない場合は、実行することはあまりありません。

4

次の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
1
Filipe

これには snoopy を使用できます。

ログメッセージ形式の定義でIP =%{env:SSH_CLIENT}を指定して、カスタム環境変数(SSH_CLIENT)をログに記録するように構成する必要があります(./configureフラグまたは2.xバージョン以降のsnoopy.iniで構成可能)。

開示:スヌーピーのメンテナはこちら。

1
Bostjan Skufca

Bashを使用していると仮定すると、history[〜#〜] your [〜#〜]コマンドライン履歴のみを表示します。デフォルトでは、履歴の~/.bash_historyを読み取ります。これは、(ほとんどありませんが)HISTFILE=/home/userFoo/.my_alt_historyのようなことで変更できることに注意してください。

あなたがボックスのルートであると仮定すると、ユーザーのすべてのディレクトリをスキャンし、その履歴を読んで、そのコマンドを実行しているユーザーを確認できます。

0
user1146334