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

小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Windowsの監査ログを使って特定のファイルアクセスを監視する

はじめに

Windowsの監査ログ機能を使うと、特定のファイルに対するファイルアクセスの記録を残し、イベントビューアで確認することができます。

監査ログの設定

1.ファイル名を指定して実行から「gpedit.msc」を起動します。
f:id:replication:20160807230858j:plain
2.Windowsの設定→セキュリティの設定→ローカルポリシー→「オブジェクト アクセスの監査」を選択し、右クリックメニューからプロパティを選択します。
f:id:replication:20160807231252j:plain
3.以下の画面で成功と失敗の両方にチェックを入れます。
f:id:replication:20160807231445j:plain
4.オブジェクト アクセスの監査が「成功,失敗」となっていることを確認します。
f:id:replication:20160807231730j:plain

ファイル単位の設定

1.監視をしたいファイルを選び、プロパティのセキュリティタブから「詳細設定」を選択します。
f:id:replication:20160808005709j:plain
2.監査タブを選択し、編集(E)をクリックします。
f:id:replication:20160808005859j:plain
3.Everyoneを選び、成功と失敗にフルコントール権限を付与します。
f:id:replication:20160808010047j:plain

ファイルにアクセスするサンプルプログラム

以下のプログラムを実行して、c:\\test1.txtにアクセスします。

#include "afx.h"
#include <windows.h>
#include <stdio.h>

int _tmain(int argc, _TCHAR *argv[])
{

  int i = 0;
  while (true)
  {

    i++;

    // 1.open file
    HANDLE handle1 = CreateFile("c:\\test1.txt" ,
                  GENERIC_READ | GENERIC_WRITE,
                  FILE_SHARE_READ ,
                  NULL ,
                  OPEN_ALWAYS ,
                  FILE_ATTRIBUTE_NORMAL ,
                  NULL);
    if (handle1 == INVALID_HANDLE_VALUE)
    {
      return 1;
    }

    // 2.seek file
    BOOL ret = SetFilePointer(handle1, NULL, NULL, FILE_END);
    if (ret == INVALID_SET_FILE_POINTER)
    {
      CloseHandle(handle1);
      return 1;
    }

    // 3. write file
    DWORD dw = 0;
    char tmp[100] = {0};
    sprintf(tmp, "Hellow World %d\n", i);
    ret = WriteFile(handle1, tmp, strlen(tmp), &dw, NULL);
    if (ret == FALSE)
    {
      CloseHandle(handle1);
      return 1;
    }

    // 4. close Handle
    ret = CloseHandle(handle1);
    if (ret == FALSE)
    {
      return 1;
    }
    handle1 = NULL;
  }

}
監査ログを確認する

イベントビューアからWindowsログ→セキュリティで監査ログを確認することができます。
f:id:replication:20160808010713j:plain