Runbooks/Secret Redaction

Password & Secret Redaction

This document covers how IdentityMesh handles password-type attributes that flow through the mesh — how they are redacted at storage, in the REST API, and in the Admin UI, while remaining change-detectable so exports and delta sync keep working.

This is not the same thing as connector-credential encryption. Secret-store encryption (DPAPI / Key Vault / Vault) protects the credentials IdentityMesh uses to authenticate to source and target systems — see secrets-and-dpapi.md. This document is about password attribute values that move through the mesh as identity data (for example a user’s unicodePwd on the way from a source to Active Directory).

TL;DR

What is protected

Redaction applies to identity attribute values that are password material flowing through the mesh, matched by attribute name:

These are the values that would otherwise be written into the mesh object / management-space store, echoed back by the mesh-object API, and rendered in preview and audit surfaces in the Admin UI.

Connector credentials — LDAP bind passwords, SQL passwords, OAuth client secrets, API keys — are a different concern and are not what this document covers. Those are held as encrypted secret-store blobs and referenced by a secret://… ref; see secrets-and-dpapi.md and the key-vault runbooks.

How it behaves

At storage

When a password-type attribute value is stored, the clear-text value is replaced with the token ***REDACTED***. The clear text is not written to the database.

In the REST API

Reading a mesh object through the API returns the same ***REDACTED*** token in place of any password-type attribute value. API consumers — including the preview and audit views — never receive clear text.

In the Admin UI

Every surface that displays attribute values (object detail, sync preview, audit / run history) renders the redacted token. An operator inspecting a person object sees ***REDACTED*** for the password attribute, not the value.

Change detection via ContentHash

Redacting the stored value would normally break change detection — the engine could no longer tell whether a password had changed, so it would either never export an update or churn on every run. To avoid that, a separate SHA-256 ContentHash is computed over the real value at the point it enters the mesh and stored next to the redacted placeholder.

The engine’s delta / export logic compares ContentHash values rather than the (redacted) stored value. A changed password produces a different hash, which drives a normal export; an unchanged password produces the same hash and is correctly skipped. Exports therefore still carry the correct password to the target even though the value persisted in the mesh is ***REDACTED***.

Why it matters for compliance

This complements, rather than replaces, database-level encryption (TDE, see database-tde.md) and connector-secret encryption. TDE protects the whole database file; secret-store encryption protects connector credentials; redaction ensures the synced password attribute is never clear text in the first place.

Upgrading from an earlier release

A database that was in use before redaction was introduced may still hold clear-text password values in export snapshots written by the earlier release. The upgrade does not rewrite those rows. Clean them up once, after the upgrade, with the script the installer places in the sql folder. It only touches snapshot values whose attribute name contains password or pwd, leaves the change-detection hash alone so nothing is re-exported, and is safe to run again.

cd "C:\Program Files\IdentityMesh\sql"
sqlcmd -S <server\instance> -d IdentityMesh -E -i Manual_RedactSecretSnapshots.sql

The script prints how many values it redacted. Run it a second time to confirm it reports zero, then do the checks under Verifying redaction. The services can stay running while it executes.

New deployments start with redaction already in force, so no cleanup is required.

Verifying redaction

An operator can confirm redaction is active without needing any special tooling:

  1. Via the Admin UI. Open a mesh object that carries a password-type attribute (for example an Active Directory person with unicodePwd). Confirm the attribute value renders as ***REDACTED*** in the object detail, sync preview, and audit views.
  2. Via the mesh-object API. Read the same object through the REST API and confirm the password-type attribute comes back as ***REDACTED*** rather than a clear-text value.

If either surface ever shows a clear-text password value, redaction is not being applied for that attribute — treat it as a security issue and check that the engine is on the release that introduced redaction, or a later one.