Chuyển đến nội dung chính

Bài 14: Policies - ACL, Sentinel và RBAC

Vault Policy system, HCL policy syntax, Path-based policies, Capabilities, Policy templates, Fine-grained control, Sentinel policies (Enterprise), EGP, RGP, testing.

🔒 DevSecOps — Bài 14 Bài 14: Policies - ACL, Sentinel và RBAC

HashiCorp Vault từ Cơ bản đến Nâng cao

Phần 3: Auth Methods - Xác thực và Ủy quyền

xdev.asia

1. Vault Policy System

Vault sử dụng policy-based access control để kiểm soát quyền truy cập. Mọi thao tác trên Vault đều phải được cho phép bởi một policy. Policies được viết bằng HCL (HashiCorp Configuration Language) hoặc JSON.

Nguyên tắc cơ bản

  • Default deny — mặc định mọi thứ bị từ chối trừ khi có policy cho phép

  • Path-based — policies gắn với API paths

  • Additive — nhiều policies gộp lại (union), quyền cao nhất thắng

  • deny wins — nếu bất kỳ policy nào deny → deny (trừ root)

Built-in Policies

PolicyMô tảCó thể xóa?
rootToàn quyền, bỏ qua mọi kiểm traKhông
defaultGán cho mọi token, cho phép basic operationsKhông (có thể sửa)

2. HCL Policy Syntax

Capabilities

CapabilityHTTP VerbMô tả
createPOSTTạo dữ liệu mới
readGETĐọc dữ liệu
updatePOST/PUTCập nhật dữ liệu
deleteDELETEXóa dữ liệu
listLISTLiệt kê keys
sudo—Cho phép thao tác trên root-protected paths
deny—Từ chối mọi truy cập (always wins)
patchPATCHPartial update (KV v2)

Ví dụ Policy cơ bản

# policy-dev-team.hcl

# Đọc secrets trong KV cho team dev
path "secret/data/dev/*" {
  capabilities = ["create", "read", "update", "delete", "list", "patch"]
}

path "secret/metadata/dev/*" {
  capabilities = ["list", "read", "delete"]
}

# Chỉ đọc secrets production
path "secret/data/production/*" {
  capabilities = ["read"]
}

# Sinh database credentials
path "database/creds/dev-readonly" {
  capabilities = ["read"]
}

# Không được truy cập admin paths
path "sys/*" {
  capabilities = ["deny"]
}

# Cho phép đọc health status
path "sys/health" {
  capabilities = ["read"]
}

# Self-management token
path "auth/token/lookup-self" {
  capabilities = ["read"]
}

path "auth/token/renew-self" {
  capabilities = ["update"]
}

Glob Patterns

# * khớp mọi ký tự trong một segment
path "secret/data/team-*" {
  capabilities = ["read"]
}
# Khớp: secret/data/team-alpha, secret/data/team-beta
# Không khớp: secret/data/team-alpha/sub

# + khớp ít nhất một segment (bao gồm /)
path "secret/data/team-alpha/+" {
  capabilities = ["read"]
}
# Khớp: secret/data/team-alpha/db, secret/data/team-alpha/api/keys

Fine-grained Control

# Cho phép tạo nhưng chỉ với parameters cụ thể
path "secret/data/production/db" {
  capabilities = ["create", "update"]
  allowed_parameters = {
    "data" = []   # Mọi giá trị
  }
  denied_parameters = {
    "data" = ["*root*", "*admin*"]  # Không cho key chứa root/admin
  }
}

# TTL constraints
path "database/creds/production" {
  capabilities = ["read"]
  min_wrapping_ttl = "5m"
  max_wrapping_ttl = "30m"
}

# Required parameters
path "auth/approle/role/*" {
  capabilities = ["create", "update"]
  required_parameters = ["token_policies", "secret_id_ttl"]
}

3. Policy Templates

Policy templates cho phép tạo dynamic policies sử dụng identity information:

# Mỗi user chỉ truy cập được KV path của mình
path "secret/data/users/{{identity.entity.name}}/*" {
  capabilities = ["create", "read", "update", "delete", "list"]
}

# Dựa trên metadata
path "secret/data/teams/{{identity.entity.metadata.team}}/*" {
  capabilities = ["create", "read", "update", "delete", "list"]
}

# Dựa trên group
path "secret/data/groups/{{identity.groups.names.*.id}}/*" {
  capabilities = ["read", "list"]
}

# Dựa trên auth method alias
path "secret/data/k8s/{{identity.entity.aliases.auth_kubernetes_abc123.metadata.service_account_namespace}}/*" {
  capabilities = ["read"]
}

4. Quản lý Policies

# Tạo/cập nhật policy từ file
vault policy write dev-team policy-dev-team.hcl

# Tạo policy từ stdin
vault policy write admin-policy - <<EOF
path "sys/*" {
  capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
path "secret/*" {
  capabilities = ["create", "read", "update", "delete", "list"]
}
EOF

# Liệt kê policies
vault policy list

# Đọc policy
vault policy read dev-team

# Xóa policy
vault policy delete dev-team

# Format/validate policy file
vault policy fmt policy-dev-team.hcl

# Test capabilities
vault token capabilities <token> secret/data/dev/app1
# create, delete, list, read, update

# Test capabilities của token hiện tại
vault token capabilities -self secret/data/dev/app1

5. RBAC Pattern với Vault Policies

Thiết kế RBAC cho tổ chức

# === Role: vault-admin ===
# policy-vault-admin.hcl
path "sys/*" {
  capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
path "auth/*" {
  capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}

# === Role: secrets-admin ===
# policy-secrets-admin.hcl
path "secret/*" {
  capabilities = ["create", "read", "update", "delete", "list"]
}
path "database/*" {
  capabilities = ["create", "read", "update", "delete", "list"]
}
path "pki/*" {
  capabilities = ["create", "read", "update", "delete", "list"]
}

# === Role: developer ===
# policy-developer.hcl
path "secret/data/dev/*" {
  capabilities = ["create", "read", "update", "delete", "list"]
}
path "database/creds/dev-*" {
  capabilities = ["read"]
}
path "pki/issue/dev-cert" {
  capabilities = ["create", "update"]
}

# === Role: operator ===
# policy-operator.hcl
path "secret/data/production/*" {
  capabilities = ["read"]
}
path "database/creds/prod-readonly" {
  capabilities = ["read"]
}
path "sys/health" {
  capabilities = ["read"]
}
path "sys/metrics" {
  capabilities = ["read"]
}

Gán policies cho Identity Groups

# Tạo internal group
vault write identity/group \
  name="platform-team" \
  policies="secrets-admin,vault-admin" \
  member_entity_ids="entity-uuid-1,entity-uuid-2"

# Tạo external group (map từ LDAP/OIDC)
vault write identity/group \
  name="developers" \
  type="external" \
  policies="developer"

# Map external group → LDAP group
vault write identity/group-alias \
  name="CN=Developers,OU=Groups,DC=company,DC=com" \
  mount_accessor="auth_ldap_abc123" \
  canonical_id="<group-id>"

6. Sentinel Policies (Enterprise)

Sentinel là policy-as-code framework của HashiCorp, cho phép tạo policies phức tạp hơn ACL bằng ngôn ngữ Sentinel. Sentinel policies có thể kiểm tra request context, time-of-day, IP address, và nhiều yếu tố khác.

Hai loại Sentinel Policies

LoạiMô tảScope
EGP (Endpoint Governing)Gắn với API path cụ thểMọi request đến path đó
RGP (Role Governing)Gắn với token / identityMọi request từ identity đó

EGP Example — Business Hours Only

# Chỉ cho phép truy cập production secrets trong giờ làm việc
import "time"
import "strings"

# Lấy thời gian hiện tại (UTC+7 cho Việt Nam)
current_hour = time.now.hour + 7
if current_hour >= 24 {
  current_hour = current_hour - 24
}

# Kiểm tra ngày trong tuần (1=Monday, 7=Sunday)
current_day = time.now.weekday

# Business hours: Mon-Fri, 7:00-19:00 ICT
is_business_hours = current_day >= 1 and current_day <= 5 and
                    current_hour >= 7 and current_hour < 19

# Cho phép nếu trong business hours hoặc là emergency path
main = rule {
  is_business_hours or
  strings.has_prefix(request.path, "secret/data/emergency/")
}
# Tạo EGP
vault write sys/policies/egp/business-hours \
  policy="$(cat business-hours.sentinel)" \
  enforcement_level="soft-mandatory" \
  paths="secret/data/production/*"

RGP Example — Request Validation

# Yêu cầu MFA cho operations trên production
import "mfa"
import "strings"

# Kiểm tra nếu path là production
is_production = strings.has_prefix(request.path, "secret/data/production/")

# Production operations cần MFA
main = rule when is_production {
  mfa.methods.totp.valid
}

Enforcement Levels

LevelHành vi khi fail
advisoryLog warning, vẫn cho phép
soft-mandatoryDeny, nhưng có thể override với sudo
hard-mandatoryDeny, không thể override

7. Policy Testing và Debugging

# Kiểm tra capabilities cụ thể
vault token capabilities -self secret/data/dev/app1

# Tạo test token với policy
vault token create -policy=dev-team -ttl=5m

# Test operations
VAULT_TOKEN="test-token" vault kv get secret/dev/app1
VAULT_TOKEN="test-token" vault kv put secret/dev/app1 key=value
VAULT_TOKEN="test-token" vault kv get secret/production/db  # Expect: permission denied

# Validate policy syntax
vault policy fmt -check policy-file.hcl

8. Tổng kết

  • ACL Policies — path-based, capabilities, glob patterns, fine-grained control

  • Policy Templates — dynamic policies sử dụng identity data

  • RBAC Pattern — group-based policy assignment cho organizational structure

  • Sentinel Policies (Enterprise) — policy-as-code cho complex business rules

Bài tiếp theo sẽ tìm hiểu Identity Secrets Engine, Entities, Groups và Multi-Factor Authentication — hoàn thiện bức tranh identity management trong Vault.