BinaryVision

לוגים מוצפנים

מאת בתאריך 16/09/12, תחת כללי

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

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

השלב הראשון הוא יצירת משתמש שישמור את הלוגים,

# adduser -c "TCPDump user" -d /home/tcpdump-log -m tcpdump-log
# passwd -l tcpdump-log

נעבור אל המשתמש שיצרנו ונוריד את המפתח הפומבי,

# su - tcpdump-log
$ gpg --keyserver hkp://keyserver.ubuntu.com:11371 --recv-keys C95E234D

נוודא כי זהו המפתח שלנו על-ידי בדיקת טביעת האצבע של המפתח,

$ gpg --fingerprint C95E234D

לאחר האישוש, נוסיף אמון מלא במפתח (Ultimate trust),

$ gpg --edit-key C95E234D
command> trust
Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y

השלב הבא הוא יצירת סקריפט קטן שיעזור לנו להמיר את הפלט המתקבל מ-tcpdump לקובץ מוצפן, הקובץ היה בספריה /home/tcpdump-log/bin בשם enc.sh,

#!/bin/bash

HOME=/home/tcpdump-log

/usr/bin/gpg -a -r C95E234D --bzip2-compress-level 9 --encrypt $1
/usr/bin/shred -z -u $1

לא לשכוח לתת לקובץ הרשאות ריצה,

$ chmod +x /home/tcpdump-log/bin/enc.sh

לבסוף נותר לנו להריץ את tcpdump בכדי לתפוס תעבורת רשת, זאת נעשה תחת המשתמש רוט*,

# nohup tcpdump -i eth0 -nn -s 68 -q -Z tcpdump-log -G 3600 -z '/home/tcpdump-log/bin/enc.sh' -w /home/tcpdump-log/headers-%Y%m%d-%H%M%S.log & > /dev/null

הפקודה הזאת תאזין על הממשק רשת eth0, היא תתפוס את ה-68 בייטים הראשונים (headers), לאחר כתיבת הקובץ לכונן התוכנה תוריד את ההרשאות שלה ל-tcpdump-log, ותבצע סירקולציה של הלוגים כל 3600 שניות (שעה), לבסוף היא תריץ את הסקריפט שיצרנו בשלבים הקודמים – הצפנה של הלוג ומחיקה של הקובץ הלא מוצפן.
אם העברת הקבצים המוצפנים למערכת שמחזיקה את המפתח הפרטי (החצי השני של המפתח הא-סמטרי) ניתן להמיר את הקבצים ל-tcpdump על-ידי,

$ gpg --decrypt filename...asc > filename...log
$ tcpdump -nn -r filename...log

אפשר להרחיב את המרת הלוגים Clear-text שבמערכת למוצפנים על-ידי עקרון זה, ניתן לעשות שימוש במפתח א-סמטרי ו-Log rotate, הדוגמה כאן היא אך ורק ל-tcpdump, אך ניתן דיי בקלות להרחיב את הרעיון הלאה. יש לשים לב שעד שהסקריפט יורץ הקבצים יהיו לא מוצפנים.

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

עדכון 17 בספטמבר, 2012:

לקחתי את ההערות של שי לצומת ליבי והנה סקריפט אשר יצפין את ה-stream ללא כתיבת קובץ לכונן. לא בדקתי את ההשלכות של ה-buffer על הזכרון, וכן ייתכן שיאבדו חבילות (packet loss) בלוג.

#!/bin/bash
# Run this command as root. Don't forget to import the gpg key to root's home dir.
# run example: nohup ./enc-v2.sh & > /dev/null ; rm nohup.out
# to stop the capture: killall enc-v2.sh
# By iTK98 for https://www.binaryvision.co.il.
# License, Public Domain.

while true; do
  current=`date +"%Y%m%d-%H%M%S"`
  tcpdump -i eth0 -nn -s 68 -G 3600 -W 1 -w -|gpg -a -r C95E234D --bzip2-compress-level 9 --encrypt - > /home/tcpdump-log/capture-$current
  chown tcpdump-log:tcpdump-log /home/tcpdump-log/capture-$current
done
:, , , , , , , , , , , ,
5 תגובות:
  1. דודו

    עבודה יפה מאוד.
    תודה רבה על המאמץ.

  2. שי

    הצעת ייעול –
    במקום לשמור לקובץ תן לgpg להצפין את המידע ב stream … ואז לא יהיה לך אף שלב שבו המידע גלוי.

    ואם בכל זאת אתה רוצה לעבוד עם מידע גלוי, תדאג למחוק את הקובץ שהצפנת בצורה בטוחה (לפחות shred, אם לא dd עם מידע רנדומלי) אחרת כל המאמץ שלך מיותר.

  3. iTK98

    תודה על ההערות, הם הוכנסו לפוסט.

    יש לשים לב שכאשר מצפינים את הפלט של tcpdump באופן ישיר, ללא קובץ מקשר, בוודאות יאבדו חבילות. מומלץ להשתמש בשיטה המקורית ולעשות שימוש ב-shred במקום ב-rm.

  4. שי

    שמחתי לעזור… הפוסטים שלך מעניינים, כן ירבו.

    לגבי אובדן פקטות – לא נשמע לי הגיוני, שתי התוכנות עובדות לוסלס… למה שזה יקרה?

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

  5. iTK98

    באופן שאני ישמתי את ההצפנה "on-the-fly", ברגע שהפלט מ-tcpdump מוצפן על-ידי gpg, אין תהליך המאזין לתעבורה עד שהלולאה מורצת שוב.

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

    אם יש דרך טובה יותר לעשות זאת, אשמח לשמוע עליה.

השאר תגובה

מחפש משהו?

תשתמש בטופס למטה כדי לחפש באתר: