TgWitness / תיעוד

הפניה / אבטחה ופרויקט

ארכיטקטורה

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

תהליך Python אחד מארח את לוח הבקרה של FastAPI ומספר בלתי מוגבל של סביבות עבודה מבודדות, כשכל אחת מהן כוללת לקוח חשבון משתמש של Telethon. SQLite מכיל יומן אירועים חתום שניתן להוסיף אליו בלבד, וכן הגדרות תפעוליות הניתנות לשינוי. כספת מוצפנת מאחסנת את פרטי הזיהוי של ה-API, את ה-StringSession ואת מפתח החתימה. ה-frontend מורכב מקובצי HTML/CSS/JavaScript רגילים: אין צורך בבניית Node, ב-CDNs או בהורדות frontend בזמן ריצה.

מודול אחריות
collector.py אישור, בחירת דיאלוג, עדכונים, תמונות מצב, תור מדיה, ניטור חיבור
interactions.py / telegram_client.py פעולות פאנל מפורטות, קבלות חתומות, מזהי בקשות קבועים ומדיניות ניסיונות חוזרים מקומיים למשימות של שיחות חוזרות/הצטרפות
message_content.py השוואת הודעות נראית לעין, ללא מטא-נתוני גישה לתעבורה
workers.py יש להמתין לעובדי ייצוא הקבצים לפני ביצוע ניקוי הביטולים
store.py עסקאות WAL, שרשרת אירועים מסודרת, מסנני שאילתות, הגדרות תפעוליות
security.py יצירת קובץ פרטי, כספת מוצפנת, חתימה ב-Ed25519, נעילת תהליך יחיד
evidence.py ייצוא יומן מלא, נגזרות, נקודות ביקורת, אימות קבצים מצורפים
verify.py מאמת עצמאי, לקריאה בלבד (stdlib + קריפטוגרפיה): ארכיונים, כיסוי, יומני עדים והודעות בערוצים, קבצי פרופיל
app.py API מאומת, מחזור חיים, אימות בקשות, לוח סטטי
profiles.py אספני חשבונות מרובים, בקר גישה משותף, מחזור חיים לכל סביבת עבודה
access.py היקף ההרשאות, בדיקות הרשאות, הגבלות IP, מגבלות על הפעלה וקונסולת מנהל
proxy_catalog.py תמונות מצב של פידים ציבוריים, בדיקות העברה, מאגר פרוקסי משותף ובחירה על סמך תקינות
provenance.py מדידות חתומות של זהות, קוד ותלות, המבוצעות במהלך תהליך הרכישה
network.py מסלולים מאומתים לכל סביבת עבודה; סטטוס וראיות שעברו עריכה; אפשרויות העברה של Telethon
sessions.py המרה למצב קריאה בלבד (offline) של סכמות SQLite של Telethon שעברו בדיקה
account_import.py זיהוי ונורמליזציה בזיכרון של קבצי חשבונות נתמכים ו-JSON
tdata.py קורא ZIP מודרני ומוגבל של TData, אימות בדיקת סיכום/פענוח, ללא חילוץ
doctor.py בדיקות מוכנות מקומיות ללא איסוף נתונים, התחברות או התקנת חבילות תוכנה
download.py הורדת ייצוא זרם מאומת עם קריאות מוגבלות וללא כתיבה על קבצים קיימים
monitoring.py מדיניות אירועים מאומתת לכל סביבת עבודה וכללי קבצים מצורפים לפי סוג, המשותפים למנהלי חשבונות, סטטוס וקבלות חתומות
scope.py היקף הניטור (צ'אטים נבחרים, תיקיית טלגרם, חשבון שלם), סוגי מקורות, החרגות, רמות בדיקה חוזרת
dossier.py פרופילים אישיים לכל צ'אט, הנבנים על בסיס רשומות שנשמרו: עובדות עם הפניות לרשומות, SHA-256/pHash של האווטאר, חילוץ אזכורים
witness_api.py אסימוני עדים לקריאה בלבד וכותרת היומן החתום שהם עשויים לאחזר
witness.py תהליך עדות עצמאי: מפתח ויומן משלך, בדיקות ראש, פוסטים חתומים בערוץ, ייצוא
alerts.py התראות Apprise ורשימת ההתראות של הפאנל
logging_config.py רישום יומני קונסולה ואבחון שרתים מתחלף עבור הפעלות ללא חלון
static/ ממשק רספונסיבי, שער גישה מקומי, מסננים, פרטים, ייצוא, הגדרת חשבון
demo.py יומן סינתטי המסומן בבירור, מבודד מהאיסוף האמיתי

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

כל סביבת עבודה מקבלת חשבון אחד ויש לה ספרייה וזהות חתימה משלה. סביבת העבודה הראשית נשארת בשורש למען תאימות; סביבות עבודה נוספות נמצאות ב- profiles/<id>/. אסימון נושא אחד שולט על כל ההתקנה; סביבות העבודה אינן דיירים נפרדים לצורך אישור. נעילות תהליכים מגנות על הספריות; נעילות מסד הנתונים מסדרות את הוספת האירועים. כל תוספת נרשמת באופן סינכרוני ל-SQLite WAL במצב סינכרוני מלא (FULL). מפעילים לעדכון/מחיקה של אירועים מונעים עריכות רגילות של היישום; מנהלי מערכת הקבצים נשארים בתוך גבול האמון.

אישור ה-API הוא אסימון נושא (bearer token). פעולות הכניסה מסודרות בסדר סדרתי ומוגבלות בזמן. העלאות לחשבון משתמשות במגבלה ייעודית של 12 MiB לגוף מקודד ו-8 MiB לקובץ מפוענח; בקשות API רגילות שומרות על המגבלה של 16 KiB. ההמרה מתבצעת ב-thread של worker, שומרת את ההעלאות בזיכרון, ומחזירה קלט מנורמל לדפדפן המאומת. לכניסה באמצעות QR יש מועמד לכל סביבת עבודה, מזהה קצר-טווח, משימת המתנה, ובטול מפורש. רק אישור שהתקבל הופך ללקוח הפעיל. Telegram FloodWait מוחזר עם ערך Retry-After; פרטי הזדהות והודעות שגיאה גולמיות של RPC אינן נחשפות בשגיאות API. ייצוא מתבצע מחוץ לולאת האירועים האסינכרונית ומסודר לפי סביבת עבודה. הוא מזרים תמונת מצב קריאה יציבה, ויכול להתקיים במקביל לכתיבות WAL מתמשכות. אספני סביבות העבודה חולקים את לולאת התהליך/האירוע.

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

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

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

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