Detection rules › Kusto

1Password - Vault export post account creation

Severity
medium
Time window
14d
Group by
userUuid
Source
github.com/Azure/Azure-Sentinel

This will alert when a successful vault export has occurred within 14 days of a new account being created within 1Password. Ref: https://1password.com/ Ref: https://github.com/securehats/

MITRE ATT&CK coverage

TacticTechniques
Persistence
Credential Access

Telemetry coverage

Rule body

id: 969e2e5c-9cc6-423c-a3de-514f7ad75fe7
name: 1Password - Vault export post account creation
version: 1.0.0
kind: Scheduled
description: |-
  This will alert when a successful vault export has occurred within 14 days of a new account being created within 1Password.

  Ref: https://1password.com/
  Ref: https://github.com/securehats/
severity: Medium
requiredDataConnectors:
  - connectorId: 1Password
    dataTypes:
      - OnePasswordEventLogs_CL
queryFrequency: 1h
queryPeriod: 14d
triggerOperator: gt
triggerThreshold: 0
tactics:
- CredentialAccess
- Persistence
relevantTechniques:
- T1555
- T1136
query: |-
  let ruleFrequency = 1h;
  let lookback = 14d;
  let onePasswordUserCreationCheck =
      OnePasswordEventLogs_CL
      | where TimeGenerated between (ago(lookback) .. ago(now() - ago(ruleFrequency)))
      | extend creationActivityFound = iff(action == "activate" and object_type == "user", bool(1), bool(0))
  ;
  OnePasswordEventLogs_CL
  | where action == "export" and object_type == "vault"
  | extend userUuid = tostring(actor_details.uuid)
  | join (
      onePasswordUserCreationCheck
      | where creationActivityFound == true
      | extend userUuid = tostring(object_details.uuid)
      )
      on $left.userUuid == $right.userUuid
  | extend
      TargetUsername = object_details1.email
      , SrcIpAddr = session1.ip_address
entityMappings:
- entityType: Account
  fieldMappings:
  - identifier: FullName
    columnName: TargetUsername
- entityType: IP
  fieldMappings:
  - identifier: Address
    columnName: SrcIpAddr
suppressionEnabled: false
incidentConfiguration:
  createIncident: true
  groupingConfiguration:
    enabled: true
    reopenClosedIncident: false
    lookbackDuration: 1h
    matchingMethod: AllEntities
suppressionDuration: 5h
eventGroupingSettings:
  aggregationKind: SingleAlert

Stages and Predicates

Parameters

let ruleFrequency = 1h;
let lookback = 14d;

Let binding: onePasswordUserCreationCheck used in Stage 4

let onePasswordUserCreationCheck = OnePasswordEventLogs_CL
    | where TimeGenerated between (ago(lookback) .. ago(now() - ago(ruleFrequency)))
    | extend creationActivityFound = iff(action == "activate" and object_type == "user", bool(1), bool(0));

Stage 1: source

OnePasswordEventLogs_CL

Stage 2: where

| where action == "export" and object_type == "vault"

Stage 3: extend

| extend userUuid = tostring(actor_details.uuid)

Stage 4: join

| join (
    onePasswordUserCreationCheck
    | where creationActivityFound == true
    | extend userUuid = tostring(object_details.uuid)
    )
    on $left.userUuid == $right.userUuid

Stage 5: extend

| extend
    TargetUsername = object_details1.email
    , SrcIpAddr = session1.ip_address

Indicators

These rows show field, operator, and value matches.

Output fields

These fields are emitted when the rule matches.

FieldSource
userUuidextend
SrcIpAddrextend
TargetUsernameextend