mirror of
https://github.com/hanzoai/vault.git
synced 2026-10-30 18:18:35 +00:00
- AES-256-GCM encryption with envelope key management (HSM-ready) - Token generation with PAN fingerprinting and brand detection - RBAC authorization (tokenizer, operator, key admin, auditor roles) - Immutable audit logging for all vault operations - Card storage with multi-tenant isolation - HTTP API: tokenize, detokenize, metadata, delete, rotate - Comprehensive test suite (19 tests, all passing) Production TODOs: HSM backend, PostgreSQL storage, mTLS, append-only audit DB
87 lines
2.0 KiB
Go
87 lines
2.0 KiB
Go
// Package auth provides authentication and authorization for the vault service.
|
|
package auth
|
|
|
|
import (
|
|
"errors"
|
|
)
|
|
|
|
var (
|
|
ErrUnauthorized = errors.New("vault/auth: unauthorized")
|
|
ErrForbidden = errors.New("vault/auth: forbidden")
|
|
)
|
|
|
|
// Role defines access levels for vault operations.
|
|
type Role string
|
|
|
|
const (
|
|
// RoleTokenizer can tokenize and get metadata. Cannot detokenize.
|
|
RoleTokenizer Role = "tokenizer"
|
|
|
|
// RoleOperator can tokenize, detokenize, and manage cards.
|
|
RoleOperator Role = "operator"
|
|
|
|
// RoleKeyAdmin can manage encryption keys. Cannot access card data.
|
|
RoleKeyAdmin Role = "key_admin"
|
|
|
|
// RoleAuditor can read audit logs. Cannot access card data or keys.
|
|
RoleAuditor Role = "auditor"
|
|
)
|
|
|
|
// Operation defines a vault operation that requires authorization.
|
|
type Operation string
|
|
|
|
const (
|
|
OpTokenize Operation = "tokenize"
|
|
OpDetokenize Operation = "detokenize"
|
|
OpDelete Operation = "delete"
|
|
OpRotate Operation = "rotate"
|
|
OpMetadata Operation = "metadata"
|
|
OpKeyGenerate Operation = "key_generate"
|
|
OpKeyRotate Operation = "key_rotate"
|
|
OpKeyDestroy Operation = "key_destroy"
|
|
OpAuditRead Operation = "audit_read"
|
|
)
|
|
|
|
// permissions maps roles to allowed operations.
|
|
var permissions = map[Role]map[Operation]bool{
|
|
RoleTokenizer: {
|
|
OpTokenize: true,
|
|
OpMetadata: true,
|
|
OpDelete: true,
|
|
},
|
|
RoleOperator: {
|
|
OpTokenize: true,
|
|
OpDetokenize: true,
|
|
OpDelete: true,
|
|
OpRotate: true,
|
|
OpMetadata: true,
|
|
},
|
|
RoleKeyAdmin: {
|
|
OpKeyGenerate: true,
|
|
OpKeyRotate: true,
|
|
OpKeyDestroy: true,
|
|
},
|
|
RoleAuditor: {
|
|
OpAuditRead: true,
|
|
},
|
|
}
|
|
|
|
// Authorize checks if a role is allowed to perform an operation.
|
|
func Authorize(role Role, op Operation) error {
|
|
ops, ok := permissions[role]
|
|
if !ok {
|
|
return ErrForbidden
|
|
}
|
|
if !ops[op] {
|
|
return ErrForbidden
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Identity represents an authenticated caller.
|
|
type Identity struct {
|
|
Subject string `json:"sub"` // service or user ID
|
|
TenantId string `json:"tenantId"` // which tenant
|
|
Role Role `json:"role"` // RBAC role
|
|
}
|