يُجرِّد Keychain خلفية التوقيع، غير أن تشغيل الموقِّع في بيئة الإنتاج يظل مسؤوليتك. تنطبق هذه الممارسات على جميع الخلفيات؛ راجع اختيار خلفية للتعرف على كيفية الاختيار.
فصل الموقِّعات الساخنة عن الباردة
استخدم موقِّعًا تشغيليًا برصيد منخفض ("ساخن") للمعاملات المتكررة والآلية، وموقِّعًا منفصلًا بقيمة عالية ("باردًا") لتحركات الخزينة. اعتمد على حضانة MPC أو HSM سحابي للموقِّع البارد، واشترط سياسات موافقة قبل أن يُوقِّع. ولأن الواجهة متطابقة، يمكن لكل دور استخدام خلفية مختلفة دون تغيير مواقع الاستدعاء.
تدوير المفاتيح بشكل متعمد
في سولانا، مفتاح التوقيع هو عنوان الحساب، لذا فإن تدوير المفتاح ينتج عنوانًا جديدًا. خطِّط للتدوير بوصفه عملية ترحيل: أنشئ مفتاحًا جديدًا، وأعد تعيين الصلاحيات ذات الصلة (أو انقل الأموال) إلى العنوان الجديد، ثم أوقف العمل بالقديم. استخدم مفاتيح مميزة لكل بيئة حتى لا تُعاد استخدام مفاتيح devnet على الشبكة الرئيسية.
منح أقل صلاحية وصول
حدِّد نطاق بيانات اعتماد كل خلفية بالحد الأدنى اللازم للتوقيع. بالنسبة لـ AWS KMS،
ذلك يعني kms:Sign وkms:DescribeKey وkms:GetPublicKey على المفتاح المحدد
(يستخدم فحص التوافر الأخيرين)؛ يُفضَّل استخدام أدوار IAM بدلًا من بيانات
الاعتماد الثابتة. طبِّق المبدأ ذاته على سياسات Vault ومفاتيح API
للمحافظ المُدارة.
التخطيط للتوافر
تعتمد الخلفيات البعيدة على خدمة شبكية. تحقَّق من التوافر قبل الاعتماد
على موقِّع (isAvailable() في TypeScript، وis_available() في Rust وPython،
وIsAvailable(ctx) في Go)، وأعد محاولة حالات الفشل التي تقتصر على التوقيع مع التراجع التدريجي، وحدِّد
مسارًا احتياطيًا للانقطاعات. لا تُعِد المحاولة عشوائيًا مع خلفية تقوم بالبث
(Crossmint، ووضع Fordefi الأصلي التلقائي): راجع
التعامل مع عمليات البث غير المؤكدة. يفرض Keychain
بروتوكول HTTPS على عناوين URL الأساسية المهيّأة، ويرفض عمليات إعادة التوجيه، ويطبِّق مهلة
طلب افتراضية.
التعامل مع عمليات البث غير المؤكدة
يقوم كل من Crossmint ووضع Fordefi الأصلي التلقائي بالتوقيع والبث من جهة الخادم، لذا
فإن فشل الاستدعاء لا يعني أن شيئًا لم يصل. عندما يكون المزوّد قد قبل
المعاملة، يُبلغ Keychain عن BROADCAST_UNCONFIRMED
(SignerError::BroadcastUnconfirmed في Rust). يتضمن الخطأ معرّف معاملة
المزوّد إذا قُبل الإنشاء، ويتضمن دائمًا مفتاح التفرّد (idempotency key)
الذي أُرسل الإنشاء بموجبه، والمشتق من الرسالة.
- طابِق الحالة مع المزوّد باستخدام معرّف المعاملة قبل القيام بأي شيء آخر.
- إعادة إرسال المعاملة المطابقة بايتًا ببايت آمنة: فمفتاح التفرّد يمنع تكرارها.
- إعادة بناء المعاملة (بتغيير blockhash مثلًا) تنتج مفتاحًا جديدًا وبالتالي عملية تحويل جديدة.
حماية الأسرار والنقل
- تفرض الخلفيات البعيدة بروتوكول HTTPS على عناوين URL الأساسية المهيّأة وترفض عمليات إعادة التوجيه.
والاستثناء الوحيد هو Vault، الذي يقبل HTTP العادي على loopback حتى يعمل الأمر المحلي
vault server -dev. - أمدَّ مفاتيح API والرموز المميزة وبيانات الاعتماد من مدير أسرار أو متغيرات بيئية — لا تُضمِّنها في الكود مباشرةً ولا تُودِعها في نظام التحكم بالإصدار.
- يُعقِّم Keychain استجابات الأخطاء لتفادي تسريب الأسرار إلى السجلات؛ احرص على أن تخلو سجلاتك من بيانات الاعتماد الخام ومواد المفاتيح.
مراقبة عمليات التوقيع وتدقيقها
تتبَّع معدل نجاح التوقيع والكمون وأعداد الأخطاء، ونبِّه عند الارتفاعات المفاجئة — راجع المقاييس في جاهزية الإنتاج. فعِّل سجلات التدقيق على جانب المزود (KMS أو Vault أو جهة الحضانة) وطابقها مع المعاملات التي تُرسلها تطبيقاتك.
ما الذي يتحقق منه Keychain
- يتحقق Keychain من مرحلة التوقيع، لا من معاملتك: فلا توجد محاكاة، ولا فحص لمحتوى المعاملة، ولا محرك سياسات. طبِّق هذه الضوابط في تطبيقك أو في عناصر التحكم بالسياسات لدى المزوّد.
- يعيد وضع Fordefi الأصلي اليدوي كتابة المعاملة (blockhash، وتعليمات رسوم Compute Budget) قبل توقيعها. تابع من المعاملة التي يعيدها، وليس تلك التي أرسلتها، ونفّذها قبل أي موقِّع آخر.
- يقوم Rust بتصفير مخازن المفاتيح الوسيطة؛ أما Python وGo فلا يمكنهما ذلك. عند استخدام خلفية Memory في هاتين اللغتين، تعامل مع ذاكرة العملية بأكملها على أنها حساسة.
- مع Ledger، تُعد شاشة الجهاز الوصف الموثوق الوحيد لما
يجري توقيعه. لا تفعِّل الميزة
unsafe-debugولا تسجيلTRACEلـsolana_remote_walletفي بيئة الإنتاج، لأن كليهما يسجّل تفاصيل الجهاز والمعاملة.
راجع نموذج الأمان للاطلاع على الصورة الكاملة.
Is this page helpful?