実行されたコマンドを記録するという要件に対するアプローチ
誰がいつどんなコマンドを実行したかを記録したい
ISMSとかPCIDSSでよく言われるモノ
世の中的アプローチ
##1.acct/lastcomm
大方のOSが持ってるアカウンティング機能
が、コマンドは分かってもコマンド引数が記録されないという問題があって使いにくい。
それ以前に記録されるコマンド名の長さに制限がある(linux16文字、solaris8文字)
イマドキではないな=3
##2.シェルのhistoryファイルを利用
実行コマンドがhistoryファイルに出力されるのを利用
以下問題点
-
ユーザが書き換え権限を持つので、ログの改変が可能
* historyファイルのファイル名と保存位置の変更は環境変数の設定で可能だが、ユーザによる変更も可能(bashはtypsetでROに出来るがtcshはできるのか??) -
シェルが終了した時点で書き出されるのでログイン中の記録を確認できない
-
該当シェル上でユーザ自身がコンパイルした俺俺シェルを実行されると無意味
##3.2同様だがhistoryをsyslogに吐きだす
- bashは再コンパイルが必要
- tcshは野良パッチが必要
- zsh/kshは?
- etc...
2.同様、俺俺シェル対策も必要
##4.scriptコマンド
実行コマンドだけでなく全出力が記録されるためログサイズが巨大になりがち
2.同様、ユーザによるログ消去対応が必要
ログインシェル以外のコマンドログの取得が出来ない
商用アプライアンスによくあるタイプ
##5.audit
いまどきのOSなら対応してそう
とりあえずCentOS7でやってみる
こまかいコンフィグは後回しで
Audit
##何者?
Linuxのシステム監査用のツール群
BSDだとOpenBSMとか
コマンドログ以外にもファイルの変更とかいろいろ使えそうな感じ
起動確認
# systemctl status auditd
動いてなければ
# systemctl start auditd
監査ルール
コマンド起動はシェル⇒fork⇒execve⇒当該コマンド
の流れなので、execveが完了(=コマンド起動)を契機に記録するように指定
execveシステムコールの監査を記録する
# auditctl -a always,exit -F arch=b64 -S execve
2画面コンソールを開いて、一方で
# tail -f /var/log/audit/audit.log
もう一方でコマンドを実行してみる
lsの例
cdtype=SYSCALL msg=audit(1427685957.120:65358): arch=c000003e syscall=59 success=yes exit=0 a0=2150cf0 a1=2137d90 a2=2150210 a3=7fff4f55b720 items=2 ppid=20464 pid=21947 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts1 ses=9122 comm="ls" exe="/usr/bin/ls" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null) type=EXECVE msg=audit(1427685957.120:65358): argc=2 a0="/bin/ls" a1="-aF" type=CWD msg=audit(1427685957.120:65358): cwd="/tmp" type=PATH msg=audit(1427685957.120:65358): item=0 name="/bin/ls" inode=17013545 dev=fd:01 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:bin_t:s0 objtype=NORMAL type=PATH msg=audit(1427685957.120:65358): item=1 name=(null) inode=42651673 dev=fd:01 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:ld_so_t:s0 objtype=NORMAL
ナマログだと長いのとuidとかになってるところが人が見る分にはツライところかな。
それでも全操作&出力ログを取るよりはかなりマシだとは思う
ログの検索にausearchコマンドがあるので、こちらを使うとそれなりに整形された(?)ものが見れるかも
ausearch -sc 59 -c ls -i
59 はexecveのsyscall番号
type=PATH msg=audit(03/30/2015 12:25:57.120:65358) : item=1 name=(null) inode=42651673 dev=fd:01 mode=file,755 ouid=root ogid=root rdev=00:00 obj=system_u:object_r:ld_so_t:s0 objtype=NORMAL type=PATH msg=audit(03/30/2015 12:25:57.120:65358) : item=0 name=/bin/ls inode=17013545 dev=fd:01 mode=file,755 ouid=root ogid=root rdev=00:00 obj=system_u:object_r:bin_t:s0 objtype=NORMAL type=CWD msg=audit(03/30/2015 12:25:57.120:65358) : cwd=/tmp type=EXECVE msg=audit(03/30/2015 12:25:57.120:65358) : argc=2 a0=/bin/ls a1=-aF type=SYSCALL msg=audit(03/30/2015 12:25:57.120:65358) : arch=x86_64 syscall=execve success=yes exit=0 a0=0x2150cf0 a1=0x2137d90 a2=0x2150210 a3=0x7fff4f55b720 items=2 ppid=20464 pid=21947 auid=test-a uid=test-a gid=test-a euid=test-a suid=test-a fsuid=test-a egid=test-a sgid=test-a fsgid=test-a tty=pts1 ses=9122 comm=ls exe=/usr/bin/ls subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null)
ログローテート
/etc/audit/auditd.confで設定
かなり細かく設定できるが、デフォルトで良さそう。個別に必要なのはサイズと世代くらいか?
プラグイン(audisp)を使うと他サーバに転送もできるので、ログの一元管理も簡単に実現できそう。
その他
CentOS6は引数表示は無い模様(出力メッセージフォーマットはカーネル側の機能)