Detection rules › Panther
Panther rules: onepassword
1Password Login From CrowdStrike Unmanaged Device
#Detects 1Password Logins from IP addresses not found in CrowdStrike''s AIP list. May indicate unmanaged device being used, or faulty CrowdStrike Sensor.
Telemetry coverage
| Platform | Record / event type |
|---|---|
| 1Password | credentials_ok |
Detection logic
def rule(_):
return True
def title(event):
return (
"1Password Login for "
f"[{event.deep_get('target_user', 'email', default = '<email_not_found>')}]"
" from unmanaged IP Address."
)
Rule specification
AnalysisType: scheduled_rule
Description: Detects 1Password Logins from IP addresses not found in CrowdStrike''s AIP list. May indicate unmanaged device being used, or faulty CrowdStrike Sensor.
DisplayName: "1Password Login From CrowdStrike Unmanaged Device"
Enabled: false
Filename: onepassword_login_from_crowdstrike_unmanaged_device.py
Reference: https://www.crowdstrike.com/wp-content/uploads/2023/05/crowdstrike-falcon-device-control-data-sheet.pdf
Severity: Medium
DedupPeriodMinutes: 60
RuleID: "OnePassword.Login.From.CrowdStrike.Unmanaged.Device"
Threshold: 1
ScheduledQueries:
- 1Password Login From CrowdStrike Unmanaged Device Query
Tags:
- Multi-Table Query
Stages and Predicates
Rule logic
This rule alerts on rows returned by its scheduled query 1Password Login From CrowdStrike Unmanaged Device Query; its Python module (Detection logic above) shapes the alert rather than filtering.
Output fields
Fields the rule emits when it matches, drawn from the rule's alert_context.
| Field | Source |
|---|---|
email | target_user.email |
Worked example
A sample event from the rule's unit tests that triggers a match.Sample Test Event
{
"category": "success",
"client": {
"app_name": "1Password Browser Extension",
"app_version": "12345",
"ip_address": "1.2.3.4",
"os_name": "MacOSX",
"os_version": "10.15.7",
"platform_name": "Chrome",
"platform_version": "108.0.0.0"
},
"country": "US",
"session_uuid": "C33SI4DELBE6RJ5QP7GKXBDUAY",
"target_user": {
"email": "homer.simpson@springfield.com",
"name": "Homer Simpson",
"uuid": "ABCDEFGHIJKLMNOP"
},
"timestamp": "2023-01-09 21:25:29.783",
"type": "credentials_ok",
"uuid": "L7L2AXBWKZDOXDQTUVGW4STMSQ"
}
BETA - Sensitive 1Password Item Accessed
#Alerts when a user defined list of sensitive items in 1Password is accessed
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Credential Access |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| 1Password | any: Item usage (catch-all) |
Detection logic
"""
This rule requires the use of the Lookup Table feature currently in Beta in Panther, 1Password
logs reference items by their UUID without human-friendly titles. The instructions to create a
lookup table to do this translation can be found at :
https://docs.runpanther.io/guides/using-lookup-tables-1password-uuids
The steps detailed in that document are required for this rule to function as intended.
"""
# Add the human-readable names of 1Password items you want to monitor
SENSITIVE_ITEM_WATCHLIST = ["demo_item"]
def rule(event):
return (
event.deep_get("p_enrichment", "1Password Translation", "item_uuid", "title")
in SENSITIVE_ITEM_WATCHLIST
)
def title(event):
return f"A Sensitive 1Password Item was Accessed by user {event.deep_get('user', 'name')}"
def alert_context(event):
context = {
"user": event.deep_get("user", "name"),
"item_name": event.deep_get("p_enrichment", "1Password Translation", "item_uuid", "title"),
"client": event.deep_get("client", "app_name"),
"ip_address": event.udm("source_ip"),
"event_time": event.get("timestamp"),
}
return context
Rule specification
AnalysisType: rule
Filename: onepassword_lut_sensitive_item_access.py
RuleID: "OnePassword.Lut.Sensitive.Item"
DedupPeriodMinutes: 30
DisplayName: "BETA - Sensitive 1Password Item Accessed"
Enabled: false
LogTypes:
- OnePassword.ItemUsage
Reference: https://support.1password.com/1password-com-items/
Severity: Low
Description: Alerts when a user defined list of sensitive items in 1Password is accessed
SummaryAttributes:
- p_any_ip_addresses
- p_any_emails
Tags:
- Configuration Required
- 1Password
- Lookup Table
- Credential Access:Unsecured Credentials
Status: Experimental
Reports:
MITRE ATT&CK:
- TA0006:T1552
Stages and Predicates
Fires on OnePassword.ItemUsage events when the condition below holds.
Condition
p_enrichment.1Password Translation.item_uuid.titleis one ofdemo_item
Indicators
These rows show field, operator, and value matches.
Output fields
Fields the rule emits when it matches, drawn from the rule's alert_context.
| Field | Source |
|---|---|
user | user.name |
item_name | p_enrichment.1Password Translation.item_uuid.title |
client | client.app_name |
ip_address | source_ip |
event_time | timestamp |
Worked example
A sample event from the rule's unit tests that triggers a match.Sample Test Event
{
"client": {
"app_name": "1Password Browser Extension",
"app_version": "20195",
"ip_address": "1.1.1.1",
"os_name": "MacOSX",
"os_version": "10.15.7",
"platform_name": "Chrome",
"platform_version": "98.0.4758.102"
},
"item_uuid": "1234",
"p_enrichment": {
"1Password Translation": {
"item_uuid": {
"title": "demo_item",
"updatedAt": "2022-02-14 17:44:50.000000000",
"uuid": "12344321"
}
}
},
"p_log_type": "OnePassword.ItemUsage",
"timestamp": "2022-02-23 22:11:50.591",
"user": {
"email": "homer@springfield.gov",
"name": "Homer Simpson",
"uuid": "12345"
},
"uuid": "12345",
"vault_uuid": "54321"
}
Configuration Required - Sensitive 1Password Item Accessed
#Alerts when a user defined list of sensitive items in 1Password is accessed
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Credential Access |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| 1Password | any: Item usage (catch-all) |
Detection logic
"""
This rule detects access to high sensitivity items in your 1Password account. 1Password references
these items by their UUID so the SENSITIVE_ITEM_WATCHLIST below allows for the mapping of UUID to
meaningful name.
There is an alternative method for creating this rule that uses Panther's lookup table feature,
(currently in beta). That rule can be found in the 1Password detection pack with the name
BETA - Sensitive 1Password Item Accessed (onepassword_lut_sensitive_item_access.py)
"""
SENSITIVE_ITEM_WATCHLIST = {"ecd1d435c26440dc930ddfbbef201a11": "demo_item"}
def rule(event):
return event.get("item_uuid") in SENSITIVE_ITEM_WATCHLIST.keys()
def title(event):
return f"A Sensitive 1Password Item was Accessed by user {event.deep_get('user', 'name')}"
def alert_context(event):
context = {
"user": event.deep_get("user", "name"),
"item_name": event.deep_get("p_enrichment", "1Password Translation", "item_uuid", "title"),
"client": event.deep_get("client", "app_name"),
"ip_address": event.udm("source_ip"),
"event_time": event.get("timestamp"),
}
return context
Rule specification
AnalysisType: rule
Filename: onepassword_sensitive_item_access.py
RuleID: "OnePassword.Sensitive.Item"
DedupPeriodMinutes: 30
DisplayName: "Configuration Required - Sensitive 1Password Item Accessed"
Enabled: false
LogTypes:
- OnePassword.ItemUsage
Reference: https://support.1password.com/1password-com-items/
Severity: Low
Description: Alerts when a user defined list of sensitive items in 1Password is accessed
SummaryAttributes:
- p_any_ip_addresses
- p_any_emails
Tags:
- Configuration Required
- 1Password
- Credential Access:Unsecured Credentials
Reports:
MITRE ATT&CK:
- TA0006:T1552
Stages and Predicates
Fires on OnePassword.ItemUsage events when the condition below holds.
Condition
item_uuidis one ofecd1d435c26440dc930ddfbbef201a11
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
item_uuid | in |
| field:"item_uuid" kind:in value:"ecd1d435c26440dc930ddfbbef201a11" |
Output fields
Fields the rule emits when it matches, drawn from the rule's alert_context.
| Field | Source |
|---|---|
user | user.name |
item_name | p_enrichment.1Password Translation.item_uuid.title |
client | client.app_name |
ip_address | source_ip |
event_time | timestamp |
Worked example
A sample event from the rule's unit tests that triggers a match.Sample Test Event
{
"client": {
"app_name": "1Password Browser Extension",
"app_version": "20195",
"ip_address": "1.1.1.1.1",
"os_name": "MacOSX",
"os_version": "10.15.7",
"platform_name": "Chrome",
"platform_version": "4.0.4.102"
},
"item_uuid": "ecd1d435c26440dc930ddfbbef201a11",
"p_log_type": "OnePassword.ItemUsage",
"timestamp": "2022-02-23 20:27:17.071",
"used_version": 2,
"user": {
"email": "homer@springfield.gov",
"name": "Homer Simpson",
"uuid": "2222222"
},
"uuid": "ecd1d435c26440dc930ddfbbef201a11",
"vault_uuid": "111111"
}
Unusual 1Password Client Detected
#Detects when unusual or undesirable 1Password clients access your 1Password account
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Credential Access |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| 1Password | any: Sign-in attempt (catch-all) |
Detection logic
"""
This rule detects unusual or unauthorized clients connecting to your 1Password account.
In order to get a baseline of what clients are being used in your environment run the following
query in Data Explorer:
select distinct client:app_name from panther_logs.public.onepassword_signinattempt
The client_allowlist variable is a collection of standard 1Password clients.
If this differs from your orginization's needs this rule can be edited to suit your environment
"""
def rule(event):
client_allowlist = [
"1Password CLI",
"1Password for Web",
"1Password for Mac",
"1Password SCIM Bridge", # Used for automated account provisioning
"1Password for Windows",
"1Password for iOS",
"1Password Browser Extension",
"1Password for Android",
"1Password for Linux",
"1Password SDK",
]
app_name = event.deep_get("client", "app_name")
if not app_name:
return False
return app_name not in client_allowlist
def title(event):
return f"Unusual 1Password client - {event.deep_get('client', 'app_name')} detected"
def alert_context(event):
context = {}
context["user"] = event.deep_get("target_user", "name", default="UNKNOWN_USER")
context["user_email"] = event.udm("actor_user")
context["ip_address"] = event.udm("source_ip")
context["client"] = event.deep_get("client", "app_name", default="UNKNOWN_CLIENT")
context["OS"] = event.deep_get("client", "os_name", default="UNKNOWN_OS")
context["login_result"] = event.get("category")
context["time_seen"] = event.get("timestamp")
return context
Rule specification
AnalysisType: rule
Filename: onepassword_unusual_client.py
RuleID: "OnePassword.Unusual.Client"
DedupPeriodMinutes: 120
DisplayName: "Unusual 1Password Client Detected"
Enabled: true
LogTypes:
- OnePassword.SignInAttempt
Severity: Medium
Description: Detects when unusual or undesirable 1Password clients access your 1Password account
Reference: https://support.1password.com/category/accounts/
Tags:
- 1Password
- Credential Access:Credentials from Password Stores
Reports:
MITRE ATT&CK:
- TA0006:T1555
SummaryAttributes:
- p_any_ip_addresses
- p_any_emails
Stages and Predicates
Fires on OnePassword.SignInAttempt events when all of the conditions below hold.
Condition
client.app_nameis presentclient.app_nameis not one of1Password CLI,1Password for Web,1Password for Mac,1Password SCIM Bridge,1Password for Windows
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
client.app_name | in | 1Password Browser Extension, 1Password CLI, 1Password SCIM Bridge, 1Password SDK, 1Password for Android, 1Password for Linux, 1Password for Mac, 1Password for Web, 1Password for Windows, 1Password for iOS | excludes:client.app_name |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
client.app_name | is_not_null | field:"client.app_name" kind:is_not_null |
Output fields
Fields the rule emits when it matches, drawn from the rule's alert_context.
| Field | Source |
|---|---|
app_name | client.app_name |
Worked example
A sample event from the rule's unit tests that triggers a match.Sample Test Event
{
"category": "success",
"client": {
"app_name": "Bartco 1Password Manager",
"app_version": "70902005",
"ip_address": "1.1.1.1",
"os_name": "MacOSX",
"os_version": "11.6.1",
"platform_name": "US - C02FR0H8MD6P",
"platform_version": "MacBookPro16,1"
},
"country": "US",
"p_log_type": "OnePassword.SignInAttempt",
"session_uuid": "12345",
"target_user": {
"email": "homer@springfield.gov",
"name": "Homer Simpson",
"uuid": "1234"
},
"timestamp": "2021-12-15 18:02:23",
"type": "credentials_ok",
"uuid": "1234"
}