תיעוד 75
פריסה ותפעול של Claude apps gateway
רשום את השער (gateway) מול ספק הזהויות שלך (
IdP), בנה את הקונטיינר, פרוס על גביKubernetesאוCloud Run, ותפעל אותו: בדיקות תקינות (health checks), סבב סודות (secret rotation), שדרוגים ואבטחה.
דף זה מכסה את הצד התפעולי של הפעלת Claude apps gateway: רישום לקוח OAuth בספק הזהויות שלך (IdP), פריסת השער כקונטיינר, והפעלתו השוטפת יום-יום. לכל אפשרות בקובץ gateway.yaml שהשער קורא בעת האתחול, ראה את מדריך התצורה.
פריסה בסביבת ייצור (production) מתבצעת לפי ארבעה שלבים לפי הסדר, והסעיפים שלהלן תואמים להם. בשני השלבים הראשונים מתקבלות ההחלטות; שני השלבים הבאים הם חומרי עיון לעיון לאחר שהשער כבר פועל.
- הגדרת ספק הזהויות שלך: רשום את לקוח ה-
OAuthובדוק את ההערות עבורOkta,Entraו-Google - פריסת השער: בנה תמונת קונטיינר מקובעת גרסה (pinned) והרץ אותה על גבי
Kubernetes,Cloud Run, או הפלטפורמה שלך. סעיף זה מכסה גם החלטות לגבי עלויות, מעקף (bypass), ריבוי שערים ו-serverless - הגדרת תפעול: יומנים (logs), בדיקות תקינות (health probes), התנהגות בעת השבתה, סבב סודות ושדרוגים. חומר עיון בעת הגדרת ניטור ונוהלי תפעול (runbooks)
- סקירת מערך האבטחה: אילו נתונים זורמים ולאן, מודל האיומים, ותשובות לתאימות (compliance). חומר עיון עבור סקירת אבטחה
אם כניסה (sign-in) או אתחול (boot) נכשלים לאורך הדרך, עבור ישירות אל פתרון בעיות, המסודר לפי השגיאה שמופיעה.
הערה: פרוס ברשת הפרטית שלך.
Claude Codeמתחבר אך ורק לשער שכתובתו פרטית. זהו מנגנון הגנה של אבטחה, מכיוון ששער מהימן (trusted) יכול להפיץ הגדרות שמריצות פקודות במחשבי מפתחים. הצב את השער שאתה פורס מאחורי נתב עומסים פנימי (internal load balancer) אוVPN, והענק לו שם מארח (hostname) שנפתר לכתובותIPפרטיות בלבד.
#הגדרת ספק הזהויות (Identity provider setup)
רשום יישום אינטרנט חסוי (confidential web application) מסוג OAuth/OpenID Connect (OIDC) עם redirect URI יחיד, https://<gateway>/oauth/callback, והקצה אותו למשתמשים או לקבוצות שאמורה להיות להם גישה לשער.
כל IdP התואם ל-OIDC יעבוד: Okta, Microsoft Entra ID, Google Workspace, Keycloak, Dex, PingFederate, ואחרים. ספק הזהויות חייב לעמוד בשלוש דרישות:
- מגיש את
/.well-known/openid-configuration, מעלHTTPSבסביבת ייצור; השער מקבל מנפיק ב-http://, ומנפיק ב-loopbackדורש בנוסף אתCLAUDE_GATEWAY_ALLOW_LOOPBACK=1 - תומך ב-
authorization-code flow. מנגנוןPKCE(Proof Key for Code Exchange) מופעל כברירת מחדל; השבת אותו באמצעותoidc.use_pkce: falseעבור ספקי זהויות שאינם תומכים בו - מחזיר
emailולפי בחירהgroupsבתוך ה-id_token, או מגיש אותם מנקודת הקצהuserinfoכאשר מוגדרoidc.userinfo_fallback: true
עבור PKI פרטי, הגדר את oidc.ca_cert_pem.
מספר ספקים מטפלים בטענות (claims) של דוא"ל וקבוצות באופן שונה:
- Okta: שרת ההרשאות הארגוני (org authorization server) בכתובת
https://example.okta.comמחזירid_tokenרזה שאינו כולל אתemailואתgroups, לכן הגדרoidc.userinfo_fallback: trueבכל פעם שאתה משתמש בו בתורissuer. שרת הרשאות מותאם אישית (custom authorization server) כגוןhttps://example.okta.com/oauth2/defaultשכולל אתemailואתgroups(באופן אופציונלי) בתוך ה-id_token, פולט אותם ישירות ואינו זקוק לנתיב גיבוי (fallback). חברתOktaפולטת אתgroupsרק כאשר תחום ההרשאה (scope) שלgroupsמבוקש ב-oidc.scopesומסנן טענות הקבוצות של האפליקציה מאפשר זאת;userinfo_fallbackאינו יכול למלא טענה שלא התבקשה מספק הזהויות. - Microsoft Entra ID: מנפיק
issuer=https://login.microsoftonline.com/<tenant-id>/v2.0. חברתEntraפולטת מזהי אובייקט (Object IDs) של קבוצות ולא שמות, לכן השתמש בערכי ה-GUIDבתוךmanaged.policies.match.groups, או השתמש ב-App Rolesעבור שמות קריאים לאדם. אם ה-tenantשלך פולט תפקידים תחתrolesבמקוםgroups, הגדרoidc.groups_claim: roles. - Google Workspace: מנפיק
issuer=https://accounts.google.com. ה-id_tokenשלGoogleאינו מכיל קבוצות. כדי להשתמש ב-allowed_groupsאו ב-managed.policiesמבוססי קבוצות כאשרGoogleמשמש כ-IdP, הגדר אתoidc.google_groups, אשר בודק את הקבוצות של כל משתמש דרך ה-Admin SDK Directory APIבאמצעות חשבון שירות (service account) עם האצלת סמכויות לכלל הדומיין (domain-wide delegation). ללא זאת, השתמש ב-oidc.allowed_email_domainsלהגבלת חברות וב-managed.policies.match.email_domainלהקצאת מדיניות. כמו כן,Googleמתעלמת מטווח ההרשאה הסטנדרטיoffline_access. לקבלת אסימוני רענון (refresh tokens), הגדרoidc.scopes: [openid, profile, email]וכןoidc.extra_auth_params: { access_type: offline, prompt: consent }.
אזהרה: אסימוני רענון (refresh tokens) מאפשרים לשער לחדש את ההפעלה (session) של המפתח באופן שקט, מבלי לשלוח את המפתח שוב לדפדפן. הם גם מניעים ביטול הרשאות (deprovisioning), מכיוון שכאשר ספק הזהויות משבית משתמש, הריענון הבא נכשל וההפעלה מסתיימת בתוך
ttl_hours. השער מבקשoffline_accessכברירת מחדל כדי לקבל אסימון רענון. אם ספק הזהויות שלך דורש הסכמה מפורשת עבור גישה לא מקוונת, הגדר את לקוח ה-OAuthלאפשר זאת.אם ספק הזהויות שלך אינו יכול להנפיק אסימוני רענון כלל, השער עדיין פועל, אך אין חידוש שקט, ולכן מפתחים מבצעים מחדש את ההתחברות בדפדפן כאשר תוקף ההפעלה שלהם פג. כדי למנוע מזה לקרות בכל שעה, העלה את
session.ttl_hoursל-8או ל-12. הפשרה היא השהיה בביטול ההרשאות (deprovisioning latency), מכיוון שללא אסימוני רענון, משתמש שהושבת שומר על גישה עד שחולף ה-TTLהארוך יותר.
#פריסה (Deployment)
השער הוא קובץ בינארי יחיד וחסר מצב (stateless) של Linux המתאם פעולות דרך Postgres, לכן פרוס אותו כפי שאתה פורס כל שירות חסר מצב אחר בסביבה שלך. שמור אותו בתוך הרשת שלך, במקום שבו המפתחים וספק הזהויות (IdP) שלך יכולים לגשת אליו דרך HTTPS, והתייחס אליו כמו אל כל שירות המחזיק באישורי גישה (credentials) של סביבת ייצור.
מספר החלטות מעצבות את הפריסה מעבר למקום שבו היא פועלת:
- עלות: אין רישיון נפרד או עמלה לפי מושב (per-seat). השער הוא חלק מהקובץ הבינארי
claude, כך שאתה משלם על הסקת מודלים (inference) דרך ההתחייבות הקיימת שלך, בתוספת משאבי המחשוב שעליהם הוא רץ. - מעקף (Bypass): השער אינו אוכף שהנתיב היחיד למודל יעבור דרכו. מפתח שיש לו אישורי גישה משלו עדיין יכול לקרוא ישירות לספק, ולכן סגירת הנתיב הזה היא החלטת מדיניות רשת, למשל חסימת יציאה (egress) אל
api.anthropic.comלמעט מהשער. חסימת תעבורת יציאה זו שוברת גם את בדיקת בטיחות הדומיין של WebFetch, אשר קוראת ל-api.anthropic.comממחשבו של כל מפתח. הגדרskipWebFetchPreflight: trueבמדיניות המנוהלת (managed policy) כדי להשבית אותה. - מספר שערים: כל שער הוא פריסה נפרדת עם תצורה משלו, וה-
CLIשומר אמון ואישורי גישה עבור כל שם מארח של שער בנפרד, כך שצוותים יכולים להשתמש בשערים שונים ללא התנגשות. כדי לשרת מספר מנפיקיOIDC, הרץ מופעים נפרדים. - Serverless: שירות
Cloud Runעובד אם מגדיריםmin-instances: 1כדי למנוע גילויOIDCקר.Lambdaו-Cloud Functionsאינם עובדים, מכיוון שהשער הוא שרתHTTPהפועל ברציפות לאורך זמן.
כל טופולוגיית ייצור כאן מציבה פרוקסי בשכבה 7 (L7 proxy), כגון Ingress, חזית השירות של Cloud Run, או ALB, לפני עותקים משוכפלים (replicas) הפועלים ב-HTTP פשוט. הגדר את listen.trusted_proxies לטווחי המקור של הפרוקסי כדי שהשער יקרא כתובות IP של לקוחות מתוך X-Forwarded-For. השער מכבד את הכותרת רק כאשר עמית ה-TCP מהימן. הדוגמאות המעשיות של Google Cloud ושל AWS כוללות ערכים קונקרטיים לכל טופולוגיה. ללא שרתי פרוקסי מהימנים, כל בקשה נראית כאילו הגיעה מכתובת ה-IP של הפרוקסי, מה שממזג מגבלות קצב (rate limits) של כל כתובת IP למאגר משותף יחיד ומתעד את כתובת ה-IP של הפרוקסי באירועי ביקורת (audit events).
הגדר לפרוקסי כל פסק זמן של חוסר פעילות (idle timeout) הארוך יותר ממרווח שמירת הקשר (keepalive interval) של השער, אשר תלוי בספק ה-upstream:
- בכל
upstreamלמעטprovider: anthropic, השער כותבpingשלSSEברגע שהזרם (stream) שקט במשך כ-15 שניות. - ב-
provider: anthropic, השער מעביר את התגובה ללא שינוי, כולל אותות ה-pingהעצמאיים של ה-APIשלAnthropic.
ערך ברירת מחדל כמו 60 שניות של ה-ALB מספיק כדי לשמור על זרם שקט פתוח. הדוגמה המעשית של AWS מעלה אותו לשעה בכל מקרה, ושורת פתרון הבעיות שלה מכסה שערים ישנים יותר מגרסה v2.1.229, אשר לא שלחו דבר בזמנים שקטים בספקי ה-upstream שכעת מקבלים אותות ping.
#תמונת קונטיינר (Container image)
בנה תמונה משלך סביב הקובץ הבינארי המקורי של claude מתוך מהדורת Claude Code הסטנדרטית:
- הורד את מהדורת ה-
Linuxעבור ארכיטקטורת התמונה שלך מתוך מהדורה מקובעת (pinned release); ראה התקנת גרסה ספציפית עבור כתובת ה-URLלהורדה. - אמת אותה מול קובץ ה-
manifest.jsonשל המהדורה החתום ב-GPGכמתואר ב-שלמות קבצים בינאריים וחתימת קוד. - העתק אותה לתוך הקשר הבנייה (build context).
צור מראה (mirror) של המהדורה ברגיסטרי הפנימי שלך אם תהליכי הבנייה שלך אינם יכולים להגיע לשרת המארח של המהדורה, וקבע את הגרסה שצי המחשבים (fleet) שלך מריץ.
מעבר לקובץ הבינארי, התמונה זקוקה ל:
- תמונה מבוססת glibc: התלויות הדינמיות היחידות של גרסת ה-
glibcהן ספריותglibc. תמונות מבוססותmuslזקוקות לגרסתlinux-x64-muslאוlinux-arm64-muslבתוספת חבילות נוספות; ראה הגדרת Alpine Linux. - ספריית מצב הניתנת לכתיבה: השער רץ ככל משתמש, אך לתמונות מינימליות אין ספריית בית (home) הניתנת לכתיבה. הגדר את
CLAUDE_CONFIG_DIRלנתיב הניתן לכתיבה כגון/tmp/.claude. - פקודת הקונטיינר:
claude gateway --config /etc/claude/gateway.yaml, כאשר קובץ התצורה מותקן (mounted) לקריאה בלבד וסודות מסופקים כמשתני סביבה; השער מאזין ב-listen.port, ברירת המחדל היא8080.
#Kubernetes
הרץ את השער בתור Deployment, כמו כל שירות חסר מצב:
- התקן (mount) את התצורה מתוך
ConfigMapוסודות מתוךSecret; התייחס לסודות ב-YAMLדרך${file:/path/to/secret}או כמשתני סביבה - סיים את הצפנת ה-
TLSב-Ingressוהגדר אתlisten.public_urlלשם המארח של ה-Ingress - כוון את בדיקת המוכנות (readiness probe) אל
GET /readyzואת בדיקת החיות (liveness probe) אלGET /healthz
לדוגמה מעשית מלאה ב-AWS, המכסה את ECS Fargate או EKS, את Amazon RDS ואת AWS Secrets Manager, ראה פריסה ב-AWS.
העדף שימוש בזהות עומסי עבודה (workload identity) של הפלטפורמה על פני מפתחות סטטיים; מדריך ההפניה של upstreams מכיל פרטי הגדרה לכל פלטפורמה. עבור שילוב בין עננים שונים, כגון Amazon Bedrock בתור upstream על גבי GKE, הגדר במקום זאת אישורי גישה מפורשים בבלוק ה-auth של ה-upstream.
#Cloud Run
הגדר את השירות באופן הבא:
- השאר את
listen.portבערך ברירת המחדל שלו,8080, התואם ל-PORTברירת המחדל שלCloud Run, או הגדרport: ${PORT} - הגדר את
public_urlלמקור הנגיש חיצונית. עבור סביבת ייצור זהו בדרך כלל שם מארח של נתב עומסים פנימי, מכיוון ש-/loginדוחה כתובות ציבוריות וכתובת ה-URLשל*.run.appנפתרת לכתובת כזו, כך שכתובת ה-URLשלCloud Runלבדה פועלת רק עבור בדיקת עשן (smoke test) בדפדפן או באמצעותcurl. היוצא מן הכלל הוא רשת שבה*.run.appנפתר באופן פרטי דרךPrivate Service Connectואזור פרטי שלCloud DNS; בטופולוגיה זו כתובת ה-URLשלCloud Runהיאpublic_urlתקין. הדוגמה המעשית של Google Cloud מכסה את שני המקרים. - התקן את התצורה בתור
secret volume - הגדר
min-instances: 1כדי למנוע גילויOIDCקר בבקשה הראשונה
לדוגמה מעשית מלאה ב-Google Cloud, המכסה את Cloud Run או GKE, את Cloud SQL ואת Secret Manager, ראה פריסה ב-Google Cloud.
#הפצת כתובת ה-URL של השער למחשבי מפתחים (Push the gateway URL to developer machines)
לאחר שהשער מתחיל לשרת בקשות, הפץ את forceLoginMethod, forceLoginGatewayUrl ואת parentSettingsBehavior: "merge" למחשב של כל מפתח דרך הגדרות מנוהלות, באמצעות MDM או על ידי כתיבה ישירה של managed-settings.json המתאים למערכת ההפעלה. ללא זאת, הפקודה /login מציגה את בורר החשבונות הרגיל ללא אפשרות לשער. ראה הגדרות מנוהלות בצד הלקוח עבור נתיבי הקבצים ועבור הערך המקביל של bootstrapUrl ב-Claude Desktop.
#תפעול (Operations)
לאחר שהשער משרת תעבורה, התפעול השוטף יום-יום כולל קריאת יומנים, בדיקת תקינות וביצוע סבב סודות לפי לוח הזמנים שלך. סעיפי המשנה מכסים כל אחד מהנושאים הללו, בנוסף למה ש-Postgres מכיל וכיצד שדרוגים וחזרות לאחור (rollbacks) מתנהגים.
#יומנים (Logs)
השער כותב שני זרמים (streams) אל stderr, שניהם מותאמים ל-JSON:
- אירועי ביקורת (Audit events): שורת
JSONבודדת עבור כל אירוע רלוונטי לאבטחה. נתב אתstderrאל מרכז היומנים (log aggregator) שלך. האירועים הנפלטים כוללים אתconfig.load,session.mint,session.refresh,device.authorize,device.verify,device.callback,auth.denied,access.denied,inference,managed.serve,desktop_bootstrap.serve,desktop_bootstrap.denied,spend.blocked,admin.denied,admin.limit.upsertו-admin.limit.delete. השדות משתנים לפי האירוע:- אירועי יצירה (mint) ורענון (refresh) מוצלחים נושאים את
sub,email,client_ipואת התוצאה auth.deniedו-access.deniedנושאים את הסיבה ואת כתובת ה-client_ip, בתוספת נתיב הבקשה עבורauth.denied, מכיוון שלא קיימת זהות משתמש בעת דחיות אלוinferenceמתעד איזהupstreamשירת את הבקשה ואת סטטוס התגובהdesktop_bootstrap.deniedמתעד שליפה שנדחתה של אתחול (bootstrap) עבורClaude Desktopעם הסיבה (not_configured,policy_not_opted_inאוno_policy_matched) ואת זהות המשתמשadmin.deniedמתעד ניסיון אימות שנדחה עבור ה-admin-APIעם כתובת ה-client_ip, המתודה, הנתיב והסיבה, ללא חומר המפתחות שהוצג:invalid_keyכאשר הוצגx-api-keyאך הוא לא תאם אף מפתח מוגדר,bearer_rejectedכאשר הוצגה רק כותרתAuthorizationוהיא לא אומתה כהפעלת שער בקבוצותadmin.admin_groups, אוno_credentialsכאשר אף כותרת לא הוצגה
- אירועי יצירה (mint) ורענון (refresh) מוצלחים נושאים את
- יומנים תפעוליים (Operational logs): שורות קריאות לאדם בעלות הקידומת
[gateway]עבור אתחול, אזהרות ושגיאותupstream. משתנה הסביבהCLAUDE_GATEWAY_LOG_LEVELשולט ברמת הפירוט ומקבלdebug,info,warnאוerror, כאשרinfoהוא ברירת המחדל. ברמתdebug, כל התחברות ורענון מתעדים גם את השמות, ולא את הערכים, של הטענות בתוך ה-id_token, בתוספת השמות של טענות ה-userinfoכאשרuserinfo_fallbackסיפק כאלה, כך שתוכל לאבחן הגדרות שלemail_claimו-groups_claimמבלי לתעד מידע מזהה אישי (PII). הדבר אינו משפיע על אירועי ביקורת, הנפלטים תמיד.
#בדיקות תקינות (Health)
השער מגיש את GET /healthz בתור בדיקת חיות (liveness probe) ואת GET /readyz בתור בדיקת מוכנות (readiness probe); הבדיקה /readyz מאמתת שמאגר הנתונים נגיש. שתיהן פטורות מ-access_control.allow_cidrs, כך שבדיקות התקינות ממשיכות לעבוד על מאזין (listener) נעול.
מסמך גילוי ה-OAuth בנתיב /.well-known/oauth-authorization-server מחזיר גם הוא 200 רק לאחר שטעינת התצורה, גילוי ה-OIDC, בניית לקוח ה-upstream והגירת Postgres מצליחים כולם, ולכן הוא משמש גם כבדיקת אתחול מקצה לקצה.
#התנהגות בעת השבתה (Outage behavior)
אם Postgres קורס, השער עצמו ממשיך לשרת מפתחים מחוברים, וכניסות חדשות נכשלות. השאלה האם מפתחים ימשיכו לעבוד בפועל תלויה באופן שבו מערכת התזמור (orchestrator) שלך מטפלת במוכנות:
- הפעלות קיימות (Existing sessions): אסימוני
bearerמאומתים מקומית באמצעות סוד ה-JWT, רענוני הפעלה אינם נוגעים במאגר הנתונים, ותהליך השער עדיין יכול לשרת הסקת מודלים - כניסות חדשות (New sign-ins): נכשלות עד ש-
Postgresמתאושש, מכיוון שתהליך ה-device flowומוני הגבלת הקצב שלו שמורים ב-Postgres - אכיפת מגבלת הוצאות: כושלת למצב פתוח (fails open) כברירת מחדל במהלך ההשבתה, כך שהסקת מודלים עדיין זורמת; הפוך אותה לכישלון במצב סגור (fail closed) אם אתה מעדיף לחסום במקום לפעול ללא מדידה
- מוכנות (Readiness): הבדיקה
/readyzמדווחת על חוסר מוכנות במהלך ההשבתה, ולכן מערכות תזמור שמתנות תעבורה במוכנות מסירות את כל העותקים המשוכפלים מסבב השירות בבת אחת. בטופולוגיה זו כל התעבורה, כולל הסקת מודלים שהשער עדיין יכול לשרת, נכשלת בנתב העומסים עד ש-Postgresמתאושש. בדיקת החיות ב-/healthzממשיכה לעבור בהצלחה, כך שהעותקים המשוכפלים אינם מופעלים מחדש. כוון את בדיקת המוכנות אל/healthzבמקום זאת אם אתה מעדיף שמפתחים מחוברים ימשיכו לעבוד לאורך השבתת מאגר נתונים; המחיר הוא שכניסות חדשות ייכשלו מול עותק שעדיין מדווח על מוכנות.
אם ספק הזהויות (IdP) שלך קורס, הפעלות קיימות פועלות עד תום ttl_hours, וכניסות ורענונים חדשים נכשלים. הגדר ttl_hours ארוך יותר אם לספק הזהויות שלך יש חלונות תחזוקה תכופים.
#סבב סודות JWT (JWT secret rotation)
בצע סבב של סוד החתימה בשלושה שלבים כדי שהפעלות קיימות יישארו תקפות:
- צור סוד חדש. הוסף אותו לתחילת המערך
session.jwt_secret. - בצע פריסה מדורגת (roll) של השירות. אסימונים חדשים ייחתמו באמצעות הסוד החדש; אסימונים ישנים עדיין יאומתו.
- לאחר
ttl_hoursבתוספת מרווח ביטחון, הסר את הסוד הישן ובצע פריסה מדורגת מחדש.
סבב סודות הוא גם הדרך היחידה לסיים הפעלות בכפייה לפני שתוקפן פג: אסימוני bearer מאומתים מקומית מול סוד ה-JWT, ולכן אין אפשרות לביטול פר הפעלה בודדת. החלפת הסוד באופן מוחלט, מבלי לשמור את הישן במערך, פוסלת בבת אחת את כל ההפעלות הפעילות. עבור גריעת עובד בודד (individual offboarding), בטל את הרשאות המשתמש בספק הזהויות (IdP); ההפעלה שלו תסתיים בתוך ttl_hours.
#Postgres
השער מחזיק חמש טבלאות נתונים בנוסף לטבלת _migrations, כולן נוצרות על ידי הגירות המבנה בעת האתחול:
| טבלה | תכולה | שימור (Retention) |
|---|---|---|
kv | הרשאות מכשיר (Device grants, בעלות TTL של 10 דקות) ומוני הגבלת קצב | TTL לכל שורה |
spend | מוני הוצאות מתחילת התקופה ועד כה לכל גורם (principal), בסנטים | admin.spend_retention_months, ברירת מחדל 13 |
spend_limits | תקרות הוצאה מוגדרות | עד למחיקה דרך ה-API |
admin_audit | עקבות שינויים ב-Admin API | admin.audit_retention_days, ברירת מחדל 365 |
principal_emails | דוא"ל, שם תצוגה וקבוצות IdP שנראו לאחרונה עבור כל גורם. מכיל PII. | admin.identity_retention_days מאז הפעילות האחרונה, ברירת מחדל 90 |
לולאה של 30 שניות פוסלת שורות kv שעברו את ה-TTL שלהן, וסריקה שעתית אוכפת את חלונות השימור בטבלאות ההוצאה, כך ששום דבר אינו גדל ללא הגבלה. ללא הגדרת מגבלות הוצאה, רק טבלת kv נכתבת. השער מחיל את הגירות הסכמה שלו בעצמו בעת האתחול ובכל שדרוג, כך שתפקיד מסד הנתונים שלו (database role) זקוק להרשאות ליצור ולשנות טבלאות. כוון אותו למסד נתונים או לסכמה המוקדשים לשער כדי לשמור על הרשאה צרה זו.
כאשר משתמשים במגבלות הוצאה, אובדן של מסד הנתונים פירושו אובדן מעקב ותקרות הוצאה, ולא רק התחברות מחדש של מפתחים, לכן בצע גיבויים שוטפים. כדי למחוק באופן מיידי מפתח שעזב במקום להמתין לתקופת השימור, הרץ ישירות DELETE FROM principal_emails WHERE principal = '<sub>'; פעולה זו מוחקת את הטבלה היחידה שמחזיקה את הדוא"ל, השם והקבוצות שלו. שורות ב-spend וב-admin_audit מתייחסות אך ורק למזהה ה-sub הפסאודונימי של OIDC.
#שדרוגים (Upgrades)
העותקים המשוכפלים הם חסרי מצב, ולכן הפעלה מחדש מדורגת (rolling restart) בטוחה בכל עת. השער מריץ הגירות סכמה בעת האתחול, מה שאומר שפריסת הקובץ הבינארי החדש מבצעת הגירה עצמית של מסד הנתונים. עותקים משוכפלים מקבילים מסתנכרנים באופן טורי באמצעות נעילה מייעצת ב-Postgres (Postgres advisory lock), כך שרק עותק אחד מחיל כל הגירה.
ההגירות הן במתכונת הוספה בלבד (append-only), ולכן חזרה לאחור (rollback) לקובץ בינארי קודם המכיר פחות הגירות היא בטוחה; הוא מתעלם מהשורות הנוספות. חזרה לאחור גם מאמתת מחדש את ה-YAML מול הסכמה של הקובץ הבינארי הישן יותר, ולכן תצורה שאימצה מפתח שהוצג במהדורה החדשה יותר תיכשל באתחול על הקובץ הישן. הסר את המפתח החדש לפני החזרה לאחור.
מכיוון שאתה מקבע את גרסת השער בתמונה שלך, תיקונים במהדורות חדשות של Claude Code, כולל תיקוני אבטחה, מגיעים לפריסה שלך רק כאשר אתה מעדכן את הקיבוע ופורס מחדש. כלול את השער באותו קצב עדכוני אבטחה (patching cadence) שבו אתה משתמש עבור שירותים אחרים המחזיקים באישורי גישה של סביבת ייצור.
#אבטחה (Security)
סעיף זה עונה על השאלות שסקירת אבטחה מעלה: אילו נתונים זורמים דרך השער ולאן הם מגיעים, מפני אילו התקפות התכנון מגן, ואילו תשובות שייכות לשאלון תאימות (compliance questionnaire).
#זרימת נתונים (Data flow)
| נתונים | נתיב | נשלח ל-Anthropic על ידי השער |
|---|---|---|
| הסקת מודלים (הנחיות, השלמות) | CLI → gateway → your upstream | רק אם ה-API של Anthropic מוגדר כ-upstream |
| טלמטריה (מדדי OTLP, בתוספת יומנים ועקבות בהרשמה מפורשת) | CLI → gateway → your collector | לעולם לא |
| זהות (email, groups, sub) | IdP → gateway → JWT → CLI; ה-CLI מחתים זאת בייצוא OTLP. אם אתה מפעיל את forward_user_identity, השער שולח גם את כתובת הדוא"ל של המפתח ואת נושא ה-IdP ככותרות לפרוקסי שלך | לעולם לא |
| הגדרות מנוהלות (Managed settings) | קובץ ה-YAML של השער שלך → CLI | לעולם לא |
| יומן ביקורת (Audit log) | ה-stderr של השער → your aggregator | לעולם לא |
#סיכום מודל האיומים (Threat model summary)
השער יושב בתוך היקף הרשת שלך (network perimeter), אך מחשבים ניידים של מפתחים בודדים אינם נחשבים מהימנים. התכנון מתחשב בכך בשלוש דרכים:
- מפתחים מחזיקים ב-
JWTקצרי מועד במקום במפתחותupstreamגולמיים. הקטע שבין ה-CLIלשער משתמש ב-device grantשלRFC 8628, והחלפת ה-authorization-codeשל השער מול ספק הזהויות מריצהPKCEבתצורת ברירת המחדל, כך שקוד הרשאה של ספק הזהויות שיורט הוא חסר תועלת. - דף אימות המכשיר (device-verification) אוכף
same-origin POSTוהגבלת קצב לכל כתובתIPלפיRFC 8628 §5.1. ראה עמידות בפני מתקפת כוח גס על קוד המשתמש. - בקשות יוצאות עוברות דרך מנגנון הגנה מפני זיוף בקשות בצד השרת (
SSRF), אשר פותר כתובותDNS, חוסם כברירת מחדל כתובותlink-local, נתוני מטא-דאטה של ענן ו-loopback, ומקבע את החיבור לכתובת ה-IPשנפתרה, כך שכתובותURLהמושפעות על ידי המפעיל, כגון יעדי ה-IdPו-OTLP, אינן יכולות להיות מנותבות מחדש לנקודות קצה של נתוני מטא-דאטה של ענן. טווחי רשת פרטיים לפיRFC 1918מותרים במכוון, מכיוון שספקי זהויות ורכיבי איסוףOTLPיושבים בדרך כלל בכתובותIPפרטיות. הגדרCLAUDE_GATEWAY_ALLOW_LOOPBACK=1בסביבת השער רק כאשר רכיב שהשער חייב להגיע אליו באופן לגיטימי יושב עלloopback, כגוןIdPלפיתוח מקומי או רכיב איסוףOTLPבתצורתsidecarעל גביlocalhost. המשתנה מרפה את חסימת ה-loopbackעבור כל כתובתURLשהוגדרה על ידי המפעיל וגם מדלג על אזהרת זמן האתחול הבודקת האם ה-podיכול להגיע לנקודת הקצה של מטא-דאטה של הענן, ולכן עדיף להעניק לרכיב האיסוף כתובת פנימית משלו.
אם אתה מוסיף בקרות יציאה משלך, השער חייב להגיע לשרת המטא-דאטה בכל פעם שהוא משתמש באישורי גישה של מטא-דאטה של המופע, כגון workload identity.
שני איומים נמצאים מחוץ לתחום מכיוון שהם חלק מהתשתית שלך שבאחריותך לאבטח:
- מארח שער שנפרץ (compromised gateway host): המארח מחזיק הן באישורי הגישה של ה-
upstreamוהן מפיץ הגדרות מנוהלות לכל מפתח מחובר, ולכן שליטה בתצורת השער שקולה לשליטה ב-MDMשלך. תיבת הדו-שיח לאישור של ה-CLIעבור הגדרות בעלות יכולת הרצה ב-shell מגבילה שינויים שקטים, אך אינה מהווה תחליף לאבטחת המארח. - ספק OIDC זדוני: הספק חותם על ה-
id_tokensשהשער נותן בהם אמון, ולכן הוא יכול לטעון לכל זהות. בדיקת נאותות ואבטחת ספק הזהויות שלך הן באחריותך.
#עמידות בפני מתקפת כוח גס על קוד המשתמש (User-code brute-force resistance)
ה-user_code שמפתח מקליד בדף האימות /device מורכב מ-8 תווים מתוך אלפבית של 20 תווים, מה שמניב 20⁸ או כ-2.56×10¹⁰ צירופים, ותוקפו פג לאחר 10 דקות.
השער מחיל מגבלות קצב לכל כתובת IP בנקודות הקצה של device-grant, הניתנות להגדרה באמצעות rate_limits. העלה את המגבלות אם מפתחים רבים מתחברים מכתובת NAT ארגונית משותפת יחידה. המגבלות חלות אך ורק על תהליך ההתחברות, ולא על הסקת מודלים.
#מערך תאימות (Compliance posture)
- מיקום שמירת הנתונים (Data residency): מישור הנתונים (data plane) של השער עצמו אינו שולח דבר ל-
Anthropic, אלא אם כן ה-APIשלAnthropicמוגדר כ-upstream; כאשר הוא מוגדר כך, הסכם הטיפול בנתונים הקיים שלך חל על נתיב הסקת המודלים. טלמטריה, ביקורת, זהות והגדרות מועברות אך ורק ליעדים שאתה מגדיר. - תעבורת תהליך המארח (Host-process traffic): תהליך המארח הוא ה-
CLIשלClaude Code. הפקודהclaude gatewayפועלת תחת אותם כללי צד-שלישי כמו פריסות שלAmazon BedrockושלGoogle Cloud Agent Platformואינה שולחת דבר ל-Anthropic. לפני גרסהv2.1.227, תהליך המארח שלח טלמטריית הפעלה כגון גרסת המוצר והפלטפורמה, והגדרה שלCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1בסביבת הקונטיינר השביתה זאת. מהדורות אלו שלחו גם בקשתHEADאחת בעת האתחול, ללא גוף בקשה וללא אישורי גישה, אל/api/helloבכתובתhttps://api.anthropic.com, או בכתובתANTHROPIC_BASE_URLכאשר הסביבה הגדירה זאת, אלא אם כן הסביבה הגדירה גם משתנה פרוקסי כגוןHTTPS_PROXYאו תעודת לקוח שלmTLS. הן התעלמו מהתגובה, כך שחסימת הבקשה הזו בחומת האש של תעבורת היציאה לא השפיעה על השער. - ניתוח נתוני לקוח (Client analytics): ה-
CLIמשבית את ניתוח השימוש ודיווחי השגיאות שלו בעת חיבור לשער. לפני ההתחברות הראשונה, ה-CLIעדיין שולח אירועי הפעלה ל-Anthropic, כולל במחשבים שההגדרות המנוהלות שלהם כופות התחברות דרך שער. כדי להשבית גם אותם, העבר אתDISABLE_TELEMETRYבאותן הגדרות מנוהלות בצד הלקוח הכופות התחברות דרך השער. - דיווחי שגיאות (Error reporting): ה-
CLIמכבה דיווחי שגיאות בכל פעם שבקשות המודל שלו נשלחות לנקודת קצה כלשהי שאינה ה-APIהישיר שלAnthropic, כגוןAmazon Bedrockאו כתובתANTHROPIC_BASE_URLמותאמת אישית. - מחשבי לקוח (Client machines): ה-
CLIשל המפתחים עדיין שולח בדיקות שמות מארח שלWebFetchובדיקות גרסה ל-Anthropic, אלא אם כן מוגדריםCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1ו-skipWebFetchPreflight: true. ראה שימוש בנתונים. - דירוגי סקרים (Survey ratings): בעת חיבור לשער, ה-
CLIמשבית את העלאת הדירוגים המיועדים ל-Anthropicיחד עם זרמי הניתוח, כך שהוא אינו שולח דירוגים ל-Anthropic. - שיתוף תמלילים (Transcript sharing): בחירה ב-
Yesבהנחיית שיתוף התמליל בסקר כותבת קובץ מקומי תחת~/.claude/feedback-bundles/במקום להעלות אותו ל-Anthropic. - עדכוני לקוח (Client updates): בדיקות עדכון נפרדות מתעבורת השער. קבע גרסאות דרך מנגנון ההפצה שלך והגדר את
DISABLE_UPDATESאם על מחשבים ניידים נאסר להוריד מהדורות.DISABLE_AUTOUPDATERעוצר רק עדכוני רקע, בעוד שהפקודהclaude updateממשיכה לפעול. - TLS: הגש את
public_urlמעלHTTPSבסביבת ייצור, מתוך המאזין של השער עצמו דרךlisten.tlsאו מ-ingressהמסייםTLSלפני עותקים משוכפלים ב-HTTPפשוט, כאשרlisten.public_urlמוגדר בשני המקרים. השער אינו דוחהHTTPפשוט. ספק הזהויות חייב להגישHTTPSבסביבת ייצור, ו-Postgresתומך ב-?sslmode=require. הגדרStrict-Transport-Securityב-ingressשלך. - חשיפת פגיעויות (Vulnerability disclosure): פעל לפי דיווח על בעיות אבטחה
#פתרון בעיות (Troubleshooting)
לשאלות ומשוב, השתמש ב-תמיכת Claude Code, או פתח פנייה ב-מאגר GitHub של Claude Code. בעת דיווח על בעיה, כלול:
- בעיית שער (Gateway issue): פלט ה-
stderrשל השער עבור חלון הזמן הרלוונטי, קובץ ה-gateway.yamlשלך כשהסודות מושחרים (redacted), גרסת השער, המוצגת בדף הנחיתה ב-/ובכותרת התגובהx-cc-gateway-versionב-/managed/settings, ומה השתנה לאחרונה - בעיית התחברות (Login issue): המפתח מריץ
claude --debug-file ./claude-debug.txt, משחזר את הבעיה, ושולח קובץ זה בתוספת יומן הביקורת של השער עבור אותו חלון זמן - בעיית הסקת מודל (Inference issue): המודל שהתבקש, ה-
upstreamsהמוגדרים, ויומן הביקורת של השער עבור הבקשה, המתעד איזהupstreamשירת אותה ואת סטטוס התגובה
ה-stderr של השער כולל את זרם אירועי הביקורת, יומן הביקורת מתעד זהויות מפתחים, וקובץ הדיבאג מתעד פלטי hook ושרת MCP ממחשב המפתח. בדוק והשחר נתונים אלה לפני פרסומם בפנייה ציבורית.
| תסמין | סיבה | תיקון |
|---|---|---|
הפקודה /login של מפתח מציגה את בורר החשבונות הרגיל במקום את מסך Cloud gateway | forceLoginMethod או forceLoginGatewayUrl אינם מוגדרים בהגדרות המנוהלות באותו מחשב | פרוס את קובץ ההגדרות המנוהלות למכשיר; הפקודה /login קוראת את כתובת ה-URL של השער משם |
Claude Desktop מדווח שלא ניתן היה להביא את תצורת האתחול (bootstrap) שלו | הנתיב /user/bootstrap החזיר 404: המדיניות התואמת למשתמש אינה מכילה מפתח desktop, או שאף מדיניות לא תאמה. יומן הביקורת של השער מתעד כל דחייה כ-desktop_bootstrap.denied יחד עם הסיבה. | הוסף בלוק desktop למדיניות התואמת למשתמש, או לשכבת הבסיס match: {}; בלוק desktop: {} ריק מספיק. ראה שכבת-על עבור Claude Desktop. |
בעת הפעלה מוצגת ההודעה Gateway login is configured in managed settings, but this Claude Code build does not include Cloud gateway support. | גרסת Claude Code המותקנת קודמת לתמיכה בשער | בקש מהמפתח לעדכן את Claude Code למהדורה הכוללת תמיכה ב-Cloud gateway |
ב-CLI מופיעה שגיאה ב-/login: Gateway hosts must be on your organization's private network; <host> resolves to the public (or unrecognized) address <ip> | שם המארח של השער נפתר לפחות לכתובת IP ציבורית אחת. Claude Code בודק כל כתובת שנפתרה ודורש שכל אחת מהן תהיה פרטית. סיבה נפוצה היא שם בעל פרוטוקול כפול (dual-stack) שבו משפחה אחת נפתרת לכתובת ציבורית, כולל נתבי עומסים פנימיים בעלי dual-stack של AWS, אשר מחזירים כתובות AAAA בטווח ציבורי. | דאג ששם השער ייפתר אך ורק לכתובות פרטיות במחשבי מפתחים. עבור שם בעל dual-stack, הסר את הרשומה בטווח הציבורי או הגש שם DNS פנימי בלבד נפרד. ראה את דרישת הקדם לרשת פרטית. |
ב-CLI מופיעה שגיאה ב-/login: Gateway login would go through proxy <proxy>, which is not on a private network | משתנה HTTPS_PROXY או HTTP_PROXY חל על מארח השער ושם המארח של הפרוקסי נפתר לכתובת ציבורית. פרוקסי שהמארח שלו נפתר אך ורק לכתובות פרטיות מותר ואינו מפעיל שגיאה זו | הוסף את מארח השער אל NO_PROXY במחשב המפתח כך שהחיבור יהיה ישיר, או השתמש בפרוקסי ששם המארח שלו נפתר לכתובות פרטיות. ההודעה מציינת את הערך המדויק שיש להוסיף ל-NO_PROXY |
ב-CLI מופיעה שגיאה ב-/login: Could not resolve the configured HTTP proxy | שם המארח ב-HTTPS_PROXY או ב-HTTP_PROXY אינו נפתר ממחשב המפתח, בדרך כלל מכיוון שאינו מחובר לרשת הארגונית | בקש מהמפתח להתחבר לרשת שלך או ל-VPN ולנסות שוב, או תקן את כתובת ה-URL של הפרוקסי |
ב-CLI מופיעה שגיאה ב-/login: Could not resolve gateway host <host> | המחשב אינו מצליח לפתור את שם ה-DNS הפנימי של השער, בדרך כלל מכיוון שאינו ברשת הארגונית | בקש מהמפתח להתחבר לרשת שלך או ל-VPN, ולאחר מכן לנסות שוב /login |
האתחול יוצא עם שגיאת אימות תצורה המציינת את store.postgres_url | לא הוגדר Postgres; השער דורש Postgres | הגדר את store.postgres_url. לפיתוח מקומי, השתמש בקונטיינר חד-פעמי: docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres. |
האתחול יוצא: requires the native binary | הרצה תחת Node במקום הקובץ הבינארי המקורי | התקן את Claude Code באחת מ-שיטות ההתקנה העצמאיות |
האתחול יוצא עם שגיאת גילוי OIDC לאחר config.load | oidc.issuer אינו נגיש, או ששרשרת ה-TLS אינה מהימנה | בדוק שהמנפיק נגיש מה-pod ומגיש את /.well-known/openid-configuration. הגדר ca_cert_pem עבור PKI פרטי. אם ה-pod מגיע לספק הזהויות רק דרך פרוקסי קדמי (forward proxy), הגדר oidc.use_proxy: true; בגרסאות שלפני v2.1.227, ספק ל-pod נתיב ישיר לכל אחת מנקודות הקצה של ספק הזהויות במקום זאת. |
| האתחול יוצא עם שגיאת הרשאות ב-Postgres | לתפקיד מסד הנתונים חסרות הרשאות DDL בסכמה שלו | הענק לתפקיד הרשאת CREATE בסכמה של השער כדי שיוכל ליצור ולשנות את הטבלאות שלו בעת האתחול |
הנתיב /oauth/callback מציג "Sign-in could not be completed" | דומיין הדוא"ל נדחה, אימות ה-id_token נכשל, או שהערך email_verified הוא במפורש false, מה שהשער תמיד דוחה ללא עקיפה | בדוק את allowed_email_domains וודא שספק הזהויות מחזיר טענת email מאומתת. עבור email_verified: false, תקן את האימות בצד ספק הזהויות. אם ספק הזהויות שלך פולט דוא"ל תחת שם טענה אחר, הגדר oidc.email_claim. |
ביומן מופיע: token exchange failed request_id=<id>: id_token missing email claim | ספק הזהויות אינו כולל email בתוך ה-id_token כברירת מחדל. דחייה זו מופעלת רק כאשר allowed_email_domains מוגדר; בלעדיו, דוא"ל חסר מייצר הפעלה ללא דוא"ל | הגדר את ספק הזהויות לפלוט email בתוך ה-id_token. ב-Okta: הוסף את email לטענות ה-ID-token של שרת הרשאות מותאם אישית. ב-Entra: הוסף את email כטענה אופציונלית ברישום האפליקציה. ב-PingFederate: הפעל OpenID Connect Policy שפולט email. אם ספק הזהויות מגיש email מנקודת הקצה userinfo אך אינו כולל אותו ב-id_token, כגון שרת ההרשאות הארגוני של Okta, הגדר oidc.userinfo_fallback: true. |
כל בקשת Amazon Bedrock מחזירה 502; היומן מציג Could not load credentials from any providers | ב-EC2, מגבלת הדילוגים (hop limit) ברירת המחדל של IMDSv2 שהיא 1 חוסמת את בקשת מטא-דאטה של המופע מתוך הקונטיינר. האתחול ו-/readyz עוברים בכל מקרה מכיוון שערכת ה-SDK של AWS פותרת אישורי מופע בבקשה הראשונה, ולא בעת בניית הלקוח | העלה את מגבלת הדילוגים באמצעות aws ec2 modify-instance-metadata-options --instance-id <id> --http-put-response-hop-limit 2, או הגדר זאת בתבנית ההשקה (launch template). השינוי חל על כל קונטיינר במופע. העדף תפקידי משימה של ECS (ECS task roles) היכן שזמינים, אשר קוראים אישורי גישה מנקודת הקצה של אישורי הקונטיינר של ECS ומונעים את הצורך בשינוי לחלוטין, או החל את השינוי על מופע שער ייעודי כדי להגביל את החשיפה. |
| שגיאת IdP: scope לא ידוע או לא נתמך (unknown or unsupported scope) | ספק הזהויות דוחה טווחי הרשאה (scopes) שאינו מזהה | הגדר את oidc.scopes בדיוק לרשימה שספק הזהויות שלך מקבל; עליה לכלול את openid. ברירת המחדל היא openid profile email offline_access. |
הפעלות אינן מתחדשות באופן שקט לאחר הגדרת oidc.scopes | הערך offline_access הושמט מהדריסה (override) | החזר את offline_access אם ספק הזהויות שלך תומך בו. ללא אסימון רענון, מפתחים מריצים מחדש את ההתחברות בדפדפן בכל session.ttl_hours. |
| הדפדפן מציג "This request came from another site and was blocked" | בקשת POST של טופס חוצה-אתרים (Cross-site form POST), שנחסמה כהגנת CSRF. צפוי עבור דפים מוטמעים או מנותבי פרוקסי | פתח את קישור האימות ישירות |
| דפדפן Chrome חוסם את כפתור האישור (Approve) עם ההודעה "Refused to send form data … violates … Content Security Policy directive: form-action", אך אותו דף עובד ב-Safari או Firefox | דפדפן Chrome אוכף את form-action מול כל שרשרת ההפניות. ספק הזהויות שלך מפנה הלאה למארח שני שאינו ברשימת המורשים. | הוסף כל מקור נוסף בשרשרת ההפניות אל oidc.form_action_origins. פתח ב-Chrome את DevTools → Console בדף ה-Approve כדי לראות איזה מקור נחסם. |
| ההתחברות מסתיימת בהצלחה בספק הזהויות אך ה-callback נכשל, עם שגיאת CSP ב-Chrome או "this sign-in link has expired" ב-Safari | ספק הזהויות החזיר את הקוד דרך response_mode=form_post, מה ששולח אותו אוטומטית בין מקורות שונים (cross-origin) דרך POST אל /oauth/callback. דפדפן Chrome חוסם זאת תחת CSP מחמיר; דפדפן Safari מאפשר את השליחה אך ה-callback קורא רק את מחרוזת השאילתה (query string). | ודא שספק הזהויות שלך מכבד את response_mode=query, אשר השער מבקש במפורש כדי שה-callback יהיה הפניה פשוטה (plain redirect) |
| התחברות עובדת מקומית אך נכשלת מאחורי ALB | הערך public_url עדיין מציין את המקור המקומי או הפנימי ב-http://, ולכן ספק הזהויות מקבל את ה-redirect_uri השגוי | הגדר את listen.public_url למקור החיצוני ב-https:// ורשום את <public_url>/oauth/callback מול ספק הזהויות |
| מפתח רואה שוב ושוב את הודעת האמון (trust prompt) | תעודת ה-TLS מתחלפת לכל עותק משוכפל או לכל בקשה | השתמש בתעודה יציבה ב-ingress, או סיים את ה-TLS פעם אחת והרץ עותקים משוכפלים מעל HTTP פשוט באופן פנימי |
ב-CLI מופיעה שגיאה ב-/login: "Could not verify the gateway's TLS certificate" או SELF_SIGNED_CERT_IN_CHAIN | שרשרת ה-TLS של השער חתומה על ידי CA פרטי שאינו נמצא במאגר האמון (trust store) של מארח ה-CLI | Claude Code קורא את מאגר האמון של מערכת ההפעלה כברירת מחדל בקובץ הבינארי המקורי וב-Node גרסה 22.15 ומעלה; משתנה CLAUDE_CODE_CERT_STORE שולט בהתנהגות זו. אם ה-CA מותקן במאגר האמון של מערכת ההפעלה, ודא שהמפתחים נמצאים בסביבת ריצה עדכנית. אחרת, הגדר את NODE_EXTRA_CA_CERTS לקובץ ה-PEM של תעודת ה-CA לפני ההפעלה. הודעת טביעת האצבע בחיבור הראשון עדיין חלה. |
ב-CLI הפקודה /login משלימה את ההתחברות בדפדפן, אך לאחר מכן ההפעלה מסתיימת עם ההודעה Cloud gateway sign-in was not completed ואי התאמה של תעודת TLS | בבקשה הראשונה לאחר ההתחברות, השער הציג תעודה שאינה תואמת את טביעת האצבע ש-Claude Code קיבע, ולכן Claude Code לא שמר שום אישור גישה של השער. הסיבות הנפוצות הן עותקים משוכפלים מאחורי כתובת אחת המגישים תעודות שונות, או גורם כלשהו בנתיב הרשת שמיירט TLS. | הגש תעודה אחת עבור שם המארח, למשל על ידי סיום ה-TLS פעם אחת ב-ingress, ולאחר מכן בקש מהמפתח להריץ שוב /login. אם תעודה זו שונה מזו שקובעה, Claude Code יציג שוב את הודעת האמון עם אזהרה שהתעודה השתנתה. |
הודעת אי ההתאמה כוללת את שם המארח של השער ואת 16 התווים הראשונים של כל אחת מטביעות האצבע, זו שקובעה וזו שהוצגה.
אם Claude Code מדווח על couldn't load your organization's managed settings לאחר התחברות לשער, Claude Code מציין את הסיבה, מופעל מחדש במקומו וממשיך את השיחה. אם Claude Code אינו יכול להפעיל את עצמו מחדש, למשל בהפעלה ברקע, Claude Code מסיים את ההפעלה ושומר את מצב ההתחברות.
#נושאים קשורים (Related)
- סקירת Claude apps gateway: התחלה מהירה וחיבור מפתחים
- מדריך תצורה: כל אפשרות בקובץ
gateway.yaml