web-dev-qa-db-ja.com

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

管理者が個人のユーザー名を使用してサーバーにログインし、Sudo -iを実行してrootになるのは会社のポリシーです。 Sudo -iを実行すると、Sudoは、元のユーザーのユーザー名を含むSudo_USERという環境変数を作成します。

ログに記録する方法はありますか[〜#〜] all [〜#〜]コマンドを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変数が含まれていませんでした。

71
Soviero

更新:コメントおよびフォローアップの質問でポップアップされた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 syscallは、32ビットコードと64ビットコードの両方で追跡する必要があります。

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

  • ラインを配置する

    session required pam_loginuid.so

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

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

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

 $ 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として実行したコマンドもリストします。

出典:

84
fuero

Sudo自体はすべてのSudoコマンドをsyslogに記録するため、すべての特権ユーザーは、Sudoだけでなくルートシェルを取得するように教育されている必要があります。

Sudo command p1 p2 ... pn

これまたは私が考えたアプローチの問題は、rootユーザーとして、ユーザーが特定のタイプのログを回避できないようにすることは非常に難しいことです。したがって、何を試しても<100%になります。申し訳ありません。

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

11
mdpc

私はかつて同じ問題に直面し、迅速で汚い解決策を考え出す必要がありました-コマンドを実行すると、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

7
Daniel t.

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

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

3
Mike McManus

Sudoには sudoreplay と呼ばれるものがあり、有効なセッションがログに記録されて後で再生できる場合、scriptコマンドと同様に機能し、scriptreplayコマンドで後で再生できる端末セッションのTypeScriptを作成します。

3
nighter

これまでのところ、他の回答に問題はありませんが、Sudosyslogによるログ記録で十分であると判断した場合は、ネットワーク経由でリモート監査ホストにログ記録することをお勧めします。

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

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

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

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

2
MadHatter

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

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

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

2
Bostjan Skufca