| # Audit plugin for Gerrit |
| |
| Plug into the Gerrit Code Review audit extension and format and forward all |
| the events to an [SLF4J appender](https://www.slf4j.org), the same logging |
| system used internally for the generation of all logs.. |
| |
| ## How to configure logging? |
| |
| Audit events are by default stored into the Gerrit error_log under the appender |
| `com.googlesource.gerrit.plugins.auditsl4j.LoggerAudit`. However, it is possible |
| to generate a separate audit file and having the audit records formatted into |
| CSV or JSON. |
| |
| For more details, see the [configuration guide](src/main/resources/Documentation/config.md) |
| in the plugin. |
| |
| ## Why auditing events on Gerrit? |
| |
| Audits leave an immutable trace of what happened on Gerrit and allows to answer |
| the question "who did what and when?". |
| |
| When aggregated by time, project or user, can give an overall figure on how much |
| the system is utilized and allow to make a better planning of the hardware resources allocation |
| and planning the downtimes to reduce the impact on the people and projects. |
| |
| ## Is this a duplicate of Gerrit stream events? |
| |
| Gerrit stream events are triggered on Git-related operations and reviews, but do |
| not cover most of the actions that happen on Gerrit and do not include all the system |
| information that is typically needed for audit-trail purposes. |
| |
| Furthermore, stream events are designed to be consumed in near-real-time while audits, |
| are typically archived and consumed off-line. |
| |
| ## What the audit events look like? |
| |
| The format of Gerrit audits changes across the different releases because they reflect |
| the internal representation of the Java objects in memory. |
| |
| They share an overall basic structure: |
| |
| - type: Audit java class |
| - event: Audit event |
| - session_id: unique identifier of the user's session |
| - who: user that generated the event |
| - account_id: user unique id |
| - access_path: how the user accessed the system |
| - when: epoch time-stamp of the event |
| - what: action performed |
| - result: result of the action |
| - time_at_start: epoch time-stamp of when the action started |
| - elapsed: how long the action lasted (msec) |
| - uuid: audit event UUID |
| |
| Example audit of a login from a Git client over SSH: |
| ```json |
| { |
| "type": "SshAuditEvent", |
| "event": { |
| "session_id": "0261c43e", |
| "who": { |
| "account_id": { |
| "id": 1011575 |
| }, |
| "access_path": "GIT", |
| "last_login_external_id_property_key": {} |
| }, |
| "when": 1539561891898, |
| "what": "LOGOUT", |
| "params": {}, |
| "result": "0", |
| "time_at_start": 1539561891898, |
| "elapsed": 0, |
| "uuid": { |
| "uuid": "audit:f135cb10-59be-4087-a9e0-571680b93a59" |
| } |
| } |
| } |
| ``` |
| |
| Example audit of a Gerrit changes query over SSH: |
| ```json |
| { |
| "type": "SshAuditEvent", |
| "event": { |
| "session_id": "22688824", |
| "who": { |
| "account_id": { |
| "id": 1011203 |
| }, |
| "access_path": "SSH_COMMAND", |
| "last_login_external_id_property_key": {} |
| }, |
| "when": 1539561891503, |
| "what": "gerrit.query.--format.json.--current-patch-set.project:mycompany/myproject commit:798b22fcf3614e8575e0ef23019a9706b8acebcc NOT is:draft", |
| "params": {}, |
| "result": "0", |
| "time_at_start": 1539561891503, |
| "elapsed": 3, |
| "uuid": { |
| "uuid": "audit:171a9b6f-327a-40a2-9b66-c47a39eba68c" |
| } |
| } |
| } |
| ``` |
| |
| ## Import old logs |
| |
| The makes available an ssh command to transform `http_logs` and `ssh_logs` into Audit Logs: |
| |
| ```bash |
| ssh -p 29418 admin@localhost audit-sl4j transform --from 2019-01-23 --until 2019-01-24 |
| ``` |