Debianボックスがある場合、一部のユーザーはrootアカウントにアクセスでき、一部のユーザーはssh接続を開いてコマンドの実行を開始します。一部の画面は、コマンドを実行するための画面またはbyobuまたは他の同様のツールを開きます。
コマンド「history」は、実行されたコマンドの完全なリストを取得していないようです。
実行されたすべてのコマンドを取得するための最良の方法は何ですか?
これは一種のハックですが、少なくとも機能します。そのサーバーにroot
が必要です。
ps aux
の出力を見ると、たとえばこの場合のユーザーsshd
のように、ユーザーのmst
のフォークが表示されます。
$ ps aux | grep ssh
mst 19325 0.0 0.0 76268 1920 ? S 21:20 0:00 sshd: mst@pts/6
したがって、このプロセスのファイル記述子を次のように確認します。
$ Sudo ls -lha /proc/19325/fd
total 0
dr-x------ 2 root root 0 Aug 30 21:26 .
dr-xr-xr-x 7 mst users 0 Aug 30 21:25 ..
lrwx------ 1 root root 64 Aug 30 21:26 0 -> /dev/null
lrwx------ 1 root root 64 Aug 30 21:26 1 -> /dev/null
lrwx------ 1 root root 64 Aug 30 21:26 11 -> /dev/ptmx
lrwx------ 1 root root 64 Aug 30 21:26 12 -> /dev/ptmx
lrwx------ 1 root root 64 Aug 30 21:26 2 -> /dev/null
lrwx------ 1 root root 64 Aug 30 21:26 3 -> socket:[138972]
lrwx------ 1 root root 64 Aug 30 21:26 4 -> socket:[138198]
lrwx------ 1 root root 64 Aug 30 21:26 5 -> socket:[138200]
lrwx------ 1 root root 64 Aug 30 21:26 6 -> socket:[138207]
lr-x------ 1 root root 64 Aug 30 21:26 7 -> pipe:[138212]
l-wx------ 1 root root 64 Aug 30 21:26 8 -> pipe:[138212]
lrwx------ 1 root root 64 Aug 30 21:26 9 -> /dev/ptmx
これらのリンクのうち3つは/dev/ptmx
を指しており、これらはstdin
、stdout
、およびstderr
です。ユーザーのシェルは、ユーザーが入力したすべてのコマンドとこれらのコマンドの出力を出力しているので、stdout
を使用してstrace
システムコールをフィルタリングすることにより、ユーザーのread
を監視します。 fd番号11
(11
は/dev/ptmx
への2番目のリンクであるため)。
Sudo strace -e read -s 256 -p 19325 2>&1 | grep 'read(11'
そして、ユーザーがls
コマンドを入力していることがわかります。
read(11, "l", 16384) = 1
read(11, "s", 16384) = 1
OK、出力はきれいではありません...しかし動作します
最良の方法はauditdを使用することです。特定のユーザーが発行したすべてのコマンド、すべてのユーザーが発行したすべてのコマンド、または特定のコマンドの呼び出しなどをログに記録するように設定できます。
auditctl
のmanページには、必要なルールの例がいくつか示されています。さらに、他のrootユーザーを信頼しない場合は、他のユーザーがアクセスできない別のサーバーにログインすることをお勧めします。
また、rootパスワードを提供せず、rootとしてsshログインを許可しないことをお勧めします。代わりに、ユーザー自身のアカウントへのログインのみを許可し、Sudo su
ルートになります。これにより、auditdがどのユーザーが何をしたかを追跡できるようになります。