إذا كنت مهندسًا، فمشاركة الأسرار تظهر عادة في ثلاثة مواضع: استقبال الموظفين الجدد والتسليم إلى الموردين والاستجابة للحوادث. هذه نظرة من زاوية المطور: متى تلجأ إلى رابط لمرة واحدة، ومتى تستغني عنه، وكيف تكتب له سكربتًا دون أن يتسرب السر إلى سجل أوامر الطرفية في الطريق. ولتجربة الآلية أولًا، لا تحتاج أداة إنشاء الروابط السرية لمرة واحدة المجانية إلى حساب.
متى يستخدم المطور رابطًا لمرة واحدة؟
حين يكون شخص على طرف واحد على الأقل من التسليم، ولا ينبغي أن تبقى القيمة في أي مكان بعده. الحالات المعتادة:
- استقبال مهندس جديد ومعه أول مجموعة من بيانات الدخول.
- مشاركة كلمة مرور مؤقتة للمسؤول أثناء حادثة.
- تسليم رمز لمورد أو متعاقد لا ينبغي أن يبقى في خزنتك.
- تغيير بيانات دخول يجب أن تتوقف قيمتها القديمة عن العمل سريعًا.
- إرسال مفتاح API جهزته لعميل.
متى لا تستخدم رابطًا لمرة واحدة
- الأسرار بين الآلات. الأداة الصحيحة هنا هي متغيرات بيئة CI (مثل أسرار GitHub Actions) وKubernetes Secrets وبيانات الدخول الديناميكية في Vault. الرابط مخصص لتسليم القيمة من شخص إلى هذه الأنظمة.
- بيانات دخول الفريق طويلة الأمد. مكانها مدير كلمات المرور.
- الإعدادات العامة. لا تلبس إعدادات غير سرية ثوب السر. استخدم رابطًا عاديًا.
الحد الفاصل: إذا كان طرفا النقل آلتين، فاستخدم مخزن الأسرار في منصتك. وإذا كان أحد الطرفين على الأقل شخصًا، فالرابط لمرة واحدة هو عادة الأداة الأنظف.
| الموقف | الأداة الصحيحة |
|---|---|
| أول بيانات دخول لمهندس جديد | رابط سري لمرة واحدة |
| خط CI يحتاج إلى رمز نشر أثناء التشغيل | مخزن أسرار CI أو متغيرات البيئة |
| Pod يحتاج إلى كلمة مرور قاعدة بيانات | K8s secret أو external secrets operator |
| بيانات دخول للفريق يستخدمها خمسة أشخاص يوميًا | مدير كلمات المرور (خزنة مشتركة) |
| عميل يحتاج إلى مفتاح API الذي جُهز له | رابط سري لمرة واحدة |
| سر مطلوب داخل مستودع git | لا يوضع فيه أبدًا: أشر إلى مخزن أسرار، وأضف الفحص إلى CI |
كتابة السكربت
لدى LinkPilot واجهة REST API (متاحة في كل الخطط، ومنها خطة Free). وهكذا يبدو إصدار سر من سكربت:
LP_KEY=lp_live_...
URL=$(curl -sS https://api.uselinkpilot.com/v1/secrets \
-H "Authorization: Bearer $LP_KEY" \
-H "Content-Type: application/json" \
-d '{
"payload": "'"$NEW_DB_PASSWORD"'",
"expires_in": 3600,
"burn_after_read": true,
"passphrase": "'"$ONBOARDING_PASSPHRASE"'"
}' | jq -r '.url')
echo "Secret link: $URL"
مرّر عنوان URL هذا إلى أي قناة تسليم تستخدمها أصلًا: رسالة خاصة في Slack، أو البريد الإلكتروني، أو عنوان webhook في أداة استقبال الموظفين لديك.
إبقاء المحتوى خارج قائمة العمليات
في المقتطف السابق عيب معروف: إدراج المحتوى داخل -d يضعه في سطر
أوامر curl، فيستطيع أي مستخدم محلي قراءته عبر ps ما دام الطلب
يعمل. ابنِ JSON بالأداة jq ومرّره عبر
stdin باستخدام الخيار -d @- في curl بدلًا من ذلك:
set -euo pipefail
jq -n --arg payload "$NEW_DB_PASSWORD" \
--arg pass "$ONBOARDING_PASSPHRASE" \
'{payload: $payload, expires_in: 3600,
burn_after_read: true, passphrase: $pass}' |
curl -sS https://api.uselinkpilot.com/v1/secrets \
-H "Authorization: Bearer $LP_KEY" \
-H "Content-Type: application/json" \
-d @- | jq -r '.url'
ثلاث عادات تستحق أن تصبح تلقائية:
- تصل القيم عبر متغيرات البيئة أو أداة CLI لمدير أسرار، ولا تُكتب أبدًا في طرفية تفاعلية تحفظها في سجل الأوامر.
- يطبع السكربت الرابط، لا المحتوى أبدًا.
set -euo pipefailحتى لا يمرر طلب API فاشل عنوانًا فارغًا إلى الخطوة التالية دون أن تنتبه.
قالب لاستقبال الموظفين الجدد
نمط ينجح مع المهندسين الجدد في يومهم الأول:
- ينشئ سكربت الاستقبال الحسابات ويستخرج بيانات الدخول لمرة واحدة.
- ينشئ السكربت رابطًا سريًا لكل بيانات دخول، تنتهي صلاحيته بعد 4 ساعات، مع عبارة مرور مشتركة.
- يرسل السكربت بريدًا إلكترونيًا فيه كل الروابط، ورسالة خاصة في Slack فيها عبارة المرور.
- يفتح المهندس كل رابط وينسخ بيانات الدخول إلى مدير كلمات المرور لديه.
- ما لم يُقرأ حتى نهاية اليوم يُبطَل ويُعاد إصداره حين يكون المهندس مستعدًا.
سبب هذه الإعدادات: مدة 4 ساعات تكفي صباح يوم أول عادي دون أن تبقى بيانات الدخول صالحة طوال الليل، وعبارة المرور تنتقل عبر قناة ثانية فلا يضر بريد أُعيد توجيهه أو وصل إلى غير صاحبه، والحذف بعد القراءة يعني أن صندوق بريد المهندس ينتهي يومه وليس فيه إلا عناوين معطلة.
قل للموظف الجديد صراحة: «كل رابط يعمل مرة واحدة، فاحفظ القيمة في مدير كلمات المرور قبل إغلاق التبويب.» أكثر ما يفشل فيه الاستقبال هو مستلم يقرأ السر ثم يغلق التبويب ظانًا أنه يستطيع العودة إليه لاحقًا.
دليل تشغيل لتغيير بيانات الدخول
تغيير كلمة مرور قاعدة بيانات مشتركة يتسلمها متعاقد أو زميل:
- أنشئ كلمة المرور الجديدة وطبّقها في النظام المصدر (قاعدة البيانات، أو وحدة التحكم السحابية، أو حيثما كانت نسختها المعتمدة).
- حدّث أولًا الأنظمة التي تستخدمها لديك (خزنة CI و K8s secret وإعدادات التطبيق) حتى لا يتعطل شيء أثناء التسليم إلى الشخص.
- أنشئ رابطًا لمرة واحدة للقيمة الجديدة: حذف بعد القراءة، وانتهاء الصلاحية بعد 1 ساعة، وعبارة مرور.
- سلّم الرابط وعبارة المرور عبر قناتين مختلفتين.
- تحقق من حدث العرض في سجل التدقيق. لم يُعرض قبل انتهاء الصلاحية؟ أبطله وأصدر غيره، ولا تُعد إرسال الرابط نفسه أبدًا.
- تأكد من تعطيل بيانات الدخول القديمة في المصدر.
لكل تغيير رابطه الخاص. الروابط مستقلة عن بعضها عمدًا، وهذه ميزة في التسليم وليست ميزة في الإدارة، لذلك يبقى جدول التغيير في مدير كلمات المرور أو دليل التشغيل، لا في أداة الروابط.
الاستجابة للحوادث
أثناء الحادثة تحتاج كثيرًا إلى تغيير بيانات دخول وتوزيع الجديدة على بضعة مستجيبين بسرعة. لا تلصقها في قناة الحادثة: هذه القناة تُسجَّل لأجل مراجعة ما بعد الحادثة، وسيصل السر إلى الملف المُصدَّر وإلى مستند المراجعة وإلى كل نظام حفظ يأتي بعدهما.
- غيّر بيانات الدخول في النظام المصدر.
- أصدر رابطًا سريًا تنتهي صلاحيته بعد 30 دقيقة.
- ضع الرابط في القناة، وأرسل عبارة المرور برسالة خاصة.
- بعد الحادثة، تأكد من أن الرابط حُذف نهائيًا أو أُبطل.
وهكذا تحوي مراجعة ما بعد الحادثة عنوانًا معطلًا بدل كلمة مرور مسؤول صالحة، ويعطي سجل التدقيق من يراجع التسلسل الزمني سجلًا دقيقًا من نوع «أُعيد إصدار بيانات الدخول في الساعة 14:32، وقُرئت في 14:33» دون جهد إضافي.
ملاحظة عن معاينات الروابط: تجلب تطبيقات المحادثة العناوين الملصقة
لعرض معاينات لها. والرابط السري المصمم جيدًا يصمد أمام ذلك، لأن جلب
المعاينة طلب GET بينما الإظهار طلب POST صريح. انظر
فاحصات الروابط والأسرار لمرة واحدة
للتفاصيل الكاملة. وإذا كنت تقيّم أداة، فاختبر هذا قبل الحادثة لا
أثناءها.
ماذا يخبرك سجل التدقيق؟
هل قُرئ السر، ومتى، ومن أين تقريبًا، وهل حاول أحد عبارة مرور خاطئة. لكل سر في LinkPilot سجل أحداث: created و viewed و failed_passphrase و burned و expired و revoked. يُسجَّل كل عرض مع وقته، والموقع الجغرافي التقريبي حين يتوفر، ومعرّف المتصفح (user agent)، وعنوان IP مُجزَّأ (SHA-256 مع ملح يتغير يوميًا، ولا يُخزَّن عنوان IP الأصلي أبدًا). وفي الواقع يعطيك ذلك ثلاث إجابات تستطيع السكربتات وأدلة التشغيل الاعتماد عليها:
- تأكيد التسليم: حدث viewed يعني أن التسليم جرى.
- رصد الشذوذ: سلسلة من أحداث failed_passphrase أو عرض لا تعرفه إشارة إلى أن تغيّر بيانات الدخول فورًا.
- سجل نظيف للمراجعات: «سُلّم مرة، وقُرئ مرة، وحُذف نهائيًا» جملة يحبها المدققون.
الحدود: ما لا تحله الروابط
- ليست خزنة. لا شيء في الرابط لمرة واحدة يدير الوصول المستمر أو جداول التغيير أو قوائم من يملك ماذا.
- الرابط هو المفتاح. تشفر LinkPilot النصوص في متصفحك ولا تتسلم المفتاح أبدًا، لكن هذا المفتاح ينتقل في الجزء الذي يلي علامة # في الرابط، فمن يحصل على الرابط كاملًا يستطيع قراءة السر، وإذا ضاع الرابط فلا يمكن استرجاع السر. وتُشفَّر الملفات المرفقة بالطريقة نفسها، لكن أسماءها وأحجامها غير مشفرة. لذلك تبقى الصلاحية القصيرة مع الحذف بعد القراءة مهمة. تحديث، 29 سبتمبر 2026: كان هذا البند يقول سابقًا «ليست مشفرة من طرف إلى طرف»، وكان ذلك صحيحًا حتى ذلك التاريخ. التفاصيل في صفحة بنية الأمان.
- لا تعالج انتشار الأسرار في الشيفرة. المفاتيح المكتوبة مباشرة في المستودعات تحتاج إلى فحص وتغيير، لا إلى وسيلة تسليم أفضل.
- لا تحمي الطرف الآخر. بعد أن يقرأ شخص القيمة، اعتبرها موجودة حيثما وضعها.
جرّبها مجانًا، بدون تسجيل
مولّد روابط سرية لمرة واحدة
شارك كلمة مرور أو ملاحظة عبر رابط يُفتح مرة واحدة.
قراءات ذات صلة
- كيف تشارك مفاتيح API بأمان
- الروابط منتهية الصلاحية: لماذا تهم المدد القصيرة
- بنية الأمان في LinkPilot
المراجع
- GitHub Docs، Using secrets in GitHub Actions.
- Kubernetes، Secrets.
- jq، Manual.
- curl، Manual page,
-d, --data.
