T Techclick ← All lessons
HashiCorp Vault · Evidence desk · Interactive lesson

Is Vault sealed? — first tool + proof field

02:10. Slack: “Is Vault sealed? Why is there no secret?” Finance CI is red. Someone already asked for Shamir shares. A green tile is not proof. This desk is five official tools — vault status (Sealed / HA Mode), the audit log, the ACL policy, the auth method, the lease — each mapped to one ticket, one first command, and one field you paste before you unseal, widen a policy, or mint a root token.

~20 min read · L2 primary · Quiz at end · Blog 1 · Factory

⚡ Quick Answer

Night-shift HashiCorp Vault desk: is it sealed, or why is there no secret? Five tickets with first tool and one official proof field — vault status, audit log, ACL policy, auth method, lease.

After this page you can

Quick answer (say this out loud)

vault status answers “is this node sealed, and is it active or standby?” Audit answers “who hit which path, and did Vault return permission denied?” Policy answers “does this ACL even grant read on secret/data/…?” Auth method answers “is the mount the job uses even enabled?” Lease answers “is this dynamic secret or service token still inside its TTL?” Unsealed is not a secret. An empty audit list is not a name. A KV payload is not a lease.

1. Why “is it sealed?” is five questions

Concept: operators collapse five failures into one sentence. The node is sealed. The client is talking to a standby. The ACL never granted that path. The AppRole mount is missing. The lease expired ten minutes ago. Those are five first tools.

Path: write the failing identity, the path, and the UTC window. Then pick the tool that is allowed to answer the question. Do not open Shamir shares until Sealed is true.

Do: this page is the night-shift desk for proof. The factory taught the gates — unseal, token, ACL, namespace, leader. Here you learn the five official surfaces you actually open, in order, when someone asks you to prove Vault is working or to explain why there is no secret.

Hero · five tiles, one ticket
Night-shift operations desk with cluster health on a monitor
Notice: five tiles, not one “Vault dashboard.” You pick the tile that matches the question, then you quote one official field.
Interview line

If they say “prove Vault is working,” do not say “I opened the UI.” Say: “I prove the node with vault status Sealed and HA Mode, the paper trail with the audit request.path, the grant with policy capabilities, the login door with vault auth list Path, and the remaining life with lease expire_time.”

2. Mental model — five proof tools

Memorise five named objects before you type. Each tool is allowed to prove one thing. Over-claiming a field is how you reseal a healthy cluster at 02:00.

1 · vault status

CLI against the address in VAULT_ADDR. Official command output. Proves Sealed, HA Enabled, HA Mode (active / standby). Does not prove a policy, a reader, or a lease.

2 · Audit log

First vault audit list, then the device file (lab: file/). Proves one API hop: request.path + request.operation + auth.display_name + error. Does not prove seal state.

3 · ACL policy

CLI vault policy read or UI Policies → ACL Policies. Proves the named rule: path + capabilities. Deny-by-default. Does not prove the cluster is up.

4 · Auth method

CLI vault auth list or UI Access → Auth Methods. Proves the mount exists: Path + Type. Then the role. Does not prove the secret payload.

5 · Lease

CLI vault lease lookup or UI Access → Leases. Proves remaining life: expire_time, ttl, renewable. KV does not issue leases. Token TTL is vault token lookup.

Hard words, once

Sealed = root key not reconstructed; only unseal and status work. HA Mode = active holds the lock; standby forwards or returns 307. Audit device = file / syslog / socket. Capability = create, read, update, delete, list, deny, sudo. Lease = TTL metadata on a dynamic secret or service token.

Flow 1 · five tools, one question each
Write identity + path + UTC first · then pick the tool Is Vault sealed / why no secret? five questions, not one vault status This node up? Sealed · HA Mode exit 0 / 1 / 2 against VAULT_ADDR not a policy verdict Audit log Who hit which path? request.path display_name · error audit list → file/ not a seal field ACL policy Is the path granted? path + capabilities deny by default Policies → ACL not HA Mode Auth method Can they even login? Path + Type approle/ · token/ Access → Auth Methods not a KV version Lease Still inside TTL? expire_time · ttl renewable Access → Leases KV has no lease Sealed = true → stop. There is no policy or lease to chase on this node. Official: prior to unsealing, the only possible operations are unseal and status.

Read left → right. Each box is allowed one claim. If you cannot name the field, you are not proving — you are guessing.

Say this out loud

I prove the node, then the paper trail, then the ACL path, then the auth mount, then the lease. I do not unseal, widen secret/*, or mint a root token until I can quote the field that made me do it.

3. Decision flow — ticket → first tool

Flowchart first. Do not open a policy PR until a diamond says so.

Path · pick the branch before the menu
Decision diamond splitting a night ticket into five proof paths
Notice: the diamond is the ticket. The path is the tool. The field comes last. Do not reverse that order.
Flow 2 · first-tool diamond
Symptom first · tool second · field third What must we prove? Is the node even unsealed + active? “Vault is down” vault status Sealed · HA Mode 403 / no secret policy read path · capabilities Who read it? audit log path · display_name Login fails auth list Path · Type Creds died lease lookup expire_time · ttl Sealed = true → stop. Unseal (change-control). Then re-run status. HA Mode standby + writes fail → point VAULT_ADDR at the active node or VIP. Do not elect a leader for one app. Empty audit list → you cannot name a person. Enabling a device now only helps the next incident. Diamond = decision. Do not write a policy from the bottom box. status exit codes: 0 unsealed · 1 error · 2 sealed. Quote the table, not only the exit.

Read the diamond first. A 403 never starts with Shamir keys if Sealed is already false. A “who read payroll” ticket never starts on kv get. Expired DB creds never start on a reseal.

4. How to choose — first tool + proof field

Print this next to the on-call laptop. If you cannot recite the proof field, you are not ready to change anything.

If the ticket says…First tool (official)Proof fieldDo not open first
“Is Vault sealed?” / “Vault is down” / whole cluster silent vault status against the caller’s VAULT_ADDR Sealed + HA Enabled + HA Mode (active / standby). Exit 0 / 2. A policy PR, a raft election, Shamir shares on an already-unsealed node
One app 403 / “the secret is gone” and status is already unsealed vault token lookup then vault policy read <name> · UI Policies → ACL Policies HCL path + capabilities. On KV v2 the payload path is secret/data/<name>. Unseal, secret/* wildcard, a new root token
GRC: “who read this path last night?” vault audit list, then the device (file / syslog / socket) JSON request.path + request.operation + auth.display_name + auth.policies + error kv get (payload, not history)
Login fails / “AppRole is broken” / 403 on auth/approle/login vault auth list · UI Access → Auth Methods Path (e.g. approle/) + Type. Then the role token_ttl / policies. Disable the mount, mint root into CI
Dynamic creds / DB login died mid-job; cluster still answers vault lease lookup <lease_id> · UI Access → Leases expire_time + ttl + renewable + id Reseal, destroy the secrets engine
KV is not a lease (official)

The Key/Value backend does not issue leases, even when a response shows a lease duration. vault lease lookup will not explain a missing static KV secret. That ticket is policy, version, or namespace — or vault token lookup ttl if the token died. Source: Lease, renew, and revoke.

Audit availability (official)

Vault sends every audited request/response to all enabled devices and requires at least one of them to succeed. If every enabled device is down, Vault refuses the API call. That can look like “Vault is down” when the node is unsealed. HashiCorp recommends at least two devices. Source: Audit logging — Availability of audit devices.

5. Runbook Side A → B → C

Side A proves the node and that you can even investigate. Side B proves the identity door and the ACL. Side C proves remaining life and the paper trail. On a messy Sev-2, do them in this order until a field lights up.

Side A — Node: status + audit device

  1. Run vault status on the address the client uses

    Official: the status command prints whether Vault is sealed and whether HA mode is enabled, even when the node is sealed. Exit codes: 0 unsealed, 1 error, 2 sealed. Quote the table, not only the exit. Source: status — Command.

  2. Read Sealed, then HA Mode

    Sealed = false means the node is unsealed and ready to operate; true means you still need unseal. On an HA cluster also quote HA Enabled, HA Mode (active or standby), and HA Cluster. A standby that receives a write will forward (default) or return 307 to the active node’s api_addr if forwarding is off or the client sent X-Vault-No-Request-Forwarding. Source: status output fields; High availability mode (HA).

  3. If Sealed is true, stop the policy hunt

    Official seal concept: prior to unsealing, the only possible operations are to unseal Vault and check status. Shamir threshold or auto-unseal is change-control. Do not invent a policy bug on a sealed node.

  4. Confirm an audit device exists before you promise a name

    vault audit list (add -detailed for file_path and replication). Official example: Path file/, Type file. A new cluster starts with auditing disabled. Empty list → you cannot prove who read the secret; enabling a device now only helps the next call. Source: audit list; Audit logging.

Lab · vault status (fields from official command output)
vault-lab $ vault status
Key                     Value
---                     -----
Seal Type               shamir
Initialized             true
Sealed                  false
Total Shares            5
Threshold               3
Version                 1.17.2
Storage Type            raft
Cluster Name            vault-lab
HA Enabled              true
HA Mode                 active
Active Since            2026-08-15T18:48:04Z
Raft Committed Index    1842
Raft Applied Index      1842
What you say after Side A

This node is unsealed and active. I will not unseal again. Next I name the token’s policy — unless the ticket is “who,” in which case I open the audit device.

Side B — Identity door + ACL (auth method, policy)

  1. List auth methods before you blame AppRole

    vault auth list. Official columns: Path, Type, Description. Detailed view adds Default TTL, Max TTL, Token Type, Replication, Accessor. Auth methods must be enabled; the same type can be mounted at different paths. Login lives under that path (for example auth/approle/login). Source: auth list; Authentication.

  2. Lookup the token the job actually holds

    vault token lookup (self) or lookup by accessor. Quote policies, ttl, path (e.g. auth/approle/login), display_name, renewable, type. Do not lookup your personal token and call it the pipeline. Source: token lookup.

  3. Read the named ACL — path plus capabilities

    vault policy read finance-read or UI Policies → ACL Policies. Policies are deny-by-default. Quote the HCL path and capabilities list. On KV v2 the HTTP payload is secret/data/<name> even when the CLI is vault kv get secret/<name>. A policy written only on secret/finance/* does not grant the v2 data path. deny always wins. Generating database credentials is a GET → you grant read, not create. Source: Policies.

  4. If login itself fails, read the role, not Slack

    Example: vault read auth/approle/role/app-finance. Quote token_ttl, secret_id_ttl, and attached policies. Auth identities have leases too — you must reauthenticate after the lease, or renew with vault token renew. Source: Authentication — Auth leases; AppRole is one of the documented machine auth methods.

https://vault-lab.example.com:8200/ui/vault/policy/acl/finance-read
Training mock · not live

Policies / ACL Policies / finance-read

ACL policy · finance-read

finance-read
ACL
path "secret/data/finance/*" { capabilities = ["read"] } path "secret/metadata/finance/*" { capabilities = ["list"] }

Source: Vault docs — Policies (HCL path + capabilities, deny-by-default, KV v2 data path); Vault UI (authenticate, manage policies). Lab policy name only. Training mock · not live.

https://vault-lab.example.com:8200/ui/vault/access/methods
Training mock · not live

Access / Auth Methods

Enabled auth methods

PathTypeDescription
token/tokentoken based credentials
approle/approlen/a
kubernetes/kubernetesn/a
approle/
approle

Source: Vault docs — vault auth list example columns Path / Type / Description; Authentication (enable at a path). UI Access section for auth methods. Lab mounts only.

Side C — Remaining life + paper trail (lease, audit row)

  1. If the secret is dynamic, lookup the lease_id

    Official: every dynamic secret and every service token gets a lease. vault read returns lease_id. Then vault lease lookup <id>. Quote expire_time, id, issue_time, last_renewal, renewable, ttl. Renew with an increment from now, not from the old expiry, and inspect the new TTL — the backend may ignore your increment. Prefix revoke: vault lease revoke -prefix database/. UI: Access tab. Source: Lease, renew, and revoke; lease command.

  2. If the secret is KV, lookup the token TTL instead

    KV does not issue leases. A “secret expired” story on secret/finance/db is either a dead token (vault token lookupttl) or a version/path bug. Do not run lease lookup on a KV path and call it proof.

  3. If GRC asked who, read one audit JSON line

    Official schema: one JSON object per line. Quote type (request / response), time, auth.display_name, auth.policies, request.path, request.operation, and error when present. String values are HMAC-SHA256 by default — use /sys/audit-hash to match a known value. kv get is the payload, not the accessor history. Source: Audit logging; Audit log entry schema.

https://vault-lab.example.com:8200/ui/vault/access/leases
Training mock · not live

Access / Leases

Lease lookup

database/creds/readonly/27e1b9a1-27b8-83d9-9fe0-d99d786bdc83
2026-08-16T02:04:10Z
0s
2026-08-16T01:44:10Z
true

Source: Vault docs — lease command example fields expire_time, id, issue_time, last_renewal, renewable, ttl; “UI under the Access tab.” Lab lease id shape only. Training mock · not live.

Lab · one audit line (schema fields only; values hashed / fictional)
{
  "type": "response",
  "time": "2026-08-16T02:11:04Z",
  "auth": {
    "display_name": "approle-app-finance",
    "policies": ["default", "finance-read"],
    "token_type": "service"
  },
  "request": {
    "operation": "read",
    "path": "secret/data/hr/db"
  },
  "error": "1 error occurred:\n\t* permission denied\n\n"
}
Green success on each side

6. Five tickets as full stories

These five land every quarter. Memorise first tool + proof field. Times, IPs, and identities below are lab-only.

Journey · one amber hop is the ticket
Four glass panels for status, token, policy and audit
Notice: the close is a named official field on a timestamp, not a screenshot of a red CI banner.
TicketSymptomFirst toolProof field
HVED-01Slack: “Vault is down / is it sealed?”vault statusSealed + HA Mode
HVED-02CI 403; cluster already answersvault policy readpath + capabilities
HVED-03GRC: who read payroll?vault audit list → filerequest.path + auth.display_name
HVED-04Login fails; “AppRole is gone”vault auth listPath + Type
HVED-05DB creds died mid-jobvault lease lookupexpire_time + ttl
P1HVED-0102:10 ISTCaller: finance-ci

HVED-01 — Prove the node (vault status)

02:10 · P1. Pipeline banner: “Vault is down.” Last green build 19:40. No raft page yet. On-call wants three Shamir shares from the safe.

First tool: vault status on the job’s VAULT_ADDR, not on your laptop’s leftover 127.0.0.1:8200.

If Sealed = true: quote it, plus Unseal Progress / Unseal Nonce if present. This is the one ticket where unseal is the work — still change-control, still threshold. Do not hunt finance-read on a sealed node. Official: only unseal and status work until the root key is reconstructed.

If Sealed = false and HA Mode = active: the node can answer the API. Stop the unseal thread. The missing secret is now Side B or Side C.

If Sealed = false and HA Mode is standby (or the caller’s address is a follower IP): isolate — point clients at the active node or the HA VIP. Official HA: standbys forward by default, or 307 to api_addr. Do not force an election for one pipeline.

Trap

Do not trust a colleague’s vault status from a different address. The proof is the node the failing client hit. Exit 2 is sealed; exit 1 is “you never reached Vault.”

Close

I would paste Sealed=false and HA Mode=active (or the standby line) and refuse Shamir keys. Next command is token lookup / policy — not unseal.

P2HVED-0202:22 ISTCaller: finance-ci

HVED-02 — Prove the grant (ACL policy)

02:22 · P2. Status already shows unsealed + active. The job still 403s on a read. L1 drafted a policy that grants secret/*.

First tool: vault token lookup on the job token, then vault policy read of every name in policies. UI: Policies → ACL Policies.

Proof field: HCL path + capabilities. Lab: secret/data/finance/* read only. A write, or a read of secret/data/hr/db, or a KV v1-shaped /v1/secret/finance/db on a v2 mount, is the ACL (or the API path) doing its job. Least privilege is not an outage.

Lab · policy read
vault-lab $ vault policy read finance-read
path "secret/data/finance/*" {
  capabilities = ["read"]
}
path "secret/metadata/finance/*" {
  capabilities = ["list"]
}
Close

I would not unseal. I would quote the path that is missing create/update or that never included hr/ or /data/. A scoped PR is change-control. A root token in CI is not.

P3HVED-0302:40 ISTCaller: GRC

HVED-03 — Prove the reader (audit log)

02:40 · P3. GRC asks who read secret/data/finance/db after 01:00. Someone already ran kv get and wants to paste the username from the payload.

First tool: vault audit list. If the table is empty, your sentence is: I cannot prove who read it — no audit device. Enabling file now is change-control and only records the future. Official: a new cluster starts with auditing disabled.

If a device exists: open that file (or syslog). Quote one JSON object: time, auth.display_name, auth.policies, request.path, request.operation, error. Remember HMAC on strings — the raw token will not appear.

Lab · audit list
vault-lab $ vault audit list
Path     Type    Description
----     ----    -----------
file/    file    n/a

vault-lab $ vault audit list -detailed
Path     Type    Description    Replication    Options
----     ----    -----------    -----------    -------
file/    file    n/a            replicated     file_path=/var/log/vault_audit.log
Trap

Do not invent a username from the KV version metadata or from your own token lookup. History is the audit device (or Enterprise snapshots), not the secret engine. Exempted endpoints such as sys/seal-status will never appear — do not call that a cover-up.

P2HVED-0403:05 ISTCaller: platform-ui

HVED-04 — Prove the door (auth method)

03:05 · P2. A new namespace / a rebuilt lab / a “temporary” disable. CI cannot login. The channel says “Vault expired” and “just use a root token until morning.”

First tool: vault auth list (or UI Access → Auth Methods). Quote Path + Type. If approle/ is missing, the job is knocking on a door that is not mounted. Confirm you are in the right namespace before you enable anything.

If the mount exists: read the role. Quote token_ttl and secret_id_ttl. A 20-minute token on a 40-minute pipeline is a lease story (HVED-05), not a missing mount. Enabling or tuning an auth method is change-control.

Lab · auth list (official columns)
vault-lab $ vault auth list
Path           Type          Description
----           ----          -----------
approle/       approle       n/a
kubernetes/    kubernetes    n/a
token/         token         token based credentials
Close

I would name the mount that is missing — or name the role TTL if the mount is there. I would not paste a root token into CI. Auth is enable-at-a-path; the job must use that path.

P2HVED-0503:20 ISTCaller: payments-job

HVED-05 — Prove remaining life (lease)

03:20 · P2. Database login worked at 01:44. At 02:04 the same pod cannot connect. Vault status is still unsealed and active. Someone typed “rotate the root.”

First tool: take the lease_id the job stored (shape database/creds/readonly/<uuid>) and run vault lease lookup. UI: Access → Leases.

Proof field: expire_time in the past and ttl = 0s. Official behaviour: once the lease is expired Vault can automatically revoke the data; for AWS/database engines that means the remote credential is gone. Renew before expiry, inspect the new lease_duration, or re-issue. Prefix revoke is for intrusion, not for this ticket.

Lab · lease lookup (official example shape)
vault-lab $ vault lease lookup database/creds/readonly/27e1b9a1-27b8-83d9-9fe0-d99d786bdc83
Key             Value
---             -----
expire_time     2026-08-16T02:04:10Z
id              database/creds/readonly/27e1b9a1-27b8-83d9-9fe0-d99d786bdc83
issue_time      2026-08-16T01:44:10Z
last_renewal    <nil>
renewable       true
ttl             0s
Trap

If the “secret” is KV, this tool is the wrong tile. Quote token ttl instead. Do not reseal a healthy node because a 20-minute database lease met a 30-minute job.

7. Traps + close-the-ticket proof

Proof · named field, then Closed
Night-shift operations desk with cluster health on a monitor
Notice: the close is Sealed, request.path, capabilities, Path/Type, or expire_time — not a screenshot of a red GitHub Action.
You seeWeak closeStrong close
Sealed=false, HA Mode=active, still 403“Vault is down” / unseal againToken lookup + policy path/capabilities
Sealed=trueA policy PR or a new AppRoleQuote Sealed + Unseal Progress; unseal under change-control
HA Mode standby + writes 307Emergency raft electionRepoint VAULT_ADDR to active / VIP; quote HA Mode on that address
Empty vault audit listA username from kv get“I cannot prove who read it.” Enable a device for the next incident
Audit device disk full / all devices down“Network blip”Official: Vault refuses the API if no device can write. Restore a device
Policy read only on finance/*Widen to secret/*Quote the 403 as the ACL working; scoped change-control if the story needs write
Policy missing /data/ on KV v2Remount the engineQuote the HTTP path vs the CLI path
No approle/ in auth listRoot token in CIQuote Path/Type. Confirm namespace. Enable only with a ticket
Lease ttl=0sReseal / destroy the mountQuote expire_time. Renew earlier, or re-issue
KV “expired”lease lookup on the KV pathKV has no lease. Lookup the token TTL or the KV version
Proof checklist before you leave the bridge
Interview close

I name the question, then the first tool, then one official field. vault status proves seal and HA. The audit log proves who hit which path. Policy proves the grant. Auth list proves the door. Lease lookup proves remaining life. I do not unseal, widen an ACL, or mint root until that field is on the ticket. Factory model: unsealed is necessary, not sufficient.

Knowledge check

Six night-shift judgments. Each maps to a first tool or a proof field. Check answers, then Reset if you picked the wrong surface.

Q1

Slack: “Is Vault even sealed?” You have not opened a policy yet. First proof?

Correct: b. Official status fields and exit codes. Sealed = true is the only ticket that starts at unseal. Re-read Side A and HVED-01.
Q2

status already shows Sealed=false and HA Mode=active. The job 403s on secret/data/hr/db. finance-read grants read on secret/data/finance/* only. Which proof field closes HVED-02?

Correct: a. Official deny-by-default ACL. KV does not issue leases. Re-read Side B step 3 and HVED-02.
Q3

GRC asks who read payroll after 01:00. vault audit list is empty. What do you say?

Correct: c. Official: auditing starts disabled. kv get is payload, not history. Re-read Side C step 3 and HVED-03.
Q4

CI cannot login to AppRole. Someone wants a root token “until morning.” First tool + proof?

Correct: b. Official auth list columns. Enable-at-a-path. Root in CI is not isolate. Re-read Side B step 1 and HVED-04.
Q5

Database creds worked at 01:44 and failed at 02:04. Vault is unsealed. What do you open first?

Correct: d. Official lease fields. Expired dynamic secrets are revoked. Re-read Side C step 1 and HVED-05.
Q6

vault status on the caller’s address shows Sealed=true. What is that row allowed to mean?

Correct: a. Official seal concept. Re-read Flow 2 bottom box and HVED-01. Quote Sealed + Unseal Progress, then unseal under change-control.

Sources

Related: Blog 1 · Session factory — unsealed ≠ enough · HashiCorp Vault interview hub · Policy and namespace design · AppRole secret-zero · Dynamic secrets and leases · Audit device / SIEM pipeline