null Alfrescoの監査証跡(Audit Log)の標準の設定で記録される情報

こんにちは。てらしたです。

今回はAlfrescoの監査証跡(Audit Log)機能に標準で用意された設定でどのような情報が記録されるのかご紹介します。Alfrescoの監査証跡機能では、どのような対象を、どのようなユーザが、どのように操作した場合に、何を記録するのか、といった要件を非常に細かく設定することができます。ただ、それをゼロから設定するのはなかなかに大変なので、おそらく多くのケースをカバーしていると思われるalfresco-accessというAudit Applicationが標準で用意されています。今回はそのalfresco-accessを有効化する方法(デフォルトでは無効になっています)と、有効化した場合にどのような情報が記録されるのかをご紹介します。なお、使用しているバージョンはAlfresco Community Edition 201911GAです。

alfresco-accessの有効化

{alfresco_install_dir}/tomcat/shared/classes/alfresco-global.propertiesに以下のプロパティを設定します。

audit.alfresco-access.enabled=true

以上です。簡単ですね。監査証跡機能自体のON/OFFを設定するaudit.enabledというプロパティもありますが、こちらはデフォルトでtrueになっているので書かなくても大丈夫です。

Docker Composeで試す場合は、docker-compose.ymlでalfrescoサービスの環境変数JAVA_OPTSに以下の11行目のように一行追記してdocker-compose upでOKです。

version: "2"

services:
    alfresco:
        image: alfresco/alfresco-content-repository-community:6.2.0-ga
        mem_limit: 1500m
        environment:
            JAVA_OPTS: "
                -Ddb.driver=org.postgresql.Driver
                ...
                -Daudit.alfresco-access.enabled=true
                ...

alfresco-access有効化で記録される情報

ここからは、ログイン/ログアウトやファイルのCRUD操作に対してどのような情報が記録されるかを見ていきます。記録されたAuditログを確認するにはREST APIを使用します。curlを使う場合は例えば以下のようにリクエストを投げます(結果がJSONで返ってくるので必要に応じてjqやpython -m json.tool等を使って整形した方がよいと思います)。

curl -u admin "http://{host}:{port}/alfresco/api/-default-/public/alfresco/versions/1/audit-applications/alfresco-access/audit-entries?include=values"

以下のようにidやcreatedAtの範囲を指定してエントリを取得することも可能です。

curl -u admin "http://{host}:{port}/alfresco/api/-default-/public/alfresco/versions/1/audit-applications/alfresco-access/audit-entries?include=values&where=(id%20BETWEEN%20('20'%2C'30'))"
curl -u admin "http://{host}:{port}/alfresco/api/-default-/public/alfresco/versions/1/audit-applications/alfresco-access/audit-entries?include=values&where=(createdAt%20BETWEEN%20('2020-11-20T00%3A00%3A00.000%2B0900'%2C'2020-11-21T00%3A00%3A00.000%2B0900'))"

また、以下のようにノードを指定してそのノードに対して行われた操作のエントリを取得することも可能です。

curl -u admin "http://{host}:{port}/alfresco/api/-default-/public/alfresco/versions/1/nodes/{nodeId}/audit-entries?include=value"

今回はこれらのREST APIを使用して各操作に対してどのようなエントリが記録されているのか確認していきます。REST APIの詳細について詳しく知りたい方はAlfresco REST API explorerを参照していただければと思います。

ログイン

ユーザtestでログインした場合のAuditログ。

{
  "entry": {
    "createdAt": "2020-11-20T07:03:52.900+0000",
    "createdByUser": {
      "id": "test",
      "displayName": "test"
    },
    "values": {
      "/alfresco-access/login/user": "test"
    },
    "auditApplicationId": "alfresco-access",
    "id": 114
  }
}

ブラウザでShareのUIからログインした場合はこの他にもログイン時に参照したコンテンツに対するREADのアクションが記録されます。

ログアウト

ユーザtestでログアウトした場合。

{
  "entry": {
    "createdAt": "2020-11-20T07:21:50.766+0000",
    "createdByUser": {
      "id": "test",
      "displayName": "test"
    },
    "values": {
      "/alfresco-access/logout/user": "test"
    },
    "auditApplicationId": "alfresco-access",
    "id": 119
  }
}

ログイン失敗

ユーザtestでログインに失敗した場合。

{
  "entry": {
    "createdAt": "2020-11-20T07:23:19.988+0000",
    "values": {
      "/alfresco-access/loginFailure/user": "test"
    },
    "auditApplicationId": "alfresco-access",
    "id": 120
  }
}

ファイル作成

ユーザtestで共有ファイル配下にtest.txtを作成した場合。以下、操作はすべてユーザtestで行っています。

{
  "entry": {
    "createdAt": "2020-11-20T07:25:26.678+0000",
    "createdByUser": {
      "id": "test",
      "displayName": "test"
    },
    "values": {
      "/alfresco-access/transaction/sub-actions": "createNode updateNodeProperties createContent updateContent addNodeAspect",
      "/alfresco-access/transaction/aspects/add": ...,
      "/alfresco-access/transaction/path": "/app:company_home/app:shared/cm:test.txt",
      "/alfresco-access/transaction/action": "CREATE",
      ...

作成したファイルのプロパティ等も記録されていますが上記では省略しています。

新規バージョンのアップロード

test.txtに対して新規バージョンをアップロードした場合。

{
        "entry": {
          "createdAt": "2020-11-20T09:06:22.213+0000",
          "createdByUser": {
            "id": "test",
            "displayName": "test"
          },
          "values": {
            "/alfresco-access/transaction/sub-actions": "updateNodeProperties addNodeAspect createVersion deleteNodeAspect updateContent copyNode checkIn",
            "/alfresco-access/transaction/version": "1.1",
            "/alfresco-access/transaction/aspects/add": ...,
            "/alfresco-access/transaction/path": "/app:company_home/app:shared/cm:test.txt",
            "/alfresco-access/transaction/action": "CHECK IN",
            "/alfresco-access/transaction/properties/add": {
              "{http://www.alfresco.org/model/content/1.0}autoVersionOnUpdateProps": false,
              "{http://www.alfresco.org/model/content/1.0}versionLabel": "1.1",
              "{http://www.alfresco.org/model/content/1.0}autoVersion": true,
              "{http://www.alfresco.org/model/content/1.0}initialVersion": true,
              "{http://www.alfresco.org/model/content/1.0}versionType": "MINOR"
            },
            "/alfresco-access/transaction/copy/from/path": "/app:company_home/app:shared/cm:test (作業用コピー).txt",
            "/alfresco-access/transaction/type": "cm:content",
            "/alfresco-access/transaction/user": "test"
          },
          "auditApplicationId": "alfresco-access",
          "id": 208
        }

上記の他に、更新したファイルに対して作成されるサムネイルやプレビューに関するログも記録されますが、省略しています。

ファイルプレビュー

test.txtのプレビュー画面を開いた場合。

{
  "entry": {
    "createdAt": "2020-11-20T07:38:27.036+0000",
    "createdByUser": {
      "id": "test",
      "displayName": "test"
    },
    "values": {
      "/alfresco-access/transaction/sub-actions": "readContent",
      "/alfresco-access/transaction/path": "/app:company_home/app:shared/cm:test.txt/cm:pdf",
      "/alfresco-access/transaction/action": "READ",
      "/alfresco-access/transaction/type": "cm:thumbnail",
      "/alfresco-access/transaction/user": "test"
    },
    "auditApplicationId": "alfresco-access",
    "id": 169
  }
}

ファイルダウンロード

text.txtをダウンロードした場合。

{
  "entry": {
    "createdAt": "2020-11-20T07:39:18.068+0000",
    "createdByUser": {
      "id": "test",
      "displayName": "test"
    },
    "values": {
      "/alfresco-access/transaction/sub-actions": "readContent",
      "/alfresco-access/transaction/path": "/app:company_home/app:shared/cm:test.txt",
      "/alfresco-access/transaction/action": "READ",
      "/alfresco-access/transaction/type": "cm:content",
      "/alfresco-access/transaction/user": "test"
    },
    "auditApplicationId": "alfresco-access",
    "id": 170
  }
}

ファイルコピー

test.txtを同じフォルダ(共有ファイル直下)にコピーした場合。

{
  "entry": {
    "createdAt": "2020-11-20T07:40:56.577+0000",
    "createdByUser": {
      "id": "test",
      "displayName": "test"
    },
    "values": {
      "/alfresco-access/transaction/sub-actions": "createNode updateNodeProperties createContent addNodeAspect copyNode",
      "/alfresco-access/transaction/aspects/add": ...,
      "/alfresco-access/transaction/path": "/app:company_home/app:shared/cm:test.txt のコピー",
      "/alfresco-access/transaction/action": "COPY",
      "/alfresco-access/transaction/properties/add": {
        "{http://www.alfresco.org/model/content/1.0}created": "2020-11-20T07:40:56.405+0000",
        ...

上記の他に、コピーして作成されたファイルのプロパティ情報等が記録されていますが省略しています。

ファイル移動

test.txtを共有ファイル/testフォルダに移動した場合。

{
  "entry": {
    "createdAt": "2020-11-20T07:43:02.479+0000",
    "createdByUser": {
      "id": "test",
      "displayName": "test"
    },
    "values": {
      "/alfresco-access/transaction/sub-actions": "updateNodeProperties addNodeAspect moveNode",
      "/alfresco-access/transaction/aspects/add": ...,
      "/alfresco-access/transaction/move/from/path": "/app:company_home/app:shared/cm:test.txt",
      "/alfresco-access/transaction/path": "/app:company_home/app:shared/cm:test/cm:test.txt",
      "/alfresco-access/transaction/action": "MOVE",
      "/alfresco-access/transaction/properties/add": {
        "{http://www.alfresco.org/model/system/1.0}cascadeTx": 45,
        "{http://www.alfresco.org/model/system/1.0}cascadeCRC": 4281589025
      },
      "/alfresco-access/transaction/type": "cm:content",
      "/alfresco-access/transaction/user": "test"
    },
    "auditApplicationId": "alfresco-access",
    "id": 185
  }
}

ファイル削除

test.txtを削除した場合。

{
  "entry": {
    "createdAt": "2020-11-20T07:44:19.412+0000",
    "createdByUser": {
      "id": "test",
      "displayName": "test"
    },
    "values": {
      "/alfresco-access/transaction/sub-actions": "deleteNode",
      "/alfresco-access/transaction/path": "/app:company_home/app:shared/cm:test/cm:test.txt",
      "/alfresco-access/transaction/action": "DELETE",
      "/alfresco-access/transaction/type": "cm:content",
      "/alfresco-access/transaction/user": "test"
    },
    "auditApplicationId": "alfresco-access",
    "id": 192
  }
}

この他にもサムネイルやプレビューを削除するエントリが記録されます。

まとめ

alfresco-accessを有効化した時に記録されるAuditログはこれがすべてではありませんが、どのような情報が記録されるかイメージは掴めたのではないでしょうか。実際の運用で使用する場合は記録される情報に過不足(少なくとも不足)がないかを精査することになると思います。本番運用で注意しなければならない点として、これらのAuditログはデータベースに蓄積されていくため、適切に管理していかないとデータが肥大化してパフォーマンスに影響を与える恐れがあります。この点についてはまた別の記事で書ければと考えています。

関連記事
feature

RANKING
2020.10.12
2020.11.19
2020.12.23
2020.10.05
2020.11.25