auditでコマンド実行履歴をログに取得してみた

どうも、ごきげんまるです。

 

皆さんは会社のLinuxサーバでログイン者のコマンド実行履歴を管理されていますか?

Linuxではコマンド履歴を取得する方法がいくつかあります。

私の現場では、Snoopy Loggerを使ってLinuxサーバのコマンド履歴を監査用として取得していましたが、AWSでAmazonLinux2でEC2インスタンスを作成した際にSnoopy Loggerがうまくインストールできない問題があったことから、Linux標準で用意されているauditに変更。その内容を書こうと思います。

aujditのログのローテートで少しはまった話についてはまた次回。。。

 

Snoopy Loggerとは

コマンドの実行履歴をsyslogに記録してくれるツールです。

github上に公開されており、いろいろなLinuxディストリビューションに対応しているツールで、インストール実行するとディストリビューションに応じたインストールが走ってくれる便利ツールです。

 

github.com

 

なぜSnoopy Loggerを使わなかったのか。

AmazonLinux2ではインストールがうまく行かなかった…。

gcc等のSnoopy Loggerで必要なパッケージを手動で入れる必要はありましたが、インストールシェルは実行でき、うまくいっているように見えるのですが、ログを見るとerrorを吐いて止まっている。

インストールログ:
~途中省略~

 

SNOOPY INSTALL: Building... make all-recursive
make[1]: Entering directory `/tmp/snoopy-2.4.6'
Making all in etc
make[2]: Entering directory `/tmp/snoopy-2.4.6/etc'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/tmp/snoopy-2.4.6/etc'
Making all in lib
make[2]: Entering directory `/tmp/snoopy-2.4.6/lib'
Making all in inih
make[3]: Entering directory `/tmp/snoopy-2.4.6/lib/inih'
Making all in src
make[4]: Entering directory `/tmp/snoopy-2.4.6/lib/inih/src'
CC ini.lo
CCLD libinih.la
make[4]: Leaving directory `/tmp/snoopy-2.4.6/lib/inih/src'
make[4]: Entering directory `/tmp/snoopy-2.4.6/lib/inih'
make[4]: Nothing to be done for `all-am'.
make[4]: Leaving directory `/tmp/snoopy-2.4.6/lib/inih'
make[3]: Leaving directory `/tmp/snoopy-2.4.6/lib/inih'
make[3]: Entering directory `/tmp/snoopy-2.4.6/lib'
make[3]: Nothing to be done for `all-am'.
make[3]: Leaving directory `/tmp/snoopy-2.4.6/lib'
make[2]: Leaving directory `/tmp/snoopy-2.4.6/lib'
Making all in src
make[2]: Entering directory `/tmp/snoopy-2.4.6/src'
Making all in eventsource
make[3]: Entering directory `/tmp/snoopy-2.4.6/src/eventsource'
CC libsnoopy_eventsource_execve_wrapper_la-execve_wrapper.lo
CCLD libsnoopy_eventsource_execve_wrapper.la
make[3]: Leaving directory `/tmp/snoopy-2.4.6/src/eventsource'
Making all in datasource
make[3]: Entering directory `/tmp/snoopy-2.4.6/src/datasource'
CC noop.lo
CC cmdline.lo
cmdline.c: In function 'snoopy_datasource_cmdline':
cmdline.c:71:79: error: comparison between pointer and zero character constant [-Werror=pointer-compare]
for (cmdLineArgCount=0 ; *(snoopy_inputdatastorage->argv+cmdLineArgCount) != '\0' ; cmdLineArgCount++);
^~
cmdline.c:71:30: note: did you mean to dereference the pointer?
for (cmdLineArgCount=0 ; *(snoopy_inputdatastorage->argv+cmdLineArgCount) != '\0' ; cmdLineArgCount++);
^
cc1: all warnings being treated as errors
make[3]: *** [cmdline.lo] Error 1
make[3]: Leaving directory `/tmp/snoopy-2.4.6/src/datasource'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/tmp/snoopy-2.4.6/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/tmp/snoopy-2.4.6'
make: *** [all] Error 2

 

 

 

おそらくですが、Snoopy LoggerはCentOSなどの一般的なLinuxディストリビューションには対応していますが、AmazonLinux2は対応していないのではないかと推測しています。

※調べる時間がその時は無かった…。

構築期限も差し迫っていたことから、AmazonLinux2でSnoopy Loggerを使うことはあきらめ、Linux標準のauditdを利用することに。

 

auditとは

Linux標準のセキュリティに関する情報を追跡するものらしいです。

今回やりたかったコマンドの実行履歴の取得もこのauditで実施できることから、今回はauditを利用することに。

設定自体は簡単で、AmazonLinux2ではデフォルトでパッケージが導入され、サービスが起動していることから、設定のみで利用可能でした。

 

 auditでコマンド履歴をaudit.logに記録するコマンド

 

auditctl -a exit,always -S execve

 

上記コマンドを実行すると、audit.log(AmazonLinux2では/var/log/audit/audit.log)にコマンドの履歴が記録されます。

可読性は…正直よくありません。1回のコマンド実行で数行のログが出力され、見づらいったらありゃしない。

まぁでも監査用のログなので、可読性は今回は捨てることに。

 

ただ、コマンドで実行した場合、当然ながらrebootなどでサーバが停止したりすれば再度実行が必要。

監査ログということもあり、サーバ起動時からログが取れないのは致命的なので、サーバ再起動等があってもコマンド履歴が取得できるよう、以下の通りauditのrulesに追記。

 

/etc/audit/rules.d/audit.rules 

-a exit,always -S execve

 

 これでauditを再起動すればauditctlコマンドを実行しなくてもコマンド履歴をログに取得できるようになりました。

 とりあえず、監査ログ取得ということであれば上記で対応は可能です。ただ、実際にセキュリティ事故等でコマンドを追うとなると正直読みづらく大変だと思うので、何かしら考えないといけないなぁと思っているところです。

 

 

 

 

まだブログの書き方に慣れておらず、ほかのブログのようにはきれいに書けない。。。

pre記法?とかを学ばないとダメですね。