אבטחה

איך אנחנו שומרים על האפליקציות פרטיות ונפרדות

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

כל בקשה עוברת התחברות קודם

כל התעבורה לאפליקציות ב-*.teamonly.app מגיעה קודם כול ל-dispatch Worker אחד. הוא מזהה את הארגון ואת האפליקציה לפי שם המארח, בודק שיש סשן תקף, ורק אז מעביר את הבקשה לאפליקציה. בלי סשן, המבקר מקבל את מסך ההתחברות. קוד הלקוח אף פעם לא רץ בשבילו.

יש שלוש דרכים להתחבר: Google OpenID Connect, Microsoft (Entra ID) OpenID Connect, או קוד חד-פעמי שנשלח לכתובת מייל של חברה. ב-Google וב-Microsoft, ה-ID token מאומת בשרת שלנו, כולל חתימה, audience, תוקף ודומיין המייל. ערך ה-hd של Google נבדק מתוך הטוקן המאומת, ולא מתקבל כמו שהוא מהבקשה. ב-Microsoft מתקבלים רק חשבונות עבודה ולימודים, וה-issuer של הטוקן חייב להתאים ל-tenant שלו.

קודים במייל

במקום Google או Microsoft, עמית יכול לבקש קוד בן 6 ספרות לכתובת העבודה. כך חברות שהמייל שלהן לא ב-Google Workspace או ב-Microsoft 365 משתמשות ב-TeamOnly, בלי שום הגדרה. הקוד מוכיח שיש לו שליטה בתיבת דואר באחד הדומיינים של החברה, אותו דבר שהתחברות עם Google או Microsoft מוכיחה. זה עובד עם כל ספק מייל. כתובות פרטיות כמו Gmail או Outlook.com נדחות באפליקציות של חברה.

  • קוד פג אחרי 10 דקות.
  • אחרי חמישה ניסיונות שגויים הקוד מפסיק לעבוד. צריך לבקש קוד חדש.
  • קוד עובד רק בדפדפן שביקש אותו. קוד שמישהו ראה מעבר לכתף, או שהועבר הלאה, לא שווה כלום בדפדפן אחר.
  • יש הגבלת קצב לבקשות לפי כתובת מייל ולפי כתובת IP, כך שאף אחד לא יכול להשתמש בטופס כדי להציף תיבת דואר.
  • הטופס מוגן על ידי Cloudflare Turnstile, שבודק שמבקש אותו אדם ולא סקריפט.
  • הטופס נותן אותה תשובה בין אם כתובת יכולה להתחבר ובין אם לא, כך שהוא לא חושף למי יש גישה.
  • הקודים נשלחים מ-signin@teamonly.app, עם SPF, DKIM ו-DMARC מוגדרים, כדי שספקי מייל יוכלו לבדוק שהם באמת הגיעו מאיתנו.
  • הקודים נשמרים רק כ-hash, והגישה נבדקת שוב כשמזינים את הקוד, למקרה שהיא השתנתה בינתיים.

זהות שהאפליקציה יכולה לסמוך עליה

ה-dispatch Worker מסיר כל כותרת זהות מהבקשה הנכנסת, ואז קובע בעצמו את המייל והשם המאומתים, יחד עם התפקידים של האדם באותה אפליקציה. ה-SDK חושף אותם לאפליקציה בתור ctx.user.

בדלת
incoming request to expenses.acme.teamonly.appx-teamonly-user: ceo@acme.com    removed, not from usx-teamonly-user: dana@acme.com   added from verified sign-in
שמות הכותרות להמחשה בלבד. האפליקציה קוראת את המשתמש מה-SDK, לא מהכותרות.

מסד נתונים ואחסון קבצים נפרדים לכל אפליקציה

כל אפליקציה מקבלת מסד נתונים D1 משלה, שנוצר בפריסה הראשונה, ו-prefix משלה באחסון R2 לקבצים. אלה ה-bindings היחידים לנתונים שמחוברים לאפליקציה. האפליקציות רצות כסקריפטים נפרדים ב-dispatch namespace של Workers for Platforms ולא יכולות להגיע ל-bindings אחת של השנייה.

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

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

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

סודות שנשמרים מחוץ לקוד

סודות מוגדרים עם npx teamonly secrets set ונשמרים כ-Worker secrets מוצפנים שמחוברים לאפליקציה האחת הזו. הם לא נמצאים ב-repository, לא ב-bundle, ולא גלויים לאפליקציות אחרות. קובץ ה-skill אומר ל-AI אף פעם לא לשים מפתחות בקוד.

קוקיז שמוגבלים לכתובת של אפליקציה אחת

עוגיות הסשן מוגדרות לשם המארח המדויק של האפליקציה, כמו expenses.acme.teamonly.app, עם Secure, HttpOnly ו-SameSite. הן אף פעם לא מוגדרות על teamonly.app או על תת-הדומיין של הארגון, כך שאפליקציה אחת לא יכולה לקרוא את הסשן של אחרת.

teamonly.app לא נמצא היום ב-Public Suffix List, ולכן דפדפנים מחשיבים כל כתובת של אפליקציה כחלק מאתר אחד כשהם מחליטים מה same-site. זו הסיבה שכל עוגיית סשן מוצמדת לכתובת המדויקת של האפליקציה שלה. הדף הזה יציין זאת אם זה ישתנה.

קוד של לקוחות מטופל כלא מהימן

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

איפה זה רץ

הכול רץ על Cloudflare: Workers ו-Workers for Platforms לקוד, D1 למסדי נתונים, R2 לקבצים ו-KV לסשנים. אנחנו לא מפעילים שרתים משלנו. בחירת אזור נתונים כלולה במסלול Business, ואנחנו מגדירים אותה איתכם כשאתם מצטרפים.

מה מוגדר איתכם, ומה אנחנו אף פעם לא עושים

במסלול Business אנחנו מגדירים Okta או ספק SSO אחר עם צוות ה-IT. יומני ביקורת ואזור הנתונים מוגדרים איתכם באותה דרך. הם כלולים במסלול, ולא מתגים שאתם מפעילים בעצמכם.

  • מוגדר איתכם
    Okta, OneLogin ו-SSO אחר (מסלול Business)
  • מוגדר איתכם
    יומני ביקורת (מסלול Business)
  • מוגדר איתכם
    בחירת אזור נתונים (מסלול Business)
  • אף פעם
    אפליקציות ציבוריות בלי אימות

אין לנו היום הסמכת SOC 2 או ISO.

דיווח על בעיית אבטחה

שלחו מייל אל hello@teamonly.dev עם המילה "Security" בנושא. בן אדם קורא כל הודעה, ונענה כדי לאשר שקיבלנו. בבקשה תנו לנו הזדמנות סבירה לתקן בעיה לפני שאתם משתפים אותה.

שאלות נפוצות

שאלות שאנשים שואלים

כל השאלות והתשובות

אפליקציה אחת יכולה לקרוא את מסד הנתונים של אפליקציה אחרת?

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

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

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

מנועי חיפוש סורקים את האפליקציות?

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

גישה מוקדמת

הכלי הראשון שלכם באוויר עוד השבוע.

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

לנסות 14 ימים בחינםאו להירשם עכשיו

בלי כרטיס אשראי לתקופת הניסיון. אחר כך החל מ-$19 לחודש, ביטול בכל עת.

עוד לא מוכנים? עדכונים במייל

כדאי להשתמש במייל העבודה. אנחנו כותבים לעתים רחוקות, ורק כשיש חדשות ששווה לשלוח.

שאלות שולחים אל hello@teamonly.dev, ובן אדם עונה.