1Password Queries#
These queries report the vault grants recorded in the newest ingested snapshot
for each account. A
principal reaches a vault directly or through a group. Each grant is its own
CAN_ACCESS relationship, so the queries follow MEMBER_OF zero or one hops
to include both paths and report which one applies. permissions holds the
granted 1Password permission names. manage_vault and group ownership don’t
imply read_items, and account state or 1Password policies can further limit
effective access.
Find Who Can Reveal Passwords in Each Vault#
MATCH (p)-[:MEMBER_OF*0..1]->(holder)-[grant:CAN_ACCESS]->(v:OnePasswordVault)
WHERE (p:OnePasswordUser OR p:OnePasswordServiceAccount)
AND 'reveal_item_password' IN grant.permissions
RETURN v.id AS vault, coalesce(p.email, p.name, p.id) AS principal,
CASE WHEN p = holder THEN 'direct' ELSE holder.name END AS via
ORDER BY vault, principal
Find Inactive Users Who Still Hold Vault Access#
MATCH (u:OnePasswordUser)-[:MEMBER_OF*0..1]->(holder)-[grant:CAN_ACCESS]->(v:OnePasswordVault)
WHERE u.state IN ['SUSPENDED', 'PROVISION_SUSPENDED', 'DELETED']
RETURN u.email, u.state, v.id AS vault,
CASE WHEN u = holder THEN 'direct' ELSE holder.name END AS via,
grant.permissions
Find Direct Grants That Bypass Groups#
MATCH (p)-[grant:CAN_ACCESS]->(v:OnePasswordVault)
WHERE p:OnePasswordUser OR p:OnePasswordServiceAccount
RETURN coalesce(p.email, p.name, p.id) AS principal,
CASE WHEN p:OnePasswordServiceAccount THEN 'service account' ELSE 'user' END AS kind,
v.id AS vault, grant.permissions
Find Service Accounts That Can Read Items#
MATCH (sa:OnePasswordServiceAccount)-[:MEMBER_OF*0..1]->(holder)-[grant:CAN_ACCESS]->(v:OnePasswordVault)
WHERE 'read_items' IN grant.permissions
RETURN coalesce(sa.name, sa.id) AS service_account, v.id AS vault,
CASE WHEN sa = holder THEN 'direct' ELSE holder.name END AS via
Rank Vaults by How Many People Can Read Them#
MATCH (u:OnePasswordUser)-[:MEMBER_OF*0..1]->()-[grant:CAN_ACCESS]->(v:OnePasswordVault)
WHERE 'read_items' IN grant.permissions
RETURN v.id AS vault, v.name AS name, count(DISTINCT u) AS readers
ORDER BY readers DESC
Find Credentials by Category and Who Can Read Them#
MATCH (v:OnePasswordVault)-[:CONTAINS]->(item:OnePasswordItem)
WHERE item.category IN ['API_CREDENTIAL', 'SSH_KEY']
AND coalesce(item.state, '') <> 'ARCHIVED'
MATCH (p)-[:MEMBER_OF*0..1]->()-[grant:CAN_ACCESS]->(v)
WHERE (p:OnePasswordUser OR p:OnePasswordServiceAccount)
AND 'read_items' IN grant.permissions
RETURN item.category, v.id AS vault, count(DISTINCT item) AS items,
collect(DISTINCT coalesce(p.email, p.name, p.id)) AS readers
Find Accounts With a Stale Snapshot#
MATCH (a:OnePasswordAccount)
WHERE duration.inDays(datetime(a.snapshot_collected_at), datetime()).days >= 2
RETURN a.id, a.snapshot_collected_at, a.collector_version