セキュリティ
今回はコマンドの実行を捕捉してログファイルに出力するサンプルDスクリプトを取り上げます。内容は、
#!/usr/sbin/dtrace -s
#pragma D option destructive
#pragma D option quiet
inline string REPORT_CMD = "/usr/local/bin/reporter.sh";
dtrace:::BEGIN
{
/*
* Ensure this contains all the reporting commands,
* otherwise this script will be a feedback loop:
*/
ALLOWED[REPORT_CMD] = 1;
ALLOWED["/bin/sh"] = 1;
/*
* Commands to allow.
*/
ALLOWED["/bin/sh"] = 1;
ALLOWED["/bin/ls"] = 1;
ALLOWED["/bin/pgrep"] = 1;
ALLOWED["/bin/pkill"] = 1;
ALLOWED["/bin/cat"] = 1;
ALLOWED["/bin/chmod"] = 1;
ALLOWED["/usr/bin/basename"] = 1;
ALLOWED["/usr/bin/grep"] = 1;
ALLOWED["/usr/bin/head"] = 1;
ALLOWED["/usr/bin/openssl"] = 1;
ALLOWED["/usr/bin/ssh"] = 1;
ALLOWED["/usr/bin/tput"] = 1;
ALLOWED["/usr/bin/tr"] = 1;
ALLOWED["/usr/bin/uname"] = 1;
ALLOWED["/usr/sbin/chown"] = 1;
ALLOWED["/usr/sbin/mountd"] = 1;
ALLOWED["/usr/sbin/nfsd"] = 1;
ALLOWED["/usr/local/bin/bash"] = 1;
ALLOWED["/usr/local/sbin/nginx"] = 1;
printf("Reporting unknown exec()s to %s...\n", REPORT_CMD);
}
syscall::exec*:entry
/ALLOWED[copyinstr(arg0)] != 1/
{
/*
* Customize arguments for reporting command:
*/
system("%s %s %d %d %d %Y\n", REPORT_CMD, copyinstr(arg0),
uid, pid, ppid, walltimestamp);
}
このDスクリプトの見どころは特定のコマンドは捕捉の対象からはずす処理をしているところと、
引数を/var/
#!/bin/sh
echo "$*" >> /var/log/execlog.txt
このDスクリプトではsystem()という標準ライブラリ関数と同じ名前の関数を使って外部のシェルスクリプトを実行しています。このシェルスクリプトを経由してモニタリング内容がログファイルに出力される仕組みになっています。Dスクリプトからファイルにデータを出力する方法として参考になります。
このDスクリプトを実行すると次のようになります。Ctrl-Cが入力されるまでモニタリングを実施し、
% sudo ./watchexec.d dtrace: 1 dynamic variable drop
捕捉されたコマンドデータは随時ログファイル
% tail -f /var/log/execlog.txt /usr/local/bin/fish 501 37978 25303 2017 Mar 21 18:05:18 /usr/bin/sed 501 37994 37978 2017 Mar 21 18:05:18 /usr/bin/sed 501 37995 37978 2017 Mar 21 18:05:18 /usr/bin/sed 501 37998 37978 2017 Mar 21 18:05:18 /usr/bin/awk 501 38096 37978 2017 Mar 21 18:05:18 /usr/bin/tr 501 38097 37978 2017 Mar 21 18:05:18 /usr/bin/sed 501 38098 37978 2017 Mar 21 18:05:18 /usr/bin/ssh-add 501 38099 37978 2017 Mar 21 18:05:18 /usr/bin/uname 501 38100 37978 2017 Mar 21 18:05:18 /usr/bin/seq 501 38102 37978 2017 Mar 21 18:05:18 /usr/bin/seq 501 38103 37978 2017 Mar 21 18:05:18 /usr/bin/seq 501 38104 37978 2017 Mar 21 18:05:18 /bin/hostname 501 38105 37978 2017 Mar 21 18:05:18 /usr/bin/tr 501 38106 37978 2017 Mar 21 18:05:18 /usr/bin/sed 501 38108 37978 2017 Mar 21 18:05:18 /usr/bin/awk 501 38109 37978 2017 Mar 21 18:05:18 /bin/hostname 501 38129 37978 2017 Mar 21 18:05:35 /usr/bin/tr 501 38130 37978 2017 Mar 21 18:05:35 /usr/bin/sed 501 38132 37978 2017 Mar 21 18:05:35 /usr/bin/awk 501 38133 37978 2017 Mar 21 18:05:35 /usr/bin/tail 501 38139 38138 2017 Mar 21 18:07:12 /bin/date 501 38141 38138 2017 Mar 21 18:07:18 /usr/sbin/wake 501 38146 38138 2017 Mar 21 18:07:40 /usr/sbin/fdwrite 501 38148 38138 2017 Mar 21 18:07:48 /usr/sbin/ppp 501 38150 38138 2017 Mar 21 18:07:52 /usr/bin/ppp 501 38150 38138 2017 Mar 21 18:07:52 /usr/local/sbin/ppp 501 38150 38138 2017 Mar 21 18:07:52 /usr/local/bin/ppp 501 38150 38138 2017 Mar 21 18:07:52 /Users/daichi/bin/ppp 501 38150 38138 2017 Mar 21 18:07:52 /Users/daichi/ttt/ppp 501 38150 38138 2017 Mar 21 18:07:52 /usr/sbin/pkg 501 38157 38138 2017 Mar 21 18:08:05 /usr/local/sbin/pkg 501 38157 38138 2017 Mar 21 18:08:05
watchexec.
※ ここに掲載したサンプルスクリプトは"DTrace Dynamic Tracing In Oracle Solaris, Mac OS X & FreeBSD", by Brendan Gregg and Jim Mauro P.
勉強会
第62回 4月28日(火)19:00~FreeBSD勉強会 エンジニアのための英会話入門 ~なぜ英語ができないのか~ br>
講師: 後藤大地(BSDコンサルティング株式会社)
FreeBSDの情報の多くは英語で入手できます。ほかの言語と比べると日本語は翻訳されたドキュメントが豊富にありますが、
日本は義務教育の間に英語を学びますが、
参加申し込みはこちらから。
第63回 5月23日(火)19:00~ FreeBSD勉強会
現在検討中です。
FreeBSD勉強会 発表者募集
FreeBSD勉強会では発表者を募集しています。FreeBSDに関して発表を行いたい場合、