אצל מהנדסים, שיתוף סודות מופיע בדרך כלל בשלושה מקומות: קליטת עובדים, מסירה לספקים וטיפול באירועי אבטחה. כאן תמצאו את נקודת המבט של מפתחים: מתי להשתמש בקישור חד-פעמי, מתי לוותר עליו ואיך ליצור אותו מסקריפט בלי שהסוד ידלוף בדרך להיסטוריית ה-shell. כדי לנסות קודם את המנגנון, הכלי החינמי ליצירת קישור סודי חד-פעמי לא דורש חשבון.
מתי מפתחים צריכים קישור חד-פעמי?
כשבצד אחד לפחות של המסירה יש אדם, והערך לא אמור להישאר בשום מקום אחריה. המקרים הנפוצים:
- קליטת מהנדס חדש עם פרטי ההתחברות הראשונים שלו.
- שיתוף סיסמת מנהל זמנית במהלך אירוע אבטחה.
- מסירת טוקן לספק או לקבלן, שלא אמור להישמר בכספת שלכם.
- החלפת פרטי התחברות, כשהערך הישן צריך להפסיק לעבוד מהר.
- שליחת מפתח ה-API שהקציתם ללקוח.
מתי לא להשתמש בקישור חד-פעמי
- סודות ממכונה למכונה. משתני סביבה של CI (למשל GitHub Actions secrets), Kubernetes Secrets ופרטי התחברות דינמיים של Vault הם הכלי הנכון שם. הקישור מיועד למסירה של אדם אל תוך המערכות האלה.
- פרטי התחברות של הצוות לטווח ארוך. מקומם במנהל סיסמאות.
- הגדרות ציבוריות. אל תציגו הגדרות שאינן סודיות כסוד. השתמשו בקישור רגיל.
קו ההפרדה: אם בשני קצוות ההעברה יש מכונות, השתמשו במאגר הסודות של הפלטפורמה. אם בקצה אחד לפחות יש אדם, קישור חד-פעמי הוא בדרך כלל הכלי הפשוט והנקי ביותר.
| מצב | הכלי הנכון |
|---|---|
| פרטי ההתחברות הראשונים של מהנדס חדש | קישור סודי חד-פעמי |
| Pipeline של 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 של מנהל סודות, ולעולם לא מוקלדים ב-shell אינטראקטיבי שבו הם נשמרים בהיסטוריה.
- הסקריפט מדפיס את הקישור, לעולם לא את התוכן.
set -euo pipefail, כדי שקריאת API שנכשלה לא תעביר בשקט URL ריק לשלב הבא.
תבנית לקליטת עובדים
דפוס שעובד טוב למהנדסים חדשים ביום הראשון:
- סקריפט הקליטה פותח חשבונות ושולף פרטי התחברות חד-פעמיים.
- הסקריפט יוצר קישור סודי לכל פרט התחברות, עם תפוגה של 4 שעות וביטוי סיסמה משותף.
- הסקריפט שולח אימייל עם כל הקישורים, ואת ביטוי הסיסמה בהודעה פרטית ב-Slack.
- המהנדס פותח כל קישור ומעתיק את פרטי ההתחברות למנהל הסיסמאות שלו.
- כל קישור שלא נקרא עד סוף היום מבוטל ומונפק מחדש בקצב של המהנדס.
למה דווקא הפרמטרים האלה: תפוגה של 4 שעות מכסה בוקר ראשון רגיל בלי להשאיר פרטי התחברות פעילים במשך הלילה. ביטוי הסיסמה עובר בערוץ שני, כך שאימייל שהועבר הלאה או הגיע לנמען הלא נכון לא מזיק. מחיקה לאחר קריאה פירושה שבסוף היום תיבת הדואר של המהנדס מכילה רק כתובות URL שכבר לא עובדות.
אמרו לעובד החדש במפורש: "כל קישור עובד פעם אחת. שמרו את הערך במנהל הסיסמאות לפני שאתם סוגרים את הלשונית." הכשל הנפוץ ביותר בקליטה הוא נמען שקורא את הסוד, סוגר את הלשונית ומניח שיוכל לחזור אליו אחר כך.
נוהל להחלפת פרטי התחברות
החלפה של סיסמה משותפת למסד נתונים, כשבצד המקבל יש קבלן או חבר צוות:
- צרו את הסיסמה החדשה והחילו אותה במערכת המקור (מסד הנתונים, קונסולת הענן, היכן שנמצא העותק הרשמי).
- עדכנו קודם את הצרכנים שלכם (כספת ה-CI, ה-K8s secret, הגדרות האפליקציה), כדי ששום דבר לא יישבר בזמן המסירה לאדם.
- צרו קישור חד-פעמי לערך החדש: מחיקה לאחר קריאה, תפוגה של 1 שעה, ביטוי סיסמה.
- מסרו את הקישור ואת ביטוי הסיסמה בערוצים שונים.
- ודאו שאירוע הצפייה מופיע בציר הזמן של יומן הביקורת. אין צפייה לפני התפוגה? בטלו את הקישור והנפיקו חדש. לעולם אל תשלחו שוב את אותו קישור.
- ודאו שפרטי ההתחברות הישנים מושבתים במקור.
כל החלפה מקבלת קישור משלה. הקישורים בלתי תלויים זה בזה מעצם התכנון: זה יתרון במסירה וחיסרון בניהול, ולכן לוח הזמנים של ההחלפות נשמר במנהל הסיסמאות או בנוהל שלכם, לא בכלי הקישורים.
טיפול באירועי אבטחה
במהלך אירוע אבטחה צריך לעיתים קרובות להחליף פרטי התחברות ולחלק את החדשים מהר לכמה אנשים שמטפלים באירוע. אל תדביקו אותם בערוץ של האירוע: הערוץ הזה מתועד לקראת התחקיר, והסוד יגיע לייצוא, למסמך התחקיר ולכל מערכת שמירה שבאה אחריהם.
- החליפו את פרטי ההתחברות במערכת המקור.
- הנפיקו קישור סודי עם תפוגה של 30 דקות.
- שימו את הקישור בערוץ ושלחו את ביטוי הסיסמה בהודעה פרטית.
- אחרי האירוע, ודאו שהקישור נמחק או בוטל.
כך התחקיר מכיל URL שכבר לא עובד במקום סיסמת מנהל פעילה, ויומן הביקורת נותן למי שבודק את ציר הזמן רישום מדויק בלי עבודה נוספת: "פרטי ההתחברות הונפקו מחדש ב-14:32, נקראו ב-14:33".
הערה על תצוגות מקדימות: אפליקציות צ'אט טוענות כתובות URL שמודבקות
בהן כדי להציג תצוגה מקדימה. קישור סודי שתוכנן היטב עומד בזה, כי
טעינת התצוגה המקדימה היא GET והצגת הסוד היא POST מפורש. ראו
סורקי קישורים וסודות חד-פעמיים
להסבר המלא. אם אתם בוחנים כלי, בדקו את זה לפני אירוע אבטחה, לא
במהלכו.
מה יומן הביקורת מספר לכם?
האם הסוד נקרא, מתי ובערך מאיפה, והאם מישהו ניסה ביטוי סיסמה שגוי. לכל סוד ב-LinkPilot יש ציר זמן של אירועים: created, viewed, failed_passphrase, burned, expired, revoked. צפיות נרשמות עם חותמת זמן, מיקום גיאוגרפי משוער כשהוא זמין, ה-user agent ו-IP שעבר hash (SHA-256 עם salt שמתחלף כל יום; כתובת ה-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.
