「sudo su-」内でコマンドを記録する方法は?


12

もし私が:

[user@notebook ~] sudo echo 123456uu
123456uu
[user@notebook ~] 

その後、ログでそれを見ることができます:

[root@notebook /var/log] grep 123456uu *
auth.log:Jan  9 17:01:51 notebook sudo: user : TTY=pts/3 ; PWD=/home/user ; USER=root ; COMMAND=/bin/echo 123456uu
[root@notebook /var/log] 

しかし、私が:

[user@notebook ~] sudo su -
[root@notebook ~] echo 1234567zz
1234567zz
[root@notebook ~] 

ログに表示されません:

[root@notebook /var/log] grep 1234567zz *
[root@notebook /var/log] echo $?
1
[root@notebook /var/log] 

私の質問:「sudo su-」内のコマンドのログを有効にするにはどうすればよいですか?

OSはUbuntu 12.04ですが、問題は一般的なものです。

更新#1:

[user@notebook ~] sudo su -
[sudo] password for user: 
[root@notebook ~] echo zizizi
zizizi
[root@notebook ~] cd /var/log
[root@notebook /var/log] grep -iIR 'zizizi' *
[root@notebook /var/log] grep 'COMMAND=/bin/su -' *
auth.log:Jan 10 15:42:42 notebook sudo: user : TTY=pts/1 ; PWD=/home/user ; USER=root ; COMMAND=/bin/su -
[root@notebook /var/log]

悪意のある(または単に信頼できない)誰かがへのアクセス権を持っている場合sudo su -、彼らはまた、あなたが彼らの行動から作ることができるすべてのログエントリを削除することができます。ロギングで100%の確実性が必要な場合は、厳しく制限sudoし、sudo su完全に禁止する必要があります。
ワイルドカード

回答:


16

Ubuntu 12.04を使用しているため、log_inputおよびlog_outputオプションを使用してアクティブ化されるI / Oロギング機能を確認してください。

log_input

    設定されている場合sudo、疑似ttyでコマンドを実行し、すべてのユーザー入力を記録します。I / Oリダイレクトまたはコマンドがパイプラインの一部であるために、標準入力がユーザーのttyに接続されていない場合、その入力もキャプチャされ、別のログファイルに保存されます。

    入力は、通常のsudoログ行に含まれ、接頭辞が付いた一意のセッションIDを使用して、iolog_dirオプション(/var/log/sudo-ioデフォルト)で指定されたディレクトリに記録されますTSID=。このiolog_fileオプションを使用して、セッションIDの形式を制御できます。

    ユーザー入力には、パスワードなどの機密情報が含まれている場合があり(パスワードが画面にエコーされない場合でも)、暗号化されずにログファイルに保存されます。ほとんどの場合、log_outputを介してコマンド出力を記録するだけで十分です。

log_output

    設定sudoすると、擬似ttyでコマンドを実行し、script(1)コマンドと同様に、画面に送信されるすべての出力をログに記録します。I / Oリダイレクトまたはコマンドがパイプラインの一部であるために、標準出力または標準エラーがユーザーのttyに接続されていない場合、その出力もキャプチャされ、個別のログファイルに保存されます。

    出力は、通常のsudoログ行に含まれる接頭辞が付いた一意のセッションIDを使用して、iolog_dirオプション(/var/log/sudo-ioデフォルト)で指定されたディレクトリに記録されますTSID=。このiolog_fileオプションを使用して、セッションIDの形式を制御できます。

    出力ログはsudoreplay(8)ユーティリティで表示できます。このユーティリティは、利用可能なログを一覧表示または検索するためにも使用できます。

実装:少なくともSudoバージョン:1.7.4p4が必要です。

/etc/sudoers変更:必要なのは、必要なすべてのsudoersエントリに2つのタグを追加することだけです(コマンドまたはエイリアスで「su」を指定)。LOG_INPUTおよびLOG_OUTPUT。

例:

%admins         ALL=(ALL) NOPASSWD: LOG_INPUT: LOG_OUTPUT: ALL

以下にデフォルトのログディレクトリ構造を追加しますsudoers

Defaults iolog_dir=/var/log/sudo-io/%{user}

それは素晴らしいですが、古いシステムでは動作しません。:\
newuser999 14年

ええ、現在のsudoバージョンのパッケージを作成するか、システムをアップグレードしますか?
serverhorror

13

あなたgrepが実行sudo su -していないのでecho 1234567zz、あなたの実行は失敗します、あなたは実行su -しています、シェルを起動します 次に、シェルが.exeを実行していますecho

これは意図的なものであり、実行されるすべてのコマンドをログに記録すると、syslogに無用な情報があふれます(通常、目に見えない舞台裏で実行されるプログラムが大量にあります)。

grepを変更すると、grep 'COMMAND=/bin/su -' *表示されます。


sudo su -も役に立たない使用ですsusudo -i同じことをします。


しかし、どうすれば「sudo su-」を記録できますか?
newuser999

1
ログに記録されます。試しましたかgrep 'COMMAND=/bin/su -' *(またはワイルドカードなし:)grep 'COMMAND=/bin/su -' /var/log/auth.log
パトリック14年

質問を更新しました。「sudo su-」を使用する場合、コマンドがログに記録されないことを他に何を証明する必要がありますか?
newuser999

4
コマンド(sudo -ログに記録され、更新された出力にこれが表示されます。 ここで話しているのはそれだけです。他のコマンド、などは、echoあなたがユーザーを切り替えた後sudo -コマンドを須藤されていない、ので、(私の答えあたりなど)にログインしていませんauth.log。明示的に前置された個々のコマンドのみsudoがログに記録されます。だから、sudo echoログに記録されていますが、単純にecho関係なく、あなたは、スーパーユーザーに切り替えているという事実を、ではありません。
goldilocks 14年

12

複雑さが増す中で、「sudo su-」内で発行されたコマンドを記録する3つの方法を次に示します。

  1. bashコマンド履歴に依存する
  2. execveロギングラッパーをインストールする
  3. SELinuxのauditdを使用する

どちらが適切かは、ロギングで何を達成しようとしているかによって異なります。

1)Bashコマンド履歴

履歴ファシリティを設定して、十分な行を維持し、異なるセッションからの上書き、コマンド、適切なタイムスタンプを無視しないようにします。(bashマニュアルの HIST *変数を参照してください)。履歴ファイルの編集、環境の操作、または別のシェルの実行により簡単に破壊されます。

2)execveラッパー

snoopyloggerは1つです。チェックを追加/etc/profileロガーライブラリがプロセスのメモリマップ(であること/proc/<pid>/maps)、そうでない場合は、セットLD_PRELOADして再起動(とexec $SHELL --login "$@")。または、snoopy.soの32/64ビットバージョンを使用して、$LIB/snoopy.soまたは同等のパスを使用して、/ etc / ld.so.preloadにエントリを追加することもできます。

より困難ではありLD_PRELOADますが、上記の環境変数バージョンは、実行環境を操作することで破壊され、スヌーピーコードが実行されなくなる可能性があります。

内容を信頼できるものにするには、syslogをボックスから送信する必要があります。

3)監査済み

execveラッパーよりも構成はやや簡単ですが、情報を抽出するのは困難です。これは、あなたが本当に尋ねそうな質問に対する答えです。「ユーザーが発行した後、ユーザーがシステムにどのような影響を与えたかを記録する方法はありますかsudo su -」。内容を信頼できるものにするには、syslogをすぐに送信する必要があります。

このServerfaultの回答は、auditdで使用するためのかなり包括的な構成のようです。

serverfaultに関する同様の質問に対する他の提案がいくつかあります。


9

どうして?

それsudoがロギングを行っているからです。sudoコマンドを記録します。最初のケースでsudo echoは、が記録されます。2番目のケースでsudo suは、ログに記録されます(で探します/var/log/auth.log)。

suデフォルトではrootになっている「ユーザーの切り替え」です。その後あなたがすることは何も通りませんsudo rootとしてログインした場合とほぼ同じです。ログイン自体は記録されますが、すべてのコマンドではありません。


5

他の人が言ったように、sudoこれはできません。

代わりに、を使用しますauditd。rootによって行われたすべてを記録したい場合(例えばcrontabによって行われたものを含む)、これを使用します:

sudo auditctl -a exit,always -F euid=0

ETA:すべてをログに記録するとパフォーマンスに影響するため、おそらく少し制限する必要があることに注意してください。man auditctl例を参照してください。

元のログインuidがルートではないシステムコールのみを記録する場合は、代わりにこれを使用します。

sudo auditctl -a exit,always -F euid=0 -F auid!=0

通常、ログは/var/log/audit/audit.logに保存されます。で検索できますausearch

auditctlaudit.rulesおよびのmanページに詳細情報がありausearchます。


2
ああ、監査ログを信頼するためには、それらを別のサーバーに送信する必要があります。信頼されていないユーザーがルートを持っているマシンにあるログは信頼できません。
ジェニーD 14年

それでも、侵害されたサーバーから何が得られるか、または何が得られないかを信頼することはできません。
マット14年

ただし、セキュリティが侵害されるまでは追跡できます。
ジェニーD 14年

2
オペアンプの場合とどちらができるだけ早く彼らが実行してきたように、技術的であるsudo su -あなたのよう振り出しにいるバック
マット

信頼されていないことは、侵害されていることと同じではありません。彼らが実際に悪意のあることをするまで、それは危険にさらされることはありません。それとは別に、リモートログは、誰かが誤ってローカルログを削除した場合や、間違いによる非難から身を守るのに役立ちます。
ジェニーD 14年

2

sudo su -なります~/.bash_historyあなたのシェルがbashのであれば。

echo 1234567zz/root/.bash_historyルートのシェルがbashの場合になります。

この説明は、goldilocksによってすでに投稿されています。


2

suをログに記録したいのは、それがセキュリティ上の欠陥だと感じているからですか?このコマンドについて考えたことはありますか?sudo bash同じように悪い私見。

人々がsudoでできることを心配しているなら、その使用を制限する必要があります。実行できるコマンドも制限できます。心配な場合は、/ bin / suへのアクセスを制限してください。


1

これはどうですか:

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log'
sudo -E su
unset PROMPT_COMMAND

または

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' 
sudo -E su --preserve-environment -
unset PROMPT_COMMAND

または長いワンライナー:

HISTTIMEFORMAT="%d/%m/%y %T " PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' sudo -E su

sudo -Eは各プロンプトの前にPROMPT_COMMANDが実行される環境を保持します


最初のものは私にコンソールを提供せず、2番目のものを/root/.bashrcに入れた場合、「sudo su-」の後にルートコンソールを取得したい場合はCTRL + Cを押す必要があります:Dこれを修正する(または「日付」関数を追加する?)。どうもありがとう!
newuser999 14年

誤用されているのではないかと思います。より明確にするために編集しました。
コスタ14年

1

これが役立つ場合は、sudoersの「NOEXEC」オプションを使用できます。

次のように定義する必要があります

USER_NAME         ALL=(ALL) NOEXEC : ALL

これにより、シェルエスケープが防止され、ユーザーはsudo -iまたはsudo -sまたはsudo su-を使用できなくなります。

これには欠点がありますが、シェルエスケープは無効になります。スクリプト内からスクリプトを実行する場合も拒否されます。


0

これを複雑にしないようにしましょう:sudo呼び出されるたびに、この事実を何らかのファイルで報告/var/logします(システム上ではauth.log、私のOS Xボックス上ではsystem.log)。sudoはコマンドライン引数を報告しますが、のような対話型コマンド内で何が起こるかについては知りませんsu

これは、ルートサブシェルで何が起こっているかの記録がないという意味ではありません。シェルコマンドはシェルの履歴に保存されます。私のシステムでは、rootの履歴の保存はデフォルトで有効になっているので、やら~root/.sh_historyなければならないことは、何が行われたかの記録を探すことだけです(もちろん、誰かがそれを改ざんしない限り、しかし彼らは等しく改ざんすることができます/var/log)。

私が考えて、これはあなたのための最適なソリューションです。そうでない場合は、auditd@ Jennyが示唆したように、で町に行きます。

PS。ルートの履歴がまだ有効になっていない場合、有効にするのは使用するシェルによって異なります。以下のためにbash設定され、HISTORYかつHISTFILESIZE、十分に大きな数に(デフォルトは500で、私の取扱説明書は述べています)。必要に応じHISTFILEて、パスを設定することで履歴の保存場所を指定できます(デフォルト$HOME/.sh_history


0

次を使用して、セッションのタイプスクリプトを作成できますscript(1)

$ sudo su -
# script -t /tmp/my_typescript 2> /tmp/my_typescript.timing
Script started, file is /tmp/my_typescript
# echo foobar
foobar
# echo hello world
hello world
# exit
exit
Script done, file is /tmp/my_typescript

これで次のことができますgrep#プロンプトは実際にに記録されることに注意してください/tmp/my_typescript):

$ grep echo /tmp/my_typescript
# echo foobar
# echo hello world

または、次のコマンドでセッション全体をもう一度見ることもできますscriptreplay(1)

$ scriptreplay -t /tmp/my_typescript.timing /tmp/my_typescript

ファイルに/tmp/my_typescript.timingは、各コマンドが呼び出されたときの情報が含まれています。ttyrecまたはshelr、さらに多くの機能を備えた、またはさらに多くのツールがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.