003 practice questions and answers
All 57 questions from Full Practice Test 1 for HashiCorp Certified: Vault Associate (003), with the correct answer and a full explanation for each — including why the other options are wrong. Free to read, no signup.
What this set covers
Questions are weighted to match the official 003 exam guide. The real exam is Not published by HashiCorp (~57-60 reported, unofficial) questions in 60 minutes with a pass mark of Not published (~70%, unofficial).
- Authentication methods7 q · 12%
- Vault policies6 q · 11%
- Vault tokens7 q · 11%
- Vault leases6 q · 11%
- Secrets engines7 q · 11%
- Encryption as a Service6 q · 11%
- Vault architecture fundamentals6 q · 11%
- Vault deployment architecture6 q · 11%
- Access management architecture6 q · 11%
A company runs Vault for both people and machines. Platform engineers must log in from their laptops using the corporate identity provider. A Jenkins pipeline on a build server must fetch database credentials with no human present. A junior engineer suggests putting a GitHub personal access token on the build server and using the GitHub auth method for the pipeline. Which approach is MOST secure and matches how Vault auth methods are designed?
- AEnable the OIDC auth method for the engineers and the AppRole auth method for the Jenkins pipeline, and do not use the GitHub personal access token.✓
- BEnable the GitHub auth method for both the engineers and Jenkins, and store the personal access token in the Jenkins credential store.
- CEnable the userpass auth method for the engineers and share one of those userpass accounts with Jenkins so both use the same login path.
- DEnable the AppRole auth method for the engineers and the LDAP auth method for Jenkins by creating a directory service account for the build server.
Correct answer: A — Enable the OIDC auth method for the engineers and the AppRole auth method for the Jenkins pipeline, and do not use the GitHub personal access token.
Vault splits auth methods into human-oriented ones (OIDC, userpass, LDAP), where a person proves who they are, and system-oriented ones (AppRole, Kubernetes, AWS IAM, JWT), where a workload proves what it is. OIDC gives engineers single sign-on with the existing identity provider, and AppRole gives the pipeline a RoleID plus SecretID that belong to the machine, not to a person. Option B fails because a GitHub personal access token is tied to a human account: it carries that person's org and team membership, it is rarely rotated, and it keeps working after the person leaves. Option C shares one human credential between people and a robot, which destroys audit trails. Option D swaps the two families around, giving humans a machine credential and giving a build server a directory identity that a human can also log in with.
A team is building a new production Vault cluster. They want high availability with the LEAST operational overhead, and the cluster must keep serving requests after two nodes fail at the same time. What should they deploy?
- AIntegrated Storage (Raft) on three Vault nodes, since quorum is two and the cluster can lose two nodes.
- BThe Consul storage backend with three Vault nodes and a separate Consul cluster, because Vault cannot run in high availability mode without Consul.
- CIntegrated Storage (Raft) on five Vault nodes. The data is replicated by the Vault nodes themselves, quorum is three, and the cluster survives two failures.✓
- DOne Vault node using the file storage backend, with frequent snapshots taken to object storage.
Correct answer: C — Integrated Storage (Raft) on five Vault nodes. The data is replicated by the Vault nodes themselves, quorum is three, and the cluster survives two failures.
Integrated Storage is the recommended backend today because the Vault nodes replicate the data themselves, so there is no second cluster to install, secure and upgrade. Raft needs a majority, so five nodes have a quorum of three and tolerate two failures, while three nodes have a quorum of two and tolerate only one, which makes option A's arithmetic wrong. Option B still works but adds a whole Consul cluster to operate, and its claim is false since Raft provides high availability on its own. Option D has no high availability at all, and snapshots only shorten an outage rather than prevent one.
Vault docs: Integrated Storage (Raft) backendA team runs applications on Kubernetes and installs the Vault Secrets Operator. They want a KV version 2 secret from Vault to appear as a native Kubernetes Secret that any pod in the namespace can consume. Which set of resources does the job?
- AA `SecretProviderClass` that lists `secretObjects`, plus a pod that mounts the matching CSI volume.
- BOnly a `VaultDynamicSecret`, because the operator reads the Vault address and role from the pod's annotations.
- CPod template annotations such as `vault.hashicorp.com/agent-inject-secret-config`, which the operator converts into a Kubernetes Secret.
- DA `VaultConnection` for the server address and CA, a `VaultAuth` for the auth mount and role, and a `VaultStaticSecret` whose `destination` creates the Kubernetes Secret.✓
Correct answer: D — A `VaultConnection` for the server address and CA, a `VaultAuth` for the auth mount and role, and a `VaultStaticSecret` whose `destination` creates the Kubernetes Secret.
The Vault Secrets Operator is driven entirely by custom resources: `VaultConnection` says how to reach the Vault server, `VaultAuth` says how to authenticate to it (for example the Kubernetes auth mount, the role and the service account), and `VaultStaticSecret` names the KV mount and path and writes the result into the Kubernetes Secret named under `destination`. `VaultDynamicSecret` is the resource for leased credentials such as database or AWS secrets, and it still needs a connection and an auth resource, so B is wrong on both points. A belongs to the Vault CSI provider and the Secrets Store CSI Driver, not to the operator. C is Vault Agent Injector annotation syntax, which renders files into a sidecar volume and never creates a Kubernetes Secret.
Vault Secrets OperatorAn application must encrypt a 4 GB archive file. Sending the file itself to Vault is not acceptable. The team decides to use envelope encryption with the transit secrets engine. Which TWO actions are correct? (Select TWO.)
- ACall transit/datakey/plaintext/<key>, encrypt the file locally with the plaintext data key that comes back, then store the ciphertext copy of that key next to the file and clear the plaintext key from memory.✓
- BCall transit/datakey/wrapped/<key> first, because it returns a plaintext data key the application can use straight away.
- CTo read the file later, send the stored ciphertext data key to transit/decrypt/<key>, get the plaintext data key back, and decrypt the file locally.✓
- DStream the whole 4 GB file to transit/encrypt/<key> and let Vault return the ciphertext.
- ERely on Vault keeping a copy of every data key it generates, so the application does not have to store the ciphertext key.
Correct answer: A, C — Call transit/datakey/plaintext/<key>, encrypt the file locally with the plaintext data key that comes back, then store the ciphertext copy of that key next to the file and clear the plaintext key from memory. · To read the file later, send the stored ciphertext data key to transit/decrypt/<key>, get the plaintext data key back, and decrypt the file locally.
Envelope encryption means Vault mints a one-time data key, the client does the bulk work locally, and only the small data key ever travels to Vault. transit/datakey/plaintext returns both the usable key and its encrypted form, so the client encrypts now and keeps the encrypted form for later. Option B is the trap: the wrapped endpoint returns only the ciphertext key, which is useful when you do not need to encrypt right away, but it gives the app nothing to encrypt with today. Option D sends gigabytes through the API, which the requirement rules out, and option E is wrong because Vault stores no data keys, only the master key that wraps them.
Vault API: Transit secrets engineA platform team has two workloads. Workload 1 is a set of services that already speak the Vault API; they only need a local endpoint that logs in for them and caches tokens and leases, and they render nothing to disk. Workload 2 is an old binary that reads its database password from an environment variable and must be restarted when that password changes. Which TWO actions fit these workloads? (Select TWO.)
- AUse Vault Agent for workload 1, because Vault Proxy cannot cache tokens or leases.
- BDeploy Vault Proxy for workload 1. It handles auto-auth, proxies the Vault API and caches tokens and leases, with no template rendering.✓
- CDeploy Vault Proxy for workload 2 as well, since Proxy can pass secrets in as environment variables and supervise a child process.
- DDeploy Vault Agent in process supervisor mode for workload 2. Agent starts the binary, passes the secrets in as environment variables, and restarts the process when they change.✓
- ENeither tool can log in on its own, so a token must be written into the config file before either one starts.
Correct answer: B, D — Deploy Vault Proxy for workload 1. It handles auto-auth, proxies the Vault API and caches tokens and leases, with no template rendering. · Deploy Vault Agent in process supervisor mode for workload 2. Agent starts the binary, passes the secrets in as environment variables, and restarts the process when they change.
Vault Proxy is the right fit when the only need is auto-auth, API proxying and caching for clients that already call the Vault API, so option A is wrong. Vault Agent adds templating and process supervisor mode: with an exec block and env templates it launches the child process, injects the secrets as environment variables, and restarts the process when the secrets change, which is exactly what a binary that reads its password once at start-up needs. Proxy has no templating and no process supervisor, so option C is wrong. Both tools support auto-auth, where they authenticate with an auth method and manage the token themselves, so option E is wrong.
Vault Agent and Vault ProxyAn application token gets "permission denied" when it writes to secret/data/payments/config. The token has several policies attached. An operator must prove exactly what that token is allowed to do on that one path. Which action gives the answer FASTEST?
- ARun vault token lookup <token> and read the policies field.
- BRead every attached policy with vault policy read and work out the merged result by hand.
- CRun vault token capabilities <token> secret/data/payments/config.✓
- DEnable a file audit device, replay the failing request, and read the audit entry.
Correct answer: C — Run vault token capabilities <token> secret/data/payments/config.
vault token capabilities returns the effective capability list for one token on one exact path after Vault has merged all of its policies, so it answers the question in a single command. vault token lookup only prints the names of the attached policies, not what they allow on that path. Reading each policy by hand is slow and easy to get wrong, because deny always wins and an exact path rule beats a glob. An audit device does record the request, but you must enable it and reproduce the failure first. Remember that the built-in default policy grants almost nothing on secret/: it covers token self-lookup, self-renew and self-revoke, the token's own cubbyhole, and lookup of wrapping tokens.
vault token capabilitiesA company has more than 500 developers who log in through an OIDC auth mount. Each developer needs a private folder in a KV version 2 secrets engine mounted at `secret/`, and no developer may read another developer's folder. The security team refuses to maintain one policy per person. Which approach meets the requirement with the LEAST operational overhead?
- AWrite one ACL policy whose path is `secret/data/user/{{identity.entity.id}}/*` and attach it to the identity group that holds all developers.✓
- BWrite one ACL policy whose path is `secret/data/user/*` and attach it to the identity group that holds all developers.
- CEnable a separate KV version 2 secrets engine for each developer and write one policy per mount.
- DRun a nightly job that lists every entity and generates one ACL policy per developer.
Correct answer: A — Write one ACL policy whose path is `secret/data/user/{{identity.entity.id}}/*` and attach it to the identity group that holds all developers.
ACL policy paths support templating. Vault replaces `{{identity.entity.id}}` at request time with the ID of the entity making the call, so a single policy document gives every developer a path that only that developer can reach. B grants everyone access to everyone else's folder, which breaks the isolation requirement outright. C creates 500 mounts plus 500 policies and slows the cluster down at unseal time. D still produces 500 policies and adds a job that drifts out of date whenever someone joins or leaves.
Vault policiesAn operator has an audit log entry that shows a token accessor but not the token value. The operator wants to know what that accessor can be used for. Which TWO actions can be performed with a token accessor? (Select TWO.)
- ALook up the token's policies, TTL and creation time with `vault token lookup -accessor <accessor>`.✓
- BSet VAULT_TOKEN to the accessor value and read any secret the original token is allowed to read.
- CRevoke the token with `vault token revoke -accessor <accessor>` when an employee leaves the company.✓
- DRecover the original token value from the accessor when a client has lost it.
- EUnwrap a response-wrapping token by passing its accessor to `vault unwrap`.
Correct answer: A, C — Look up the token's policies, TTL and creation time with `vault token lookup -accessor <accessor>`. · Revoke the token with `vault token revoke -accessor <accessor>` when an employee leaves the company.
An accessor is a reference to a token that lets operators manage the token without ever seeing it: lookup, renew and revoke all accept -accessor. That is why B is wrong; the accessor is not a credential and cannot be used to authenticate or read a secret. D is wrong because the mapping is one way by design, which is exactly what makes accessors safe to keep in audit logs. E is wrong because unwrapping needs the wrapping token itself; the wrapping token's accessor only lets you look up wrap information or check whether it was already used.
TokensAn application on a virtual machine reads its Vault token from a file on disk, and that file currently holds a static token that never changes. The team must remove the static token without changing how the application reads the token. Which approach meets this requirement?
vault {
address = "https://vault.example.com:8200"
}
auto_auth {
method "approle" {
config = {
role_id_file_path = "/etc/vault-agent/role_id"
secret_id_file_path = "/etc/vault-agent/secret_id"
}
}
sink "file" {
config = {
path = "/run/vault/token"
}
}
}- AExport a root token as an environment variable from the startup script so nothing is written to disk in the application repository.
- BRun Vault Agent on the virtual machine with an auto_auth block: a method stanza that logs in with AppRole and a file sink that writes the fresh token to the path the application already reads.✓
- CIssue the application a token with a ten-year TTL and rotate it by hand once a year.
- DAttach the policy directly to Vault Agent so the application needs no token of any kind.
Correct answer: B — Run Vault Agent on the virtual machine with an auto_auth block: a method stanza that logs in with AppRole and a file sink that writes the fresh token to the path the application already reads.
Vault Agent auto-auth handles login for the workload: the method stanza authenticates with a machine identity such as AppRole, and the sink writes the resulting token to a file, which the agent keeps renewed and rewrites when it changes. Because the application keeps reading the same file, no application code changes. Option A only moves a secret from a file to an environment variable, and makes it worse by using a root token. Option C is the long-lived static credential the team is trying to remove. Option D is not how Vault works, since policies attach to tokens and identities, and every request still needs a token.
A legacy application cannot call the Vault API. It reads its database password from /etc/app/config.ini at start-up and needs a reload signal whenever that file changes. The password is stored in the KV v2 engine and is rotated regularly. Which solution meets the requirement with the LEAST operational overhead?
- ARun Vault Agent on the host with an auto-auth method and a template stanza that renders /etc/app/config.ini from the KV secret, and set the command option in that template stanza to reload the application when the rendered file changes.✓
- BAdd a cron job that runs `vault kv get` every five minutes, rewrites config.ini, and restarts the application every time it runs.
- CRewrite the application so it calls the Vault API at start-up using a long-lived token stored on the host filesystem.
- DPut the password in a Kubernetes ConfigMap generated by the deployment pipeline and redeploy the application whenever the password is rotated.
Correct answer: A — Run Vault Agent on the host with an auto-auth method and a template stanza that renders /etc/app/config.ini from the KV secret, and set the command option in that template stanza to reload the application when the rendered file changes.
Vault Agent is built for exactly this case: auto-auth handles login and token renewal, the template stanza renders a file from a Vault secret using Consul Template syntax, and the command option runs a reload or restart only when the rendered content actually changes. Option B adds a polling script the team must maintain and restarts the app on a schedule even when nothing changed. Option C contradicts the constraint that the application cannot call Vault, and parks a long-lived token on disk. Option D moves a secret into a ConfigMap, which is neither encrypted nor rotated by Vault, and ties every rotation to a full redeploy.
A team is building a self-managed three-node Vault cluster in one data centre. If one node fails, another node must take over automatically and the data must survive. The team wants the LEAST operational overhead. Which storage backend should they choose?
- AThe file backend, with each node writing to the same NFS share.
- BIntegrated Storage (Raft) on each of the three nodes.✓
- CA separate three-node HashiCorp Consul cluster used as the storage backend.
- DThe inmem backend on each node with a load balancer in front of them.
Correct answer: B — Integrated Storage (Raft) on each of the three nodes.
Integrated Storage replicates the data over Raft between the Vault nodes themselves, elects an active node and promotes a standby when the active one fails, and needs nothing beyond the Vault binary. Consul also supports HA and is a supported backend, but it means running, upgrading and monitoring a second cluster, which is more operational overhead. The file backend keeps data on local disk, does not support HA, and putting it on a shared mount does not make it safe for more than one node. The inmem backend holds everything in memory and loses all data when the process stops, so it exists only for development and testing.
Storage backendsA company logs in to Vault through an OIDC provider. The provider returns a `groups` claim in the ID token. Vault must grant the `platform-admin` policy only while the provider lists a user in the `platform-admins` group, and a user removed from that group in the provider must lose the policy at the next login. The team wants the LEAST operational overhead. Which approach meets the requirement?
- ACreate an internal identity group named `platform-admins`, attach the `platform-admin` policy, and add each admin user's entity as a member of the group.
- BCreate an external identity group named `platform-admins`, attach the `platform-admin` policy, and add the entity IDs of the admin users as members of the group.
- CCreate an external identity group with the `platform-admin` policy, then create a group alias whose name matches the value sent in the OIDC `groups` claim and whose mount accessor is the OIDC auth mount.✓
- DAdd the `platform-admin` policy to `token_policies` on the OIDC role that all employees use to log in.
Correct answer: C — Create an external identity group with the `platform-admin` policy, then create a group alias whose name matches the value sent in the OIDC `groups` claim and whose mount accessor is the OIDC auth mount.
An external identity group has no members you manage by hand. Its membership comes from a group alias, which maps a group name returned by an auth method — here the value of the `groups` claim that the OIDC role reads through `groups_claim` — onto the Vault group and its policies. Vault recalculates that membership at every login, so removing the user in the provider removes the policy. A is an internal group, which someone must edit by hand every time a team changes. B fails because external groups reject member entities; only the alias decides who is in them. D hands the policy to every employee who uses that role, not just the admins.
Vault identity: entities and groupsA service must sign every audit record it produces. Partner companies outside the network must be able to verify those signatures on their own, with no access to Vault and no shared secret. The signing key must never leave Vault, and the team wants small signatures. Which use of the transit secrets engine meets the requirement?
- ACreate a transit key of type aes256-gcm96 and call transit/hmac to produce the signature.
- BCreate a transit key of type aes256-gcm96 and call transit/encrypt on a hash of each record.
- CCreate a transit key of type ed25519 and call transit/sign and transit/verify.✓
- DCreate a transit key of type chacha20-poly1305 and give the partners a copy of the key so they can verify.
Correct answer: C — Create a transit key of type ed25519 and call transit/sign and transit/verify.
Signing needs an asymmetric key. ed25519 supports the sign and verify endpoints, produces short signatures, and its public key can be read from transit/keys/<name> and handed to partners, while the private half stays inside Vault. aes256-gcm96 and chacha20-poly1305 are symmetric: aes256-gcm96 does support transit/hmac, but an HMAC can only be checked by someone who holds the same secret key, so partners would need Vault access or a copy of the key. Encrypting a hash is not a signature and gives the partner nothing to check. Sharing a symmetric key breaks the rule that the key never leaves Vault, and it lets the partner forge records.
Transit secrets engineA company is tired of paging five people every time a Vault node restarts, so it rebuilds the cluster with auto-unseal backed by AWS KMS. Which statement correctly describes the result?
- ARecovery keys can be supplied to `vault operator unseal` to unseal the cluster by hand whenever the KMS key is unreachable.
- BKMS now holds the key that decrypts Vault's root key at start-up, `vault operator init` returns recovery keys instead of unseal keys, and a quorum of recovery keys is still required for operations such as generating a new root token.✓
- CAuto-unseal removes the need for any key material, so anyone with access to the KMS key can create a root token on demand.
- DAuto-unseal replaces the encryption key used for data at rest, so KMS encrypts and decrypts every individual secret as the application reads it.
Correct answer: B — KMS now holds the key that decrypts Vault's root key at start-up, `vault operator init` returns recovery keys instead of unseal keys, and a quorum of recovery keys is still required for operations such as generating a new root token.
Auto-unseal moves only one job to the cloud KMS or HSM: unwrapping the root key when a node starts, which is what the Shamir unseal keys used to do. Because the unseal keys disappear, init hands out recovery keys instead, and they still form a quorum for privileged actions such as generate-root or rekey. Option A is the common trap: recovery keys cannot be passed to `vault operator unseal`, since unsealing is now the seal's job. Option C forgets the recovery key quorum, and option D is wrong because the barrier encryption key still lives inside Vault; KMS never sees individual secrets.
Seal/UnsealA company gives engineers SSH access to a fleet of bastion hosts. Engineers keep their own SSH key pairs. Nobody may copy public keys into authorized_keys on the hosts, access must expire on its own after a few hours, and the security team refuses to install any extra agent or helper binary on the bastions. Which approach meets all of these requirements?
- AUse the SSH secrets engine in signed certificate (CA) mode, point sshd at the Vault CA public key with TrustedUserCAKeys, and have each engineer get their own public key signed with a short TTL.✓
- BUse the SSH secrets engine in one-time password (OTP) mode and install vault-ssh-helper on every bastion.
- CStore one shared bastion private key in the KV v2 secrets engine and rotate it every night with a scheduled job.
- DUse the SSH secrets engine's dynamic key mode so Vault creates a new key pair for each user and installs it on the host.
Correct answer: A — Use the SSH secrets engine in signed certificate (CA) mode, point sshd at the Vault CA public key with TrustedUserCAKeys, and have each engineer get their own public key signed with a short TTL.
In CA mode Vault signs the engineer's existing public key and returns a certificate with a TTL. The bastions trust the Vault CA once through TrustedUserCAKeys, so no per-user key ever lands in authorized_keys and nothing extra runs on the host. OTP mode does meet the no-shared-key goal, but it fails the requirement because vault-ssh-helper must be installed on each target host. A shared key in KV still means one key that everyone holds, and nightly rotation does not expire an active session. The dynamic key type is deprecated and works by writing keys into authorized_keys on the host, which the requirement forbids.
SSH secrets engineAn operator hands a pipeline a token created with `vault token create -policy=deploy -use-limit=3`. The pipeline makes three successful API calls and the fourth call is rejected. Using their own admin token, the operator then runs `vault token lookup` against the pipeline token and gets an error saying the token is not valid. The pipeline token's TTL has not expired. What happened?
- AVault's user lockout feature blocked the token after repeated failures, and it will work again once the lockout period ends.
- BVault revoked the token automatically as soon as `num_uses` reached zero, so the token no longer exists and cannot be looked up.✓
- CThe token is still valid, but its `deploy` policy was consumed after three requests and has to be attached again.
- D`vault token lookup` can only be run with a root token, so the lookup error has nothing to do with the use limit.
Correct answer: B — Vault revoked the token automatically as soon as `num_uses` reached zero, so the token no longer exists and cannot be looked up.
`-use-limit` sets `num_uses` on the token. Every request authenticated with that token decrements the counter — including `vault token lookup-self` — and Vault revokes the token the instant the counter reaches zero. That is why the later lookup reports an invalid token instead of showing `num_uses: 0`. A describes the user lockout feature, which counts failed logins on auth methods such as userpass, LDAP and AppRole and has nothing to do with use limits. C is not a real behaviour; policies are not consumed. D is wrong because any token with `update` on `auth/token/lookup` can look up another token, and the operator's admin token clearly reached the endpoint.
Vault tokensAn engineer creates a transit key named payments with default settings, then tries to take a backup of it so the key can be restored on a second cluster. The call to transit/backup/payments fails. What must the team do, and what should they understand about it?
- AGrant the engineer the sudo capability on transit/backup/payments; transit keys can always be exported once policy allows it.
- BSet deletion_allowed to true on the key, then read the backup endpoint again.
- CRotate the key first, because only the newest key version can be backed up.
- DUpdate the key configuration to set exportable and allow_plaintext_backup to true, and accept that both are one-way changes that let the raw key material leave Vault.✓
Correct answer: D — Update the key configuration to set exportable and allow_plaintext_backup to true, and accept that both are one-way changes that let the raw key material leave Vault.
By default a transit key can never leave Vault: you send plaintext in and get ciphertext back, and the key material stays inside. Backup and export are blocked until allow_plaintext_backup and exportable are turned on, and neither flag can be turned off again once set, so every key version becomes copyable from then on. Policy is not the blocker here, so extra sudo changes nothing. deletion_allowed only controls whether the key can be deleted at all. Rotation creates a new version but does not make any version exportable.
Transit secrets engineAfter a node reboot, an operator runs vault status on one Vault node and sees the output below. Applications pointed at this node still get errors. What does this output mean?
$ vault status Key Value --- ----- Seal Type shamir Initialized true Sealed true Total Shares 5 Threshold 3 Unseal Progress 2/3 Unseal Nonce 9c1f5b2a-1d7e-4a0b-8f31-6c2d1e4b9a77 Storage Type raft HA Enabled true
- ATwo of the three required key shares have been entered. The node stays sealed and rejects requests until a third, different unseal key is entered against the same unseal nonce.✓
- BThe node is unsealed but is a standby, so it forwards client requests to the active node.
- CTwo of the five key holders have lost their shares, so the cluster must be initialized again with vault operator init.
- DUnseal progress never resets, so the operator only has to wait for the other nodes to gossip the remaining share.
Correct answer: A — Two of the three required key shares have been entered. The node stays sealed and rejects requests until a third, different unseal key is entered against the same unseal nonce.
Sealed is true and Unseal Progress shows 2/3, so two valid shares out of the threshold of three have been supplied and the node is half unsealed. It answers status calls but refuses all other requests until a third, different share is entered, and every share in the same attempt must carry the matching unseal nonce. The node is not a standby: HA Mode only appears once a node is unsealed, and Total Shares 5 with Threshold 3 simply describes how the key was split at init time, not lost shares, so re-initialising would destroy the cluster. Progress is held in memory only, so a restart or a mismatched nonce resets it to 0/3 and the count starts over; nothing arrives from the other nodes on its own.
vault statusAn application holds a dynamic database credential with a one hour lease. To avoid renewing so often, the operator asks for a much longer extension and gets the output shown below. Vault returns no error. What explains the shorter lease duration?
$ vault lease renew -increment=72h database/creds/reporting/8f2c... Key Value --- ----- lease_id database/creds/reporting/8f2c... lease_duration 24h lease_renewable true
- AThe client token that created the lease was close to expiry, so Vault matched the lease to the token's remaining TTL.
- BThe -increment flag is only a hint used when the role has no TTL configured, so the role's default TTL of one hour was applied instead.
- CThe max_lease_ttl configured on that secrets engine mount caps how long the lease may live, so Vault granted the largest allowed value instead of the requested 72h.✓
- DThe lease had already been renewed the maximum number of times, so Vault returned only the time that was left.
Correct answer: C — The max_lease_ttl configured on that secrets engine mount caps how long the lease may live, so Vault granted the largest allowed value instead of the requested 72h.
A renewal request is a suggestion. Vault honours it only up to the maximum TTL, which comes from the mount's max_lease_ttl (set with `vault secrets tune`), or from the system default if the mount does not set one, and it silently returns the capped value rather than failing. Option A is wrong because a lease TTL is not clamped to the creating token's TTL; revoking that token does revoke its leases, but renewal length is a different rule. Option B is wrong because -increment is always considered, not just when a role TTL is missing. Option D is wrong because Vault does not count renewals; it limits total lease lifetime by TTL.
Lease, renew, and revokeA token has both of the policies below attached. The application calls the KV v2 path secret/data/prod/db and gets a 403 permission denied. What explains the result?
# policy: app-read
path "secret/data/prod/db" {
capabilities = ["read"]
}
# policy: prod-lockdown
path "secret/data/prod/*" {
capabilities = ["deny"]
}- AVault evaluates attached policies in alphabetical order, so app-read is applied last and should have allowed the read; the 403 comes from something else.
- BThe exact path in app-read is more specific than the glob, so it should win; the request failed because the token was already expired.
- CVault is deny by default and merges the attached policies. An explicit deny on a matching path beats any grant from another policy, even a more specific one.✓
- Ddeny is not a valid capability, so prod-lockdown is ignored and the 403 is caused by reading the data/ path instead of the metadata/ path.
Correct answer: C — Vault is deny by default and merges the attached policies. An explicit deny on a matching path beats any grant from another policy, even a more specific one.
Vault starts with no access and adds up the capabilities from every attached policy, but deny is absolute: if any attached policy denies a matching path, the request is refused. That is why option B's specificity argument fails here, and specificity only breaks ties between rules inside the same policy. Option A invents an ordering rule that does not exist, and option D is wrong because deny is a real capability and secret/data/... is the correct read path for KV v2.
Vault docs: PoliciesAn engineer installs the Vault CLI on a new laptop and runs `vault status`. The company cluster is reachable at `https://vault.example.com:8200` and presents a certificate signed by the company's private CA. The command fails with the error below. What is the correct fix?
$ vault status Error checking seal status: Get "https://127.0.0.1:8200/v1/sys/seal-status": dial tcp 127.0.0.1:8200: connect: connection refused
- AExport `VAULT_TOKEN` with a valid token so the CLI is allowed to contact the cluster.
- BExport `VAULT_NAMESPACE=admin` so the CLI targets the correct namespace.
- CExport `VAULT_SKIP_VERIFY=true` so the CLI accepts the private CA certificate.
- DExport `VAULT_ADDR=https://vault.example.com:8200` so the CLI stops using the default local address.✓
Correct answer: D — Export `VAULT_ADDR=https://vault.example.com:8200` so the CLI stops using the default local address.
`VAULT_ADDR` defaults to `https://127.0.0.1:8200`, so leaving it unset makes every command talk to the laptop itself — which is why the message is a refused TCP connection rather than an authentication or TLS error. A is wrong because a missing token produces a permission error from a server that answered, and `vault status` does not need a token at all. B is an Enterprise namespace setting and would return an HTTP error, not a dial failure. C only turns off certificate verification and should be avoided in production; the correct way to trust a private CA is `VAULT_CACERT` pointing at the CA bundle.
Vault CLI environment variablesA legacy reporting tool cannot handle a changing username. It must always connect to PostgreSQL as report_user. Security still wants that password changed every 24 hours, with the LEAST work for the application team. Which database secrets engine feature meets this requirement?
- AA dynamic role with default_ttl set to 24h, so Vault creates a fresh database user each day.
- BA static role that points at the existing report_user with rotation_period set to 24h; the app reads the current password from database/static-creds/<role>.✓
- CStore the password in KV v2 and run a nightly job that changes it in PostgreSQL and writes the new value.
- DSchedule vault write -f database/rotate-root/postgres once a day.
Correct answer: B — A static role that points at the existing report_user with rotation_period set to 24h; the app reads the current password from database/static-creds/<role>.
Static roles are built for exactly this case: Vault takes over an account that already exists, keeps the username fixed, and rotates only the password on the schedule in rotation_period. Option A is the trap, because a dynamic role creates a brand new username on every read, which the tool cannot use. Option C rebuilds rotation by hand and leaves you owning the script and its failures. Option D rotates the credential Vault itself uses to manage the database, not the reporting account, and running it daily would not help the tool at all.
Vault docs: Database secrets engineAn auditor asks what protects Vault data if someone copies the raw files out of the storage backend. Which answer describes the Vault barrier correctly?
- AVault writes plaintext values and only controls access, so the storage backend must have its own encryption at rest enabled.
- BUnsealing reconstructs the root key, which decrypts the keyring. The keyring holds the encryption key Vault uses with AES-256-GCM, so everything written to storage is already ciphertext.✓
- CThe root token decrypts the keyring, so anyone holding a root token can read the raw storage files directly.
- DVault encrypts secret values only. Policies, the mount table and audit device settings stay in plaintext so the server can start before unsealing.
Correct answer: B — Unsealing reconstructs the root key, which decrypts the keyring. The keyring holds the encryption key Vault uses with AES-256-GCM, so everything written to storage is already ciphertext.
The barrier is the layer every read and write must pass through: unseal keys rebuild the root key, the root key decrypts the keyring, and the keyring's encryption key protects data with AES-256-GCM before it reaches storage. Option A gets it backwards, since Vault never trusts the storage backend and hands it ciphertext only. Option C confuses authentication with encryption, because a root token grants API access but decrypts nothing on disk. Option D is wrong because policies, mount tables and audit configuration all live behind the barrier, which is exactly why a sealed Vault cannot serve any of them.
Vault docs: ArchitectureA company runs Vault Enterprise in two regions. They want reads served close to the applications in the second region, and they also want a separate cluster that can take over if the primary region is lost. Which TWO statements about Vault Enterprise replication are correct? (Select TWO.)
- AA performance replication secondary serves read requests locally and forwards write requests to the primary cluster.✓
- BA disaster recovery secondary serves read-only client requests, which lowers latency for nearby applications.
- CA disaster recovery secondary accepts no client requests at all until an operator promotes it.✓
- DPerformance replication copies tokens and leases to the secondary, so a token issued by the primary works unchanged on the secondary.
- EDisaster recovery replication works by copying a storage snapshot to the secondary on a fixed schedule.
Correct answer: A, C — A performance replication secondary serves read requests locally and forwards write requests to the primary cluster. · A disaster recovery secondary accepts no client requests at all until an operator promotes it.
Performance replication exists for scale: the secondary holds a copy of the data, answers reads locally, and forwards writes to the primary. Disaster recovery replication exists for failover only, so its secondary is a warm standby that refuses all client traffic until it is promoted. B is the classic mix-up between the two modes. D is wrong because a performance secondary keeps its own token store and its own leases, so clients authenticate again against that cluster; it is the DR secondary that carries tokens and leases across. E is wrong because replication streams changes continuously from a write-ahead log rather than shipping scheduled snapshots.
Vault Enterprise replicationAn application uses the transit secrets engine to encrypt customer records. Millions of rows in the database hold ciphertext that starts with vault:v1:. As part of a yearly key rotation the operator runs the command below. What happens after this command?
vault write -f transit/keys/orders/rotate
- AVault re-encrypts every stored ciphertext with the new key version automatically during the next background job.
- BExisting vault:v1: ciphertext can no longer be decrypted, so the old key version must be restored from a backup before the application can read old rows.
- CNew encrypt calls use key version 2 and return vault:v2: ciphertext, while existing vault:v1: ciphertext still decrypts; the transit/rewrap endpoint can move old ciphertext to the new version without exposing plaintext.✓
- DVault exports the new key version so the application can encrypt locally and stop calling the transit engine.
Correct answer: C — New encrypt calls use key version 2 and return vault:v2: ciphertext, while existing vault:v1: ciphertext still decrypts; the transit/rewrap endpoint can move old ciphertext to the new version without exposing plaintext.
Rotating a transit key adds a new key version and makes it the latest one. From then on encrypt operations use that version and tag the output vault:v2:, while older versions stay available for decryption, so nothing breaks for data already written. Vault never walks your database for you, which rules out A; to update old ciphertext you send it to transit/rewrap, where Vault decrypts and re-encrypts inside the barrier and the plaintext never leaves. B describes what happens only if you raise min_decryption_version, which rotation does not do. D is wrong because transit keys are non-exportable unless the key was created with exportable enabled, and exporting defeats the purpose of encryption as a service.
Transit secrets engineA platform team already uses the AppRole auth method at its default path. They enable a second AppRole mount so CI pipelines stay separate from everything else. A CI job must now authenticate, and an operator group must be able to create and update AppRole roles on the new mount only. Which combination is correct?
vault auth enable -path=ci-cd approle
- AClients log in at `auth/approle/login` and pass the mount name `ci-cd`; the operator policy grants `auth/approle/role/ci-cd/*`.
- BClients log in at `auth/ci-cd/approle/login`; the operator policy grants `auth/approle/ci-cd/role/*`.
- CClients log in at `ci-cd/login`; the operator policy grants `sys/auth/ci-cd/*`.
- DClients log in at `auth/ci-cd/login`; the operator policy grants `auth/ci-cd/role/*`.✓
Correct answer: D — Clients log in at `auth/ci-cd/login`; the operator policy grants `auth/ci-cd/role/*`.
`-path` sets the mount path, and every endpoint of that mount lives under it. The login endpoint becomes `auth/ci-cd/login`, roles live at `auth/ci-cd/role/<name>`, so the operator policy must be written against `auth/ci-cd/role/*`. A and B invent paths that mix the method type into the URL; the type never appears there, only the mount path. C is wrong twice: auth endpoints are always prefixed with `auth/`, and `sys/auth/ci-cd` only controls enabling, tuning and disabling the mount itself, not the roles stored inside it.
AppRole auth methodAn application runs as a pod in a Kubernetes cluster. The pod already has a projected service account token mounted at /var/run/secrets/kubernetes.io/serviceaccount/token. The team wants the pod to authenticate to Vault and read its own secrets. Which option delivers the credential with the LEAST operational overhead?
- ACreate an AppRole role, publish the RoleID in a ConfigMap, and have a CI job deliver a wrapped SecretID to each pod at deploy time.
- BCreate a long-lived periodic token, store it in a Kubernetes Secret, and mount that Secret into the pod.
- CEnable the Kubernetes auth method and let the pod log in with the projected service account token it already has.✓
- DEnable the JWT auth method and have the deployment pipeline mint a signed JWT for every pod, then write it into the pod as a file.
Correct answer: C — Enable the Kubernetes auth method and let the pod log in with the projected service account token it already has.
The Kubernetes auth method makes Vault verify the pod's service account token with the cluster's TokenReview API, so the credential is already on disk and nothing has to be created, shipped or rotated by the team. AppRole (option A) works, but the SecretID is a real secret that someone must generate, wrap and deliver on every deploy, which is exactly the extra work the question asks you to avoid. Option B stores a long-lived token in a Kubernetes Secret, so it never expires cleanly and must be rotated by hand. Option D reinvents the same trust chain the cluster already provides and adds a signing key and a distribution step to maintain.
Kubernetes auth methodA team is initializing a new Vault cluster. Five named operators will hold key material, any three of them together must be able to unseal the cluster, and no operator may ever see another operator's share, not even in the terminal output of the person running the command. Which command meets all of these requirements?
- Avault operator init -key-shares=3 -key-threshold=5 -pgp-keys="op1.asc,op2.asc,op3.asc,op4.asc,op5.asc"
- Bvault operator init -key-shares=5 -key-threshold=5 -pgp-keys="op1.asc,op2.asc,op3.asc,op4.asc,op5.asc"
- Cvault operator init -key-shares=5 -key-threshold=3 -pgp-keys="op1.asc,op2.asc,op3.asc,op4.asc,op5.asc"✓
- Dvault operator init -key-shares=5 -key-threshold=3, then encrypt the saved output with one shared GPG key held by the team lead
Correct answer: C — vault operator init -key-shares=5 -key-threshold=3 -pgp-keys="op1.asc,op2.asc,op3.asc,op4.asc,op5.asc"
With Shamir's secret sharing, -key-shares is how many pieces the key is split into and -key-threshold is how many pieces must be combined to rebuild it, so five holders with any three able to unseal means shares=5 and threshold=3. Supplying -pgp-keys with one public key per share makes Vault encrypt each share to its own owner, so the person running init sees only ciphertext. Option A is rejected outright because the threshold can never be larger than the number of shares. Option B works but forces all five operators to be available for every unseal, which is stricter than the requirement. Option D prints all five shares in clear text first and then locks them behind a single key, which breaks the split entirely.
vault operator initAn application stores ciphertext from the transit secrets engine in a database. Every stored value begins with `vault:v1:`. An operator rotated the transit key to version 2 and then set `min_decryption_version` to 2. The application can no longer decrypt its stored data. The security team requires that plaintext is never handled outside Vault. What should the team do?
- ADelete the transit key and create a new one, then have the application re-encrypt each record the next time it is written.
- BSet `min_decryption_version` back to 1, call `transit/rewrap/<key>` for each stored ciphertext so it is re-encrypted under key version 2, then raise `min_decryption_version` to 2 again.✓
- CRotate the transit key once more so that version 3 is able to read ciphertext produced by version 1.
- DHave the application call `transit/decrypt` and then `transit/encrypt` for each stored value and save the new ciphertext.
Correct answer: B — Set `min_decryption_version` back to 1, call `transit/rewrap/<key>` for each stored ciphertext so it is re-encrypted under key version 2, then raise `min_decryption_version` to 2 again.
`min_decryption_version` stops Vault from using older key versions, so `vault:v1:` ciphertext becomes unreadable until that setting is lowered again. The `transit/rewrap` endpoint decrypts and re-encrypts entirely inside Vault and returns only the new ciphertext, so the caller never sees plaintext — which is exactly why rewrapping should happen before `min_decryption_version` is raised. A throws away the only key that can read the existing records. C is wrong because rotation only adds a version for new encryptions; it does not unblock a version that policy has disabled. D leaks plaintext to the application and still fails, since the decrypt call is blocked by the same setting.
Transit secrets engineA Vault server config file sets max_lease_ttl to 768h. The operator tuned the auth/approle mount with max_lease_ttl of 72h. The AppRole role that an application uses sets token_ttl to 1h and token_max_ttl to 8h. The application renews its token every 30 minutes and never stops. What is the longest total lifetime the token can reach?
- A8 hours✓
- B1 hour
- C72 hours
- D768 hours (32 days)
Correct answer: A — 8 hours
The most specific setting wins, and it can never raise the limit above a broader one. The role's token_max_ttl of 8h is the most specific value and is also the smallest, so Vault caps the token there. The 72h mount tune and the 768h system value are only outer limits for anything that does not set its own max. 1h is the starting TTL that each renewal resets, not a cap. Near the end Vault still accepts the renew call but returns a shorter and shorter TTL, and once 8h from creation is reached the token expires and renewal is refused.
TokensA team finds that MySQL accounts created by the database secrets engine still exist hours after their leases should have ended. The Vault server log shows repeated "failed to revoke lease" errors from a maintenance window when the database was unreachable. The operator must first see which leases Vault is still tracking for the role. Which command should the operator run?
- Avault lease revoke -prefix database/creds/readonly and check the exit code.
- Bvault list sys/leases/lookup/database/creds/readonly✓
- Cvault read sys/mounts/database to list the leases attached to the mount.
- DRestart the Vault node so the expiration manager rebuilds its list and drops the failed leases.
Correct answer: B — vault list sys/leases/lookup/database/creds/readonly
Vault's expiration manager tracks every lease and calls the secrets engine to revoke it when the TTL ends. If revocation fails, for example because the database is down, Vault retries with backoff and keeps the lease, so the credential stays outstanding. Listing sys/leases/lookup under the role path shows those lease IDs, and vault lease lookup on one ID shows its state. Revoking with -prefix is the fix you apply after you know what is there, not the way to find it, and it can silently fail again while the database is unreachable. sys/mounts/database returns mount configuration, not leases. A restart does not clear leases: they live in storage and the expiration manager reloads and retries them.
Lease, renew, and revokeA company moves from a self-managed Vault cluster to HCP Vault Dedicated to cut the work its platform team does. Which task does the team still have to do itself after the move?
- AInstalling Vault version upgrades on the cluster nodes.
- BTaking and storing regular snapshots of the cluster.
- CWriting policies and configuring the auth methods and secrets engines the applications need.✓
- DSetting up auto-unseal so the cluster comes back on its own after a restart.
Correct answer: C — Writing policies and configuring the auth methods and secrets engines the applications need.
HCP Vault Dedicated is a managed service, so HashiCorp runs the infrastructure: it performs version upgrades, takes automatic snapshots, configures auto-unseal, and runs the cluster across availability zones for production tiers. What it does not do is decide how you use Vault. Policies, auth method configuration, secrets engines, roles and TTLs are still the customer's work, exactly as on a self-managed cluster. Options A, B and D all describe platform tasks that the service already handles for you.
HCP Vault DedicatedA serverless function runs millions of times a day. Each run logs in to Vault, reads one secret, and exits in under a second. The platform team sees heavy write load on the storage backend caused by token creation. Which change reduces that load the MOST, and what does the team give up?
- AKeep service tokens but set the TTL to 1 second so Vault removes them quickly.
- BShare one long-lived root token across every function invocation so no new tokens are created.
- CIssue periodic service tokens from the auth role so the same token is reused between runs.
- DConfigure the auth role to issue batch tokens. They are not written to storage, but they cannot be renewed, cannot create child tokens, and have no accessor.✓
Correct answer: D — Configure the auth role to issue batch tokens. They are not written to storage, but they cannot be renewed, cannot create child tokens, and have no accessor.
Batch tokens are encrypted blobs handed to the client instead of records in storage, so creating them costs no storage write, which is exactly the problem here. The trade-off is real: no renewal, no child tokens, no cubbyhole and no accessor, so you cannot look one up or revoke it by accessor. Option A still writes every token to storage, only for less time. Option B removes all isolation and auditability. Option C keeps service tokens, so the storage writes stay, and a short-lived function has nothing to renew.
Vault docs: TokensA company runs a three node Vault Community Edition cluster on Integrated Storage behind a network load balancer that sends traffic to all three nodes. An engineer asks what happens to a client request that lands on a standby node. Which statement is correct?
- AOnly the active node accepts connections; a standby node refuses every request until it wins a leader election.
- BBy default the standby node forwards the request to the active node over the cluster port using the `cluster_addr` each node advertises for node-to-node traffic, while `api_addr` is the address advertised to clients.✓
- CAll three nodes serve the request themselves, because Raft lets every node read from its own local copy of the data.
- DThe standby node redirects the client to `cluster_addr`, so `cluster_addr` has to be set to the load balancer address.
Correct answer: B — By default the standby node forwards the request to the active node over the cluster port using the `cluster_addr` each node advertises for node-to-node traffic, while `api_addr` is the address advertised to clients.
Vault is active/standby. By default a standby node forwards client requests to the active node over the cluster port, 8201 by default, using the `cluster_addr` each node advertises, and the client sees a normal response. `api_addr` is the address a node advertises for regular API traffic and is what a client gets redirected to when request forwarding is turned off with `disable_clustering`. A is wrong because standby nodes do handle requests, by forwarding or redirecting them. C is wrong because Community Edition never serves reads from a standby; performance standbys are a Vault Enterprise feature. D swaps the two settings — a redirect uses `api_addr`, and `cluster_addr` must point at the node itself, never at the load balancer.
High availability modeAn application must encrypt customer records, but the security team will not let the application hold an encryption key. The team enables the transit secrets engine and the application makes the call below. Which description of the flow is correct?
$ vault write transit/encrypt/orders \
plaintext=$(base64 <<< "card-4111-1111")
Key Value
--- -----
ciphertext vault:v1:8SDd3WHDOjf7mq69CyCqYjBXAiQQAVZRkFM13ok481zoCmHnSeDX9vyf7w==- AThe app sends base64-encoded plaintext, Vault returns ciphertext beginning with vault:v1:, and Vault stores neither the plaintext nor the ciphertext, so the app must keep the ciphertext itself.✓
- BVault encrypts the record, saves the ciphertext inside the transit mount, and returns an identifier the app can look up later.
- CVault returns the orders key to the app so the app can encrypt this record and later records on its own.
- DThe app must send raw plaintext; Vault rejects base64 input and returns an invalid request error.
Correct answer: A — The app sends base64-encoded plaintext, Vault returns ciphertext beginning with vault:v1:, and Vault stores neither the plaintext nor the ciphertext, so the app must keep the ciphertext itself.
Transit is encryption as a service: the key never leaves Vault, and Vault never keeps your data. The app base64-encodes the plaintext, receives ciphertext whose vault:v1: prefix names the key version used, and stores that ciphertext in its own database. Option B is the common misunderstanding that transit is storage, which it is not. Option C would defeat the whole point by handing the key to the app. Option D reverses the rule, since base64 is required so binary data survives the JSON API.
Vault docs: Transit secrets engineAn application reads a password from KV version 2 at secret/data/app/db. A developer copies the lease information from the response, runs vault lease renew, and gets an error saying the lease is not found. Why does this happen?
- AKV v2 holds static secrets, so the read creates no tracked lease. Only dynamic secrets, such as those from the database, AWS or PKI engines, come with a renewable lease_id.✓
- BThe token is missing the update capability on sys/leases/renew, so Vault reports the lease as missing.
- CKV v2 leases exist but can only be extended with vault kv rollback.
- DThe KV v2 mount has no max_lease_ttl set, so its leases expire the moment they are created.
Correct answer: A — KV v2 holds static secrets, so the read creates no tracked lease. Only dynamic secrets, such as those from the database, AWS or PKI engines, come with a renewable lease_id.
Vault tracks a lease only when it generated the credential and can revoke it later. KV v1 and KV v2 store values you gave Vault, so nothing is generated and nothing is leased; the value stays until you change it. Option B describes a different error message, since a permission problem returns 403 and not a missing lease. Option C is wrong because vault kv rollback moves a secret back to an earlier version and has nothing to do with leases. Option D invents behaviour that a missing mount tuning value does not cause.
Vault docs: Lease, Renew, and RevokeA daemon runs for months on a virtual machine. It logs in once and renews its token every hour. After 32 days the token stops working, because the auth role sets max_ttl to 768h. The team wants the daemon to keep running without a restart, with the LEAST impact on other workloads. What should they do?
- ARaise max_lease_ttl in the Vault server configuration to 87600h so every token in the cluster can live for ten years.
- BSwitch the daemon to a batch token, because batch tokens are not bound by a maximum TTL.
- CSet a period on the auth role so it issues a periodic token, which can be renewed forever as long as each renewal happens inside the period.✓
- DHave the daemon create a child token from its own token every 30 days and use the child from then on.
Correct answer: C — Set a period on the auth role so it issues a periodic token, which can be renewed forever as long as each renewal happens inside the period.
A periodic service token is not capped by a max TTL; it only has to be renewed within its period, which makes it the standard answer for a long-running daemon. Option A only pushes the wall further away, still ends in expiry, and loosens limits for every other workload in the cluster. Option B is wrong because a batch token has a fixed TTL and cannot be renewed at all. Option D fails because child tokens are revoked when the parent is revoked, so the whole chain dies when the original token hits max_ttl.
Vault docs: TokensA KV version 2 secrets engine is mounted at secret/. A developer is attached to the policy below. The developer can run `vault kv get secret/apps/billing/db` and gets the value, but in the Vault UI the billing folder appears empty and `vault kv list secret/apps/billing` returns a permission denied error. Which change fixes the problem with the LEAST extra privilege?
path "secret/data/apps/billing/*" {
capabilities = ["read"]
}- AAdd the list capability to the existing secret/data/apps/billing/* rule.
- BChange the rule path to secret/* and grant read, list and sudo.
- CGrant read and list on sys/mounts so the UI can enumerate the secrets engine.
- DAdd a second rule granting the list capability on secret/metadata/apps/billing/*.✓
Correct answer: D — Add a second rule granting the list capability on secret/metadata/apps/billing/*.
KV version 2 rewrites paths: secret values live under secret/data/<path>, but key names are served from secret/metadata/<path>, so listing and UI browsing need the list capability on the metadata path. Option A is the classic trap; a LIST request is never sent to secret/data, so adding list there changes nothing. Option B does work but hands the developer every secret in the mount plus sudo, which is far more privilege than the task needs. Option C only affects whether the mount itself shows up, not whether the keys inside the billing folder can be listed.
KV secrets engine - version 2A new operator is learning how sealing and unsealing work on a self-managed Vault cluster that uses Shamir key shares. Which TWO statements are correct? (Select TWO.)
- Avault operator seal needs a valid Vault token, and that token's policy must grant the sudo capability on the sys/seal path.✓
- Bvault operator unseal needs a root token in addition to the unseal key shares.
- CSealing the cluster discards the key shares, so the operator must run vault operator init again before it can be unsealed.
- Dvault operator unseal needs no token at all, because Vault cannot authenticate anyone while it is sealed.✓
- EAnyone holding a single unseal key share can run vault operator seal without logging in first.
Correct answer: A, D — vault operator seal needs a valid Vault token, and that token's policy must grant the sudo capability on the sys/seal path. · vault operator unseal needs no token at all, because Vault cannot authenticate anyone while it is sealed.
Sealing is a privileged API call on sys/seal, so it needs an authenticated token whose policy grants sudo on that path, which is why holding an unseal share alone is not enough and option E is wrong. Unsealing is the opposite case: while Vault is sealed it cannot read its own storage, so no auth method and no policy engine exist yet, and unseal is served unauthenticated to whoever supplies enough valid key shares, which also rules out option B. Sealing only drops the in-memory encryption key and refuses requests until enough shares are entered again; it does not touch the key shares or the data, so re-initialising as in option C would in fact destroy the cluster.
Seal/UnsealTeams keep settings in KV v2 under secret/data/teams/<team-name>/config. An auditor policy must allow reading the config key of every team, and nothing else inside a team folder. Which path rule meets this requirement?
- Apath "secret/data/teams/*/config"
- Bpath "secret/data/teams/+/config"✓
- Cpath "secret/data/teams/*"
- Dpath "secret/data/teams/config/+"
Correct answer: B — path "secret/data/teams/+/config"
The + wildcard matches exactly one path segment and can sit anywhere in the path, so secret/data/teams/+/config matches every team's config key and nothing else. The * glob is only a wildcard when it is the LAST character of the path, so option A does not behave as a wildcard at all. Option C matches everything under teams, which is far more than the requirement. Option D has the segments in the wrong order and would match paths under a team named config.
Vault docs: PoliciesA database server is being decommissioned and is already switched off. Vault still holds thousands of active leases from the mount path database/creds/reporting, and the security team must clear them out of Vault today. Which TWO statements are correct? (Select TWO.)
- Avault lease revoke -prefix database/creds/reporting will finish right away, because Vault skips any secrets engine that does not answer.
- Bvault lease revoke -force -prefix database/creds/reporting removes the lease records from Vault without waiting for the database to confirm, so it succeeds while the server is offline.✓
- CThe -force flag works on a single lease ID and does not need -prefix.
- DAfter a forced revoke the database accounts still exist, so an operator has to delete them by hand once the server is reachable.✓
- EA forced revoke also revokes every token that was used to create those leases.
Correct answer: B, D — vault lease revoke -force -prefix database/creds/reporting removes the lease records from Vault without waiting for the database to confirm, so it succeeds while the server is offline. · After a forced revoke the database accounts still exist, so an operator has to delete them by hand once the server is reachable.
A normal prefix revoke asks the database secrets engine to drop each user, so with the server down it fails and Vault keeps retrying, which is why option A is wrong. Adding -force tells Vault to delete its own lease records and ignore errors from the backend, which is the only way to clear them while the database is unreachable. The cost is stated in option D: Vault forgets the credentials but the accounts remain in the database, so cleanup becomes a manual job. Option C is wrong because -force must be used together with -prefix, and option E is wrong because revoking leases does not revoke the tokens that requested them.
Vault docs: Lease, Renew, and RevokeAn engineer logs in to Vault two ways: with LDAP from the terminal and with OIDC from the web UI. Right now the two logins produce different access. The security team wants one identity for this engineer so the same policies apply to both logins and show up as identity_policies on either token. Which TWO actions meet this requirement? (Select TWO.)
- ACreate one entity per auth method and let Vault merge them automatically, because Vault joins entities that share an email address.
- BCreate a single identity entity for the engineer and add two aliases to it: one using the LDAP mount accessor and one using the OIDC mount accessor.✓
- CGive both entities the same alias name, since one alias can be linked to more than one entity at the same time.
- DAttach the shared policies to the entity, or to an identity group that contains the entity, so both logins inherit them.✓
- EDisable the OIDC auth method so only LDAP can issue tokens for this engineer.
Correct answer: B, D — Create a single identity entity for the engineer and add two aliases to it: one using the LDAP mount accessor and one using the OIDC mount accessor. · Attach the shared policies to the entity, or to an identity group that contains the entity, so both logins inherit them.
An entity is the person; an alias is that person as seen by one auth mount, so two logins need two aliases on one entity, each tied to its own mount accessor. Policies placed on the entity or on an identity group are added to any token created through those aliases and appear as identity_policies. Option A is wrong because Vault does not merge entities on its own, and option C is wrong because an alias maps to exactly one entity for a given mount accessor. Option E removes a working login instead of fixing the identity model.
Vault docs: IdentityA team overwrote a production secret by mistake and lost the old value. They now want three things: keep previous versions, stop two people from overwriting each other blindly, and be able to undo a delete. Which option meets all three requirements?
- AKV version 1, which keeps the last ten versions of every key by default.
- BKV version 2, but note that vault kv delete wipes the data for good, so recovery needs a backup restore.
- CKV version 2, which keeps versions, supports check-and-set writes, and treats vault kv delete as a soft delete that vault kv undelete can reverse.✓
- DKV version 1 with vault kv rollback to move a key back to an earlier version.
Correct answer: C — KV version 2, which keeps versions, supports check-and-set writes, and treats vault kv delete as a soft delete that vault kv undelete can reverse.
Only KV v2 offers all three behaviours: version history, check-and-set so a write fails unless it names the version it expects, and a soft delete that undelete can bring back. vault kv destroy is the permanent one, which is why option B is wrong about delete. Options A and D both credit KV v1 with features it does not have; KV v1 stores a single value per key, with no version history and no rollback.
Vault docs: KV secrets engine version 2A team has finished the initial setup of a new Vault cluster. They used the initial root token to enable auth methods and write policies. Company rules say no root token may exist during normal operation, but the team still needs a way to get one during an emergency. Which approach meets both requirements?
- AKeep the initial root token in the company password manager, because `vault operator generate-root` only works before Vault is initialized.
- BRevoke the initial root token now. If a root token is needed later, run `vault operator generate-root`, which issues a one-time password, requires a threshold of unseal key holders to each supply a share, and returns an encoded token that is decoded with the OTP.✓
- CWrite the initial root token into the KV secrets engine and give a break-glass policy read access to that path.
- DRevoke the initial root token and, when one is needed, have any administrator run `vault token create -policy=root`.
Correct answer: B — Revoke the initial root token now. If a root token is needed later, run `vault operator generate-root`, which issues a one-time password, requires a threshold of unseal key holders to each supply a share, and returns an encoded token that is decoded with the OTP.
HashiCorp's guidance is to use the initial root token only for setup and then revoke it, because the generate-root workflow can always produce a new one. That workflow deliberately needs a quorum: the unseal (or recovery) key holders each enter their share, and only the person holding the OTP or PGP key can decode the resulting token. Option A is wrong because generate-root is designed for a running, unsealed cluster. Option C keeps a root token alive forever and just moves it, which is what the policy forbids. Option D fails because a root token cannot be minted by an ordinary token; creating a token with the root policy itself requires root or sudo rights.
vault operator generate-rootA Kubernetes Deployment named orders-api reads its database user and password from a Secret through envFrom. Vault Secrets Operator keeps that Secret up to date with the manifest below. The team confirms the Kubernetes Secret holds the new credentials after each rotation, but the pods keep using the old password until someone restarts them by hand. Which change fixes this with the LEAST operational overhead?
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultDynamicSecret
metadata:
name: orders-db
namespace: apps
spec:
vaultAuthRef: vault-auth
mount: database
path: creds/orders-role
destination:
name: orders-db-creds
create: true- ALower renewalPercent on the VaultDynamicSecret so the operator renews the lease sooner.
- BReplace the VaultDynamicSecret with a VaultStaticSecret, because only static secrets update a running Deployment.
- CAdd spec.rolloutRestartTargets with kind: Deployment and name: orders-api, so the operator restarts the Deployment whenever the Secret changes.✓
- DMount the Secret as a volume instead of using envFrom and let the kubelet refresh the file in place.
Correct answer: C — Add spec.rolloutRestartTargets with kind: Deployment and name: orders-api, so the operator restarts the Deployment whenever the Secret changes.
Kubernetes injects environment variables only when a container starts, so updating the Secret can never change what a running pod already has. rolloutRestartTargets tells Vault Secrets Operator to trigger a rolling restart of the named Deployment, StatefulSet or DaemonSet after it writes new data into the Secret, and the fresh pods read the new password. Changing renewalPercent only changes when the operator refreshes the credential; the Secret was already correct, so this fixes nothing. A VaultStaticSecret has the same restart problem and would also lose the per-workload dynamic credentials. Mounting the Secret as a volume does let the kubelet refresh the file, but the process already read its configuration at start-up and still has to be restarted.
Vault Secrets OperatorA team runs the database secrets engine at the path database/. Credentials from this mount must last 1 hour by default and 24 hours at most. Every other secrets engine on the cluster must keep the current defaults. The rule must apply to all roles on the mount, including roles added later, and the cluster cannot be restarted. Which approach meets the requirement with the LEAST operational overhead?
- AEdit default_lease_ttl and max_lease_ttl in the server config file and restart every Vault node.
- BSet default_ttl and max_ttl on each database role, and update the list whenever someone adds a role.
- CDisable the database secrets engine and enable it again with the new lease flags.
- DRun vault secrets tune -default-lease-ttl=1h -max-lease-ttl=24h database/.✓
Correct answer: D — Run vault secrets tune -default-lease-ttl=1h -max-lease-ttl=24h database/.
vault secrets tune changes the lease settings of one mount, takes effect at once, and needs no restart. Every role on that mount, now and in the future, inherits the tuned values. Editing default_lease_ttl and max_lease_ttl in the config stanza sets them for the whole server, hits all other mounts, and needs a restart of each node. Setting the TTLs role by role works but is manual work that must be repeated for every new role. Disabling and re-enabling the engine does accept the flags, but it revokes existing leases and throws away the connection and role configuration.
vault secrets tuneAn on-premises Vault cluster using integrated storage and Shamir seal is restarted after an operating system patch. Applications now fail with an error saying Vault is sealed. Which statement correctly describes what must happen next?
- AVault always starts sealed. A threshold number of unseal key holders must each run `vault operator unseal` with their own share until the threshold is reached; the shares are not tokens and cannot be used to authenticate or read secrets.✓
- BVault started sealed because its storage is empty after the restart, so the operators must run `vault operator init` again to recreate the cluster.
- COne unseal key holder runs `vault operator unseal` once with any single share, which is enough to unseal the node.
- DAn operator exports one unseal key as VAULT_TOKEN, logs in with it, and then unseals the cluster from the CLI.
Correct answer: A — Vault always starts sealed. A threshold number of unseal key holders must each run `vault operator unseal` with their own share until the threshold is reached; the shares are not tokens and cannot be used to authenticate or read secrets.
On start-up Vault has the encrypted data but not the key to decrypt it, so it comes up sealed. Each key holder submits their own share separately, and only when the configured threshold is met can Vault reconstruct the key that decrypts its root key and start serving requests. Option B is wrong and dangerous: init on an initialized cluster fails, and treating it as a fresh install would suggest destroying data. Option C ignores the whole point of Shamir, which is that no single share unseals anything. Option D confuses two different things: unseal keys unlock the storage, while a token authenticates a client, and one can never be used as the other.
Seal/UnsealA company discovers that an application token has leaked. During its lifetime that token read dynamic PostgreSQL credentials from the database secrets engine and created two child tokens for worker processes. The security team must cut off the leaked token, both child tokens and the database users it generated, as FAST as possible with a single action. What should they do?
- ARun `vault lease revoke -prefix database/creds/` to revoke every lease issued by the database mount.
- BSeal the Vault cluster so that no request can be served while the incident is investigated.
- CRotate the AppRole SecretID that the application used to log in.
- DRun `vault token revoke` against the leaked token.✓
Correct answer: D — Run `vault token revoke` against the leaked token.
Revoking a token revokes its entire tree: the token itself, every child token below it, and every lease that any of those tokens created. Vault therefore drops the dynamic PostgreSQL users as part of the same call. A revokes the leases but leaves the leaked token and its children alive, and it also destroys credentials belonging to every other application on that mount. B stops all work for everyone and revokes nothing; after unsealing, the leaked token still works. C only blocks future logins, while the token already issued keeps working until its TTL runs out. Use `vault token revoke -mode=orphan` only when you deliberately want the child tokens to survive.
Leases, renewal, and revocationA company's CI pipeline logs in to Vault with the AppRole auth method. A build job printed the SecretID into a build log that many people can read. An attacker took that SecretID and logged in again after the pipeline had finished. The team must make sure that a SecretID which leaks this way cannot be used a second time. Which change to the AppRole role is the MOST effective?
- ASet secret_id_ttl to 60s on the role.
- BSet secret_id_num_uses to 1 on the role.✓
- CSet secret_id_bound_cidrs to the CI runner subnet.
- DSet token_num_uses to 1 on the role.
Correct answer: B — Set secret_id_num_uses to 1 on the role.
secret_id_num_uses is the only setting that caps how many times a single SecretID can be exchanged for a token. With a value of 1 the pipeline consumes the SecretID on its own login, and the copy in the log is already dead when the attacker tries it. secret_id_ttl only shortens the window: inside that window the same SecretID still works, and it can be replayed many times. secret_id_bound_cidrs is good defence in depth, but it limits where the SecretID can be used, not how often, and a shared CI runner range is exactly where the attacker is likely to be. token_num_uses limits the token that login returns, not the SecretID, so a fresh login still succeeds.
AppRole auth methodA company must move a legacy application running on Kubernetes off hard-coded credentials. The container image cannot be rebuilt, and the application reads its configuration only from environment variables. The credentials live at a KV version 2 path in Vault and are rotated every 30 days. Which approach meets the requirement with the LEAST operational overhead?
- AUse the Vault Agent Injector to render the secret to `/vault/secrets/config` and change the container entrypoint to source that file before the application starts.
- BUse the Vault CSI provider with a `SecretProviderClass` so the secret is mounted as a file under `/mnt/secrets-store`.
- CUse the Vault Secrets Operator with a `VaultStaticSecret` that writes to a Kubernetes Secret, then reference that Secret from the Deployment with `envFrom.secretRef`.✓
- DAdd an init container that runs `vault kv get` and writes the values into a ConfigMap that the Deployment reads.
Correct answer: C — Use the Vault Secrets Operator with a `VaultStaticSecret` that writes to a Kubernetes Secret, then reference that Secret from the Deployment with `envFrom.secretRef`.
The Vault Secrets Operator syncs Vault data into a native Kubernetes Secret and keeps it current as the values rotate, so the Deployment can load them as environment variables with `envFrom.secretRef` and the image is never touched. A and B both deliver the secret as a file, which this application cannot read, and A also needs the entrypoint change that the question rules out. D stores credentials in a ConfigMap, which is not meant for sensitive data, and adds a custom job that has to run again after every rotation.
Vault Secrets OperatorAn operator creates a token for a nightly batch job by running `vault token create -ttl=24h -policy=batch`. Last night the operator's own token was revoked during an offboarding cleanup, and the batch job failed immediately with permission denied even though its token still had many hours of TTL left. Which explanation and fix is correct?
- AThe batch token silently inherited the operator's remaining TTL. Create it again with a longer explicit `-ttl` value.
- BThe batch token lost its policy when the operator's entity was deleted. Attach the `batch` policy to an identity group instead.
- CThe batch token was a child of the operator's token, and revoking a parent revokes every child. Let the job log in to an AppRole mount itself, because tokens returned by an auth method login are orphan tokens with no parent.✓
- DThe batch token exceeded the token mount's `max_lease_ttl`. Tune the token auth mount to raise `max_lease_ttl`.
Correct answer: C — The batch token was a child of the operator's token, and revoking a parent revokes every child. Let the job log in to an AppRole mount itself, because tokens returned by an auth method login are orphan tokens with no parent.
A token created with `vault token create` becomes a child of the token that called the endpoint, and revoking a parent revokes the whole subtree beneath it. Tokens issued by an auth method login, such as AppRole or Kubernetes, are orphan tokens, so no other token can take them away; the same effect is available from `vault token create -orphan`, which needs `sudo` on `auth/token/create-orphan`. A and D both describe TTL limits, which would have failed the job at a predictable clock time rather than at the exact moment the operator's token was revoked. B is wrong because a token carries its own list of policies; deleting an entity does not strip them.
Vault tokensA platform team uses response wrapping to pass an AppRole SecretID to a newly started application. A security reviewer asks where the wrapped value is stored inside Vault and who is able to read it. Which statement is correct?
- AThe value is stored in the cubbyhole of a single-use wrapping token, and only the holder of that token can unwrap it. No other token can read that cubbyhole, not even a root token.✓
- BThe value is written under secret/ in the KV v2 engine, so any token with read on secret/data/* can retrieve it before the application does.
- CThe value is stored in the cubbyhole of the token that created the wrap, and an operator with a root token can read it for auditing.
- DThe value is held only in the memory of the Vault node that served the request and is lost if that node fails over.
Correct answer: A — The value is stored in the cubbyhole of a single-use wrapping token, and only the holder of that token can unwrap it. No other token can read that cubbyhole, not even a root token.
Response wrapping puts the payload in the cubbyhole of a brand new wrapping token with a short TTL. Cubbyhole storage is scoped to one token: no other token can reach it, root included, and the contents are destroyed when the token is used or expires. That is what makes the pattern useful, since an unwrap by anyone but the intended app is detected immediately because the token is single use. B is wrong because wrapped data never lands in the KV engine, C is wrong because root has no special path into another token's cubbyhole, and D is wrong because the cubbyhole is written to the storage backend like any other data.
Cubbyhole secrets engineA platform team delivers bootstrap secrets to new machines by wrapping the response with `vault kv get -wrap-ttl=5m secret/bootstrap` and passing the returned token to the machine, which calls `vault unwrap`. Which TWO statements about this workflow are correct? (Select TWO.)
- AThe `-wrap-ttl` flag encrypts the secret with the transit secrets engine before the CLI returns it.
- BThe response is stored in the cubbyhole of a newly created single-use token, so the value can only be retrieved by presenting that wrapping token.✓
- CThe wrapping token carries the same policies as the token that asked for the wrap, so it can also be used to read other paths.
- D`vault unwrap` returns the wrapping token's creation time and remaining TTL without consuming the token.
- EA wrapping token can be unwrapped only once, so an unwrap that fails for the intended consumer is a strong signal that someone else already read the response.✓
Correct answer: B, E — The response is stored in the cubbyhole of a newly created single-use token, so the value can only be retrieved by presenting that wrapping token. · A wrapping token can be unwrapped only once, so an unwrap that fails for the intended consumer is a strong signal that someone else already read the response.
Response wrapping stores the response in the cubbyhole of a brand new single-use token and hands the caller only that token, so whoever holds the token is the only party who can retrieve the value. Because the token is single use, an unwrap that fails tells the consumer the payload was already taken and the secret must be treated as compromised. A is wrong: wrapping does not involve the transit engine, and the value stays inside Vault. C is wrong because a wrapping token has no policies beyond unwrapping its own payload. D describes the wrong endpoint — `sys/wrapping/lookup` reports creation time and TTL without consuming the token, while `vault unwrap` always consumes it.
Response wrappingA security engineer is reviewing Vault policies before they go to production and wants to confirm how policy capabilities map to API requests. Which TWO statements are correct? (Select TWO.)
- AThe create capability maps to HTTP GET requests against paths that do not exist yet.
- BThe list capability maps to LIST requests and does not by itself allow a client to read the value of a secret.✓
- CEvery endpoint under sys/ requires the sudo capability in addition to read or update.
- DThe patch capability maps to HTTP PATCH requests and allows a partial update of a KV v2 secret; a policy that grants only update cannot make a PATCH request.✓
- EThe sudo capability on its own grants access to every path in Vault, including root-protected endpoints.
Correct answer: B, D — The list capability maps to LIST requests and does not by itself allow a client to read the value of a secret. · The patch capability maps to HTTP PATCH requests and allows a partial update of a KV v2 secret; a policy that grants only update cannot make a PATCH request.
Capabilities map to HTTP verbs: create and update to POST/PUT, read to GET, delete to DELETE, list to LIST, and patch to PATCH. So B and D are correct: list only returns key names, and a partial update needs the patch capability because update does not cover the PATCH verb. A is wrong because create maps to a write, not a GET. C is wrong because only root-protected sys/ endpoints such as sys/seal, sys/rotate and sys/raw need sudo, not the whole sys/ tree. E is wrong because sudo is never granted alone; it is added next to read or update to reach a root-protected path and grants nothing by itself.
Vault policiesA company keeps one wildcard TLS certificate and its private key in the KV secrets engine. Around forty services read the same key at start-up, and the certificate is valid for one year. Security wants to reduce the damage if that private key ever leaks. Which approach is MOST secure?
- AKeep the certificate in KV v2 and rely on versioning with check-and-set so an old version can be restored after an incident.
- BEnable the PKI secrets engine, create a role with a short max_ttl, and have each service request its own certificate at start-up.✓
- CKeep the certificate in KV but encrypt it with the transit engine before writing it, and decrypt it in each service.
- DMove the certificate into cubbyhole so that only one token at a time can read it.
Correct answer: B — Enable the PKI secrets engine, create a role with a short max_ttl, and have each service request its own certificate at start-up.
The PKI engine issues a unique, short-lived certificate and private key to each service on demand, so a leaked key is useful only until it expires, it can be traced to one workload, and Vault can revoke it. Option A does nothing about exposure; versioning helps you roll back, not contain a leak. Option C still ends with the same long-lived key sitting in the memory of forty services, and it adds a decrypt call for no real gain. Option D breaks the use case, because a cubbyhole belongs to a single token and cannot be shared by many services.
PKI secrets engineA company enables the LDAP auth method so engineers can log in to Vault with their corporate username and password. An engineer logs in, then reads a secret ten minutes later. Which statement BEST describes how Vault decides what that engineer may do, and for how long?
- AVault stores the LDAP password and replays it to the LDAP server on every request to confirm the engineer still has access.
- BThe LDAP auth method checks each later API call against the engineer's LDAP groups before Vault allows the read.
- CThe auth method only verifies the login and hands back a Vault token. That token carries the policies and the TTL, and Vault checks the token on every later call.✓
- DPolicies and TTL belong to the LDAP mount, so Vault reads them from the mount configuration on each request instead of from the token.
Correct answer: C — The auth method only verifies the login and hands back a Vault token. That token carries the policies and the TTL, and Vault checks the token on every later call.
An auth method has one job: turn an external identity (LDAP, OIDC, AppRole, Kubernetes) into a Vault token. Everything after login is authorized from the token, which holds the policy list and the TTL. Option B and option D both put the enforcement back on the auth method or the mount; the mount configuration only decides which policies go on to the new token, it is not consulted per request. Option A is wrong because Vault never keeps the user's password for replay.
Vault docs: AuthenticationTwo teams share one Vault Community Edition cluster. The payments team and the analytics team each need their own KV version 2 store, and neither team may read the other's data. Namespaces are not available on this edition. Which approach meets the requirement with the LEAST operational overhead?
- AEnable one KV version 2 engine at `secret/`, give both teams a policy on `secret/*`, and ask each team to stay inside its own prefix.
- BRun a second Vault cluster so that each team has its own storage backend.
- CEnable the KV version 2 engine twice, once with `-path=payments` and once with `-path=analytics`, and write one policy per team scoped to that mount.✓
- DEnable one KV version 2 engine at `secret/` and create a separate token auth role for each team.
Correct answer: C — Enable the KV version 2 engine twice, once with `-path=payments` and once with `-path=analytics`, and write one policy per team scoped to that mount.
A secrets engine is mounted at a path, and a path can only be used once, which is why a second `vault secrets enable` fails with "path is already in use" unless you pass `-path`. Mounting KV v2 twice gives each team its own mount, its own data and a short policy on `payments/*` or `analytics/*`, all on one cluster. A depends on good behaviour instead of policy, so either team can read the other's secrets. B doubles the work of running, unsealing, upgrading and backing up Vault. D is wrong because access is decided by the policies on the token, not by which role issued it — both roles would still reach the same paths.
KV secrets engine version 2Ready to try it under exam conditions?
Reading answers is not the same as recalling them with a clock running. Take the same 57 questions as a timed mock exam — 60 minutes, no feedback until you submit, then a score broken down by exam domain so you know what to study.
Start the timed 003 test →