Rencanakan jaringan gateway Anda terlebih dahulu. Saat masuk, Claude Code menolak gateway aplikasi Claude yang nama host-nya di-resolve ke alamat IP publik, bahkan yang tidak dapat dijangkau dari internet.Gateway aplikasi Claude dapat mendorong pengaturan ke mesin pengguna, termasuk hook yang menjalankan perintah shell. Pemeriksaan ini membantu mencegah pengguna secara tidak sengaja masuk ke gateway berbahaya di internet publik. Jauhkan juga gateway Anda sendiri dari internet.Pilih alamat gateway sebelum Anda memilih tempat menjalankannya. Biasanya, itu adalah alamat privat yang dijangkau pengguna di jaringan internal Anda atau melalui VPN. Jika jaringan internal Anda menggunakan rentang IPv4 publik, Anda dapat mencantumkan satu rentang yang mencakup gateway dan mesin pengguna Anda. Claude Code menganggap kecocokan tersebut sebagai tanda bahwa gateway berada di jaringan internal Anda. Lihat Pilih alamat untuk gateway. Jika tidak ada yang sesuai dengan jaringan Anda, hubungi tim akun Anthropic Anda.
gateway.yaml yang dibaca gateway saat boot, lihat Referensi Konfigurasi.
Penyebaran produksi mengikuti empat langkah secara berurutan, dan bagian di bawah cocok dengan mereka. Dua yang pertama adalah tempat Anda membuat pilihan; dua yang kedua adalah materi referensi untuk dikonsultasikan setelah berjalan.
- Siapkan penyedia identitas Anda: daftarkan klien OAuth dan periksa catatan per-IdP untuk Okta, Entra, dan Google
- Sebarkan gateway: bangun gambar kontainer yang disematkan dan jalankan di Kubernetes, Cloud Run, atau platform Anda sendiri. Bagian ini juga mencakup keputusan biaya, bypass, gateway-ganda, dan serverless
- Siapkan operasi: log, probe kesehatan, perilaku pemadaman, rotasi rahasia, dan peningkatan. Referensi untuk ketika Anda menghubungkan pemantauan dan runbook
- Tinjau postur keamanan: aliran data ke mana, model ancaman, dan jawaban kepatuhan. Referensi untuk tinjauan keamanan
Penyiapan penyedia identitas
Daftarkan aplikasi web OAuth/OpenID Connect (OIDC) rahasia dengan URI pengalihan tunggal,https://<gateway>/oauth/callback, dan tetapkan ke pengguna atau grup yang harus memiliki akses gateway. Gateway melakukan autentikasi ke IdP dengan client secret dari pendaftaran tersebut, atau dengan sertifikat yang Anda unggah ke pendaftaran jika IdP Anda menggunakan kredensial sertifikat sebagai gantinya.
IdP apa pun yang sesuai dengan OIDC berfungsi: Okta, Microsoft Entra ID, Google Workspace, Keycloak, Dex, PingFederate, dan lainnya. IdP harus memenuhi tiga persyaratan:
- Melayani
/.well-known/openid-configuration, melalui HTTPS dalam produksi; gateway menerimahttp://issuer, dan issuer loopback juga memerlukanCLAUDE_GATEWAY_ALLOW_LOOPBACK=1 - Mendukung aliran kode otorisasi. PKCE (Proof Key for Code Exchange) aktif secara default; nonaktifkan dengan
oidc.use_pkce: falseuntuk IdP yang tidak mendukungnya - Mengembalikan
emaildan secara opsionalgroupsdalam id_token, atau melayaninya dari endpoint userinfo denganoidc.userinfo_fallback: true
oidc.ca_cert_pem.
Beberapa penyedia menangani klaim email dan grup secara berbeda:
- Okta: server otorisasi org di
https://example.okta.commengembalikan id_token tipis yang menghilangkanemaildangroups, jadi aturoidc.userinfo_fallback: truekapan pun Anda menggunakannya sebagaiissuer. Server otorisasi khusus sepertihttps://example.okta.com/oauth2/defaultyang menyertakanemaildan secara opsionalgroupsdalam id_token memancarkannya secara langsung dan tidak memerlukan fallback. Okta memancarkangroupshanya ketika scopegroupsdiminta dalamoidc.scopesdan filter klaim grup aplikasi memungkinkannya;userinfo_fallbacktidak dapat mengisi klaim yang IdP tidak diminta. - Microsoft Entra ID:
issuer=https://login.microsoftonline.com/<tenant-id>/v2.0. Entra memancarkan Object ID grup daripada nama, jadi gunakan GUID dalammanaged.policies.match.groups, atau gunakan App Roles untuk nama yang dapat dibaca manusia. Jika penyewa Anda memancarkan peran di bawahrolesbukangroups, aturoidc.groups_claim: roles. - Google Workspace:
issuer=https://accounts.google.com. id_token Google tidak membawa grup. Untuk menggunakanallowed_groupsberbasis grup ataumanaged.policiesdengan Google sebagai IdP, konfigurasikanoidc.google_groups, yang mencari grup setiap pengguna melalui Admin SDK Directory API menggunakan akun layanan dengan delegasi di seluruh domain. Tanpa itu, gunakanoidc.allowed_email_domainsuntuk gating keanggotaan danmanaged.policies.match.email_domainuntuk penugasan kebijakan. Google juga mengabaikan scopeoffline_accessstandar. Untuk token refresh, aturoidc.scopes: [openid, profile, email]danoidc.extra_auth_params: { access_type: offline, prompt: consent }.
Deployment
Gateway adalah satu binary Linux stateless yang berkoordinasi melalui Postgres, jadi deploy gateway dengan cara yang sama seperti Anda men-deploy layanan stateless lainnya di lingkungan Anda. Tempatkan gateway di dalam jaringan Anda, di mana developer Anda dapat menjangkaunya melalui HTTPS dan gateway dapat menjangkau IdP Anda, dan perlakukan gateway seperti layanan apa pun yang menyimpan kredensial produksi. Beberapa keputusan membentuk deployment di luar tempat gateway dijalankan:- Biaya: tidak ada lisensi terpisah atau biaya per kursi. Gateway merupakan bagian dari binary
claude, jadi Anda membayar inferensi melalui komitmen yang sudah ada, ditambah komputasi tempat gateway berjalan. - Bypass: gateway tidak memaksakan bahwa satu-satunya rute ke model harus melewatinya. Developer yang memiliki kredensial sendiri tetap dapat memanggil penyedia secara langsung, jadi menutup jalur tersebut merupakan keputusan kebijakan jaringan, misalnya memblokir egress ke
api.anthropic.comkecuali dari gateway. Memblokir egress tersebut juga merusak pemeriksaan keamanan domain WebFetch, yang memanggilapi.anthropic.comdari mesin setiap developer. AturskipWebFetchPreflight: truedalam kebijakan terkelola untuk menonaktifkannya. - Beberapa gateway: masing-masing merupakan deployment terpisah dengan konfigurasinya sendiri, dan CLI menyimpan kepercayaan serta kredensial per hostname gateway, sehingga tim dapat menggunakan gateway yang berbeda tanpa konflik. Untuk melayani beberapa penerbit OIDC, jalankan instance terpisah.
- Serverless: Cloud Run dapat digunakan jika Anda mengatur
min-instances: 1untuk menghindari OIDC discovery dalam kondisi cold. Lambda dan Cloud Functions tidak dapat digunakan, karena gateway adalah server HTTP yang berjalan lama.
listen.trusted_proxies ke rentang sumber proxy agar gateway membaca IP klien dari X-Forwarded-For. Gateway hanya menghormati header tersebut ketika peer TCP tepercaya. Contoh lengkap Google Cloud dan AWS memiliki nilai konkret per topologi. Tanpa trusted proxies, setiap permintaan tampak berasal dari IP proxy, yang menyatukan rate limit per IP menjadi satu bucket bersama dan mencatat IP proxy dalam event audit.
Jangan mengalihkan permintaan ke endpoint otorisasi perangkat dan token milik gateway, misalnya dengan penulisan ulang HTTP-ke-HTTPS atau kanonikalisasi host di ingress. Claude Code tidak mengikuti pengalihan pada permintaan tersebut, sehingga aturan ingress yang mengalihkannya akan merusak proses masuk dan penyegaran token.
Berikan proxy idle timeout apa pun yang lebih lama daripada interval keepalive gateway, yang bergantung pada upstream:
- Pada setiap upstream kecuali
provider: anthropic, gateway menulis SSEpingsetelah stream diam selama sekitar 15 detik. - Pada
provider: anthropic, gateway meneruskan respons tanpa perubahan, termasuk ping milik Anthropic API sendiri.
Memilih alamat untuk gateway
Claude Code menerima alamat gateway dengan salah satu dari dua cara:- Alamat privat: tempatkan gateway di belakang load balancer internal atau VPN, dengan hostname yang hanya di-resolve ke alamat privat, seperti RFC 1918 atau CGNAT
100.64.0.0/10. Mesin pengguna dapat berada di alamat apa pun. Prasyarat jaringan privat mencantumkan rentang yang diterima. - Blok yang dideklarasikan: jika jaringan internal Anda menggunakan ruang IPv4 publik yang dimiliki organisasi Anda, cantumkan blok tersebut dalam pengaturan terkelola
gatewayInternalNetworks. Gateway dan mesin pengguna harus sama-sama berada dalam blok tersebut. Lihat Mengizinkan gateway pada ruang alamat publik yang Anda miliki.
Image container
Buat image Anda sendiri di sekitar binary nativeclaude dari rilis standar Claude Code:
- Unduh build Linux untuk arsitektur image Anda dari rilis yang disematkan; lihat Menginstal versi tertentu untuk URL unduhan.
- Verifikasi build tersebut terhadap
manifest.jsonrilis yang ditandatangani GPG seperti yang dijelaskan dalam Integritas binary dan penandatanganan kode. - Salin ke dalam konteks build.
- Image berbasis glibc: satu-satunya dependensi dinamis dari build glibc adalah library glibc. Image berbasis musl memerlukan build
linux-x64-muslataulinux-arm64-musl, yang satu-satunya dependensi dinamisnya adalah musl. - Direktori state yang dapat ditulis: gateway berjalan sebagai pengguna apa pun, tetapi image minimal tidak memiliki direktori home yang dapat ditulis. Atur
CLAUDE_CONFIG_DIRke path yang dapat ditulis seperti/tmp/.claude. - Perintah container:
claude gateway --config /etc/claude/gateway.yaml, dengan file konfigurasi di-mount secara read-only dan secret disediakan sebagai environment variable; gateway mendengarkan padalisten.port, default8080.
Kubernetes
Jalankan gateway sebagai Deployment, seperti layanan stateless lainnya:- Mount konfigurasi dari ConfigMap dan secret dari Secret; rujuk secret dalam YAML melalui
${file:/path/to/secret}atau sebagai environment variable - Terminasi TLS di Ingress dan atur
listen.public_urlke hostname Ingress - Arahkan readiness probe ke
GET /readyzdan liveness probe keGET /healthz
upstreams memiliki detail penyiapan per platform. Untuk pasangan lintas cloud, seperti upstream Amazon Bedrock di GKE, atur kredensial eksplisit dalam blok auth milik upstream sebagai gantinya.
Cloud Run
Konfigurasikan layanan sebagai berikut:- Biarkan
listen.portpada nilai default8080, yang sesuai denganPORTdefault Cloud Run, atau aturport: ${PORT} - Atur
public_urlke origin yang dapat dijangkau dari luar. Untuk produksi, ini biasanya hostname load balancer internal, karena/loginmenolak alamat publik dan URL*.run.appdi-resolve ke alamat publik, sehingga URL Cloud Run saja hanya dapat digunakan untuk smoke test dengancurlatau browser. Pengecualiannya adalah jaringan tempat*.run.appdi-resolve secara privat melalui Private Service Connect dan zona privat Cloud DNS; dalam topologi tersebut, URL Cloud Run merupakanpublic_urlyang valid. Contoh lengkap Google Cloud mencakup keduanya. - Mount konfigurasi sebagai volume secret
- Atur
min-instances: 1untuk menghindari OIDC discovery dalam kondisi cold pada permintaan pertama
Mendorong URL gateway ke mesin developer
Setelah gateway melayani, dorongforceLoginMethod, forceLoginGatewayUrl, dan parentSettingsBehavior: "merge" ke mesin setiap developer melalui pengaturan terkelola, melalui MDM atau dengan menulis managed-settings.json per OS secara langsung.
Setelah Anda men-deploy kunci-kunci tersebut, Claude Code berhenti menggunakan kunci API atau login claude.ai yang tersisa di mesin, jadi rencanakan pendorongan ini bersama dengan instruksi masuk Anda. Administrator policy requires a Cloud gateway sign-in menjelaskan pesan yang dilihat developer.
Lihat tempat setiap mekanisme menyimpan kebijakan untuk path file, dan Pengaturan terkelola sisi klien untuk padanan bootstrapUrl di Claude Desktop.
Peluncuran berskala besar
Proses masuk dikenai rate limit per alamat IP klien, dan nilai default-nya cocok untuk tim kecil. Setiap alamat mendapatkan 30 permulaan masuk dan 10 pengiriman kode setiap 10 menit. Peluncuran ke ribuan developer dapat mencapai batas tersebut pada pagi pertama, karena salah satu dari dua alasan:- Gateway tidak dapat melihat melewati load balancer Anda. Tanpa
listen.trusted_proxies, setiap developer tampak berasal dari alamat load balancer dan berbagi satu batas. Gateway menulis peringatan ke log pertama kali ia mengabaikan headerX-Forwarded-For. Jika load balancer seharusnya ada dilisten.trusted_proxies, cantumkan load balancer tersebut sebelum Anda mengubah hal lainnya. Jika developer masih berbagi satu alamat, naikkanrate_limits. - Banyak developer berbagi beberapa alamat egress NAT atau VPN. Mereka berbagi batas dari alamat-alamat tersebut bahkan ketika
trusted_proxiessudah benar. Naikkanrate_limitsagar sesuai.
max, bagi jumlah developer dengan jumlah alamat egress yang mereka gunakan bersama. Perkirakan berapa banyak dari mereka yang masuk dalam satu periode window_seconds, yaitu 10 menit secara default. Kemudian gandakan untuk mencakup retry dan developer yang masuk ke Claude Code maupun Claude Desktop.
Sebagai contoh, 10.000 developer di belakang 4 alamat egress masuk secara merata selama satu jam. Itu berarti 2.500 developer per alamat dan sekitar 420 di antaranya dalam setiap 10 menit, yang Anda gandakan dan bulatkan ke atas menjadi 1.000. Contoh di bawah ini mengatur kedua batas menjadi 1.000:
device_verify adalah yang mencegah seseorang menebak kode masuk milik developer lain, jadi naikkan hanya sejauh yang dibutuhkan oleh perkiraan Anda. Bahkan pada batas ini, sebuah kode terdiri dari 8 karakter dari alfabet 20 karakter dan kedaluwarsa setelah 10 menit, sehingga menebak tetap tidak praktis; lihat Ketahanan kode pengguna terhadap brute-force.
Ketika IdP Anda menerbitkan refresh token, Claude Code memperbarui sesi secara diam-diam, sehingga Anda dapat mengembalikan batas setelah peluncuran. Tanpa refresh token, developer masuk kembali setiap session.ttl_hours. Tentukan ukuran kedua batas untuk laju tetap tersebut juga dan biarkan tetap dinaikkan.
Ketika batas tercapai, Claude Code v2.1.274 atau yang lebih baru menampilkan The gateway is limiting sign-in attempts right now. Gateway pada v2.1.274 atau yang lebih baru menampilkan Too many attempts came from your network address pada halaman verifikasi, beserta pengaturan yang perlu diperiksa. Gateway juga menulis baris log sign-in refused yang menyebutkan pengaturan yang perlu diubah.
Operasi
Setelah gateway melayani lalu lintas, operasi sehari-hari membaca lognya, menyelidiki kesehatannya, dan memutar rahasianya sesuai jadwal Anda. Subbagian mencakup masing-masing, ditambah apa yang disimpan Postgres dan bagaimana upgrade dan rollback berperilaku.Log
Gateway menulis dua aliran ke stderr, keduanya ramah JSON:-
Acara audit: JSON satu baris per acara yang relevan dengan keamanan. Pipa stderr ke agregator log Anda.
Acara yang dipancarkan termasuk
config.load,session.mint,session.refresh,device.authorize,device.verify,device.callback,auth.denied,access.denied,access.public_client,inference,managed.serve,desktop_bootstrap.serve,desktop_bootstrap.denied,spend.blocked,admin.denied,admin.limit.upsert, danadmin.limit.delete. Bidang bervariasi menurut acara:- Acara mint dan refresh yang berhasil membawa
sub,email,client_ip, dan hasilnya auth.denieddanaccess.deniedmembawa alasan dan IP klien, ditambah jalur permintaan untukauth.denied, karena tidak ada identitas pengguna yang ada pada penolakan tersebut. Dua alasanaccess.deniedmengubah apa yang dibawa acara:xff_unparseable: acara juga membawa entriX-Forwarded-Foryang tidak dapat dibacaclient_ip_unknown: acara tidak membawa IP klien, karena koneksi tidak memiliki alamat peer sementara daftaraccess_controlditetapkan
access.public_clientmembawa IP klien dari permintaan pertama per proses yang tiba dari alamat publik sementaraaccess_control.allow_cidrskosong. Gateway melayani permintaan seperti biasa; acara menandakan bahwa gateway mungkin dapat dijangkau dari internet publik. Lihat referensiaccess_controluntuk apa yang dihitung sebagai publik dan untuk daftar izin yang direkomendasikan.inferencemencatat upstream mana yang melayani permintaan dan status responsdesktop_bootstrap.deniedmencatat pengambilan bootstrap Claude Desktop yang ditolak dengan alasan (not_configured,policy_not_opted_in, atauno_policy_matched) dan identitas penggunaguardrail.tracemencatat filter mana yang terpicu, tanpa teks yang cocokadmin.deniedmencatat upaya autentikasi admin-API yang ditolak dengan IP klien, metode, jalur, dan alasan, tanpa materi kunci yang disajikan:invalid_keyketikax-api-keydisajikan tetapi tidak cocok dengan kunci yang dikonfigurasi,bearer_rejectedketika hanya headerAuthorizationyang disajikan dan tidak memverifikasi sebagai sesi gateway diadmin.admin_groups, atauno_credentialsketika tidak ada header yang disajikan
- Acara mint dan refresh yang berhasil membawa
-
Log operasional: baris yang dapat dibaca manusia dengan awalan
[gateway]untuk boot, peringatan, dan kesalahan upstream. Variabel lingkunganCLAUDE_GATEWAY_LOG_LEVELmengontrol verbositas dan menerimadebug,info,warn, atauerror, denganinfosebagai default. Padadebug, setiap sign-in dan refresh juga mencatat nama, bukan nilai, dari klaim dalam id_token, ditambah nama klaim userinfo ketikauserinfo_fallbackmenyediakan apa pun, sehingga Anda dapat mendiagnosis pengaturanemail_claimdangroups_claimtanpa mencatat PII. Ini tidak mempengaruhi acara audit, yang selalu dipancarkan.
Tulis log operasional sebagai JSON
Jika pengumpul log Anda membaca level setiap baris dari bidang JSON, aturCLAUDE_GATEWAY_LOG_FORMAT=json di environment gateway. Memerlukan Claude Code v2.1.319 atau lebih baru pada server gateway.
Setiap baris log operasional kemudian menjadi satu objek dengan severity, time, dan message:
severity adalah level log dalam huruf kapital, dengan warn ditulis sebagai WARNING. Start yang gagal berupa baris ERROR.
Acara audit, yang juga dikirim ke stderr, tidak berubah. Acara tersebut membawa ts dan evt, dan tidak membawa severity.
Kesehatan
Gateway melayaniGET /healthz sebagai probe liveness dan GET /readyz sebagai probe kesiapan. /readyz memverifikasi toko dapat dijangkau. Jika Anda menetapkan store.readiness_grace_seconds, /readyz terus melaporkan siap selama hingga banyak detik setelah toko berhenti menjawab.
Kedua endpoint dikecualikan dari access_control.allow_cidrs, jadi probe terus bekerja pada pendengar yang terkunci.
Dokumen penemuan OAuth di /.well-known/oauth-authorization-server juga mengembalikan 200 hanya setelah pemuatan konfigurasi, penemuan OIDC, konstruksi klien upstream, dan migrasi Postgres semua berhasil, jadi berfungsi ganda sebagai pemeriksaan boot end-to-end.
Permintaan upstream bersamaan
Secara default, setiap replika gateway mengirim paling banyak 256 permintaan upstream pada waktu yang sama. Respons streaming dihitung terhadap batas sampai aliran berakhir. Permintaan yang tiba sementara replika berada di batas menunggu di dalam gateway untuk slot gratis. Pengembang melihat respons yang lambat dimulai atau tampak hang. Pada upstreamprovider: anthropic, permintaan yang menunggu lebih lama dari timeouts.upstream_ttfb_ms menyerah pada upstream itu, dan gagal dengan 502 ketika tidak ada upstream yang melayaninya kemudian.
Baris log startup yang berisi upstream requests: menunjukkan batas yang berlaku. Sementara replika memiliki lebih banyak permintaan terbuka daripada batas, itu juga mencatat peringatan yang berisi client requests are open, paling banyak sekali per menit.
Untuk melayani lebih banyak permintaan sekaligus, Anda memiliki dua opsi:
- Tambahkan replika.
- Naikkan batas pada setiap replika. Atur variabel lingkungan
BUN_CONFIG_MAX_HTTP_REQUESTSpada kontainer gateway ke angka bulat dari 1 hingga 65535, kemudian mulai ulang kontainer.
client requests are open.
Dalam uji beban dengan load_test_mode, permintaan tidak menunggu pada batas ini, tetapi replika tetap mencatat peringatan client requests are open.
Pertahankan API_TIMEOUT_MS di atas waktu hingga byte pertama gateway
Jika Anda menurunkan API_TIMEOUT_MS untuk mencoba ulang permintaan yang tidak terjawab lebih cepat, pertahankan nilainya di atas waktu yang dibutuhkan gateway untuk mengirim byte pertama dari respons streaming. Permintaan yang menunggu lebih lama akan mengalami timeout, begitu pula setiap retry yang menunggu selama itu, hingga giliran berakhir dengan Request timed out kecuali tenggat byte pertama mengakhirinya.
provider: anthropic: aturAPI_TIMEOUT_MSdi atas waktu terlama yang dibutuhkan upstream Anda untuk mengirim acara pertamanya.- Setiap upstream lainnya: atur nilainya lebih dari 20 detik di atas waktu terlama yang dibutuhkan upstream Anda untuk mengembalikan header respons. Gateway mengirim
pingkeepalive pertamanya sekitar 15 detik setelah header tersebut, kecuali acara pertama upstream datang lebih cepat. Gateway yang lebih lama dari v2.1.229 tidak mengirim ping, jadi gunakan aturanprovider: anthropicdi sana.
Mencoba ulang permintaan yang tidak terjawab lebih cepat dengan tenggat byte pertama
Agar Claude Code mencoba ulang permintaan streaming yang tidak terjawab lebih cepat, berikan tenggat byte pertama dengan mengaturCLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MS pada mesin pengembang Anda. Tenggat ini membatasi berapa lama upaya pertama menunggu header respons. Tanpanya, upaya tersebut dapat menunggu 5 hingga 6 menit. Memerlukan Claude Code v2.1.307 atau lebih baru pada mesin pengembang.
Atur variabel ke angka bulat positif dalam milidetik, di blok env kebijakan gateway atau di shell pengembang. Pertahankan nilainya di atas waktu hingga byte pertama terlama gateway Anda, atau Claude Code dapat membatalkan dan mengirim ulang permintaan sehat yang header-nya membutuhkan waktu lebih lama. Contoh ini mengatur 60 detik di shell pengembang:
API_TIMEOUT_MS hanya untuk mencoba ulang lebih cepat, hapus nilai tersebut, atau satu pengiriman ulang yang tidak terjawab dapat mengakhiri giliran dengan No response from API.
Untuk memastikan tenggat tersebut terpicu, minta pengembang memulai Claude Code dengan debug logging, lalu cari [first-byte] no response headers di log.
Perilaku pemadaman
Jika Postgres turun, gateway itu sendiri terus melayani pengembang yang masuk dan masuk baru gagal. Apakah pengembang benar-benar terus bekerja tergantung pada bagaimana orchestrator Anda menangani kesiapan:- Sesi yang ada: token pembawa memvalidasi secara lokal dengan rahasia JWT, penyegaran sesi tidak menyentuh toko, dan proses gateway masih dapat melayani inferensi
- Masuk baru: gagal sampai Postgres pulih, karena aliran perangkat dan penghitung batas lajunya tinggal di Postgres
- Penegakan batas pengeluaran: gagal terbuka secara default selama pemadaman, jadi inferensi masih mengalir; balikkan ke gagal tertutup jika Anda lebih suka memblokir daripada menjalankan tanpa meter
- Kesiapan: secara default
/readyzmelaporkan tidak siap segera setelah Postgres tidak dapat dijangkau, jadi setiap replika gagal pemeriksaan kesiapannya sekaligus. Di mana lalu lintas hanya mencapai replika yang lulus pemeriksaan, semua lalu lintas, termasuk inferensi yang masih dapat dilayani gateway, gagal sampai Postgres pulih. Probe liveness di/healthzterus lulus sepanjang waktu.
ttl_hours dan masuk baru gagal. Penyegaran sesi mendapat jawaban coba-lagi dan berjalan setelah IdP kembali. Atur ttl_hours yang lebih lama jika IdP Anda memiliki jendela pemeliharaan yang sering.
Periode grace kesiapan
Untuk menjaga pengembang yang masuk tetap bekerja melalui pemadaman Postgres yang singkat seperti failover database, aturstore.readiness_grace_seconds lebih lama dari waktu yang diperlukan failover, misalnya 300. Dengan batas pengeluaran aktif dan perilaku gagal-terbuka default, permintaan melalui replika yang tetap siap tidak diukur sampai Postgres pulih, jadi simpan nilai serendah yang mencakup failover Anda. Jika Anda menetapkan enforcement.fail_closed_on_error: true, gateway menolak inferensi pengembang yang masuk dengan pesan 429 spend limit unavailable sampai Postgres pulih, bahkan sementara replika masih lulus pemeriksaan kesiapan mereka.
Pengaturan memerlukan Claude Code v2.1.282 atau lebih baru pada server gateway. Gateway yang lebih awal menolak untuk memulai ketika menemukan kunci, jadi upgrade setiap replika sebelum Anda menambahkannya. Upgrade mencakup rollback.
Jika Anda menunjukkan probe kesiapan ke /healthz sebagai gantinya, replika juga terus lulus melalui pemadaman, tetapi /healthz tidak pernah melaporkan tidak siap, jadi replika yang koneksi Postgres-nya tidak pulih terus lulus juga.
Rotasi rahasia JWT
Putar rahasia penandatanganan dalam tiga langkah sehingga sesi yang ada tetap valid:- Hasilkan rahasia baru. Tambahkan ke depan array
session.jwt_secret. - Gulung penyebaran. Token baru menandatangani dengan rahasia baru; token lama masih memverifikasi.
- Setelah
ttl_hoursditambah margin, hapus rahasia lama dan gulung lagi.
ttl_hours.
Postgres
Gateway menyimpan statusnya dalam database PostgreSQL:- Database: PostgreSQL itu sendiri, di-host sendiri atau terkelola, pada versi minimum atau lebih baru. Database yang hanya mengimplementasikan protokol Postgres, seperti database SQL terdistribusi, tidak didukung.
- Alamat:
store.postgres_urlmenerima satu host. Jika database memiliki beberapa node, gunakan alamat yang berada di depannya, seperti endpoint layanan terkelola Anda, load balancer, atau IP virtual. Atur periode grace kesiapan yang lebih lama dari waktu yang diperlukan failover.
_migrations, semuanya dibuat oleh migrasi waktu boot-nya:
Loop 30 detik mengakhiri baris
kv melewati TTL mereka, dan sapuan per jam memberlakukan jendela retensi pada tabel pengeluaran, jadi tidak ada yang tumbuh tanpa batas. Tanpa batas pengeluaran yang dikonfigurasi, hanya kv yang ditulis. Gateway menerapkan migrasi skema sendiri saat boot dan pada setiap upgrade, jadi peran database-nya memerlukan hak untuk membuat dan mengubah tabel. Arahkan ke database atau skema yang didedikasikan untuk gateway untuk menjaga hibah tetap sempit.
Dengan batas pengeluaran digunakan, database yang hilang berarti pelacakan pengeluaran dan batas yang hilang, bukan hanya login ulang pengembang, jadi jalankan backup reguler. Untuk menghapus satu pengembang yang pergi segera daripada menunggu retensi, jalankan DELETE FROM principal_emails WHERE principal = '<sub>' secara langsung; itu menghapus satu-satunya tabel yang menyimpan email, nama, dan grup mereka. Baris spend dan admin_audit mereferensikan hanya sub OIDC pseudonim.
Tentukan ukuran connection pool
Setiap replika membuka hinggastore.max_connections koneksi Postgres, lima secara default. Pertahankan replika × store.max_connections pada atau di bawah jumlah koneksi yang tersisa di database untuk gateway:
- Replika: hitung jumlah terbanyak yang berjalan sekaligus. Mulai dari maksimum autoscaling Anda, atau jumlah replika Anda jika Anda tidak menggunakan autoscale, lalu tambahkan replika ekstra yang dimulai oleh rolling update sebelum menghentikan yang lama. Pada Amazon ECS dengan pengaturan default, dan pada Cloud Run, jumlahnya bisa sebanyak itu lagi.
- Koneksi yang tersisa: ambil
max_connectionsdatabase, lalu kurangi yang dicadangkan database dan yang dipegang oleh klien lain. PostgreSQL mencadangkansuperuser_reserved_connections, tiga secara default. Layanan terkelola dapat mencadangkan lebih banyak, jadi periksa dokumentasinya.
max_connections 50 dan dua koneksi yang dipegang oleh klien lain memiliki 50 − 3 − 2 = 45 koneksi tersisa, jadi totalnya muat.
Jika total Anda tidak muat, ubah salah satu dari berikut ini:
- Database: naikkan
max_connections-nya - Replika: jalankan lebih sedikit, atau minta orchestrator Anda memulai lebih sedikit replika ekstra dalam rolling update
- Pool: turunkan
store.max_connections, tetapi dengan batas pengeluaran aktif, pertahankan cukup besar untuk beban setiap replika. Jika tidak, pemeriksaan pengeluaran dapat mengalami timeout saat menunggu koneksi, dan gateway mencatatspend check failed: spend precheck timed out.
Upgrade
Replika tidak memiliki status, jadi restart bergulir tidak kehilangan status gateway. Gateway menjalankan migrasi skema saat boot, yang berarti menyebarkan biner baru secara otomatis memigrasikan database. Replika bersamaan menserialisasi pada kunci advisory Postgres, jadi hanya satu yang menerapkan setiap migrasi. Ketika orchestrator Anda menghentikan replika denganSIGTERM, seperti dalam restart bergulir atau scale-in, gateway berhenti menerima koneksi baru dan membiarkan permintaan dan aliran yang sudah dalam penerbangan selesai sebelum keluar. Itu menunggu hingga 25 detik, disebut jendela drain, kemudian menutup apa pun yang masih terbuka. SIGINT, seperti Ctrl+C di terminal, memulai drain yang sama, dan sinyal kedua selama drain menutup permintaan terbuka dan keluar langsung. Draining memerlukan gateway v2.1.274 atau lebih baru.
Generasi panjang dapat streaming selama berapa menit. Pada Kubernetes dan Amazon ECS, naikkan keduanya bersama-sama untuk memberikan aliran tersebut lebih banyak waktu:
- Jendela drain: atur variabel lingkungan
CLAUDE_GATEWAY_DRAIN_TIMEOUT_MSpada kontainer gateway ke angka bulat positif milidetik, seperti120000. Gateway mengabaikan nilai dalam bentuk lain apa pun, seperti120s, dan menyimpan default 25 detik - Periode grace orchestrator Anda:
terminationGracePeriodSecondspada Kubernetes, ataustopTimeoutpada Amazon ECS
preStop apa pun juga, karena periode grace mulai menghitung sebelum hook berjalan daripada ketika gateway menerima SIGTERM.
Platform Anda juga dapat membatasi berapa lama drain dapat berjalan:
- Amazon ECS on Fargate:
stopTimeoutmemungkinkan paling banyak 120 detik - Cloud Run: menghentikan instance 10 detik setelah
SIGTERM, jadi aliran terbuka mendapat paling banyak 10 detik di sana, apa pun jendela drain-nya
drain window over after, menghitung permintaan yang dipotongnya, dan menamai kedua pengaturan untuk dinaikkan.
Migrasi adalah append-only, jadi rollback ke biner sebelumnya yang mengetahui lebih sedikit migrasi aman; itu mengabaikan baris ekstra. Rollback juga memvalidasi ulang YAML terhadap skema biner yang lebih lama, jadi konfigurasi yang mengadopsi kunci yang diperkenalkan oleh rilis yang lebih baru gagal boot pada yang lebih lama. Hapus kunci baru sebelum rollback.
Karena Anda menyematkan versi gateway dalam gambar Anda sendiri, perbaikan dalam rilis Claude Code baru, termasuk perbaikan keamanan, mencapai penyebaran Anda hanya ketika Anda memperbarui pin dan menyebarkan ulang. Sertakan gateway dalam kadence patching yang sama yang Anda gunakan untuk layanan lain yang menyimpan kredensial produksi.
Keamanan
Bagian ini menjawab pertanyaan yang ditanyakan tinjauan keamanan: aliran data apa melalui gateway dan ke mana perginya, serangan mana yang dipertahankan desain, dan jawaban mana yang termasuk dalam kuesioner kepatuhan.Aliran data
Ringkasan model ancaman
Gateway duduk di dalam perimeter jaringan Anda, tetapi laptop pengembang individual tidak diperlakukan sebagai terpercaya. Desain memperhitungkan ini dalam tiga cara:- Pengembang menyimpan JWT berumur pendek bukan kunci upstream mentah. Leg CLI-ke-gateway menggunakan hibah perangkat RFC 8628, dan pertukaran kode otorisasi gateway dengan IdP menjalankan PKCE dalam konfigurasi default, jadi kode otorisasi IdP yang disadap tidak berguna.
- Halaman verifikasi perangkat memberlakukan POST asal-sama dan batas laju per-IP per RFC 8628 §5.1. Lihat Resistansi brute-force kode pengguna.
-
Permintaan gateway ke IdP Anda, kolektor OTLP Anda, dan upstream
provider: anthropicmelalui penjaga server-side request forgery (SSRF) yang menyelesaikan DNS, memblokir alamat link-lokal dan cloud-metadata ditambah loopback secara default, dan menyematkan koneksi ke IP yang diselesaikan, jadi URL yang dipengaruhi operator tidak dapat dialihkan ke endpoint metadata cloud. Rentang pribadi RFC 1918 secara sengaja diizinkan, karena IdP dan kolektor OTLP biasanya tinggal di IP pribadi. Untuk penyedia lainnya, gateway menolakbase_urlyang menamai salah satu alamat tersebut atau nama host metadata saat memuat konfigurasi, dan SDK penyedia kemudian terhubung tanpa pemeriksaan DNS. Jika Anda mengaktifkan egress hanya-proxy, pemeriksaan alamat itu berpindah ke proxy forward Anda: gateway menyerahkan nama host dan daftar izin proxy harus menolak tujuan tersebut. AturCLAUDE_GATEWAY_ALLOW_LOOPBACK=1dalam lingkungan gateway hanya ketika sesuatu yang harus dijangkau gateway secara sah tinggal di loopback, seperti IdP pengembangan lokal atau kolektor OTLP sidecar dilocalhost. Variabel ini melonggarkan blok loopback untuk setiap URL yang dikonfigurasi operator dan juga melewati peringatan waktu boot yang memeriksa apakah pod dapat menjangkau endpoint metadata cloud, jadi lebih baik memberikan kolektor alamat internal sendiri.
- Host gateway yang dikompromikan: host menyimpan kredensial upstream dan mendistribusikan pengaturan terkelola ke setiap pengembang yang terhubung, jadi kontrol atas konfigurasi gateway sebanding dengan kontrol atas MDM Anda. Dialog persetujuan CLI untuk pengaturan yang mampu shell membatasi perubahan diam-diam tetapi tidak menggantikan keamanan host.
- Penyedia OIDC yang berbahaya: penyedia menandatangani id_token yang dipercaya gateway, jadi dapat menegaskan identitas apa pun. Penyaringan dan pengamanan IdP Anda adalah tanggung jawab Anda.
Resistansi brute-force kode pengguna
user_code yang diketik pengembang ke halaman verifikasi /device adalah 8 karakter yang diambil dari alfabet 20 karakter, yang menghasilkan 20⁸ atau sekitar 2,56×10¹⁰ kombinasi, dan berakhir setelah 10 menit.
Gateway menerapkan batas laju per-IP pada endpoint hibah perangkat, dapat dikonfigurasi melalui rate_limits. Naikkan batas jika banyak pengembang masuk dari alamat NAT korporat bersama tunggal. Peluncuran besar menunjukkan cara mengukurnya. Batas hanya berlaku pada aliran masuk, bukan pada inferensi.
Postur kepatuhan
- Residensi data: bidang data sendiri gateway mengirim tidak ada ke Anthropic kecuali API Anthropic adalah upstream yang dikonfigurasi; ketika itu, perjanjian penanganan data yang ada berlaku untuk jalur inferensi. Telemetri, audit, identitas, dan pengaturan hanya pergi ke tujuan yang Anda konfigurasikan.
- Lalu lintas proses host: proses host adalah Claude Code CLI.
claude gatewayberjalan di bawah aturan pihak ketiga yang sama seperti Amazon Bedrock dan penyebaran Agent Platform Google Cloud dan mengirim tidak ada ke Anthropic. Sebelum v2.1.227, proses host mengirim telemetri startup seperti versi produk dan platform, yang pengaturanCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1dalam lingkungan kontainer mematikan. Rilis tersebut juga mengirim satu permintaanHEADsaat boot, tanpa body atau kredensial, ke/api/hellodihttps://api.anthropic.com, atau diANTHROPIC_BASE_URLketika lingkungan menetapkannya, kecuali lingkungan juga menetapkan variabel proxy sepertiHTTPS_PROXYatau sertifikat klien mTLS. Mereka mengabaikan respons, jadi memblokir permintaan itu di firewall egress tidak mempengaruhi gateway. - Analitik klien: CLI menonaktifkan analitik penggunaan sendiri dan pelaporan kesalahan saat masuk ke gateway. Sebelum masuk pertama kali, CLI masih mengirim acara startup ke Anthropic, termasuk pada mesin yang pengaturan terkelola memaksa masuk gateway. Untuk menjaga itu juga, berikan
DISABLE_TELEMETRYdalam pengaturan terkelola sisi klien yang sama yang memaksa masuk gateway. - Pelaporan kesalahan: CLI mematikan pelaporan kesalahan kapan pun permintaan model perginya ke endpoint apa pun selain API pihak pertama Anthropic, seperti Amazon Bedrock atau
ANTHROPIC_BASE_URLkustom. - Mesin klien: CLI pengembang masih mengirim pemeriksaan nama host WebFetch dan pemeriksaan versi ke Anthropic kecuali
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1danskipWebFetchPreflight: truediatur. Permintaan marketplace plugin memiliki sakelar nonaktifnya sendiri. Lihat penggunaan data. - Peringkat survei: saat masuk ke gateway, CLI menonaktifkan unggahan peringkat terikat Anthropic bersama dengan aliran analitik, jadi tidak mengirim peringkat ke Anthropic.
- Berbagi transkrip: memilih Ya pada prompt berbagi transkrip survei menulis file lokal di bawah
~/.claude/feedback-bundles/bukan mengunggah ke Anthropic. - Pembaruan klien: pemeriksaan pembaruan terpisah dari lalu lintas gateway. Sematkan versi melalui distribusi Anda sendiri dan atur
DISABLE_UPDATESjika laptop tidak boleh mengambil rilis.DISABLE_AUTOUPDATERmenghentikan hanya pembaruan latar belakang sementaraclaude updatemasih berfungsi. - TLS: layani
public_urlmelalui HTTPS dalam produksi, baik dari pendengar gateway sendiri melaluilisten.tlsatau dari ingress yang menghentikan TLS di depan replika HTTP biasa, denganlisten.public_urldiatur dalam kedua kasus. Gateway tidak menolak HTTP biasa. IdP harus melayani HTTPS dalam produksi, dan Postgres mendukung?sslmode=require. AturStrict-Transport-Securitydi ingress Anda. - Pengungkapan kerentanan: ikuti Melaporkan masalah keamanan
Permintaan marketplace plugin
Claude Code mengambil marketplace plugin langsung dari mesin setiap pengembang, bukan melalui gateway. Persyaratan akses jaringan mencantumkan host-hostnya. Pertama kali pengembang memulai sesi terminal interaktif, Claude Code mendaftarkan marketplace resmi,claude-plugins-official. Claude Code mengunduh katalog dari downloads.claude.ai dan, jika itu gagal, mengkloningnya dari github.com. Marketplace dan plugin mana yang diperbarui otomatis membahas penyegaran berikutnya.
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 tidak menghentikan pendaftaran pertama. Salah satu dari pengaturan terkelola berikut dapat menghentikannya:
- Daftar marketplace: allowlist
strictKnownMarketplacesyang tidak menyertakan marketplace tersebut, atau entriblockedMarketplacesyang menamainya - Environment variable:
CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALLdiatur ke"1"dalam blokenvterkelola
cli atau code kebijakan gateway.
Pemecahan masalah
Untuk pertanyaan dan masukan, gunakan dukungan Claude Code, atau buka issue di repositori GitHub Claude Code. Anda juga dapat menghubungi tim akun Anthropic Anda. Saat melaporkan masalah, sertakan:- Masalah gateway: stderr gateway untuk rentang waktu yang relevan,
gateway.yamlAnda dengan rahasia yang sudah disamarkan, versi gateway, yang ditampilkan di halaman landing pada/dan di header responsx-cc-gateway-versionpada/managed/settings, serta apa yang berubah baru-baru ini - Masalah login: developer menjalankan
claude --debug-file ./claude-debug.txt, mereproduksi masalahnya, lalu mengirim file tersebut beserta log audit gateway untuk rentang waktu yang sama - Masalah inferensi: model yang diminta, upstream yang dikonfigurasi, dan log audit gateway untuk permintaan tersebut, yang mencatat upstream mana yang melayaninya dan status responsnya
Pesan
Cloud gateway sign-in was not completed menyebutkan hostname gateway. Jika Claude Code memiliki fingerprint yang di-pin maupun yang disajikan, pesan tersebut juga menampilkan 16 karakter pertama dari masing-masing.
Jika Claude Code melaporkan couldn't load your organization's managed settings setelah sign-in gateway, Claude Code menyebutkan alasannya, melakukan restart di tempat, dan melanjutkan percakapan. Jika Claude Code tidak dapat melakukan restart, misalnya dalam sesi latar belakang, Claude Code mengakhiri sesi dan mempertahankan sign-in.
Header permintaan terlalu besar setelah sign-in
Permintaan seorang developer dapat gagal dengan error431 setelah sign-in jika developer tersebut menjadi anggota banyak grup IdP.
Gateway menjawab 431 ketika total header suatu permintaan melebihi 256 KiB, atau melebihi limits.max_request_header_bytes jika Anda mengaturnya. Gateway tidak menulis baris log maupun event audit untuk permintaan ini. Versi gateway sebelum v2.1.284 menjawab 431 di atas 16 KiB.
Mulailah dengan yang pertama dari berikut ini yang berlaku untuk gateway Anda:
- Gateway lebih lama dari v2.1.284: upgrade gateway
limits.max_request_header_bytesdiatur: naikkan nilainya atau hapus kunci tersebut- Tidak ada yang berlaku, atau
431tetap terjadi setelahnya: minta IdP Anda mengirim lebih sedikit grup. Penyiapan identity provider membahas cara Okta, Microsoft Entra ID, dan Google Workspace menyediakan grup
oidc.allowed_groups: menentukan siapa yang dapat sign-inadmin.admin_groups: menentukan siapa yang dapat memanggil API admin dengan sesi gateway merekamatch.groupsdalammanaged.policies: menentukan kebijakan mana yang berlaku untuk seorang developergroupspada upstream: menentukan upstream mana yang melayani seorang developer- Batas pengeluaran
rbac_group: menentukan batas grup mana yang berlaku untuk seorang developer
Thinking panjang berakhir dengan timeout proxy
Jika upstream Anda adalahprovider: anthropic, gunakan Thinking panjang pada upstream Anthropic API sebagai gantinya: Anda juga menaikkan CLAUDE_STREAM_IDLE_TIMEOUT_MS di sana, tetapi waktu dan error-nya berbeda.
Jika giliran gagal setelah thinking panjang dan proxy Anda mencatat satu permintaan terbuka selama sekitar 12,5 menit, lalu serangkaian error 504, naikkan CLAUDE_STREAM_IDLE_TIMEOUT_MS dalam kebijakan gateway. Misalnya, dengan idle timeout 240 detik pada proxy, rangkaian tersebut terdiri dari 10 permintaan, masing-masing diputus pada 240 detik.
- Permintaan pertama: stream yang mengirimkan event respons pertamanya,
message_start, lalu hanya ping selama Claude berpikir. Dengan pengaturan default, Claude Code mengakhiri stream tersebut setelah sekitar 12,5 menit. - 10 lainnya: permintaan yang sama, dikirim tanpa streaming lalu dicoba ulang, total 10 pengiriman secara default. Permintaan ini tidak mendapatkan ping, sehingga balasan yang lambat terkena timeout proxy.
Mengonfirmasi penyebab
Minta seorang developer mereproduksi kegagalan denganclaude --debug-file ./claude-debug.txt, lalu cari baris berikut di file tersebut:
CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK ke 1, Anda tidak melihat permintaan tanpa streaming, dan giliran berakhir dengan API Error: Stream idle timeout - no chunks received. Perbaikan yang sama berlaku.
Memilih nilai
Pilih nilaiCLAUDE_STREAM_IDLE_TIMEOUT_MS yang kolom keduanya mencakup jeda thinking terpanjang Anda, atau mulai dengan 1800000 jika Anda tidak mengetahuinya. Sebuah stream dapat bertahan hanya dengan ping selama sekitar 7,5 menit lebih lama daripada nilai tersebut:
Jika upstream macet sementara gateway terus mengirim ping, developer Anda juga menunggu selama itu sebelum Claude Code menyerah pada stream tersebut. Koneksi yang benar-benar diam tetap berakhir setelah 5 hingga 6 menit, karena body idle timeout tidak mengikuti variabel ini.
Mengirimkan nilai dalam kebijakan
Tambahkan entrienv ke setiap kebijakan dalam gateway.yaml yang sudah mengirimkan pengaturan Claude Code kepada developer yang ingin Anda cakup. Letakkan di bawah kunci code, cli, atau settings yang sudah dimiliki kebijakan tersebut. Untuk mencoba nilainya terlebih dahulu, mulailah dengan kebijakan yang cocok dengan satu grup. Lihat managed untuk cara kebijakan dicocokkan dan diwariskan. Contoh ini menambahkan entri ke kebijakan match: {} dengan kunci cli:
cli, Anda mencakup sesi terminal, ekstensi IDE, dan Agent SDK. Untuk tab Code di Claude Desktop, lihat Memilih cli atau code.
Restart gateway agar membaca file yang telah diedit. Lalu minta developer me-restart Claude Code untuk mendapatkan CLAUDE_STREAM_IDLE_TIMEOUT_MS.
Thinking panjang pada upstream Anthropic API
Jikaprovider: anthropic adalah satu-satunya upstream untuk model tersebut dan proxy Anda mencatat satu permintaan terbuka selama sekitar 20 menit, lalu error 502 atau 504, naikkan CLAUDE_STREAM_IDLE_TIMEOUT_MS dalam kebijakan gateway.
- Permintaan panjang: stream yang mengirimkan
message_startlalu hanya ping selama Claude berpikir. Claude Code mengakhirinya setelah sekitar 20 menit dengan pengaturan default, dan lebih lama setelah Anda menaikkan variabel tersebut. - Error-nya: permintaan yang kemudian dikirim Claude Code tanpa streaming. Masing-masing gagal dengan
502dari gateway, atau dengan504dari proxy Anda jika timeout proxy lebih pendek daripada waktu tunggu gateway. Waktu tunggu tersebut adalahtimeouts.upstream_ttfb_ms, yang tidak perlu Anda naikkan untuk perbaikan ini.
900000, dan 45 pada 1800000. Lalu ikuti Mengirimkan nilai dalam kebijakan.
Terkait
- Gambaran umum gateway aplikasi Claude: quickstart dan koneksi pengembang
- Referensi konfigurasi: setiap opsi
gateway.yaml