読者です 読者をやめる 読者になる 読者になる

「Linux」auditd でファイルのアクセスを監査する

Linux 環境でファイルのアクセスを監査する方法について調べたので、その時のメモ。

監査には auditd の機能が利用できるみたい。
以下の Web ページに情報がまとめられていた。

Linux Audit ~OSレベルの監査ログ徹底活用~
http://www.secureos.jp/index.php?plugin=attach&refer=events%2Fjsosjk06&openfile=jsosjk06-linux-audit.pdf

ファイルのアクセスを監査する場合には、以下のルールを追加してやればよさそう。

auditctl -a exit,always -S open -F path=/usr/local/tmp/test.log -F success=1

上記の場合、"/usr/local/tmp/test.log" が監査対象のファイルになる。

追加されたルールは以下のコマンドで確認できる。

auditctl -l

ルールがあるとこんな感じの出力が得られる。

LIST_RULES: exit,always watch=/usr/local/tmp/test.log success=1 (0x1) syscall=open

ちなみにルールがない場合は、以下の出力となるみたい。

No rules

で "/usr/local/tmp/test.log" にアクセスしてみる。
ユーザから cat なりのコマンドで開いてもいいんだけど、ちょっと今回はプログラムからアクセス
することにしてみた。
C ビギナーだけど、気合い ( コピペで・・・ ) で書いてみた。
一応、どのプロセスがアクセスしたのかって辺りが監査できるのか調べるため、プロセスID の
出力を行なうようにしておく。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
  FILE *fp;
  char *file = "/usr/local/tmp/test.log";
  char s[100];

  fp = fopen(file, "r");
  if(fp == NULL) {
    printf("failed to open the %s\n", file);
    return -1;
  }

  printf("**********\n");
  while(fgets(s, 100, fp) != NULL) {
    printf("%s", s);
  }
  printf("**********\n");

  printf("PID : %d\n", getpid());

  fclose(fp);
  return 0;
}

コンパイルしておく。

gcc -o file fileRead.c

そして、"./file" とすると、auditd のログ ( /var/log/audit/audit.log ) に以下が出力される。

type=SYSCALL msg=audit(1373464694.690:74): arch=40000003 syscall=5 success=yes exit=3 a0=8048614 a1=0 a2=1b6 a3=804862d items=1 ppid=2044 pid=2162 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=2 comm="file" exe="/usr/local/tmp/c/file" key=(null)
type=CWD msg=audit(1373464694.690:74):  cwd="/usr/local/tmp/c"
type=PATH msg=audit(1373464694.690:74): item=0 name="/usr/local/tmp/test.log" inode=414336 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00

監査できている。あと、プログラムで出力されるプロセス ID と上記ログの pid が一致していることを確認。
なのでプロセスの特定もできている。

以上です。