Skip to content

The five-minute demo

Edition: Community and Enterprise

Four people pass one data fix through sealfix: alice asks for it, dave reviews the SQL, bea approves the business change, and audrey checks the trail. The value in the fix, a national ID, stays sealed the whole way.

Demo only

Fake data, throwaway passwords and a plain-LDAP directory. Never point the demo at real systems.

Start it

You need Docker and about 8 GB of free memory (the demo runs PostgreSQL, SQL Server and Oracle targets beside sealfix).

make demo-up

One command builds the images, starts the stack and waits for the fake data. The first run takes a few minutes, and the Oracle target needs a minute or two to start. When it prints sealfix demo is up, open http://localhost:8080.

User Password Role
alice sealfix-demo Requester
dave sealfix-demo DBA reviewer
bea sealfix-demo Business approver
audrey sealfix-demo Auditor
adam sealfix-demo Administrator

Use a private browser window per person, or sign out between steps.

The scenario

sequenceDiagram
    autonumber
    actor A as alice (requester)
    participant S as sealfix
    participant X as Executor
    actor D as dave (DBA)
    actor B as bea (business)
    actor U as audrey (auditor)
    A->>S: Template + national ID
    S->>S: Checks, then seal the value
    S->>X: Dry run
    X-->>S: 1 row, plan, sample
    D->>S: Approve the SQL (sees no value)
    B->>S: Approve the change (sees ****1234)
    A->>S: Execute
    X->>X: Save before-image, run, compare counts, commit
    U->>S: Verify the audit chain

1. alice asks for a fix

Sign in as alice and open "New request".

  • Target: core-banking-pg. Ticket: CHG-1001. Why: "suspend a customer flagged by fraud".
  • SQL template, with no value in it:

    UPDATE customers SET status = :status WHERE national_id = :nid
    
  • Parameter kinds: status is text, nid is a national ID.

  • One row of values: status = suspended, and one of the IDs the seeder printed.

Submit it. The checks run, then the national ID is sealed: from here on the database holds ciphertext and a masked copy.

The new request form The new request form

Try it

Paste the national ID straight into the template instead of using :nid. Check C4 refuses it: a sensitive value never travels as SQL text.

2. dave reviews the SQL

Sign in as dave. The executor has already made a dry run on the target, inside a transaction it rolled back. dave sees the template, the rows per statement, the plan and the check results. He sees no value, not even masked. He approves.

What the DBA reviewer sees What the DBA reviewer sees

3. bea approves the business change

Sign in as bea. She sees what the change means: the national ID masked as ****1234, the reason and the ticket. She approves, and the request is ready to run.

What the business approver sees What the business approver sees

4. alice executes it

Back as alice, select "Execute on the target". In one transaction the executor saves the rows it will change (sealed again, for rollback), runs the statement and compares the row count with the dry run. On any difference it rolls back by itself.

From the executed request, alice can ask for a rollback: a new request built from the sealed before-image, with its own dry run and the same approvals.

5. audrey checks the trail

Sign in as audrey. The audit log shows every step: who asked, who approved, what ran and how many rows changed, with the values masked. The page recomputes every hash each time it loads, and "Hash chain intact" confirms nothing was edited or removed.

Start it with nothing set up

make demo-up-fresh starts the same stack with no directory, no targets and no roles. Sign in as the bootstrap administrator at http://localhost:8080/login/local and walk the setup wizard yourself.

Stop it

make demo-down