実動サーバー上の管理者が実行したすべてのコマンドをログに記録する


71

管理者が個人のユーザー名を介してサーバーにログインし、実行sudo -iしてルートになることは企業ポリシーです。を実行するとsudo -i、sudoはと呼ばれる環境変数を作成しSUDO_USERます。これには、元のユーザーのユーザー名が含まれます。

次の構文に似た何かでsyslog内のすべてのコマンドを記録する方法はありますか?

${TIME/DATE STAMP}: [${REAL_USER}|${SUDO_USER}]: ${CMD}

エントリの例は次のとおりです。

Sat Jan 19 22:28:46 CST 2013: [root|ksoviero]: yum install random-pkg

明らかに上記の構文である必要はなく、最低限の実ユーザー(例:root)、sudoユーザー(例:ksoviero)、および実行された完全なコマンド(例:yum)を含める必要があります。 random-pkgをインストールします)。

すでに試しましたsnoopyが、SUDO_USER変数は含まれていません。


13
あなたが必要auditdです。
マイケルハンプトン


1
誰かがこれを答えとして投稿してもらえますか?ユーザーが実行したすべてのコマンドを厳密に記録する方法を含めてください。「監査の簡単な紹介」は便利でしたが、実際のコマンドのロギングに関連するものは何も含まれていませんでした(とにかく伝えることができる限り)。
ソビエロ

1
わかりました、私はで遊んで始めましたauditd、そして実行中のすべてのコマンドをログに記録しましたが、SUDO_USER変数(または同等の情報)が含まれておらず、それを含める方法が見つかりません。どんな助けも大歓迎です!
ソビエロ

2
そして、管理者によって入力されたすべてのコマンドのこの記録で会社何をしますか?
ewwhite

回答:


83

更新:コメントとフォローアップの質問にさらに2つのポップアップが表示されます:

  • auditdこの方法を使用すると、特にシステムがコマンドライン経由で頻繁に使用されている場合、ログのボリュームが劇的に増加します。ログ保持ポリシーを調整します。
  • Auditdそれらが作成されるホスト上のログは、同じボックスの他のファイルと同じくらい安全です。ログをELKやGraylogなどのリモートログ収集サーバーに転送して、ログの整合性を維持します。さらに、上記のポイントに追加すると、古いログをより積極的に削除できます。

マイケル・ハンプトンによって提案されたようにauditd、ここでの仕事のための正しいツールです。

Ubuntu 12.10インストールでこれをテストしたため、他のシステムでは燃費が異なる場合があります。

  • インストールauditd

    apt-get install auditd

  • 次の2行を追加し/etc/audit/audit.rulesます。

    -a exit、常に-F arch = b64 -F euid = 0 -S execve
    -a exit、常に-F arch = b32 -F euid = 0 -S execve

これらは、ルート(euid=0)によって実行されるすべてのコマンドを追跡します。なぜ2つのルールがあるのですか?execveシステムコールは、両方の32ビットおよび64ビットのコードで追跡されなければなりません。

  • auid=4294967295ログ内のメッセージをaudit=1削除するには、カーネルのコマンドラインに追加します(編集/etc/default/grub

  • ラインを配置する

    session required pam_loginuid.so

ログイン(/etc/pam.d/{login,kdm,sshd})に関連するすべてのPAM構成ファイルに含まれますが、suまたはに関連するファイルには含まれませんsudo。これによりauditd、またはをuid呼び出すときに、呼び出し元のユーザーを正しく取得できます。sudosu

  • 今すぐシステムを再起動します。

  • ログインしていくつかのコマンドを実行してみましょう。

    $ id -u
    1000
    $ sudo ls /
    bin boot data dev etc home initrd.img initrd.img.old lib lib32 lib64 lost + found media mnt opt proc root run sbin scratch selinux srv sys tmp usr var vmlinuz vmlinuz.old
    $ sudo su-
    #ls / etc
    [...]

これにより、次のようになり/var/log/audit/auditd.logます。

----
time->Mon Feb  4 09:57:06 2013
type=PATH msg=audit(1359968226.239:576): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968226.239:576): item=0 name="/bin/ls" inode=2117 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968226.239:576):  cwd="/home/user"
type=EXECVE msg=audit(1359968226.239:576): argc=2 a0="ls" a1="/"
type=SYSCALL msg=audit(1359968226.239:576): arch=c000003e syscall=59 success=yes exit=0 a0=10cfc48 a1=10d07c8 a2=10d5750 a3=7fff2eb2d1f0 items=2 ppid=26569 pid=26570 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="ls" exe="/bin/ls" key=(null)
----
time->Mon Feb  4 09:57:06 2013
type=PATH msg=audit(1359968226.231:575): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968226.231:575): item=0 name="/usr/bin/sudo" inode=530900 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968226.231:575):  cwd="/home/user"
type=BPRM_FCAPS msg=audit(1359968226.231:575): fver=0 fp=0000000000000000 fi=0000000000000000 fe=0 old_pp=0000000000000000 old_pi=0000000000000000 old_pe=0000000000000000 new_pp=ffffffffffffffff new_pi=0000000000000000 new_pe=ffffffffffffffff
type=EXECVE msg=audit(1359968226.231:575): argc=3 a0="sudo" a1="ls" a2="/"
type=SYSCALL msg=audit(1359968226.231:575): arch=c000003e syscall=59 success=yes exit=0 a0=7fff327ecab0 a1=7fd330e1b958 a2=17cc8d0 a3=7fff327ec670 items=2 ppid=3933 pid=26569 auid=1000 uid=1000 gid=1000 euid=0 suid=0 fsuid=0 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="sudo" exe="/usr/bin/sudo" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.523:578): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.523:578): item=0 name="/bin/su" inode=44 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.523:578):  cwd="/home/user"
type=EXECVE msg=audit(1359968229.523:578): argc=2 a0="su" a1="-"
type=SYSCALL msg=audit(1359968229.523:578): arch=c000003e syscall=59 success=yes exit=0 a0=1ceec48 a1=1cef7c8 a2=1cf4750 a3=7fff083bd920 items=2 ppid=26611 pid=26612 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="su" exe="/bin/su" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.519:577): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.519:577): item=0 name="/usr/bin/sudo" inode=530900 dev=08:01 mode=0104755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.519:577):  cwd="/home/user"
type=BPRM_FCAPS msg=audit(1359968229.519:577): fver=0 fp=0000000000000000 fi=0000000000000000 fe=0 old_pp=0000000000000000 old_pi=0000000000000000 old_pe=0000000000000000 new_pp=ffffffffffffffff new_pi=0000000000000000 new_pe=ffffffffffffffff
type=EXECVE msg=audit(1359968229.519:577): argc=3 a0="sudo" a1="su" a2="-"
type=SYSCALL msg=audit(1359968229.519:577): arch=c000003e syscall=59 success=yes exit=0 a0=7fff327ecab0 a1=7fd330e1b958 a2=17cc8d0 a3=7fff327ec670 items=2 ppid=3933 pid=26611 auid=1000 uid=1000 gid=1000 euid=0 suid=0 fsuid=0 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="sudo" exe="/usr/bin/sudo" key=(null)
----
time->Mon Feb  4 09:57:09 2013
type=PATH msg=audit(1359968229.543:585): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968229.543:585): item=0 name="/bin/bash" inode=6941 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968229.543:585):  cwd="/root"
type=EXECVE msg=audit(1359968229.543:585): argc=1 a0="-su"
type=SYSCALL msg=audit(1359968229.543:585): arch=c000003e syscall=59 success=yes exit=0 a0=13695a0 a1=7fffce08a3e0 a2=135a030 a3=7fffce08c200 items=2 ppid=26612 pid=26622 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/bin/bash" key=(null)
----
time->Mon Feb  4 09:57:11 2013
type=PATH msg=audit(1359968231.663:594): item=1 name=(null) inode=668682 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=PATH msg=audit(1359968231.663:594): item=0 name="/bin/ls" inode=2117 dev=08:01 mode=0100755 ouid=0 ogid=0 rdev=00:00
type=CWD msg=audit(1359968231.663:594):  cwd="/root"
type=EXECVE msg=audit(1359968231.663:594): argc=3 a0="ls" a1="--color=auto" a2="/etc"
type=SYSCALL msg=audit(1359968231.663:594): arch=c000003e syscall=59 success=yes exit=0 a0=7fff8c709950 a1=7f91a12149d8 a2=1194c50 a3=7fff8c709510 items=2 ppid=26622 pid=26661 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="ls" exe="/bin/ls" key=(null)

auid列には、呼び出し元のユーザーの含まれているuidあなたと、このユーザーが実行するコマンドをフィルタリングできます、

 ausearch -ua 1000

これは、ユーザーがrootとして実行したコマンドもリストします。

ソース:


+50この回答は最も包括的なように見えますが、やや複雑になったことに少しがっかりしています。ご協力ありがとうございます。
草の根

これらの変更により、ログの量が/var/log/audit/audit.logに大幅に増加する可能性があることに注意してください。このファイルへの私のログボリュームは以上audit.rulesにtwoexecveラインを追加した後に倍増
JDS

11

sudo自体がすべてのsudoコマンドをsyslogに記録するので、すべてのpriv'dユーザーは、単にsudoでなくルートシェルを取得するように教育する必要があります。

sudo command p1 p2 ... pn

これまたは私が考えてきたアプローチの問題は、rootユーザーとして、ユーザーが特定のタイプのロギングを回避するのを防ぐことは非常に難しいということです。したがって、あなたがしようとすることは100%未満になります。

教育、文書化、施行、そして何よりも信頼が必要です。


3
完璧なものは何もないことは理解していますが、皆さんが説明したように全員を働かせることはできません。これらは私たちが話しているシステム管理者です;)
ソビエロ

3
真実ではない....私が個人的に仕事をした少なくとも2つの非常に大きな企業が多数のシステム管理者で構成されており、このポリシーが整っている!繰り返しになりますが、教育と執行によって機能します。
mdpc

2
mdpcは100%正しいです。これはまさにsudoコマンドの目的です。私は数百のホストを持つ10人のシステム管理者の店にいます。すべてに個別のsudoコマンドを使用しています-suでrootになることを禁止する特定のポリシーがあります。管理操作が適切に監査されるようにする唯一の合理的な方法です。
ジェフアルバート

4
-1教育は決してそれを行いません。私たちは、あなたがシステム管理者の多くの顧客の1人に過ぎないアウトソーシングの世界に住んでいます。
草の根

7

私はかつて同じ問題に直面し、迅速で汚い解決策を考え出さなければなりませんでした-各sudoユーザーはコマンドを実行すると独自の履歴ファイルを持つことになります sudo -i

/root/.bashrc、私は次の行を追加しました-

 export HISTFILE=/root/.bash_history-$SUDO_USER
 export HISTTIMEFORMAT="%F %T "

そのため、rootにsudoするすべてのユーザーには、履歴ファイル.bash_history-usernameがあります。

別の方法-

次のコードを/root/.bashrc追加すると、ユーザー名、sudo-user、およびコマンドがログファイルに追加されます。通知レベルが設定されている場合は、ほとんどの場合/ var / log / messagesです。

function log2syslog
{
   declare COMMAND
   COMMAND=$(fc -ln -0)
   logger -p local1.notice -t bash -i -- "${USER}:${SUDO_USER}:${COMMAND}"
}
trap log2syslog DEBUG

クレジット-http://backdrift.org/logging-bash-history-to-syslog-using-traps


ナイスなアプローチですが、尋ねられたものとはまったく異なります。監査済みまたは同様のソリューションをご覧ください。
草の根

OK、トラップ方式に依存するように更新しました。
ダニエルt。

3
そして、正当なユーザーの場合、これは機能します。しかし、そのアカウントがクラックされた場合、クラッカーは/bin/shunset HISTFILEまたはを実行することにより、bash履歴をすぐに無効にすることができ/bin/bash --norcます。
ステファンLasiewski

3

多くの施設では、リソースを大量に消費し、サービス拒否攻撃の機会をもたらす可能性があるため、実際にauditdの使用を禁止しています。

1つの解決策は、最新のKornシェル(ksh-93、詳細についてはhttp://kornshell.com/を参照)を構成して、rootとして実行されたすべてのコマンドをリモートsyslogサーバーに記録し、緊急時を除いてポリシーで要求することです。状況では、sysadminsは個人アカウントでログオンし、sudo経由で拡張Kornシェルを実行します。ログを調べると、管理者が承認されたシェルから別のシェルを起動してトラックをカバーするタイミングを検出でき、必要に応じてSAを教育できます。


3

Sudoには、有効なセッションがログに記録され、後で再生できるときにsudoreplayと呼ばれるものがあります。これは、scriptコマンドで後で再生できるターミナルセッションのタイプスクリプトを作成するコマンドと同様に機能しscriptreplayます。


2

これまでの他の回答のいずれかに問題があるわけではありませんが、sudo「を介してのログインsyslogが満足できるものであると判断した場合、私はしわを提案できますか?ネットワーク経由でリモート監査ホストにログを記録します。

これで、「今はルートになったので、ログから不正行為の痕跡をすべて取り除くことができます」という問題を回避できます。これでローカルボックスのルートになりましたが、そのログパケットをネットワークから呼び出すことはできず、リモート監査ホストのルート権限を(おそらく)持っていません。

私は長年管理しているいくつかのネットワークでこれを行ってきましたが、他にも2つの信号の利点があります。

まず、ネットワーク上にすべてのsyslogをチェックする場所が1つあります。これにより、インシデントの関連付けがはるかに容易になります。したがって、「junoNFSサーバーheraが応答していないと不平を言ったとき、他の誰かが同時に同じことですか?もしそうならhera、問題である可能性が高いので、彼女が記録したものを見てみましょう;そうでない場合、junoネットワーク接続がより疑わしいので、junoその時に記録された他のものを見てみましょう。」

第二に、syslogログのローテーションが簡単になります。ログのコピーをローカルホストに数日以上保持することはありませんが、監査サーバーに大量のディスクスペースがあることを確認し、すべてのsyslogを数年間保持します。さらに、たとえば、法医学監査などのためにWORMメディアに書き込みたい場合は、WORMドライブを1つ購入するだけです。


2

バージョン2.0.0以降、snoopyは任意の環境変数を記録できます。

しかし、最近の投稿では、ttyのロギング所有者は「rootとしてそのコマンドを実行したのはだれか」という質問に対するかなり効果的でエレガントな回答であることが指摘されました。

開示:私はスヌーピーメンテナーです。


単純なリンクではなく、OPの要件に従って設定する方法に関する指示を提供してください。ありがとう。
アンドレアラザロット

1
-1。これは単なるスヌーピーのプラグインです。開示に従いましたが、投稿の質問にはまだ答えていません。プロジェクトにリンクしたばかりです。
ダンカンXシンプソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.