כניסה מאוחדת
הכניסה המאוחדת מאפשרת לספק זהויות חיצוני (IdP) להחליט מי רשאי להיכנס לשרת Control Center שלכם. שני פרוטוקולים נתמכים — SAML 2.0 ו-OpenID Connect — ושניהם מגיעים לאותה נקודה: פרטי גישה של מכשיר שנוצרו זה עתה, שאינם ניתנים להבחנה מהזמנה או משיוך ב-QR בכל מקום בהמשך.
הצורה של התחברות
קטע בשם “הצורה של התחברות”התחברויות SAML מתווכות על ידי הדפדפן. ה-IdP לעולם אינו פותח חיבור לשרת שלכם; הדפדפן של המשתמש נושא את הכול:
browser ──> /saml/login ──> IdP ──POST SAMLResponse──> /saml/acs │ verify ▼ provision user (maybe) │ ▼ browser handoff: device PSK in the URL fragment (never a query parameter)מכיוון שהדפדפן הוא השליח, שרת מאחורי NAT עובד היטב לצורך התחברות: localhost, LAN, Tailscale, VPN או מנהרה — כולם מתאימים; רק הדפדפן של המשתמש חייב להגיע לכתובת ה-ACS. ממסר ה-WebSocket שמשמש לשליטה מרחוק מהטלפון אינו יכול לשאת את סבב ה-HTTP, ולכן נקודות הכניסה של SSO תמיד מכוונות למקור ה-HTTP של השרת.
OpenID Connect פועל באותה צורה, בסבב של authorization code + PKCE; ה-claims נקראים מנקודת הקצה לאסימונים של המנפיק דרך TLS, כך שהדפדפן כלל אינו מספק נתוני זהות.
המתאמים
קטע בשם “המתאמים”Control Center מחלק את האחריות במכוון:
| רכיב | היכן | אחראי על |
|---|---|---|
cc_saml native |
packages/cc_natives/native/saml/ |
אימות XML-DSig, קנוניקליזציה, אימות פרופיל SAML — מואצל לקרייט saml הטהור ב-Rust שמוצמד, מאחורי C ABI חסר מצב |
SamlService / OidcService |
cc_server_core |
מצב ההתחברות (מעקב אחר בקשות ממתינות, סינון כפילויות של שידור חוזר), מתגי מדיניות האימות, קריאת ההקצאה המשותפת |
SsoProvisioner |
cc_server_core |
איתור או יצירה של המשתמש, קיבוע ה־subject של הספק, הענקת חברויות לפי מדיניות החברות האוטומטית |
ScimService |
cc_server_core |
משטח הדחיפה של SCIM 2.0 (מחזור חיי הקצאה וביטול הקצאה) |
SsoSettingsService |
cc_server_core |
שורות החיבור השמורות, החלה מחדש בזמן אמת, אסימון ה-SCIM |
בכוונה אין נפילה לאחור של הצפנת SAML ב-Dart טהור: XML-DSig וקנוניקליזציה
במימוש עצמי הם בדיוק המקום שבו חיות חולשות עטיפת חתימה, ולכן ספרייה cc_saml
חסרה מסרבת הן להתחברות SAML והן לאתחול השרת. ה-native חסר מצב בתכנונו — מצב
חוצה־בקשות חי בשירותי ה-Dart, חד־פעמי וקצר־מועד.
מה ההתחברות מאמתת
קטע בשם “מה ההתחברות מאמתת”בתוך ה-native המאומת והשירות, לפי הסדר:
- את החתימה של ההצהרה (נדרשת תמיד; זו של מעטפת התגובה אופציונלית בהתאם לתצורה) — עמידה מבנית מפני עטיפת חתימה, משום שהמטען המאומת כבול לאלמנט המאומת,
- את המנפיק — תואם ל-IdP המוגדר,
- את הקהל — מציין את ספק השירות הזה,
- את היעד — הוא כתובת ה-ACS שלנו,
- את
InResponseTo— תואם לבקשת AuthnRequest ממתינה שהנפקנו (תגובות לא־מבוקשות שיזם ה-IdP כבויות כברירת מחדל), - את חלונות התוקף — עומדים בסטיית השעון (ברירת מחדל: 90 שניות), ואת
- את מזהה ההצהרה — לא נראה מעולם קודם לכן (מטמון שידור חוזר).
כשלים חוזרים כקודים טיפוסיים — signature, expired, audience, destination, issuer, request-match — ונקודות הקצה עונות בשגיאות כלליות, כך שתוקף לא לומד דבר על הסיבה לכשל של זיוף.
חשבונות וקיבוע ה־subject
קטע בשם “חשבונות וקיבוע ה־subject”התחברות ה-SSO הראשונה מקבעת על החשבון את ה־subject הקבוע של הספק (issuer
בתוספת SAML NameID / OIDC sub, או SCIM externalId). מעתה, ה־subject — ולא
כתובת הדוא“ל — הוא שמזהה את ההתחברות. אם מישהו אחר יציג בהמשך את אותה כתובת
דוא”ל מאותו IdP או מאחר, החשבון המקובע מסרב לו. זה מה שמונע מכתובת דוא“ל
שמוחזרה אצל ספק להפוך להשתלטות על חשבון.
הקצאה וביטול הקצאה
קטע בשם “הקצאה וביטול הקצאה”הקצאת JIT מתרחשת בזמן ההתחברות (SsoProvisioner). SCIM הוא משטח דחיפה נפרד
(ScimService) שמקבע את אותו subject על שורת המשתמש; הוא אינו מעניק חברויות
בסביבות עבודה. ביטול הקצאה — SCIM active: false או DELETE — מסרב אם
החשבון הוא בעלים של סביבת עבודה (יש להעביר בעלות קודם). אחרת, הוא קודם כל
שולל כל פרטי גישה של מכשיר (הסשנים נופלים בתוך שניות דרך מעקב המכשיר), מסיר
כל חברות בסביבת עבודה ומסמן את החשבון כלא פעיל. שורת המשתמש שורדת: הייחוס הוא
קבוע. הפעלה מחדש מחזירה את הכניסה אך לעולם אינה מעניקה מחדש חברויות.
מה נשאר בחוץ
קטע בשם “מה נשאר בחוץ”- מיפוי קבוצה→תפקיד מתרחש בזמן ההתחברות מתוך מאפייני SAML / ה־claims של OIDC — קבוצות שנדחפות ב-SCIM אינן נשמרות.
- לא ניתן להגיע לתפקיד הבעלים דרך SSO — לא כברירת מחדל של תפקיד ולא דרך מיפוי קבוצה.
- ממסר ה-WebSocket אינו ערוץ SSO לעולם; טלפונים שמגיעים לשרת רק דרך הממסר אינם יכולים להשלים מולו סבב דפדפן.