תיעוד/אמון

שאלות נפוצות על אבטחה

לאן השיחות שלכם הולכות, מה אנחנו שומרים, למי יש גישה, ומה עוד אין לנו. נכתב בשביל אנשי ה-IT ואבטחת המידע שבודקים אותנו, במונחים שהם בודקים.

איך לקרוא את הדף הזהכל תשובה מתארת את המוצר כפי שהוא פועל היום. כשמשהו ניתן להפעלה ולכיבוי, אנחנו מציינים מה ברירת המחדל. כשאין לנו משהו שבודקים שואלים עליו בדרך כלל, אנחנו אומרים את זה בחלק האחרון. שאלות שהדף הזה לא עונה עליהן: hello@talktomyagent.io.

לאן השיחות שלכם הולכות

איפה הסוכן רץ?

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

אילו חברות מטפלות בשיחה חיה?

שלוש, בשתי התצורות. הספק הטלפוני שלנו, Telnyx, מחבר את שיחת הטלפון. מנהרה מוצפנת של Cloudflare מעבירה אותה לרכיב השיחות. מודל Gemini Live של Google מקשיב ומדבר.

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

האם רכיב השיחות נגיש מהאינטרנט?

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

מה Cloudflare יכולה לראות?

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

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

איך אתם יודעים שאירוע שיחה נכנס הוא אמיתי?

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

איך ה-webhooks שאתם שולחים אלינו מוכיחים שהם באמת מכם?

האירוע call.ended חתום ב-HMAC-SHA256 על חותמת זמן ועל גוף הבקשה, בעזרת סוד חתימה שרק אתם ואנחנו מחזיקים בו. המדריך ל-webhooks מראה איך לאמת אותו.

מה אנחנו שומרים

אתם מקליטים שיחות?

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

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

אתם שומרים תמלולים?

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

מה אתם שומרים תמיד?

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

איפה המידע מאוחסן?

ב-Google Cloud, בארצות הברית. כרגע אנחנו לא מציעים בחירה של אזור אחסון.

אפשר לבקש שנמחק שיחות?

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

ומה אם מתקשר מקריא מספר כרטיס?

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

אתם מאמנים מודלי AI על השיחות שלנו?

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

למי יש גישה למה

הצוות שלכם יכול להאזין לשיחות שלנו?

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

שיחה של מתקשר אחד יכולה לדלוף לשיחה של מתקשר אחר?

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

מתי הסוכן ימסור פרטי הזמנה של לקוח?

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

למי הסוכן יכול לשלוח מייל?

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

האם מפתח ה-API של הספק הטלפוני יושב על שרת שבשליטתנו?

לא. ברכיב שיחות שאתם מריצים, השליטה בשיחה עוברת דרך שרת מתווך לאיתות (signaling proxy) שלנו, שבודק את זהות הפריסה, מפעיל מגבלות קצב ומקבל רק רשימה קבועה של פעולות שיחה. המפתח של הספק הטלפוני נשאר אצלנו, ב-Google Cloud Secret Manager.

אם אתם מריצים את רכיב השיחות בעצמכם

יש לכם גישה לשרת שלנו?

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

איך מועברים הסודות בזמן ההתקנה?

בטוקן התקנה חד-פעמי, מוצפן ב-AES-256-GCM, שפג 15 דקות אחרי שנוצר. כשמממשים אותו, התוכן המוצפן נמחק מהמערכות שלנו, ונשמרים רק נתוני ביקורת. הסוד של רכיב השיחות עצמו נשמר אצלנו כ-hash מסוג SHA-256.

איפה נמצא המפתח של המודל הקולי?

יש שתי אפשרויות. אפשר להביא מפתח Gemini משלכם, ואז Google מחייבת אתכם ישירות ואנחנו אף פעם לא מחזיקים בו. או שרכיב השיחות שולף את המפתח שלנו כשהוא עולה ושומר אותו בזיכרון בלבד: הוא לא נכתב לאף קובץ על השרת.

רכיב השיחות רץ כ-root?

התהליך של רכיב השיחות לא. ב-Linux הוא רץ כמשתמש שירות שאינו root, בבידוד (sandboxing) של systemd: בלי הסלמת הרשאות, עם תיקיות מערכת לקריאה בלבד, עם אזור קבצים זמניים פרטי משלו, ובלי core dumps. רכיב העדכון הנפרד, שמתקין גרסה חדשה כשמבקשים עדכון מהפורטל, רץ כשירות מערכת עם הרשאות root. בשרתי Hermes, משימה נוספת שרצה כ-root מעתיקה את קובצי הפרסונה שלכם לסביבת העבודה הקולית כל 15 דקות. אם רכיב השיחות עומד לרוץ כ-root, ההתקנה נעצרת.

מה תוכנית ההתקנה משנה במכונה?

היא כותבת לתיקיית ההתקנה שלה ולסביבת העבודה של הסוכן, מתקינה יחידות systemd לרכיב השיחות ולרכיב העדכון שלו, ומוסיפה את הפקודה ninja-talk ב-/usr/local/bin. בשרתי Hermes היא גם יוצרת משתמש שירות נעול שאי אפשר להתחבר איתו, ומוסיפה טיימר לסנכרון הפרסונה ושירות session מקומי. היא לא מוסיפה מפתחות SSH, כללי sudo, חוקי חומת אש או משימות cron. הסרת ההתקנה מסירה את מה שהיא הוסיפה, כולל משתמש השירות אם תוכנית ההתקנה יצרה אותו. סקריפטי ההפעלה, ההגדרות, קובצי היחידות וההרשאות פתוחים כולם לקריאה על השרת, ו-ninja-talk doctor מריץ בדיקת תקינות. הקובץ הבינארי של רכיב השיחות עצמו הוא תוכנה מהודרת וקניינית.

איך נבדקות ההורדות?

הקובץ הבינארי של רכיב השיחות נבדק מול ה-checksum מסוג SHA-256 שבמניפסט הגרסאות שלנו, בהתקנה ובכל עדכון, והקובץ הבינארי של המנהרה נבדק מול checksum שמקובע בתוכנית ההתקנה. ההתקנה נכשלת אם אחד מהם לא תואם. הגרסאות עדיין לא חתומות בחתימת קוד. פרטים בהמשך.

מה עוד אין לנו

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

  • אין הסמכות או אישורי תאימות. אין לנו הסמכת SOC 2, ISO 27001, PCI DSS או HIPAA. אם השיחות שלכם כוללות רשומות רפואיות או נתוני כרטיסי אשראי, דברו איתנו לפני שאתם בונים תוכנית עבודה סביב הסוכן.
  • אין הערכה בלתי תלויה שאפשר לשתף. בדיקות האבטחה שלנו עד היום הן ביקורות פנימיות של הקוד וההגדרות שלנו. אם התהליך שלכם מחייב הערכה של צד שלישי, ספרו לנו מוקדם.
  • אין חתימת קוד. הגרסאות מאומתות לפי checksum, עדיין לא לפי חתימה.
  • אין בחירה של אזור אחסון. מידע השיחות שנשמר נמצא בארצות הברית.
  • אין אחסון ב-bucket משלכם. ההקלטות והתמלולים שאנחנו שומרים מאוחסנים אצלנו. אפשר לכבות כל אחד מהם.
  • אין מסלול שעוקף את Cloudflare. תעבורת השיחות החיות עוברת תמיד דרך המנהרה של Cloudflare.

אין מערכת מאובטחת לחלוטין. אם מצאתם בעיה, כתבו ל-hello@talktomyagent.io ואנחנו נגיב.

איזו שיחה הסוכן שלכם יקבל קודם?

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