HashiCorp Vault — Userpass & LDAP
Userpass and LDAP are human-friendly auth methods. Userpass stores credentials in Vault; LDAP validates against an external directory.
Userpass Auth Method
Enable Userpass
vault auth enable userpass
Create Users
# Create a user with policies
vault write auth/userpass/users/alice \
password="alice-password" \
policies="dev-team" \
token_ttl=8h \
token_max_ttl=24h
vault write auth/userpass/users/bob \
password="bob-password" \
policies="ops-team,dev-team" \
token_ttl=8h
Login
# Login via CLI
vault login -method=userpass username=alice password=alice-password
Expected output:
Success! You are now authenticated. The token information displayed below
is already stored in the token helper.
Key Value
--- -----
token hvs.CAESI...
token_accessor abc123
token_duration 8h
token_renewable true
token_policies ["default", "dev-team"]
identity_policies []
policies ["default", "dev-team"]
token_meta_username alice
Login via API
curl -s --request POST \
--data '{"password": "alice-password"}' \
"$VAULT_ADDR/v1/auth/userpass/login/alice" | jq
Manage Users
# List users
vault list auth/userpass/users
# Read user config
vault read auth/userpass/users/alice
# Update password
vault write auth/userpass/users/alice password="new-password"
# Update policies
vault write auth/userpass/users/alice policies="admin-team"
# Delete user
vault delete auth/userpass/users/bob
LDAP Auth Method
LDAP authenticates users against an external LDAP directory (Active Directory, OpenLDAP, etc.).
Enable LDAP
vault auth enable ldap
Configure LDAP Connection
# Configure LDAP (Active Directory example)
vault write auth/ldap/config \
url="ldaps://ldap.example.com:636" \
userdn="OU=Users,DC=example,DC=com" \
groupdn="OU=Groups,DC=example,DC=com" \
userattr="sAMAccountName" \
groupattr="cn" \
groupfilter="(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={{.UserDN}}))" \
binddn="CN=vault-svc,OU=Service Accounts,DC=example,DC=com" \
bindpass="service-account-password" \
certificate=@ldap-ca.pem \
insecure_tls=false \
starttls=false
# Configure LDAP (OpenLDAP example)
vault write auth/ldap/config \
url="ldaps://ldap.example.com:636" \
userdn="ou=People,dc=example,dc=com" \
groupdn="ou=Groups,dc=example,dc=com" \
userattr="uid" \
groupattr="cn" \
groupfilter="(|(memberUid={{.Username}})(member={{.UserDN}}))" \
binddn="cn=admin,dc=example,dc=com" \
bindpass="admin-password"
Map LDAP Groups to Policies
# Map "engineering" LDAP group to Vault policies
vault write auth/ldap/groups/engineering policies="dev-team,deploy"
# Map "sre" group
vault write auth/ldap/groups/sre policies="ops-team,admin-read"
# Map specific users (overrides group policies)
vault write auth/ldap/users/alice policies="admin-team"
Login with LDAP
vault login -method=ldap username=alice
# Enter password at prompt
# Or non-interactively
vault login -method=ldap username=alice password=alice-ldap-pass
Userpass vs LDAP
| Feature | Userpass | LDAP |
|---|---|---|
| User store | Vault internal | External LDAP directory |
| Password management | Manual in Vault | Managed by LDAP/AD |
| Group mapping | Manual policy assignment | Automatic from LDAP groups |
| SSO integration | ❌ | ✅ (via AD/LDAP) |
| Best for | Dev/test, small teams | Enterprise with existing AD/LDAP |
| MFA support | Vault MFA | LDAP + Vault MFA |
Security Best Practices
| Practice | Why |
|---|---|
Use LDAP over TLS (ldaps://) |
Prevent credential sniffing |
| Use a dedicated service account for bind | Limit blast radius |
| Map LDAP groups (not individual users) | Easier management |
| Set token TTLs | Limit exposure of leaked tokens |
| Prefer OIDC over Userpass for humans | Better UX, supports MFA |
Quick Reference
| Command | Description |
|---|---|
vault auth enable userpass |
Enable userpass |
vault write auth/userpass/users/NAME password=PASS policies=POL |
Create user |
vault login -method=userpass username=NAME |
Login |
vault auth enable ldap |
Enable LDAP |
vault write auth/ldap/config url=URL ... |
Configure LDAP |
vault write auth/ldap/groups/GROUP policies=POL |
Map LDAP group |
vault login -method=ldap username=NAME |
LDAP login |
Next: AppRole