אבטחת מידע ב-FORTVISION
1. ארכיטקטורה ואחסון
מיקום הנתונים
- פונקציות ה-API רצות באזור ברירת המחדל של Vercel (ארה"ב, iad1); לא הוגדר אזור אחר בקונפיגורציה.
- קבצי מדיה, גיבויים ונתוני תוספי החנות: AWS אירלנד (eu-west-1).
- אזור מסד ה-Redis נקבע ברמת המסד בחשבון Upstash, ואזור SES בקונפיגורציית הסביבה — שניהם יימסרו על פי בקשה.
2. אימות (Authentication)
- סיסמאות נשמרות כ-hash מסוג scrypt עם salt אקראי לכל משתמש (N=16384). hash-ים ישנים משודרגים אוטומטית בהתחברות הבאה.
- אימות דו-שלבי (2FA): אפליקציית TOTP או קוד באימייל. בהפעלה נוצרים 8 קודי שחזור חד-פעמיים (נשמרים כ-SHA-256). ניתן "לזכור" מכשיר ל-30 יום (מזהה המכשיר נשמר כ-hash).
- כניסה חברתית: Google Sign-In ו-Facebook Login.
- הגנה מפני ניחוש סיסמאות: הגבלת קצב לפי IP (100 ניסיונות / 10 דק') ולפי אימייל (20 / 15 דק'), ונעילה קשיחה של החשבון ל-15 דקות לאחר 8 כשלונות רצופים — עם אימייל התראה לבעל החשבון.
- סשנים: טוקן אקראי בצד השרת בלבד, תוקף 7 ימים (30 יום לסשן של מעבר בין סביבות עבודה). המשתמש יכול לנתק את כל הסשנים האחרים שלו בלחיצה אחת.
- טוקני API (
fvmcp_…): נושאים הרשאות (scopes), פגים אחרי 90 יום כברירת מחדל (מקסימום 365), עד 25 פעילים לסביבת עבודה, נשמרים כ-HMAC-SHA256 עם "pepper" ממשתני הסביבה — כך ש-dump של המסד לבדו אינו מאפשר לייצר טוקן. רק בעל סביבת העבודה יכול ליצור/לבטל/להחליף טוקן, וטוקן API לעולם אינו יכול לנהל טוקנים אחרים. - MCP: OAuth 2.1 עם PKCE ורישום לקוח דינמי.
3. הרשאות (Authorization) ובידוד לקוחות
- בידוד סביבות עבודה בצד השרת (
lib/tenantScope.js): משתמש מוגבל רשאי לגשת רק לחשבונות המודעות, הדפים, האתרים ומזהי Google Ads שהוענקו לו. כשלא ניתן להתאים משאב להרשאה — הגישה נחסמת (fail-closed). - הרשאות לפי משתמש: מנהל הסביבה מגדיר לכל משתמש אילו חשבונות, אתרים ותכונות (tabs) זמינים לו.
- כניסת לקוחות: לקוח קצה מקבל משתמש מוגבל עם הרשאה לאתר/חשבון שלו בלבד — ורואה רק את הנתונים שלו.
- API ו-MCP עוברים באותם handlers של האפליקציה, עם סשן אמיתי של בעל הטוקן — אין שכבת הרשאות שנייה ונפרדת שיכולה לסטות. סביבת העבודה נגזרת מהטוקן ולעולם לא מהלקוח; מזהים של סביבה אחרת מחזירים 404.
- סקירת גישה חוצת-לקוחות הושלמה ב-1 בספטמבר 2026; כל הממצאים תוקנו, ומאז צנרת הפריסה מריצה בדיקת בידוד לקוחות (עם סביבות סינתטיות) בכל פריסה — ראו סעיף 6.
- יומן ביקורת: כניסות, עריכת לידים ופעולות ניהול נרשמות לסביבת העבודה (נשמר 180 יום, עד 2,000 רשומות אחרונות); לכל קריאת API/MCP נרשם מי, איזה כלי ומה התוצאה (90 יום). הצפייה ביומן זמינה למנהל הסביבה.
4. הגנה על הנתונים
- בתעבורה: HTTPS/TLS בכל הממשקים — דפדפן↔אפליקציה, אפליקציה↔Redis, אפליקציה↔AWS וספקי צד ג'.
- במנוחה: הצפנה במנוחה מסופקת ומנוהלת על ידי ספקי התשתית (Upstash, AWS, Vercel). סיסמאות, קודי שחזור וטוקני API נשמרים כ-hash בלבד.
- סודות: מפתחות API וסודות מוגדרים אך ורק כמשתני סביבה של הפרויקט ואינם נשלחים לדפדפן. נקודות cron מוגנות בסוד ייעודי בהשוואה בזמן-קבוע.
- גיבויים: מדי יום (03:10 UTC) מיוצאים מפתחות הקונפיגורציה והתוכן — משתמשים וסביבות עבודה, קמפיינים באתר, אוטומציות, הגדרות ייחוס ושיוך לקוחות — כקובץ דחוס ל-S3 (eu-west-1). נתוני אירועים/אנליטיקס אינם כלולים בגיבוי (ניתנים לשחזור מהמקור).
- שמירה (retention) של מידע תפעולי: סשנים 7 ימים · אימות 2FA ממתין 10 דקות · יומן ביקורת 180 יום · יומן API 90 יום · יומן שגיאות שרת 14 יום · טלמטריית מצב 8 ימים · מוני דף הסטטוס 45 יום. נתוני לידים ואנשי קשר נשמרים כל עוד סביבת העבודה פעילה.
- מחיקה: מנהל הסביבה יכול למחוק משתמש (מסמך המשתמש וכל הסשנים שלו נמחקים מיד). בקשות למחיקת סביבת עבודה שלמה או נתוני נושא-מידע מטופלות על פי בקשה בכתב (ראו סעיף 8). ה-webhooks המחייבים של Shopify למחיקת נתוני לקוח וחנות (
customers/redact,shop/redact) ממומשים ומאומתים ב-HMAC. - דיוור: קישורי הסרה חתומים (HMAC) בכל אימייל, מרכז העדפות, רשימות הסרה לאימייל ול-SMS.
5. ניטור ותגובה לאירועים
- ניטור זמינות אקטיבי כל 10 דקות: האפליקציה, ה-API, ה-runtime של קמפיינים באתר, קליטת אירועים ו-API של תוספי החנות. כל בדיקה מקבלת ניסיון חוזר אחד לפני שנספרת ככשל.
- התראה אחרי 2 כשלים רצופים — לתורן דרך התראה באפליקציה והודעת WhatsApp; הודעת התאוששות כשהבדיקה חוזרת לתקין.
- ניטור זרימת אירועים של אתרי לקוחות (מדי שעה): אתר שהפסיק לשלוח אירועים או שינוי מזהה לא צפוי מדווחים אוטומטית.
- שגיאות שרת נלכדות ליומן מרכזי; מסלולי fallback "שקטים" סופרים את עצמם ומסוכמים יומית, כדי שתקלה שקטה לא תישאר חבויה.
- דף סטטוס ציבורי: /status — מצב נוכחי והיסטוריית זמינות ל-30 יום, ללא מידע פנימי.
- אירועי אבטחה: בעת חשד לאירוע אבטחת מידע המשפיע על נתוני לקוח, FORTVISION מודיעה ללקוחות המושפעים ללא דיחוי בלתי סביר ולא יאוחר מ-72 שעות מרגע הגילוי, עם פרטי האירוע, הנתונים המושפעים והצעדים שננקטו (ראו DPA).
6. פיתוח ופריסה מאובטחים
- שער פריסה אחד (
scripts/deploy.sh) — אין פריסה ידנית לייצור. - לינט סטטי (מבוסס acorn) שמאתר הפניות לא-מוגדרות בכל קוד השרת והלקוח, ובודק escaping של handlers מוטמעים — פריסה נחסמת בכשל.
- קנרית API: כל שאילתת Google Ads בקוד שנפרס נבדקת מול ה-API לפני הפריסה.
- אימות לפני קידום: הגרסה החדשה נבדקת קודם על כתובת פריסה מבודדת ומוגנת — חותמת גרסה, בדיקות smoke, בדיקת בידוד לקוחות (סביבות סינתטיות) ובדיקת נתיב הרשאה (משתמש עם הרשאה עדיין מקבל את הנתונים שלו) — ורק אז מקודמת לדומיינים של הייצור. נעילת פריסה מונעת פריסות מקבילות.
- שחזור: כשל בבדיקה שלאחר הקידום מקדם חזרה את הגרסה הקודמת.
- Webhooks נכנסים מאומתים בחתימת HMAC-SHA256 על גוף הבקשה הגולמי (Meta, Shopify, TikTok, ממסר WhatsApp); דחיות חתימה נרשמות.
- חבילת בדיקות אוטומטית לשער ה-API/MCP (כולל בדיקות בידוד לקוחות) רצה בכל שינוי בשכבה זו.
7. תתי-מעבדים (Sub-processors)
ספקים שמעבדים נתוני לקוחות בשם FORTVISION, כפי שמופיעים בקוד הפלטפורמה:
| ספק | תפקיד | נתונים | מיקום |
|---|---|---|---|
| Vercel Inc. | אירוח האפליקציה וה-API | כל תעבורת האפליקציה | ארה"ב (iad1) + CDN גלובלי |
| Upstash Inc. | מסד נתונים ראשי (Redis) | נתוני סביבות העבודה | לפי הגדרת המסד |
| Amazon Web Services | SES (אימייל), S3 (מדיה, גיבויים), Aurora MySQL, Lambda/API Gateway | אימיילים, קבצים, גיבויים, נתוני תוספי חנות | אירלנד (eu-west-1); SES לפי הגדרה |
| Cloudflare Inc. | CDN לקריאייטיבים של מודעות | קבצי קריאייטיב בלבד | רשת גלובלית |
| Anthropic PBC | עוזר AI (צ'אט), יצירת תוכן | תוכן והקשר שהמשתמש מבקש לנתח | ארה"ב |
| OpenAI | יצירת תוכן אימייל ו-AI | תוכן שהמשתמש מזין | ארה"ב |
| Google LLC | Gemini (יצירת דפי נחיתה), Google Sign-In, Google APIs | תוכן שהמשתמש מזין; פרטי כניסה | ארה"ב / גלובלי |
| Twilio Inc. | SMS, שיחות, מעקב שיחות | מספרי טלפון, תוכן הודעות | ארה"ב / גלובלי |
| MicroPay (מיקרופיי) | שליחת SMS בישראל | מספרי טלפון, תוכן הודעות | ישראל |
| Unipile | אינטגרציית הודעות LinkedIn | שיחות LinkedIn של חשבונות מחוברים | EU |
פלטפורמות מחוברות (בשליטת הלקוח)
הלקוח בוחר לחבר את החשבונות שלו; הפלטפורמות הבאות פועלות כבעלות שליטה עצמאיות על פי תנאיהן: Meta (פייסבוק, אינסטגרם, מודעות, לידים, WhatsApp Business), Google Ads / Analytics / Business Profile, TikTok for Business, LinkedIn, Shopify, Wix ו-WooCommerce.
8. דיווח על פגיעויות ויצירת קשר
מצאתם פגיעות אבטחה? אנא כתבו ל-info@fortvision.com עם הנושא "Security report". נאשר קבלה תוך 2 ימי עסקים, נעדכן על התקדמות, ולא ננקוט צעדים משפטיים נגד מחקר בתום לב שמכבד את פרטיות המשתמשים ואינו פוגע בזמינות השירות.
בקשות פרטיות (עיון, תיקון, מחיקה, ניוד), שאלות על תתי-מעבדים או בקשה ל-DPA חתום: אותה כתובת. מדיניות פרטיות: fortvision.com/privacy-policy.
Security at FORTVISION
1. Architecture & hosting
Data location
- API functions run in Vercel's default region (USA, iad1); no other region is configured.
- Media files, backups and store-plugin data: AWS Ireland (eu-west-1).
- The Redis database region is set per database in the Upstash account and the SES region in the environment configuration — both provided on request.
2. Authentication
- Passwords are stored as scrypt hashes with a per-user random salt (N=16384). Legacy hashes are upgraded transparently on the next sign-in.
- Two-factor authentication: TOTP app or email code. Enrolment issues 8 single-use recovery codes (stored as SHA-256). A device can be trusted for 30 days (device id stored hashed).
- Social sign-in: Google Sign-In and Facebook Login.
- Brute-force protection: rate limits per IP (100 attempts / 10 min) and per email (20 / 15 min), plus a hard 15-minute account lock after 8 consecutive failures — with an alert email to the account holder.
- Sessions: random server-side token only, 7-day lifetime (30 days for a workspace-switch session). Users can sign out all their other sessions with one click.
- API tokens (
fvmcp_…): scoped, expire after 90 days by default (max 365), at most 25 active per workspace, stored as HMAC-SHA256 with an environment-held pepper — a database dump alone cannot mint a token. Only the workspace owner can create, revoke or rotate tokens, and an API token can never manage other tokens. - MCP: OAuth 2.1 with PKCE and dynamic client registration.
3. Authorisation & tenant isolation
- Server-side tenant scoping (
lib/tenantScope.js): a restricted user may only touch the ad accounts, pages, sites and Google Ads customer ids granted to them. When a resource cannot be matched to a grant, access is denied (fail-closed). - Per-user grants: the workspace admin decides which accounts, sites and features (tabs) each user gets.
- Client logins: an end client receives a restricted user granted only their own site/account — and sees only their data.
- API and MCP go through the same application handlers with a real session minted for the token owner — there is no second, separate authorisation layer that could drift. The workspace is resolved from the token, never supplied by the client; ids from another workspace return 404.
- A cross-tenant access review was completed on 1 September 2026; all findings were fixed, and since then the deploy pipeline runs a tenant-isolation probe (with synthetic tenants) on every deploy — see section 6.
- Audit log: sign-ins, lead edits and admin actions are recorded per workspace (kept 180 days, last 2,000 entries); every API/MCP call is logged with who, which tool and the outcome (90 days). The log is visible to the workspace admin.
4. Data protection
- In transit: HTTPS/TLS on every hop — browser↔app, app↔Redis, app↔AWS and third-party providers.
- At rest: encryption at rest is provided and managed by the infrastructure providers (Upstash, AWS, Vercel). Passwords, recovery codes and API tokens are stored only as hashes.
- Secrets: API keys and secrets exist only as project environment variables and are never shipped to the browser. Cron endpoints require a dedicated secret compared in constant time.
- Backups: daily (03:10 UTC) export of configuration and content keys — users and workspaces, on-site campaigns, automations, attribution settings and client-account groupings — as a compressed file to S3 (eu-west-1). Event/analytics data is not included (reproducible from source).
- Retention of operational data: sessions 7 days · pending 2FA 10 minutes · audit log 180 days · API log 90 days · server error log 14 days · degraded-path telemetry 8 days · status counters 45 days. Lead and contact data is kept for as long as the workspace is active.
- Deletion: a workspace admin can delete a user (the user record and all their sessions are removed immediately). Requests to delete an entire workspace or a data subject's records are handled on written request (section 8). Shopify's mandatory customer/shop erasure webhooks (
customers/redact,shop/redact) are implemented and HMAC-verified. - Email: HMAC-signed unsubscribe links in every message, a preference centre, and suppression lists for both email and SMS.
5. Monitoring & incident response
- Active uptime monitoring every 10 minutes: the app, the API, the on-site campaign runtime, event ingestion and the store-plugin API. Each check gets one retry before counting as a failure.
- Alerting after 2 consecutive failures — to the on-call engineer via in-app alert and WhatsApp; a recovery notice when the check turns green again.
- Customer-site event-flow watchdog (hourly): a site that stops sending events, or an unexpected id change, is reported automatically.
- Server errors are captured to a central log; "silent" fallback paths count themselves and are summarised daily so a quiet breakage cannot stay hidden.
- Public status page: /status — current state and 30-day uptime history, with no internal details.
- Security incidents: on a suspected security incident affecting customer data, FORTVISION notifies affected customers without undue delay and no later than 72 hours after becoming aware, with the nature of the incident, the data concerned and the measures taken (see the DPA).
6. Secure development & deployment
- One deploy gate (
scripts/deploy.sh) — no manual production deploys. - Static lint (acorn-based) resolves every identifier in server and browser code and rejects undefined references, plus an inline-handler escaping check — a failure blocks the deploy.
- API canary: every Google Ads query in the committed code is validated against the live API before deploying.
- Verify-then-promote: the new build is first checked on an isolated, protected deployment URL — version stamp, smoke tests, a tenant-isolation probe (synthetic tenants) and a grant-path check (a user with a grant still receives their data) — and only then promoted to the production domains. A deploy lock prevents concurrent deploys.
- Recovery: a failed post-promote check promotes the previous deployment back.
- Inbound webhooks are verified with HMAC-SHA256 over the raw request body (Meta, Shopify, TikTok, WhatsApp relay); signature refusals are logged.
- Automated test suite for the API/MCP gateway (including tenant-isolation tests) runs on every change to that layer.
7. Sub-processors
Providers that process customer data on FORTVISION's behalf, as they appear in the platform code:
| Provider | Role | Data | Location |
|---|---|---|---|
| Vercel Inc. | Hosting of app and API | All application traffic | USA (iad1) + global CDN |
| Upstash Inc. | Primary database (Redis) | Workspace data | Per database configuration |
| Amazon Web Services | SES (email), S3 (media, backups), Aurora MySQL, Lambda/API Gateway | Emails, files, backups, store-plugin data | Ireland (eu-west-1); SES per configuration |
| Cloudflare Inc. | CDN for ad creatives | Creative files only | Global network |
| Anthropic PBC | AI assistant (chat), content generation | Content and context the user asks to analyse | USA |
| OpenAI | Email and content generation | Content the user submits | USA |
| Google LLC | Gemini (landing-page generation), Google Sign-In, Google APIs | Content the user submits; sign-in identity | USA / global |
| Twilio Inc. | SMS, voice calls, call tracking | Phone numbers, message content | USA / global |
| MicroPay | SMS delivery in Israel | Phone numbers, message content | Israel |
| Unipile | LinkedIn messaging integration | LinkedIn conversations of connected accounts | EU |
Connected platforms (customer-controlled)
The customer chooses to connect their own accounts; these platforms act as independent controllers under their own terms: Meta (Facebook, Instagram, Ads, Lead Ads, WhatsApp Business), Google Ads / Analytics / Business Profile, TikTok for Business, LinkedIn, Shopify, Wix and WooCommerce.
8. Responsible disclosure & contact
Found a security vulnerability? Please write to info@fortvision.com with the subject "Security report". We acknowledge within 2 business days, keep you updated on progress, and will not pursue legal action against good-faith research that respects user privacy and does not degrade the service.
Privacy requests (access, rectification, erasure, portability), sub-processor questions or a countersigned DPA: same address. Privacy policy: fortvision.com/privacy-policy.