إدارة الأسرار والبنية التحتية للمفاتيح

بنية HashiCorp Vault

18 دقيقة الدرس 3 من 28

بنية HashiCorp Vault

HashiCorp Vault هو منصة إدارة الأسرار الفعلية في الصناعة — تستخدمها Google وNetflix وGitHub وآلاف المؤسسات الهندسية الأخرى. قبل تشغيل أي أمر vault kv get، عليك أن تفهم ما يجري داخل Vault. النموذج المعماري — الإغلاق وفك الإغلاق، وطرق المصادقة، ومحركات الأسرار، والسياسات — يُحدد مباشرةً نموذج التهديد الخاص بك، ونطاق الضرر إذا حدث خطأ ما، ودليل التشغيل. هذا الدرس يفتح هذه الآليات الداخلية بالكامل.

خلفية التخزين وحاجز التشفير

لا يُخزّن Vault أي شيء بنص واضح. كل قطعة من البيانات — الأسرار، والرموز، والإيجارات، وإعدادات المصادقة — تُشفَّر قبل أن تصل إلى خلفية التخزين. خلفية التخزين (تخزين Raft المدمج في النشرات الحديثة، أو Consul/DynamoDB في النشرات القديمة) مُصمَّمة عن قصد لتكون غبية: لا تُخزّن سوى كتل مشفرة غير مفهومة. هذا الفصل هو أساس نموذج أمان Vault. حتى لو تسرّبت لقطة Raft الخاصة بك، لن يحصل المهاجم إلا على نص مشفر، وليس أسراراً.

المفتاح الذي يُشفّر جميع البيانات يُسمى مفتاح التشفير. هذا المفتاح نفسه مُشفَّر بواسطة مفتاح رئيسي. يُقسَّم المفتاح الرئيسي باستخدام مشاركة أسرار شامير إلى N شريحة (الافتراضي: 5)، يلزم M منها لإعادة بنائه (الافتراضي: 3). تُوزَّع هذه الشرائح على المشغّلين — وهذه هي عملية فك الإغلاق.

الإغلاق وفك الإغلاق

عند بدء تشغيل Vault (أو بعد إعادة التشغيل أو الانهيار أو استعادة اللقطة)، يكون في حالة مغلقة. في هذه الحالة، يستطيع Vault التحدث إلى خلفية التخزين، لكنه لا يستطيع فك تشفير أي بيانات. إنه لا يعرف المفتاح الرئيسي. يرفض جميع طلبات API. Vault المغلق مقفل تشفيرياً.

فك الإغلاق هو عملية تزويد Vault بشرائح مفاتيح كافية لإعادة بناء المفتاح الرئيسي وفك تشفير مفتاح التشفير والبدء في خدمة الطلبات. مع الإعداد الافتراضي لشامير، يقدم ثلاثة من أصل خمسة مشغّلين شريحتهم — لا يُجمَع المفتاح الرئيسي كاملاً خارج ذاكرة Vault أبداً. بمجرد فك الإغلاق، يحتفظ Vault بمفتاح التشفير في الذاكرة فقط؛ ولا يُحفظ أبداً على القرص بنص واضح.

فكرة محورية — فك الإغلاق التلقائي: فك الإغلاق اليدوي باستخدام شامير أمر غير مقبول على نطاق الإنتاج (تخيّل إعادة تشغيل عقدة في الثالثة صباحاً يتطلب ثلاثة مشغّلين). الحل الإنتاجي هو فك الإغلاق التلقائي: يُفوّض Vault حماية المفتاح الرئيسي إلى KMS خارجي — AWS KMS أو GCP Cloud KMS أو Azure Key Vault. عند بدء التشغيل، يستدعي Vault الـ KMS لفك تشفير المفتاح الرئيسي المُغلَّف المُخزَّن محلياً ويفك الإغلاق تلقائياً. تصبح سياسة مفتاح KMS هي حدودك الأمنية الحقيقية.
# تهيئة كتلة Vault جديدة (تُشغَّل مرة واحدة، تلتقط مفاتيح فك الإغلاق والرمز الجذري) vault operator init \ -key-shares=5 \ -key-threshold=3 \ -format=json | tee /tmp/vault-init.json # فك الإغلاق اليدوي (كرر مع 3 شرائح مفاتيح مختلفة) vault operator unseal <UNSEAL_KEY_1> vault operator unseal <UNSEAL_KEY_2> vault operator unseal <UNSEAL_KEY_3> # التحقق من حالة الإغلاق vault status # ضبط فك الإغلاق التلقائي مع AWS KMS (في ملف HCL لإعدادات خادم Vault) # /etc/vault.d/vault.hcl seal "awskms" { region = "us-east-1" kms_key_id = "alias/vault-unseal-key" # دور IAM على مثيل EC2 أو مهمة ECS يوفر بيانات الاعتماد — لا مفاتيح ثابتة }
خطأ إنتاجي شائع — الرمز الجذري: يطبع vault operator init رمزاً جذرياً. تتجاوز الرموز الجذرية جميع السياسات — فهي تعادل حساب root في UNIX. خزّن الرمز الجذري في مخزن أسرار مدعوم بأجهزة فور التهيئة، وألغِ صلاحيته بمجرد ضبط طرق المصادقة التشغيلية (vault token revoke <root-token>)، وأعد توليده فقط في سيناريوهات الطوارئ باستخدام vault operator generate-root مع النصاب القانوني. تشغيل العمليات اليومية برمز جذري هو اكتشاف تدقيق في كل شركة كبرى.

طرق المصادقة

تُجيب طرق المصادقة على السؤال: كيف يُثبت المُستدعي هويته لـ Vault؟ Vault محايد تماماً بشأن مصدر المُستدعين — يدعم طرق مصادقة قابلة للتوصيل تُعيّن الهويات الخارجية إلى سياسات Vault. ناتج أي طريقة مصادقة ناجحة هو رمز Vault قصير الأمد مع سياسات مُرفقة. بمجرد حصول المُستدعي على هذا الرمز، لم تعد طريقة المصادقة في الصورة.

أهم طرق المصادقة في هندسة الإنتاج:

  • AppRole — مُصمَّم للآلات وخطوط أنابيب CI. يُثبت Role ID (غير سري، مضمَّن في الإعدادات) مع Secret ID (سري، يُحقَن في وقت التشغيل من قِبل مُنسّق موثوق) الهوية معاً. شاعت Netflix هذا النمط للتمهيد بين الخدمات.
  • Kubernetes — يُقدَّم JWT حساب الخدمة من Pod إلى Vault. يستدعي Vault الـ Kubernetes API للتحقق من JWT، ويتحقق من تطابقه مع الـ namespace وحساب الخدمة المتوقعَيْن، ويُصدر رمزاً. لا حاجة لأي بيانات اعتماد ثابتة في Pod.
  • AWS IAM — يُثبت طلب GetCallerIdentity موقَّع أن المُستدعي هو دور IAM أو مستخدم محدد. يعمل مع EC2 وLambda وECS وأي مكان تتوفر فيه بيانات اعتماد IAM. لا أسرار في صورة AMI أو حاوية.
  • OIDC / JWT — يُستخدم لمصادقة GitHub Actions وGitLab CI وأي مزود هوية OIDC. يُتحقَّق من رمز OIDC لمهمة CI مقابل نقطة نهاية JWKS للمزود.
  • Token — الطريقة المدمجة. يمكن لكل رمز Vault إنشاء رموز فرعية. يُستخدم للتمهيد والبشر عبر CLI. ليس لأحمال العمل الإنتاجية.
# تفعيل طريقة مصادقة Kubernetes vault auth enable kubernetes # ضبطها للتحقق من خادم API الكتلة vault write auth/kubernetes/config \ kubernetes_host="https://kubernetes.default.svc:443" \ token_reviewer_jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \ kubernetes_ca_cert="$(cat /var/run/secrets/kubernetes.io/serviceaccount/ca.crt)" # إنشاء دور: ربط حساب خدمة Kubernetes بسياسة Vault vault write auth/kubernetes/role/payments-api \ bound_service_account_names=payments-api \ bound_service_account_namespaces=production \ policies=payments-read \ ttl=1h # من داخل Pod، المصادقة واسترجاع رمز vault write auth/kubernetes/login \ role=payments-api \ jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"

محركات الأسرار

محركات الأسرار هي واجهات Vault القابلة للتوصيل لتوليد الأسرار وإدارتها. هذا هو أكثر جوانب Vault قوة: بدلاً من كونه مخزن مفاتيح-قيم ثابتاً، يستطيع Vault توليد أسرار ديناميكية تنتهي صلاحيتها تلقائياً. يتعامل محرك الأسرار المُركَّب على مسار معين مع جميع العمليات على ذلك المسار.

محركات الأسرار الأساسية التي ستستخدمها في الإنتاج:

  • KV v2 (kv-v2) — مخزن مفاتيح-قيم إصدارات. كل كتابة تُنشئ إصداراً جديداً. يدعم check-and-set لمنع تعارضات الكتابة. يُستخدم للأسرار الثابتة كمفاتيح API وأسرار عميل OAuth وبيانات اعتماد طرف ثالث التي لا يمكن توليدها ديناميكياً.
  • Database — يتصل بقاعدة بياناتك ويُولّد ديناميكياً بيانات اعتماد قصيرة الأمد (اسم مستخدم + كلمة مرور) لكل مُستدعٍ. تُلغى بيانات الاعتماد تلقائياً عند انتهاء صلاحية الإيجار. يعمل مع PostgreSQL وMySQL وMongoDB وRedis وElasticsearch والمزيد. يُلغي كلمات مرور قاعدة البيانات المشتركة تماماً.
  • AWS — يُولّد مفاتيح وصول AWS IAM قصيرة الأمد، أو يفترض أدواراً ويُعيد بيانات اعتماد STS. تحصل Lambda على زوج مفاتيح AWS فريد ينتهي تلقائياً في 15 دقيقة، بدلاً من مشاركة مفتاح طويل الأمد مضمَّن في متغيرات البيئة.
  • PKI — سلطة شهادات كاملة مدمجة في Vault. تُصدر شهادات X.509 عند الطلب. تحصل كل خدمة على شهادة TLS قصيرة الأمد (دقائق إلى ساعات)، مما يجعل اختراق الشهادات غير ذي صلة تقريباً لأنها تنتهي قبل أن يتمكن المهاجم من استخدامها. هذا هو أساس الدرس الثامن.
  • Transit — تشفير كخدمة. يحتفظ Vault بالمفتاح ولا يُعيده أبداً؛ يُرسل المُستدعون نصاً واضحاً ويستلمون نصاً مشفراً (أو العكس). يُستخدم لتشفير أعمدة قاعدة البيانات وحمولات الرسائل أو PII دون توزيع مفتاح التشفير على كل خدمة.
# تركيب وضبط محرك أسرار Database لـ PostgreSQL vault secrets enable -path=database database vault write database/config/payments-db \ plugin_name=postgresql-database-plugin \ allowed_roles="payments-readonly,payments-readwrite" \ connection_url="postgresql://{{username}}:{{password}}@postgres.internal:5432/payments" \ username="vault-root" \ password="<initial-root-pw>" # تعريف دور: ما هي SQL التي تُنفَّذ عند إنشاء Vault لبيانات اعتماد vault write database/roles/payments-readonly \ db_name=payments-db \ creation_statements="CREATE ROLE \"{{name}}\" WITH 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/payments-readonly # النتيجة: username=v-payments-1a2b3c4d password=A1b2C3d4... lease_duration=1h

السياسات

سياسات Vault هي طبقة التفويض — تُحدد ما يستطيع هوية مُصادَق عليها فعله. تُكتب السياسات بـ HCL (أو JSON) وتُعبّر عن التحكم في الوصول المستند إلى المسار. يجب منح كل صلاحية صراحةً (read، وwrite، وdelete، وlist، وcreate، وupdate، وpatch، وsudo)؛ Vault يرفض بشكل افتراضي.

تُرفق السياسات بالرموز عند المصادقة. يمكن لرمز واحد امتلاك سياسات متعددة — مجموعة الصلاحيات الفعّالة هي اتحاد جميع السياسات. سياسة root تُرفق ضمنياً فقط برموز root وتتجاوز جميع الفحوصات.

# payments-read.hcl — سياسة أقل الصلاحيات لخدمة payments-api path "secret/data/payments/*" { capabilities = ["read"] } path "database/creds/payments-readonly" { capabilities = ["read"] } # رفض الوصول لكل شيء آخر (ضمني، لكن يمكن الرفض الصريح) path "secret/data/payments/admin/*" { capabilities = ["deny"] } # كتابة السياسة إلى Vault vault policy write payments-read payments-read.hcl # فحص السياسات الفعّالة على رمز ما vault token lookup <TOKEN> # اختبار ما تسمح به السياسة دون رمز حقيقي (لا يُقدَّر بثمن لفحص السياسات في CI) vault policy fmt payments-read.hcl # تنسيق تلقائي
ممارسة احترافية — السياسة كرمز: خزّن جميع ملفات HCL للسياسات في Git وطبّقها عبر CI، تماماً كما تفعل مع Terraform. يمنحك هذا سجل التغييرات ومراجعة الأقران والقدرة على مقارنة تغييرات السياسة قبل تطبيقها. تُبوّب شركات مثل GitHub وShopify كل تغيير لسياسة Vault عبر pull request + فحص lint آلي بـ vault policy fmt. لا تُحرّر السياسات مباشرةً في واجهة مستخدم Vault في الإنتاج أبداً.
HashiCorp Vault architecture: seal barrier, auth methods, secret engines, and policies Caller Pod / CI / Human Vault Server Encryption Barrier (sealed until master key reconstructed) Auth Methods Kubernetes AWS IAM AppRole OIDC / JWT Token issues Token + Policies on success (pluggable, per path) Policy Engine HCL path rules deny by default union of policies Secret Engines KV v2 (static) Database (dynamic) AWS (STS / IAM) PKI (certs) Transit (encrypt) mounted at paths; dynamic leases (pluggable, per path) auto-expiry + revocation Storage Backend Raft / Consul (encrypted blobs) KMS (Auto Unseal) AWS KMS / GCP KMS identity token allow? secret + lease unwrap key
بنية Vault: يُصادق المُستدعي عبر طريقة مصادقة، يستلم رمزاً مع سياسات مُرفقة، يُفوّض محرك السياسات الطلب، ويُعيد محرك الأسرار السر مع إيجار. جميع البيانات في حالة الراحة مُشفَّرة؛ يُمكّن KMS فك الإغلاق التلقائي.

الإيجار والتجديد والإلغاء

كل سر يُعيده محرك الأسرار الديناميكي يأتي مع إيجار: مدة TTL بعد انتهائها يُلغي Vault بيانات الاعتماد تلقائياً في المصدر (مثال: حذف مستخدم قاعدة البيانات). هذه هي الميزة التشغيلية الأساسية على الأسرار الثابتة — حتى لو تسرّبت بيانات اعتماد، فإنها تنتهي في دقائق أو ساعات بدلاً من الاستمرار إلى الأبد حتى يُدوّرها شخص ما يدوياً.

التطبيقات التي تحتاج أسراراً تتجاوز TTL الأولية يجب تجديد الإيجار قبل انتهائه. يتعامل Vault Agent (عملية sidecar) مع التجديد بشكل شفاف. عند إيقاف خدمة، يستطيع المشغّل إلغاء فوري لجميع الإيجارات الصادرة بموجب رمز مصادقة أو دور محدد، مما يُبطل فوراً كل بيانات اعتماد قاعدة البيانات ومفاتيح API التي كانت تمتلكها تلك الخدمة — أمر مستحيل مع الأسرار الثابتة.

ممارسة احترافية — Vault Agent Injector في Kubernetes: لا تكتب استدعاءات Vault SDK في كود تطبيقك لجلب الأسرار عند بدء التشغيل. بدلاً من ذلك، استخدم Vault Agent Injector (webhook Kubernetes للتحويل). يُضيف sidecar من Vault Agent إلى Pod الخاص بك، يُصادق عبر مصادقة Kubernetes، يجلب الأسرار، يكتبها إلى وحدة تخزين tmpfs مشتركة كملفات، ويُجدّدها باستمرار. يقرأ تطبيقك ملفاً — لا تبعية Vault في كود التطبيق، ولا أسرار في متغيرات البيئة، ولا أسرار في طبقات الصورة.

التوافر العالي وRaft

Vault الإنتاجي يعمل كتلة. خلفية التخزين الموصى بها منذ Vault 1.4 هي تخزين Raft المدمج: بروتوكول توافق Raft مدمج يُكرّر البيانات عبر عقد الكتلة. النشر الإنتاجي النموذجي هو 3 أو 5 عقد خلف موازن تحميل داخلي. تتعامل العقدة النشطة فقط مع الكتابات؛ العقد الاحتياطية توجّه طلبات القراءة/الكتابة إلى العقدة النشطة أو (مع standbys الأداء) تخدم القراءات محلياً.

لقطات Raft هي آلية التعافي من الكوارث. أتمتة vault operator raft snapshot save يومياً إلى S3 أو GCS مُشفَّر. عند فقدان كتلة، شغّل كتلة جديدة، استعد اللقطة، وافك الإغلاق. مع فك الإغلاق التلقائي عبر KMS، تستغرق هذه العملية أقل من 10 دقائق.

Vault Enterprise مقابل OSS: Vault الذي تثبّته من سجل HashiCorp هو مفتوح المصدر ويغطي كل ما في هذا الدرس. تُضيف Vault Enterprise ميزات تدفع الشركات الكبرى مقابلها: namespaces (تعدد المستأجرين)، والنسخ (multi-region active-active)، وتكامل HSM للإغلاق، وسياسات Sentinel (قواعد OPA-style دقيقة)، وإعادة توجيه أجهزة التدقيق. معظم الشركات من مرحلة الناشئة إلى منتصف المرحلة تُشغّل Vault OSS على ثلاث عقد Raft مع فك الإغلاق التلقائي — هذا يغطي 90% من احتياجات الإنتاج.