|
1 | | -# GCP filter, version 2.1.2 |
2 | | -# |
| 1 | +# GCP filter, version 2.2.0 |
| 2 | +# |
3 | 3 | # Documentations |
4 | 4 | # 1- https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry |
| 5 | +# 2- https://cloud.google.com/logging/docs/audit (protoPayload / AuditLog) |
5 | 6 |
|
6 | 7 | pipeline: |
7 | 8 | - dataTypes: |
@@ -251,6 +252,75 @@ pipeline: |
251 | 252 | - log.resource.type |
252 | 253 | to: log.resourceType |
253 | 254 |
|
| 255 | + # .......................................................................# |
| 256 | + # Renaming protoPayload fields (Cloud Audit Logs — AuditLog message) |
| 257 | + # .......................................................................# |
| 258 | + # NOTE: log.protoPayload.@type is NOT renamed here. The engine treats |
| 259 | + # paths containing '@' as complex and the rename plugin errors with |
| 260 | + # "cannot delete value from a complex path". The whole log.protoPayload |
| 261 | + # subtree is dropped in the final delete step, so the field is cleaned |
| 262 | + # up implicitly. We use log.protoPayloadMethodName (always present in |
| 263 | + # AuditLog) as the discriminator for protoPayload-derived actionResult. |
| 264 | + - rename: |
| 265 | + from: |
| 266 | + - log.protoPayload.authenticationInfo.principalEmail |
| 267 | + to: origin.user |
| 268 | + |
| 269 | + - rename: |
| 270 | + from: |
| 271 | + - log.protoPayload.authenticationInfo.principalSubject |
| 272 | + to: log.protoPayloadPrincipalSubject |
| 273 | + |
| 274 | + - rename: |
| 275 | + from: |
| 276 | + - log.protoPayload.authenticationInfo.oauthInfo.oauthClientId |
| 277 | + to: log.protoPayloadOauthClientId |
| 278 | + |
| 279 | + - rename: |
| 280 | + from: |
| 281 | + - log.protoPayload.requestMetadata.callerIp |
| 282 | + to: origin.ip |
| 283 | + |
| 284 | + - rename: |
| 285 | + from: |
| 286 | + - log.protoPayload.requestMetadata.callerSuppliedUserAgent |
| 287 | + to: log.httpUserAgent |
| 288 | + |
| 289 | + - rename: |
| 290 | + from: |
| 291 | + - log.protoPayload.methodName |
| 292 | + to: log.protoPayloadMethodName |
| 293 | + |
| 294 | + - rename: |
| 295 | + from: |
| 296 | + - log.protoPayload.serviceName |
| 297 | + to: log.protoPayloadServiceName |
| 298 | + |
| 299 | + - rename: |
| 300 | + from: |
| 301 | + - log.protoPayload.resourceName |
| 302 | + to: log.protoPayloadResourceName |
| 303 | + |
| 304 | + - rename: |
| 305 | + from: |
| 306 | + - log.protoPayload.resourceLocation.currentLocations |
| 307 | + to: log.protoPayloadResourceLocation |
| 308 | + |
| 309 | + - rename: |
| 310 | + from: |
| 311 | + - log.protoPayload.authorizationInfo |
| 312 | + to: log.protoPayloadAuthorizationInfo |
| 313 | + |
| 314 | + - rename: |
| 315 | + from: |
| 316 | + - log.protoPayload.status.code |
| 317 | + to: log.protoPayloadStatusCode |
| 318 | + |
| 319 | + - rename: |
| 320 | + from: |
| 321 | + - log.protoPayload.status.message |
| 322 | + to: log.protoPayloadStatusMessage |
| 323 | + |
254 | 324 | # .......................................................................# |
255 | 325 | # Renaming operation field |
256 | 326 | # .......................................................................# |
@@ -303,6 +373,11 @@ pipeline: |
303 | 373 | - statusCode |
304 | 374 | to: int |
305 | 375 |
|
| 376 | + - cast: |
| 377 | + fields: |
| 378 | + - log.protoPayloadStatusCode |
| 379 | + to: int |
| 380 | + |
306 | 381 | # Adding severity field based on log.severity |
307 | 382 | - add: |
308 | 383 | function: "string" |
@@ -383,6 +458,34 @@ pipeline: |
383 | 458 | value: "denied" |
384 | 459 | where: equals("log.jsonPayloadEnforcedEdgeSecurityPolicyOutcome", "DENY") |
385 | 460 |
|
| 461 | + # Adding actionResult for Cloud Audit Logs (protoPayload): |
| 462 | + # In GCP AuditLog, status.code follows google.rpc.Code — 0/absent = OK, |
| 463 | + # any non-zero code = error. We only apply this when the event is an |
| 464 | + # AuditLog (log.protoPayloadMethodName is always present in AuditLog; |
| 465 | + # used as discriminator since log.protoPayload.@type can't be renamed |
| 466 | + # due to the '@' character) so non-audit logs keep their existing |
| 467 | + # actionResult derivation. |
| 468 | + - add: |
| 469 | + function: "string" |
| 470 | + params: |
| 471 | + key: actionResult |
| 472 | + value: "success" |
| 473 | + where: 'exists("log.protoPayloadMethodName") && !exists("log.protoPayloadStatusCode")' |
| 474 | + |
| 475 | + - add: |
| 476 | + function: "string" |
| 477 | + params: |
| 478 | + key: actionResult |
| 479 | + value: "success" |
| 480 | + where: 'exists("log.protoPayloadMethodName") && equals("log.protoPayloadStatusCode", 0)' |
| 481 | + |
| 482 | + - add: |
| 483 | + function: "string" |
| 484 | + params: |
| 485 | + key: actionResult |
| 486 | + value: "failure" |
| 487 | + where: 'exists("log.protoPayloadMethodName") && greaterThan("log.protoPayloadStatusCode", 0)' |
| 488 | + |
386 | 489 | # Adding geolocation to origin.ip |
387 | 490 | - dynamic: |
388 | 491 | plugin: com.utmstack.geolocation |
|
0 commit comments