Moatgator Vault
مكان واحد لأسرار خادمك الخلفي وCI وتطبيق الجوال الخاص بك
ضع مرجع mg:// حيث كانت القيمة. تحلّه CLI وGitHub Actions وSDK الجوال عند التشغيل، ولا يتلقى تطبيقك السرّ إلا على جهاز اجتاز Attest.
مضمَّن بدءًا من خطة Startup.
$ moatgator secrets run --env-file .env.tpl -- npm start$ moatgator secrets inject -i .env.tpl -o .env$ moatgator secrets get mg://api/prod/DATABASE_URLمراجع mg://
احفظ المرجع في Git، لا القيمة
يسمّي المرجع مشروعًا وبيئة وسرًّا، كما في mg://api/prod/DATABASE_URL. من الآمن الاحتفاظ به في Git: فلا تحوّله إلى قيمة إلا هوية لديها صلاحية الوصول.
01
ملف .env.tpl في مستودعك
احتفظ بقالب واحد يحتوي على المراجع. يكتب moatgator secrets inject ملف .env بأذونات 0600، ولا يستبدل ملفًا موجودًا دون --force.
.env.tplمثال # .env.tpl: safe to commitDATABASE_URL=mg://api/prod/DATABASE_URLSTRIPE_KEY=mg://api/prod/STRIPE_KEYSENTRY_DSN=mg://api/prod/SENTRY_DSN02
moatgator secrets run
يشغّل أمرك مع الأسرار كمتغيرات بيئة ويخفي قيمها في مخرجات الأمر. أما moatgator secrets get فيقرأ مرجعًا واحدًا.
terminalمثال $ moatgator secrets run --env-file .env.tpl -- npm start$ moatgator secrets inject -i .env.tpl -o .env$ moatgator secrets get mg://api/prod/DATABASE_URL03
المرجع نفسه في التطبيق
في SDK الخاص بـ Android، يقرأ Moatgator.vault.get("mg://mobile/prod/PARTNER_KEY") البيئة المرتبطة بالتطبيق في لوحة التحكم. ولا تُشحن القيمة أبدًا داخل APK.
Kotlinمثال // Android (Kotlin), off the main threadMoatgator.startSession(playIntegrityProvider)val key = Moatgator.vault.get("mg://mobile/prod/PARTNER_KEY")
المشاريع والبيئات والإصدارات
المشاريع والبيئات
يبدأ كل مشروع بـ dev وstaging وprod. أضف بيئاتك الخاصة عندما تحتاج إليها.
الوراثة والتجاوز
يمكن لبيئة أن ترث من بيئة أخرى، حتى ثلاثة مستويات. والسرّ الذي يحمل الاسم نفسه يتجاوز السرّ الموروث.
البيئات المحمية
تبدأ prod محمية: لا يستطيع قراءة قيمها أو الكتابة فيها إلا المالكون والمسؤولون.
الإصدارات والتراجع
كل تغيير ينشئ إصدارًا له سجل. والتراجع ينشئ إصدارًا جديدًا، فلا يُعاد كتابة السجل أبدًا.
الإبطال الفوري
أبطِل سرًّا أو رمز خدمة فتُرفض القراءة التالية، دون انتظار تاريخ انتهاء الصلاحية.
الأدوار
تحدد أدوار المالك والمسؤول والمطوّر والقارئ من يرى القيم ومن يغيّرها.
على الأجهزة المصدَّق عليها فقط
السرّ نفسه، يُسلَّم إلى تطبيق الجوال فقط على جهاز اجتاز Attest
تخدم أدوات إدارة الأسرار عادةً الخوادم والمطورين وCI. أما Vault فيخدم أيضًا التطبيق الموجود في أيدي مستخدميك: يطلب SDK السرّ وقت التشغيل، وتتحقق API من Attest الخاص بالجهاز (Play Integrity أو App Attest، إضافة إلى إشارات RASP من Moatgator) وترسل القيمة مشفّرة لمفتاح مؤقت خاص بتلك الجلسة. لا يدخل أي شيء في الملف الثنائي.
يحتفظ SDK بالقيمة في الذاكرة فقط، ولا يكتبها أبدًا على القرص أو في السجلات. مراجع mg:// متاحة في SDK الخاص بـ Android.
سياسات لكل سرّ
- الحد الأدنى للحكماختر أدنى حكم من Attest يُسمح له باستلام كل سرّ.
- اشتراط تصديق المنصةاشترط نتيجة تصديق من المنصة، لا إشارات SDK نفسه فقط.
- الحد الأقصى لعمر التصديقارفض تسليم السرّ عندما يكون تصديق الجهاز أقدم مما تسمح به.
CI والخوادم
لا رمز طويل الأمد مخزَّن في CI الخاص بك
يستبدل الإجراء moatgator-hq/github-action/vault على GitHub Actions رمز OIDC الخاص بالمهمة برمز قراءة صالح لمدة 15 دقيقة. لا تتلقى pull requests رمزًا أبدًا. وحيث لا يتوفر OIDC، استخدم رمز خدمة.
- رموز الخدمة (mgvt_…) للقراءة فقط، ومرتبطة بمشروع واحد وبالبيئات التي تختارها.
- انتهاء الصلاحية إلزامي: 90 يومًا افتراضيًا، وسنة واحدة كحد أقصى.
- تُخفى القيم في سجل المهمة ولا تصبح أبدًا مخرجات للخطوات.
- المرجع الذي لا يمكن حلّه يُفشل الخطوة دون تصدير أي شيء.
permissions: { contents: read, id-token: write }steps: - uses: moatgator-hq/github-action/vault@v1 with: project-id: vpj_… secrets: | DATABASE_URL=mg://api/prod/DATABASE_URL - run: ./deploy.sh # $DATABASE_URL, *** in the logالمزامنة والتدوير
انقل الأسرار إلى حيث تنشر تطبيقك، ودوّرها وفق جدول زمني
تُبقي المزامنة بيئةً، مع ما ترثه، منسوخةً إلى أسرار GitHub Actions أو Railway أو Vercel. وهي تعمل عند إنشائها، ثم مرة أخرى بعد كل تغيير في تلك البيئة أو في بيئة ترث منها.
أسرار GitHub Actions
زامِن مع مستودع أو مع بيئة على GitHub. تُشفَّر كل قيمة بالمفتاح العام للمستودع قبل أن تغادر Moatgator.
Railway
زامِن مع متغيرات مشروع وبيئة على Railway، أو مع متغيرات خدمة واحدة.
Vercel
زامِن مع متغيرات production أو preview أو development لمشروع على Vercel، وتُحفظ كمتغيرات مشفَّرة.
إذن صريح وحالة واضحة
تؤكد كل وجهة وتمنحها رمزًا خاصًا بتلك الوجهة وحدها، يُخزَّن مشفَّرًا. وتعرض كل مزامنة آخر وقت تشغيل لها، وعدد الأسرار التي كتبتها، وأي خطأ.
التدوير المجدول
- قيمة عشوائية جديدة في موعدهاللأسرار التي لا تستخدمها إلا شركتك، مثل مفاتيح HMAC وأسرار الجلسات: تولّد Moatgator قيمة جديدة، وتنشئ إصدارًا، وتشغّل المزامنات.
- تذكير لمفاتيح المزوّدين الآخرينللمفتاح الصادر عن خدمة أخرى، يتلقى المالكون والمسؤولون رسالة بريد إلكتروني عند حلول موعده، وتعرض لوحة التحكم التدوير على أنه متأخر حتى تُحفظ قيمة جديدة.
المزامنة تكتب في الوجهة فقط، ولا تحذف منها إلا الأسرار التي كتبتها بنفسها. وحذف المزامنة يترك الوجهة كما هي.
مشفَّر لكل مؤسسة، ومدقَّق عند كل قراءة
تشفير مغلَّف لكل مستأجر
لكل مؤسسة مفتاحها الخاص، مغلَّف بمفتاح رئيسي.
نص مشفَّر مرتبط بمكانه
يرتبط كل نص مشفَّر بمشروعه وبيئته واسمه وإصداره، فلا يمكن نقله إلى سرّ آخر.
القيم تبقى خارج السجلات
لا تُكتب قيم الأسرار أبدًا في سجلاتنا، ويخفيها CLI والإجراء (Action) في مخرجاتك.
سجل تدقيق لكل قراءة
لكل قراءة: من قرأ، ومن أين، وأي إصدار، والنتيجة.
المقارنة
Moatgator Vault و1Password وDoppler
1Password وDoppler أداتان راسختان لإدارة الأسرار، وكلتاهما تؤدي كثيرًا مما يؤديه Vault. يوضح الجدول موقع كل منها، مع مصدر عام وتاريخ تحققنا منه لكل خانة تخصهما. Vault ليس مدير كلمات مرور للأشخاص: بل يركّز على التطبيقات وCI وأجهزة الجوال.
| الإمكانية | Moatgator Vault | 1Password | Doppler |
|---|---|---|---|
| مراجع بدلًا من القيم | mg://project/environment/NAME، وكذلك في SDK الجوال | 1 op://vault/item/field | جزئيًا23 مراجع ${…} داخل Doppler؛ وقوالب {{.NAME}} للملفات |
| تشغيل أمر مع الأسرار كمتغيرات بيئة | القيم مخفية في المخرجات | 4 op run، مع إخفاء القيم في المخرجات افتراضيًا | 56 doppler run؛ إخفاء المخرجات غير موثَّق لـ CLI |
| إنشاء ملف من قالب | الملف يُكتب بأذونات 0600 | 7 op inject | 3 secrets substitute و--mount |
| بيئات مع الوراثة | حتى 3 مستويات، والتجاوز حسب الاسم | جزئيًا8 Environments موجودة، مستقلة عن بعضها | 910 ترث branch configs من الإعداد الجذري؛ وراثة الإعدادات في Team وEnterprise |
| سجل الإصدارات والتراجع | التراجع ينشئ إصدارًا جديدًا | 11 سجل العناصر والاستعادة | 12 التراجع من السجلات |
| رموز آلية محددة النطاق مع انتهاء صلاحية | للقراءة فقط، لكل مشروع وبيئة، وانتهاء الصلاحية إلزامي | 1314 service accounts بأذونات لكل vault وانتهاء صلاحية اختياري | 15 service tokens لكل config، وانتهاء صلاحية اختياري |
| إبطال فوري للرموز | 16 | 15 | |
| CI مع OIDC، دون رمز مخزَّن | GitHub Actions، رمز صالح لمدة 15 دقيقة | جزئيًا1718 يستخدم load-secrets-action رمزًا مخزَّنًا؛ Credential Broker مع OIDC في معاينة عامة | 196 service account identities، في خطتي Team وEnterprise |
| المزامنة مع GitHub Actions وRailway وVercel | بعد كل تغيير؛ تكتب فقط، ولا تحذف إلا ما كتبته | جزئيًا820 مزامنة Environments مع AWS Secrets Manager (beta)؛ لم يُعثر على GitHub وRailway وVercel | 2122 تكاملات GitHub وVercel وRailway ترسل الأسرار تلقائيًا |
| التدوير المجدول | جزئيًا قيمة عشوائية جديدة لأسرارك الخاصة؛ وتذكير بالبريد الإلكتروني لمفاتيح الأطراف الأخرى | غير موجود في الوثائق العامة2316 رموز service account تُدوَّر يدويًا؛ لم يُعثر على تدوير مجدول للأسرار المخزَّنة | 24 تدوير تلقائي للخدمات المدعومة، مثل قواعد البيانات، في Team وEnterprise |
| الأدوار وحماية بيئة الإنتاج | مالك ومسؤول ومطوّر وقارئ؛ prod محمية | 258 أذونات vault وEnvironment | 26 أدوار على مستوى المشروع والبيئة |
| تدقيق كل قراءة لسرّ | من، ومن أين، والإصدار، والنتيجة | 27 تقارير الاستخدام في 1Password Business | جزئيًا28 سجل الوصول يحتفظ بأول قراءة وآخرها لكل جهة فاعلة |
| التسليم إلى تطبيق جوال على جهاز مصدَّق عليه فقط | Attest مع RASP، مشفَّر لكل جلسة | غير موجود في الوثائق العامة2930 غير موجود في وثائق SDK وConnect | غير موجود في الوثائق العامة3121 غير موجود في وثائق SDK والتكاملات |
نقاط قوة 1Password
المصادر
- 1. 1Password CLI — Secret references · تم التحقق في
- 2. Doppler — Secrets (referencing) · تم التحقق في
- 3. Doppler — Secret injection with templates · تم التحقق في
- 4. 1Password CLI — op run · تم التحقق في
- 5. Doppler — Accessing secrets (run, --mount) · تم التحقق في
- 6. Doppler — GitHub OIDC examples · تم التحقق في
- 7. 1Password — Load secrets into config files (op inject) · تم التحقق في
- 8. 1Password Environments · تم التحقق في
- 9. Doppler — Branch configs · تم التحقق في
- 10. Doppler — Config inheritance · تم التحقق في
- 11. 1Password — View and restore previous versions of items · تم التحقق في
- 12. Doppler — Versioning · تم التحقق في
- 13. 1Password CLI — op service-account · تم التحقق في
- 14. 1Password CLI — op connect · تم التحقق في
- 15. Doppler — Service tokens · تم التحقق في
- 16. 1Password — Manage service accounts · تم التحقق في
- 17. 1Password — GitHub Actions (load-secrets-action) · تم التحقق في
- 18. 1Password Credential Broker — GitHub Actions (public preview) · تم التحقق في
- 19. Doppler — Service account identities (OIDC) · تم التحقق في
- 20. 1Password — Sync Environments to AWS Secrets Manager (beta) · تم التحقق في
- 21. Doppler — Integrations · تم التحقق في
- 22. Doppler — GitHub Actions integration · تم التحقق في
- 23. 1Password Secrets Automation · تم التحقق في
- 24. Doppler — Secrets rotation · تم التحقق في
- 25. 1Password — Create, share, and manage vaults · تم التحقق في
- 26. Doppler — Project permissions · تم التحقق في
- 27. 1Password — Reports (usage reports) · تم التحقق في
- 28. Doppler — Access logs · تم التحقق في
- 29. 1Password SDKs · تم التحقق في
- 30. 1Password Connect · تم التحقق في
- 31. Doppler — Future SDKs and integration roadmap · تم التحقق في
- 32. 1Password — About the 1Password security model · تم التحقق في
- 33. 1Password — About your Secret Key · تم التحقق في
- 34. Doppler — Security fact sheet · تم التحقق في
- 35. Doppler — Pricing · تم التحقق في
1Password وDoppler علامتان تجاريتان لمالكيهما، ذُكرتا فقط لتعريف المنتجات المقارَنة. ما نقوله عنهما مأخوذ من وثائقهما العامة في التاريخ المبيَّن. «غير موجود» يعني أننا لم نجده في الصفحات المذكورة، لا أن المنتج يفتقر إليه. إذا تغيّر شيء، راسلنا وسنصحّحه.
الخطط
Vault مضمَّن في خطط Startup وScale وEnterprise.
| الخطة | المشاريع لكل مؤسسة | الأسرار لكل بيئة |
|---|---|---|
| Startup | 5 | 100 |
| Scale | 50 | 500 |
| Enterprise | 200 | 1,000 |
الأسئلة الشائعة
هل أحتاج إلى تغيير الشيفرة لاستخدام Vault؟
ليس على الخوادم وCI: تواصل شيفرتك قراءة متغيرات البيئة، وتبدأ العملية باستخدام moatgator secrets run أو GitHub Action. وفي تطبيق Android، استدعِ Moatgator.vault.get مع المرجع.
هل يمكن لمن يملك ملف APK الخاص بي قراءة سرّ من Vault؟
القيمة ليست في APK. ترسلها API فقط إلى جهاز اجتاز Attest وفق سياسة السرّ، مشفَّرة لتلك الجلسة، ويحتفظ بها SDK في الذاكرة فقط. يظل من الممكن اختراق الجهاز بعد اجتيازه، لذا احتفظ بفحوصات على جانب الخادم لكل ما يتضمن تحريك الأموال.
ماذا يحدث إذا تسرّب رمز خدمة؟
أبطِله في لوحة التحكم فيُرفض الطلب التالي. رموز الخدمة للقراءة فقط، ومحصورة في مشروع واحد والبيئات التي اخترتها، وتنتهي صلاحيتها بعد 90 يومًا افتراضيًا.
هل يحل Vault محل 1Password أو Doppler؟
ليس بالضرورة. إذا كنت تستخدم أحدهما بالفعل للخوادم وCI، فيمكنه البقاء. يضيف Vault التسليم إلى تطبيق الجوال على الأجهزة المصدَّق عليها، ويمكنه تغطية الخوادم وCI أيضًا إذا فضّلت أداة واحدة.
أي الخطط تتضمن Vault؟
Startup وScale وEnterprise. المشاريع لكل مؤسسة: 5 و50 و200. الأسرار لكل بيئة: 100 و500 و1,000.
ابدأ بسرّ واحد
أنشئ مشروعًا، وأضف سرًّا، وحُلَّه من CLI أو من CI أو من تطبيقك.