העתקת קובץ תצורה אינה גיבוי, וגיבוי שאיש אינו יכול לשחזר אינו תוכנית. הארכיון חייב להכיל את זהות השירות, את המדיניות שסביבו ואת המצב שאומר אילו התקנים עדיין מורשים. הוא חייב גם להיות מוגן, מפני שברוב הפריסות הארכיון מעניק בדיוק את מה שה-VPN מעניק. ההחלטה מה חייב להיות ניתן לשחזור באה ראשונה; רשימת הקבצים נובעת מאותה החלטה.

התחילו מיעד הבנייה מחדש

כתבו מה שרת שנבנה מחדש חייב לעשות לפני שמרשימים קובץ אחד: לסיים את אותן מנהרות, להציג את אותה זהות ולסרב להתקנים שמבוטלים כרגע. המשפט הזה פוסל את רוב ההעתקות הנאיביות, מפני שספריית תצורה לעיתים רחוקות מכילה את רשימת הביטולים או את תלות הזהות החיצונית. הוא גם חושף את החלקים שחיים מחוץ למארח, כמו רשומות DNS, כללי חומת אש בענן והספרייה שמולה השער מאמת. תוכנית שמתעלמת מהם מייצרת שרת משוחזר שנראה בריא ואינו מכניס איש.

קבצו את החומר לשלוש סלים: זהות, תצורה ומצב. הזהות היא המפתחות, האישורים והרשות שחותמת עליהם. התצורה היא הגדרות הדמון, המאגרים, המסלולים ומדיניות חומת האש, ואילו המצב הוא קבוצת העמיתים, החשבונות והביטולים שמשתנה בכל יום.

הזהות היא החלק שאי אפשר ליצור מחדש

לא ניתן לשחזר מפתחות פרטיים מהזיכרון, והאישורים שתלויים בהם פגים לפי לוח זמנים שאתם יורשים ולא בוחרים. גבו את מפתח השרת, את חומר ההקצאה של הלקוחות ואת רשות האישורים, ואז סמנו מי מהם אמור להישאר מחוץ לרשת. מפתח רשות שחי רק בשער הפעיל נמצא במרחק פשרה אחת מאיפוס זהות מלא לכל לקוח. תעדו מה נשמר במכוון במקום אחר כדי שאיש לא ישכפל אותו לארכיון בעל הגנה נמוכה יותר.

ביטול ראוי לשורה משלו בתוכנית. שחזור התצורה של אתמול עלול להחזיר זהות שהסרתם היום, מה שהופך שחזור לתקרית אבטחה. שמרו את מצב הביטולים הנוכחי במקום שאינו תלוי בתמונת המצב שאליה הייתם חוזרים, ובדקו אותו אחרי כל שחזור.

צלמו את המצב ברגע אחד

העתק שנלקח בזמן שהשירות כותב מייצר מלאי לא עקבי, ונתוני זהות לא עקביים גרועים מהעתק נקי ישן יותר. השתמשו בנתיב הייצוא הנתמך לכל מאגר, ואז תעדו את זמן תמונת המצב, מפני שכל שאלה מאוחרת על השחזור תלויה בו.

wg showconf wg0 > /srv/backup/wg0.runtime.conf
sqlite3 /var/lib/vpn/admin.db ".backup '/srv/backup/admin.db'"
cp -a /etc/wireguard /srv/backup/etc-wireguard
sha256sum /srv/backup/*.conf > /srv/backup/MANIFEST

הפקודה הראשונה מדפיסה את הממשק הפעיל חזרה כתצורה, וזו הדרך המהירה ביותר ללכוד עמיתים שנוספו ביד ולא בכלי ניהול; זהו המדריך של wg(8) מתעד זאת. שורת sqlite היא התבנית למסד נתונים ניהולי: פקודת הגיבוי מייצרת העתק עקבי בזמן שהכותב ממשיך לרוץ. העתקת הספרייה שומרת על ההרשאות, וזה חשוב מפני שאותם קבצי מפתח ניתנים לקריאה רק על ידי root. המניפסט הוא מה שמאפשר להבדיל בין ארכיון שלם לקטוע.

אפשרו את השחזור ואז נסו אותו

הצפינו את הארכיון ושמרו את מפתח השחזור במקום אחר ולא במכונה שממנה הוא בא. גיבוי שסיסמתו קיימת רק בשרת שנכשל הוא גיבוי שאיש לא יפתח. הגבילו את השליפה לאנשים שכבר יכלו לנהל את השער, ותעדו כל שליפה. בדקו את השחזור ברשת מבודדת, מפני שזהות משוכפלת שמוקמת לצד הייצור יוצרת שני שרתים שעונים לאותו מפתח עמית.

תעדו את החריגים בקפידה כמו את התוכן. כללי חומת אש בענן, רשומות DNS וספרייה חיצונית עשויים כל אחד להזדקק לצעד שחזור משלו. העתקת קבצים מוצלחת אינה הוכחה שהשירות חוזר; ההוכחה היחידה שנחשבת היא נקודת קצה שנבנתה מחדש ועוברת את אותו מבחן קבלה כמו המקור.

מאמרים קשורים