פרק 9
Cloudflare Access ו-Zero Trust
בעבר, גישה למערכות ניהול פנימיות, ממשקי פיתוח או מסדי נתונים דרשה חיבור VPN ארגוני מסורבל. ברגע שעובד או קבלן התחברו ל-VPN, הם קיבלו גישה רחבה לכלל רכיבי הרשת הפנימית, מה שיצר סיכוני אבטחה משמעותיים של תנועה רוחבית (Lateral Movement) במקרה של פריצה.
Cloudflare Access (חלק מחבילת Zero Trust Network Access - ZTNA) מיישם את עקרון היסוד של אפס אמון: "לעולם אל תסמוך, תמיד תאמת". כל בקשה לכל נתיב או אפליקציה נבדקת ומאומתת בשרתי הקצה של קלאודפלייר עוד לפני שהיא מגיעה לתשתית המקורית.
זרימת אימות ב-Cloudflare Access:
[גולש / עובד] ──(פנייה אל admin.example.com)──> [שרתי הקצה של קלאודפלייר]
│
├── אין אישור תקף? ──> [מסך אימות Access: OTP / Google / Okta]
│ │ (הזנת קוד / אישור זהות)
│ ▼
└── קיים טוקן JWT חתום ──> [העברת הבקשה אל שרת המקור]#ארבעת רכיבי המדיניות (Policy Components)
כל כלל גישה ב-Access מורכב מארבעה אלמנטים מוגדרים:
מדיניות Access = [Action] + [Rule Type] + [Selector] + [Value]#1. פעולה (Action)
- Allow: מעניק גישה למשתמשים שעומדים בתנאי הכלל.
- Block: חוסם מפורשות משתמשים (שימושי להחרגת משתמשים מסוימים מתוך קבוצה מורשית).
- Bypass: עוקף לחלוטין את מנגנון האימות של Access (מתאים לנתיבי Webhook ציבוריים או קריאות API חיצוניות שאינן תומכות בהתחברות דפדפן).
- Service Auth: אימות תקשורת בין מכונות (Machine-to-Machine) באמצעות טוקנים ייעודיים (Service Tokens) ללא צורך במסך התחברות אנושי.
#2. סוג הכלל (Rule Type)
- Include (תנאי OR): המשתמש חייב לעמוד לפחות באחד מכללי ה-Include כדי לקבל הרשאה. חובה להגדיר לפחות Include אחד בכל מדיניות.
- Require (תנאי AND): תנאי חובה נוסף שכל המשתמשים חייבים לעמוד בו (לדוגמה: המשתמש שייך לארגון וגם מתחבר מתוך שטח מדינת ישראל).
- Exclude (תנאי NOT): חסימה מיידית של מי שתואם לתנאי זה, גם אם עמד בכללי ה-Include.
#3. בורר (Selector) וערך (Value)
המאפיינים הנבדקים בזמן אמת:
- Emails: רשימת כתובות דוא"ל ספציפיות (
[email protected]). - Emails Ending In: סיומת דוא"ל ארגונית (
@company.com). - Country: מדינת המקור של הבקשה (
Israel,United States). - IP Ranges: כתובות IP משרדיות קבועות (
198.51.100.0/24). - Access Groups: קבוצות הרשאה שהוגדרו מראש.
- SAML / OIDC Groups: קבוצות הרשאה המסונכרנות מ-Google Workspace, Microsoft Entra ID (Azure AD), Okta או GitHub.
#סדר הערכת הכללים (Evaluation Order)
כאשר מגיעה בקשה, קלאודפלייר מעריכה את הכללים בסדר הבא:
- בדיקת כללי Bypass ו-Service Auth מלמעלה למטה.
- בדיקת כללי Block ו-Allow לפי הסדר שהוגדר במסך.
- ברגע שנמצאת התאמה למדיניות Allow (ועמידה בכל תנאי ה-Require וללא Exclude), מונפק טוקן זיהוי (JWT) והמשתמש מועבר לאפליקציה.
- אם לא נמצאה שום התאמה, הגישה נחסמת כברירת מחדל (Default Deny).
#אימות מכונה למכונה (Service Tokens)
עבור תהליכי אוטומציה, מערכות CI/CD (כמו GitHub Actions) או קריאות שרת-אל-שרת, אין אפשרות להקליד קוד אימות בדפדפן.
פתרון קלאודפלייר הוא Service Tokens:
- בלוח Zero Trust נכנסים ל-Access → Service Credentials → Create Service Token.
- קלאודפלייר מייצרת שני ערכים: Client ID ו-Client Secret.
- יוצרים מדיניות מסוג
Service Authעבור הנתיב המבוקש. - המערכת החיצונית שולחת את שני הערכים בכותרות הבקשה:
curl -H "CF-Access-Client-Id: <CLIENT_ID>" \
-H "CF-Access-Client-Secret: <CLIENT_SECRET>" \
https://api.example.com/internal/sync#אימות טוקן JWT בשרת המקור
לאחר אימות מוצלח, קלאודפלייר מזריקה כותרת HTTP בשם Cf-Access-Jwt-Assertion המכילה טוקן JWT חתום קריפטוגרפית.
שרת המקור שלכם יכול לפענח את הטוקן, לאמת את החתימה מול שרתי קלאודפלייר (https://<team-name>.cloudflareaccess.com/cdn-cgi/access/certs), ולחלץ ישירות את כתובת הדוא"ל והזהות של המשתמש המחובר (email, identity_provider).
#מלכודות אבטחה נפוצות
- שימוש שגוי ב-Everyone: הגדרת כלל Include מסוג
Everyoneפותחת את האפליקציה לכל אדם בעולם. - סתירה לוגית בתנאי Require: הגדרת שני תנאי Require למדינות שונות (למשל Require Israel ו-Require USA באותה מדיניות) תיצור מצב שאיש לעולם לא יוכל להתחבר, מאחר שבקשה אחת אינה יכולה להגיע משתי מדינות בו-זמנית.
- עקיפה מקומית: שרת שחשוף ישירות לאינטרנט בכתובת IP ללא חסימת חומת אש יאפשר לתוקפים לגשת אליו ישירות תוך עקיפת מסך ה-Access. יש להשתמש ב-Cloudflare Tunnel או לחסום ברמת השרת כל IP שאינו שייך לקלאודפלייר.
בפרק הבא נכיר את Cloudflare Workers - פלטפורמת ה-Serverless להרצת קוד בקרבת המשתמש ללא צורך בניהול שרתים.