Audit information publishing
Objective
Publish audit logs for changes to CDAP entities so that other apps/tools like Cask Tracker, MDM, etc can use this as a source for audit information.
For 3.4 release, we'll limit the scope to publishing changes for Datasets and Streams.
Use Cases
Use cases and user stories are documented at Cask Tracker.
Design Choices
We chose Kafka to be the system where audit information gets published from CDAP. Other tools can subscribe to the Kafka feed to get audit information. Using Kakfa could make integrating external tools with CDAP easier.
However, publishing to Kafka has certain limitations today that will need to be addressed later -
- Kafka publish does not happen in a transaction, so there is a chance that the audit log feed from Kafka may be inconsistent compared to what actually happened. CDAP-5109 has more discussion on it.
- There is no access control on who can publish audit information to Kafka (CDAP-5130).
- Messages in Kafka are transient. They will be deleted after a few days in most setups. The subscribers will have to consume the messages before they are deleted.
Audit Message Format
Audit feed will be a stream of audit messages as defined below.
Types of Audit Message
The following types of audit messages are published for an entity -
- CREATE
- UPDATE
- TRUNCATE
- DELETE
- ACCESS (sub types: READ, WRITE, UNKNOWN)
- METADATA_CHANGE
Â
[ /** Dataset access operation **/ { "time": 1456956659468, "entityId": { "namespace": "ns1", "stream": "stream1", "entity": "STREAM" }, "user": "user1", "type": "ACCESS", "payload": { "accessType": "WRITE", "accessor": { "namespace": "ns1", "application": "app1", "type": "Flow", "program": "flow1", "run": "run1", "entity": "PROGRAM_RUN" } } }, /** Explore stream access **/ { "time": 1456956659469, "entityId": { "namespace": "ns1", "stream": "stream1", "entity": "STREAM" }, "user": "user1", "type": "ACCESS", "payload": { "accessType": "UNKNOWN", "accessor": { "service": "explore", "entity": "SYSTEM_SERVICE" } } }, /** Metadata change **/ { "time": 1456956659470, "entityId": { "namespace": "ns1", "application": "app1", "entity": "APPLICATION" }, "user": "user1", "type": "METADATA_CHANGE", "payload": { "previous": { "USER": { "properties": { "uk": "uv", "uk1": "uv2" }, "tags": [ "ut1", "ut2" ] }, "SYSTEM": { "properties": { "sk": "sv" }, "tags": [] } }, "additions": { "SYSTEM": { "properties": { "sk": "sv" }, "tags": [ "t1", "t2" ] } }, "deletions": { "USER": { "properties": { "uk": "uv" }, "tags": [ "ut1" ] } } } }, /** Dataset admin operation **/ { "time": 1456956659471, "entityId": { "namespace": "ns1", "dataset": "ds1", "entity": "DATASET" }, "user": "user1", "type": "CREATE", "payload": {} } ]
Implementation
The Audit log information will be published to CDAP Kafka server when `audit.publish.enabled` config parameter is set to true.
- Dataset admin operations can be published by DatasetOpExecutor service.
- Stream admin operations can be published by StreamAdmin class
- Dataset and stream access information can be published by piggy backing on lineage capturing code.
- Metadata changes can be published by DefaultMetadataStore class.
Note: Publishing of metadata updates to Kafka introduced by CDAP-3518 for Navigator integration will be deprecated in 3.4 and removed in 3.5. We will need to move Navigator app to use audit log instead of metadata change updates.
Â