اعرف اللي قصادك. احمي أرضك.

HashiCorp Vault

منصة مركزية لإدارة الأسرار والبيانات الحساسة، توفر ميزات التشفير، والوصول المؤقت، وسجلات التدقيق الشاملة.

دفاعمفتوحة المصدرLinuxmacOSWindows
www.vaultproject.io

HashiCorp Vault — الدليل الكامل

يُعد Vault خادماً مركزياً لإدارة الأسرار (Secrets Management). يقوم بتخزين بيانات الاعتماد (Credentials)، الشهادات الرقمية (Certificates)، ومفاتيح التشفير (Encryption Keys)؛ كما يعمل كوسيط للأسرار الديناميكية (Dynamic Secrets) مثل بيانات دخول قاعدة البيانات لكل طلب، و AWS STS، و SSH OTP. يوفر Transit تشفيراً للبيانات بشكل فوري. يهدف Vault إلى استبدال ممارسة "تخزين الأسرار في متغيرات البيئة" (Secrets in env vars) بنظام وصول خاضع للسياسات (Policy-controlled) ومدقق بالكامل (Audited).

التثبيت والتشغيل (Install / Boot)

$ brew install vault
$ vault server -dev # وضع الاختبار الفوري في الذاكرة
$
# الإنتاج (Production)
$ vault server -config=/etc/vault.d/vault.hcl
$ vault operator init
$ vault operator unseal <key1>
$ vault operator unseal <key2>
$ vault operator unseal <key3>

خادم الإنتاج: يتكون عادةً من عنقود (Cluster) عالي التوفر (HA) مع واجهة خلفية (Backend) تعتمد على Raft أو Consul، مع تفعيل سجلات التدقيق (Audit logging)، والمصادقة متعددة العوامل (MFA)، ويتم فك قفل الخادم (Unseal) عبر نظام مشاركة الأسرار الخاص بـ Shamir (Shamir secret-sharing).

طرق المصادقة (Auth Methods)

الطريقةالاستخدام
tokenالافتراضية؛ رمز الجذر (Root token) + الرموز التابعة
userpassاسم المستخدم وكلمة المرور
ldapLDAP / Active Directory
oidcمزود الهوية (IdP) عبر OAuth/OIDC
kubernetesمصادقة الـ Pods عبر رموز حساب الخدمة (SA tokens)
approleهوية التطبيقات (RoleID + SecretID)
awsكيانات EC2 / IAM
azureالهويات المدارة (Managed identities)
gcpحساب الخدمة (Service-account)
certشهادة العميل (Client cert)
tls-certmTLS
tokenless OIDC for CIGitHub Actions OIDC
$ vault auth enable kubernetes
$ vault write auth/kubernetes/config kubernetes_host="https://kubernetes.default.svc"
$ vault write auth/kubernetes/role/myapp \
$ bound_service_account_names=myapp \
$ bound_service_account_namespaces=default \
$ policies=myapp-policy \
$ ttl=1h

محركات الأسرار (Secret Engines)

المحركالوظيفة
kv (v2)مفتاح-قيمة بسيط (Key-Value)
databaseبيانات اعتماد ديناميكية لقواعد البيانات (Postgres / MySQL / Mongo / إلخ)
awsمفاتيح وصول STS مع سياسة IAM مرفقة
azureكيانات الخدمة (Service principals) عند الطلب
gcpمفاتيح حسابات الخدمة / رموز OAuth
pkiإصدار شهادات X.509
sshبيانات SSH (OTP / Signed CA)
transit"التشفير كخدمة" (Encryption-as-a-service) عبر API
totpكلمات مرور لمرة واحدة تعتمد على الوقت
kubernetesإصدار رموز حساب خدمة مؤقتة
transformالتشفير مع الحفاظ على التنسيق (Format-preserving encryption)
$ vault secrets enable -path=secret kv-v2
$ vault kv put secret/myapp/db username=alice password=Pass1
$ vault kv get secret/myapp/db

السياسات — Sentinel / HCL (Policies)

سياسات Vault تُكتب بلغة HCL وتتضمن المسارات (Paths) والصلاحيات (Capabilities):

hcl
path "secret/data/myapp/*" {
  capabilities = ["read", "list"]
}

path "secret/data/admin/*" {
  capabilities = ["deny"]
}

path "transit/encrypt/myapp" {
  capabilities = ["update"]
}
$ vault policy write myapp-policy myapp.hcl
$ vault token create -policy=myapp-policy

بيانات اعتماد قاعدة البيانات الديناميكية

$ vault secrets enable database
$ vault write database/config/postgres \
$ plugin_name=postgresql-database-plugin \
$ connection_url="postgresql://{{username}}:{{password}}@db:5432/postgres" \
$ allowed_roles=myapp \
$ username=vault_admin \
$ password=...
$
$ vault write database/roles/myapp \
$ db_name=postgres \
$ creation_statements="CREATE ROLE \"{{name}}\" LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
$ default_ttl=1h max_ttl=24h
$ vault read database/creds/myapp
# username=v-app-myapp-A8s..., password=... (صالحة لمدة ساعة، ثم تُلغى تلقائياً)

يطلب التطبيق بيانات الاعتماد عند التشغيل؛ يقوم Vault بتأجيرها (Lease)؛ وعند انتهاء مدة الإيجار، يتم تدمير البيانات في قاعدة البيانات.

خدمة التشفير — Transit

$ vault secrets enable transit
$ vault write -f transit/keys/myapp
$ vault write transit/encrypt/myapp plaintext=$(echo "secret-data" | base64)
# يعيد النص المشفر: vault:v1:abc...
$
$ vault write transit/decrypt/myapp ciphertext=vault:v1:abc...
# يعيد النص الأصلي بصيغة base64

لا يمتلك التطبيق المفتاح أبداً؛ ويتولى Vault عملية تدوير المفاتيح (Cipher rotation).

البنية التحتية للمفاتيح العامة (PKI) — إصدار الشهادات

$ vault secrets enable pki
$ vault write pki/root/generate/internal common_name=corp.local ttl=87600h
$ vault write pki/roles/myapp \
$ allowed_domains=corp.local allow_subdomains=true \
$ max_ttl=720h
$
$ vault write pki/issue/myapp common_name=svc.corp.local ttl=240h
# يعيد الشهادة + المفتاح الخاص + سلسلة مرجع التصديق (CA chain)

سير العمل — حقن الأسرار في Kubernetes

  1. داخل العنقود: تثبيت Vault وتفعيل auth/kubernetes.
  2. إنشاء ربط دور (Role binding) يربط حساب خدمة الـ Pod بسياسة Vault.
  3. إضافة التوصيفات (Annotations) للـ Pod:
yaml
spec:
  template:
    metadata:
      annotations:
        vault.hashicorp.com/agent-inject: "true"
        vault.hashicorp.com/role: "myapp"
        vault.hashicorp.com/agent-inject-secret-db: "database/creds/myapp"

يقوم Vault Agent sidecar بحقن بيانات الاعتماد في المسار /vault/secrets/db. يحتاج الـ Pod فقط لتنفيذ أمر cat /vault/secrets/db.

تشخيص المشاكل (Bad output / Fixes)

العرضالحل
permission denied على مسار صحيحالرمز (Token) يفتقد للسياسة المرتبطة بالمسار؛ استخدم vault token lookup
حالة "مغلق" (Sealed) عند التشغيلأدخل مفاتيح فك القفل (Unseal keys)؛ استخدم التفكيك التلقائي عبر cloud KMS في الإنتاج
أخطاء lease expiredالتطبيق لا يجدد عقود الإيجار؛ استخدم Vault Agent أو المكتبات البرمجية الخاصة بـ Vault
سجل التدقيق مفقودقم بتفعيل جهاز التدقيق: vault audit enable file file_path=/var/log/vault/audit.log
ارتباك بين KV v1 و v2يتم استخدام الإصدار الثاني (v2) افتراضياً؛ المسارات تختلف (secret/data/x مقابل secret/x)

منظور المدافع (Defender Perspective)

يُعد Vault المكان الصحيح لكل ما هو سري. يفضل ربطه بـ:

  • سجلات التدقيق (Audit logging) مع نظام SIEM — جميع عمليات الوصول قابلة للاستعلام.
  • سياسات Sentinel (نسخة مدفوعة) لمنطق سياسات متقدم.
  • التدوير التلقائي (Auto-rotation) للأسرار الثابتة التي لا يمكن جعلها ديناميكية.

الأمن العملياتي (OPSEC)

  • رمز الجذر (Root token) مخصص للإعداد الأولي فقط؛ يجب إلغاؤه بعد ذلك.
  • مفاتيح فك القفل (Shamir 5-of-3) يجب توزيعها على عدة مسؤولين.
  • فك القفل التلقائي عبر cloud KMS مفيد للتوفر العالي ولكنه يضيف تبعية على سحابة خارجية.
  • تعطيل الحالات "المغلقة" (Sealed) من قبول الطلبات غير المصادق عليها.
  • تشفير سجلات التدقيق وتعمية المعلومات الشخصية (PII) في سياسة التدقيق.

أدوات ذات صلة

الأداةالتخصص
AWS Secrets Managerمدمج مع AWS؛ لا يدعم Transit
GCP Secret Managerمدمج مع GCP
Azure Key Vaultمدمج مع Azure
Dopplerمدير أسرار كخدمة (SaaS)
1Password Connectأسرار التطبيقات عبر 1Password
Bitwarden Secrets Managerبديل مفتوح المصدر
ExternalSecrets Operatorلربط مخازن الأسرار السحابية بـ Kubernetes