この記事は公開から1年以上が経過しています。内容が古い場合があるのでご注意下さい。

Snoopy Loggerとは、Linuxのコマンド実行履歴をsyslogで記録してくれるツールです。
これまでbashでやったり、historyscriptを使っていましたが、よさげなツールなので紹介したいと思います。

Github – snoopy : Log every executed commnd to syslog

ちなみに今回は、CentOS6を対象にしています。

インストール

インストール方法は、3種類あります。

1. 自動インストール
 STABEバージョンとDEVELOPMENTバージョンがあります。
2. OSディストリビューションのパッケージマネージャでインストール
3. ソースからインストール(ビルド)

一番簡単な自動インストールでインストールしてみます。

自動インストールの場合

STABLEバージョンは以下のコマンドでインストールします。

socatなどが必要になるので、事前にepelリポジトリが使えるようにしておきます。

# rm -f snoopy-install.sh &&
wget -q -O snoopy-install.sh https://github.com/a2o/snoopy/raw/install/doc/install/bin/snoopy-install.sh &&
chmod 755 snoopy-install.sh &&
./snoopy-install.sh stable

DEVELOPMENTバージョンは以下のコマンドでインストールします。

# rm -f snoopy-install.sh &&
wget -q -O snoopy-install.sh https://github.com/a2o/snoopy/raw/install/doc/install/bin/snoopy-install.sh &&
chmod 755 snoopy-install.sh &&
./snoopy-install.sh git-master

インストーラが実行されると、OS種別が自動判断されて、各ディストリビューション標準のパッケージマネージャによって、必要なツールがインストールされていきます。
(試した環境はCentOSだったのでyumでgccsocatなどがインストールされました。)

その後、Snoopyがmake installされていきます。

STABLEバージョンのインストールが完了すると、以下のようなメッセージが出力されます。

SNOOPY INSTALL: Starting installation, log file name: /root/snoopy-install.log
SNOOPY INSTALL: Installation mode: package-latest-stable
SNOOPY INSTALL: Getting latest Snoopy version: snoopy-2.4.3.tar.gz
SNOOPY INSTALL: Downloading http://source.a2o.si/download/snoopy/snoopy-2.4.3.tar.gz... done.
SNOOPY INSTALL: Unpacking snoopy-2.4.3.tar.gz... done.
SNOOPY INSTALL: Configuring... done.
SNOOPY INSTALL: Building... done.
SNOOPY INSTALL: Installing... done.
SNOOPY INSTALL: Enabling... done.

SNOOPY LOGGER is now installed and enabled.

TIP #1: If Snoopy is to be enabled for all processes, you need
        to restart your system, or at least all services on it.

TIP #2: If you ever need to disable Snoopy, you should use provided
        'snoopy-disable' script. Use 'snoopy-enable' to reenable it.

TIP #3: Snoopy output can usually be found somewhere in /var/log/*
        Check your syslog configuration for details.

TIP #4: Configuration file location: /etc/snoopy.ini
        See included comments for additional configuration options.

Snoopy wishes you a happy logging experience:)

余談

自動インストール時に実行されるconfigureオプションは以下になります。

./configure --enable-config-file --sysconfdir=/etc --enable-filtering

操作ログ

記録されたログは下記のいずれかにストアされます。

/var/log/auth*
/var/log/messages
/var/log/secure

どこにストアされるかは、利用環境のsyslogの設定に依存します。
手元のCentOS6では、/var/log/secureに出力されていました。

ログのサンプル

Jul 23 06:59:24 ip-172-31-2-225 snoopy[9398]: [uid:0 sid:9387 tty:/dev/pts/1 cwd:/root filename:/bin/ls]: ls --color=auto
Jul 23 07:01:01 ip-172-31-2-225 snoopy[9400]: [uid:0 sid:9400 tty:(none) cwd:/ filename:/usr/bin/run-parts]: run-parts /etc/cron.hourly
Jul 23 07:01:01 ip-172-31-2-225 snoopy[9402]: [uid:0 sid:9400 tty:(none) cwd:/ filename:/bin/basename]: basename /etc/cron.hourly/0anacron
Jul 23 07:01:01 ip-172-31-2-225 snoopy[9403]: [uid:0 sid:9400 tty:(none) cwd:/ filename:/bin/logger]: logger -p cron.notice -t run-parts(/etc/cron.hourly)[9400] starting 0anacron
Jul 23 07:01:01 ip-172-31-2-225 snoopy[9405]: [uid:0 sid:9400 tty:(none) cwd:/ filename:/bin/awk]: awk -v progname=/etc/cron.hourly/0anacron progname {#012#011#011#011#011   print progname ":\n"#012#011#011#011#011   progname="";#012#011#011#011       }#012#011#011#011       { print; }
Jul 23 07:01:01 ip-172-31-2-225 snoopy[9404]: [uid:0 sid:9400 tty:(none) cwd:/ filename:/etc/cron.hourly/0anacron]: /etc/cron.hourly/0anacron
Jul 23 07:01:01 ip-172-31-2-225 snoopy[9406]: [uid:0 sid:9400 tty:(none) cwd:/ filename:/bin/cat]: cat /var/spool/anacron/cron.daily
Jul 23 07:01:01 ip-172-31-2-225 snoopy[9407]: [uid:0 sid:9400 tty:(none) cwd:/ filename:/bin/date]: date +%Y%m%d
Jul 23 07:01:01 ip-172-31-2-225 snoopy[9408]: [uid:0 sid:9400 tty:(none) cwd:/ filename:/bin/basename]: basename /etc/cron.hourly/0anacron
Jul 23 07:01:01 ip-172-31-2-225 snoopy[9409]: [uid:0 sid:9400 tty:(none) cwd:/ filename:/bin/logger]: logger -i -p cron.notice -t run-parts(/etc/cron.hourly) finished 0anacron
Jul 23 07:04:09 ip-172-31-2-225 snoopy[9412]: [uid:0 sid:977 tty:/dev/pts/0 cwd:/var/log filename:/bin/bash]: /bin/bash -c /usr/bin/lesspipe.sh secure
Jul 23 07:04:09 ip-172-31-2-225 snoopy[9412]: [uid:0 sid:977 tty:/dev/pts/0 cwd:/var/log filename:/usr/bin/lesspipe.sh]: /usr/bin/lesspipe.sh secure
Jul 23 07:04:09 ip-172-31-2-225 snoopy[9413]: [uid:0 sid:977 tty:/dev/pts/0 cwd:/var/log filename:/usr/bin/file]: file -b secure
Jul 23 07:04:09 ip-172-31-2-225 snoopy[9416]: [uid:0 sid:977 tty:(none) cwd:/var/log filename:/bin/cut]: cut -d. -f2

記録対象

操作ログには、cdpwdといった、ビルトインコマンドは記録されません。
対象コマンドがビルトインコマンドであるかどうかは、typeコマンドで確認できます。

$ type cd
$ cd is a shell builtin

cd コマンドはビルトインコマンドです。

Snoopyの有効化と無効化

インストールしたら自動的に有効になっています。
無効にするには以下のコマンドを実行します。

# snoopy-disable

再度、有効にするには以下のコマンドを実行します。

# snoopy-enable

手動で無効にするには、/etc/ld.so.preloadを編集して、libsnoopy.soのある行を削除します。
CentOS6の環境では、以下の様になっていましたので、この一行を消すことになります。

$ cat /etc/ld.so.preload

/usr/local/lib/libsnoopy.so

実体は、/usr/local/sbin/以下に同名のシェルスクリプトがあり、これが実行されています。
このスクリプトの中で、/etc/ld.so.preloadの中身をsedで消したり、リダイレクトで設定を追加したりしています。

有効/無効が反映されるタイミング

一旦、有効/無効を変更すると既にログイン中のユーザについては、設定が反映されません。
新規にログインしてきたユーザの操作に対して、設定が反映されます。

設定ファイル

設定ファイルは、/etc/snoopy.iniです。
ログのフォーマット指定や、出力ファイルの指定などが可能です。

試しに、以下のように変更してみます。

1. 出力先をsyslogから特定ファイル「/var/log/snoopy.log」に変更
2. 出力フォーマットを変更

設定ファイルは、outputmessage_formatの2つの項目を変更します。

--- snoopy.ini_20150723071340   2015-07-23 06:14:33.158801189 +0900
+++ snoopy.ini  2015-07-23 07:33:51.243796863 +0900
@@ -59,6 +59,7 @@
 ;message_format = "useless static log entry that gets logged on every program execution"
 ;message_format = "uid=%{uid}"   ; <--- this would only log uids who execute programs, nothing else;
 ;message_format = "uid=%{uid} tty=%{tty} cmdline=%{cmdline}"   ; <--- logs uid + tty + command that is executed
+message_format = "%{datetime} [uid:%{uid} sid:%{sid} tty:%{tty} cwd:%{cwd} filename:%{filename}]: %{cmdline}"


--- snoopy.ini_20150723071340   2015-07-23 06:14:33.158801189 +0900
+++ snoopy.ini  2015-07-23 07:22:37.324795549 +0900
@@ -130,7 +130,7 @@
 ; Example:
 ;output = console
 ;output = devlog
-;output = file:/var/log/snoopy.log
+output = file:/var/log/snoopy.log
 ;output = socket:/var/run/socket-for-snoopy.sock

この設定変更も、無効化/有効化の変更時と同じように、新規ユーザの接続から有効になります。

実際にログインし直すと、新たに「/var/log/snoopy.log」ファイルが作成されて、操作ログが記録されています。

yumでインストールする場合

epelレポジトリからインストール可能です。

$ sudo yum -y install --enablerepo=epel snoopy

しかし、これではまだ利用できませんので、下記のドキュメントにあるように、2つほどコマンドを実行します。

/usr/share/doc/snoopy-1.7.10/README.Fedora
(ドキュメントファイルは、rpm -ql snoopyで確認します。)

This file describes how to enable snoopy after
installing this snoopy RPM on a Fedora on Redhat/CentOS system.

snoopy can be enabled in one of two ways:

1) To enable for the whole system with a global preload.

echo “/lib64/snoopy.so” >> /etc/ld.so.preload

2) To enable in user space for a particular user then

set LD_PRELOAD=/lib64/snoopy.so

Afterwards logs will be made via syslog to /var/log/secure

以下のコマンドを実行します。

# echo "/lib64/snoopy.so" >> /etc/ld.so.preload
# set LD_PRELOAD=/lib64/snoopy.so

これで、新規ユーザから/var/log/secureに操作ログが記録されていきます。

yumでインストールした時の注意点

設定ファイルが無い

/etc/snoopy.iniのような設定ファイルが利用できるのはバージョン2.0.0以上です。
yumでインストールされるバージョンは、snoopy-1.7.10-1.el6.x86_64です。

有効化/無効化コマンドが無い

/etc/ld.so.preloadから/lib64/snoopy.soの行を削除したり追加することで、有効/無効を切り替えます。

個人的感想

yumでインストールできるのが古いバージョンになってしまうのが、個人的には気になりますが、bashで同じことをやるよりは導入し易いのではないかと思います。

関連記事:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です