「sudo su -」内でコマンドをログに記録するにはどうすればよいですか?

「sudo su -」内でコマンドをログに記録するにはどうすればよいですか?

もし私が:

[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]

答え1

log_inputUbuntu 12.04 を使用している場合は、およびオプションで有効になっている I/O ログ機能を確認してくださいlog_output

log_input

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

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

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

log_output

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

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

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

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

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

例:

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

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

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

答え2

を実行しているのではなく、 を実行しているため、のgrep実行が失敗します。これにより、シェルが起動します。次に、シェルが を実行します。sudo su -echo 1234567zzsu -echo

これは意図的なものであり、実行されるコマンドをすべてログに記録すると、syslog が役に立たない情報で溢れてしまいます (通常、見えないところで実行されるプログラムが大量に存在します)。

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


sudo su -も の無駄な使い方ですsu。もsudo -i同じことを行います。

答え3

複雑さが増すにつれて、「sudo su -」内で発行されたコマンドをログに記録する方法は 3 つあります。

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

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

1) Bashコマンド履歴

十分な行数を保持し、異なるセッションから上書きせず、コマンドを無視せず、適切なタイムスタンプを保持するように履歴機能を設定する必要があります。(bash マニュアル) 履歴ファイルを編集したり、環境を操作したり、別のシェルを実行したりすることで簡単に破壊されます。

2) execveラッパー

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

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

コンテンツの信頼性を確保するには、Syslog をボックス外に送信する必要があります。

3) 監査

execve ラッパーよりも設定が少し簡単ですが、情報を抽出するのは困難です。これは、おそらくあなたが本当に尋ねている質問に対する答えです。「ユーザーがsudo su -「」を発行した後に、システムにどのような影響を与えたかをログに記録する方法はありますか?」 コンテンツの信頼性を確保するには、Syslog をボックス外に送信する必要があります。

これServerfaultの回答これは、auditd で使用するためのかなり包括的な構成であると思われます。

他にもいくつか提案がありますserverfault での同様の質問

答え4

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

代わりに を使用してくださいauditdすべてroot によって実行されるもの (crontab によって実行されるものなどを含む) の場合は、以下を使用します。

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

ETA: すべてをログに記録するとパフォーマンスに影響するので、少し制限したほうがよいかもしれません。man auditctl例については、こちらをご覧ください。

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

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

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

auditctlaudit.rulesおよびのマニュアル ページにさらに詳しい情報が記載されていますausearch

関連情報