システム管理者は自分のユーザー端末を覗くことができますか?

システム管理者は自分のユーザー端末を覗くことができますか?

コンピュータにログインしたらw。システム管理者としてユーザーがこっそりこの端末を垣間見ることができますか?つまり、その端末で行われたすべての作業を私の端末の出力として見たいのです。

次の点に注意してください。

  • これは、ユーザーのアクティビティを監視する実際のユースケースには適用されません。この目的のためのシステム監査ツールがあることを知っています。できるかと思います。
  • わかりましたこの問題straceすべての解決策が邪魔になったり(ユーザーが私がしていることに気づいたり)、あまりにも多くのノイズを生成(ソリューション)することを提案しているので、私が求めているものを扱っていないようです。近い解決策が提案されましたgdb。ただし、これは他の端末からの標準出力のみを表示できます。

私が試したこと

私の端末でこれを試しました。

tee /dev/pts/user_pts </dev/pts/user_pts

これにより、ユーザーが別の擬似端末に入力したすべての文字を表示できます。問題は、数文字ごとに「スキップ」することです。つまり、ある端末装置には悪意のある文字が表示されますが、他の端末装置には表示されません。また、ユーザの擬似端末装置でコマンドが実行されるのを防止する。なぜこれが起こるのか、改善する方法があるのか​​はわかりません。

私は何を見たいですか?

USER TERMINAL        |    MY TERMINAL
$ echo "Test"        |    # slick_command_here
Test                 |    echo "Test"
$                    |    Test

ベストアンサー1

ターミナルエミュレータに表示される内容を表示するには、そのターミナルエミュレータで疑似ターミナルの基本側のfdを監視する必要があります。それ所有者fd は実際の端末に接続されたラインをシミュレートします。上に書いたのは、xterm押したキーによって生成された文字です。それが読むのはそれが表示するものです。

たとえば、Linuxでは次のようになります。

$ lsof -ac xterm /dev/ptmx
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
xterm   15173 chazelas    4u   CHR    5,2      0t0 2131 /dev/ptmx

次に、次のように実行します。

stty -echo -opost
strace -e read -e read=4 -p15173 2>&1 | stdbuf -o0 sh -c '
  grep "^ |" | cut -b11-60 | tr -d " " | xxd -r -p'

もちろん、監視したい端末と同じ種類とサイズの端末で実行すると、うまく機能します。次のように寸法を取得できます。

stty size < /dev/pts/that-terminal

これは何を捨てますか?読むxterm端末のメイン側に表示される内容には、echoローカルで入力された内容が含まれます。

上記のコマンドは、-e read=4fd 4から読み取ったstrace内容の16進ダンプを出力しますxterm。残りのコマンドは、これを実際の文字に変換することです。私は試しましたが、peekfd -n -8 15173 4何らかの理由で書かれたものだけを提供します。

-opost監視端末で後処理を無効にして、スレーブxxd側に記録されているすべての内容がマスター側で変更されないようにして、監視が監視されたのとxterm同じ結果を得るようにします。-echo問題は、監視されている端末のアプリケーションが端末から応答を要求するためにエスケープシーケンスを送信する場合(たとえば、カーソルの位置、端末の種類、またはウィンドウのタイトルを要求する)、これは私たちの監視とxterm意志xtermに入ります。返信する私たちはこのようなことがローカルで起こることを望んでいません。

write同じreadfdのシステムコールを追跡して、入力されている内容(上記の内容の置き換え)を監視することもできますwrite。を押すと、Enter端末エミュレータはLFの代わりにCR文字を送信します。また、私たちはメイン側で追跡しているので、ユーザーが を入力すると、エンドデバイスがa<Backspace>b標準モードになっていても、3つのキー入力がすべて表示されます。

あなたがうまくいかない理由は次のとおりです。

tee /dev/pts/user_pts </dev/pts/user_pts

端末装置から読み取るのはユーザー入力を読み取ることであり、書き込むことはそれをユーザーに表示することです。

tee端末装置から読み取るように指示します。したがって、読み取る内容(ユーザー入力)は、端末readで実行されているアプリケーションでは読み取られません(その逆も端末入力のために競合します)。端末装置への書き込みは表示するためのものであり、入力として書き戻すためのものではありません。するときteeapplication

echo test

echostdoutが端末です)入力した内容とは異なりますtest

ioctl文字を再入力に入れることができる()がありますがTIOCSTI、それでも書き戻すことができ、機能しません。後ろにアプリケーションがより多くの内容を読み取ったため、アプリケーションが入力を読み取る順序が変わります。つまり、とにかく何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も読んでいきます。

おすすめ記事