Propagasi header dengan Gateway
Apa itu propagasi parameter header dan query
Propagasi header mengacu pada penerusan sistematis header HTTP selektif dari permintaan masuk melalui gateway Anda ke target yang dikonfigurasi, dan penerusan selektif header respons kembali ke klien. Mirip dengan propagasi header, propagasi parameter kueri memungkinkan penerusan parameter kueri URL dari permintaan masuk ke target yang dikonfigurasi. Fitur ini dapat digunakan untuk kasus penggunaan di mana Anda perlu bertukar konteks, otentikasi, penelusuran, dan informasi penting lainnya antara klien dan target. Header yang telah diijinkan sebelumnya yang disediakan dalam panggilan alat pemanggilan ke gateway atau dikirim dari lambda pencegat khusus, akan diteruskan ke target tertentu.
Fitur ini beroperasi sebagai model tanggung jawab bersama:
-
AWS tanggung jawab adalah meneruskan header dan parameter kueri dengan aman yang telah Anda izinkan untuk target Anda.
-
Tanggung jawab Anda adalah berhati-hati dan hanya mengizinkan header tersebut untuk propagasi yang penting bagi target, memastikan mereka memenuhi persyaratan keamanan dan fungsional Anda.
Pembatasan header
Untuk menjaga keamanan dan mencegah paparan informasi sensitif, header berikut dibatasi dan tidak dapat dikonfigurasi untuk propagasi:
|
Otorisasi* |
|
Proxy-Authorization |
|
WWW-Authenticate |
|
Menerima |
|
Accept-Charset |
|
Accept-Encoding |
|
Accept-Language |
|
Content-Type |
|
Content-Length |
|
Content-Encoding |
|
Content-Language |
|
Content-Location |
|
Content-Range |
|
Cache-Control |
|
ETag |
|
Kedaluwarsa |
|
If-Match |
|
If-Modified-Since |
|
If-None-Match |
|
If-Range |
|
If-Unmodified-Since |
|
Last-Modified |
|
Pragma |
|
Bervariasi |
|
Koneksi |
|
Keep-Alive |
|
Proxy-Connection |
|
Peningkatan |
|
Host |
|
User-Agent |
|
Perujuk |
|
Dari |
|
Kisaran |
|
Accept-Ranges |
|
Transfer-Encoding |
|
TE |
|
Trailer |
|
Server |
|
Date |
|
Lokasi |
|
Retry-After |
|
Set-Cookie |
|
Cookie |
|
Content-Security-Policy |
|
Content-Security-Policy-Report-Only |
|
Strict-Transport-Security |
|
X-Content-Type-Options |
|
X-Frame-Options |
|
X-XSS-Protection |
|
Referrer-Policy |
|
Permissions-Policy |
|
Cross-Origin-Embedder-Policy |
|
Cross-Origin-Opener-Policy |
|
Cross-Origin-Resource-Policy |
|
Access-Control-Allow-Origin |
|
Access-Control-Allow-Methods |
|
Access-Control-Allow-Headers |
|
Access-Control-Allow-Credentials |
|
Access-Control-Expose-Headers |
|
Access-Control-Max-Age |
|
Access-Control-Request-Method |
|
Access-Control-Request-Headers |
|
asal |
|
Accept-CH |
|
Accept-CH-Lifetime |
|
DPR |
|
Lebar |
|
Viewport-Width |
|
Downlink |
|
DLL |
|
RTT |
|
Save-Data |
|
Clear-Site-Data |
|
Feature-Policy |
|
Expect-CT |
|
Public-Key-Pins |
|
Public-Key-Pins-Report-Only |
|
X-Forwarded-For |
|
X-Forwarded-Host |
|
X-Forwarded-Proto |
|
X-Real-IP |
|
X-Requested-With |
|
X-CSRF-Token |
|
CF-Ray |
|
CF-Connecting-IP |
|
X-Amz-Cf-Id |
|
X-Cache |
|
X-Served-By |
|
:metode |
|
:jalur |
|
:skema |
|
:otoritas |
|
:status |
|
Tautan |
|
Sec-WebSocket-Key |
|
Sec-WebSocket-Accept |
|
Sec-WebSocket-Version |
|
Sec-WebSocket-Protocol |
|
Sec-WebSocket-Extensions |
-
Header otorisasi tidak dapat diizinkan terdaftar selama pembuatan target. Namun itu akan diteruskan ke target bila disediakan oleh lambda pencegat. Lihat Propagasi header dari interceptor lambda untuk detailnya.
penting
Selain header terbatas yang disebutkan di atas, header yang disediakan dalam kunci API dan skema REST API tidak dapat dikonfigurasi untuk propagasi header.
Aturan validasi tambahan berlaku untuk header yang diizinkan:
-
Maksimal 10 header permintaan, 10 header respons, dan 10 parameter kueri per target untuk mencegah penyalahgunaan dan mempertahankan kinerja
-
Nama header harus hanya berisi karakter alfanumerik, tanda hubung, dan garis bawah (regex:)
^[a-zA-Z0-9_-]+$ -
Nilai header dibatasi hingga maksimum 4KB untuk mencegah kelelahan memori
-
Nilai header harus berisi hanya karakter ASCII yang dapat dicetak
-
Header yang dimulai dengan
X-Amzn-dilarang (kecuali untuk X-Amzn-Bedrock-AgentCore-Runtime-Custom -* header)
Mengkonfigurasi propagasi parameter header dan kueri
Anda dapat mengonfigurasi parameter header dan kueri pada tingkat target saat membuat atau memperbarui target gateway. Header dan parameter kueri ditentukan per target, memastikan bahwa setiap target hanya menerima header yang dibutuhkannya.
Target-level konfigurasi
Konfigurasikan propagasi header dengan menambahkan allowedRequestHeadersallowedResponseHeaders,, dan allowedQueryParameters bidang ke target Anda: metadataConfiguration
{ "name": "my-target", "description": "my target description", "credentialProviderConfigurations": [{ "credentialProviderType": "OAUTH", "credentialProvider": { "oauthCredentialProvider": { "providerArn": "arn:aws:bedrock-agentcore:us-west-2:123456789012:credential-provider/example", "scopes": [] } } }], "targetConfiguration": { "mcp": { "mcpServer": { "endpoint": "https://example.com/mcp" } } }, "metadataConfiguration": { "allowedRequestHeaders": [ "request-header" ], "allowedResponseHeaders": [ "response-header" ], "allowedQueryParameters": [ "query-param" ] } }
Menggunakan Python SDK:
import boto3 # Initialize the client client = boto3.client('bedrock-agentcore', region_name='us-west-2') # Create target with header propagation response = client.create_gateway_target( gatewayId='gateway-123', name='mcp-target-with-headers', description='MCP target with header propagation', targetConfiguration={ 'mcp': { 'mcpServer': { 'endpoint': 'https://example.com/mcp' } } }, metadataConfiguration={ 'allowedRequestHeaders': ['x-correlation-id', 'x-tenant-id'], 'allowedResponseHeaders': ['x-rate-limit-remaining'], 'allowedQueryParameters': ['version'] } )
Propagasi header dari interceptor lambda
Saat menggunakan lambda pencegat khusus dengan gateway Anda, Anda dapat mengontrol propagasi header secara dinamis dengan menyertakan header dalam respons lambda pencegat Anda.
Cara kerja propagasi header interceptor
Interceptor lambda dapat mempengaruhi propagasi header dengan cara berikut:
-
Penggantian header otorisasi:
AuthorizationHeader dari respons lambda pencegat secara otomatis disebarkan ke target. MeskipunAuthorizationheader tidak dapat dikonfigurasi dalam daftar izin target, itu akan diteruskan ke target ketika disediakan oleh lambda pencegat.Misalnya, jika Anda telah menambahkan penyedia kredensi ke target yang menyediakan token otorisasi seperti
Authorization: Bearer client-tokendan lambda pencegat yang disediakanAuthorization: Bearer refreshed-token, nilaiBearer refreshed-tokendari lambda pencegat akan diteruskan ke target. -
Injeksi header khusus: Header tambahan dari respons lambda pencegat digabungkan dengan daftar izin header target yang dikonfigurasi.
-
Prioritas header: Header yang disediakan Interceptor lambda lebih diutamakan daripada header yang disediakan klien jika terjadi konflik.
Misalnya, jika Anda mengizinkan header daftar
x-tenant-iddalam konfigurasi target, dan permintaan masuk menyediakanx-tenant-id: tenant-123saat lambda pencegat menyediakanx-tenant-id: tenant-456, nilaitenant-456dari lambda pencegat akan diteruskan ke target. -
Validasi keamanan: Semua header yang disediakan lambda tunduk pada aturan validasi yang sama dengan header yang dikonfigurasi. Kecuali untuk header Otorisasi, semua header lainnya harus diizinkan terdaftar selama pembuatan target agar dapat diteruskan ke target.
Menerapkan propagasi header di pencegat
Konfigurasikan lambda pencegat Anda untuk mengembalikan header yang harus disebarkan ke target:
import json import boto3 def lambda_handler(event, context): # Extract request context request_context = event.get('requestContext', {}) user_identity = request_context.get('identity', {}) # Fetch credentials from secure store (example) credentials_client = boto3.client('secretsmanager') secret = credentials_client.get_secret_value( SecretId=f"mcp-credentials/{user_identity.get('userId')}" ) credentials = json.loads(secret['SecretString']) # Return response with headers to propagate return { "interceptorOutputVersion": "1.0", "mcp": { "transformedGatewayRequest": { "headers": { # Authorization header will be propagated automatically "Authorization": f"Bearer {credentials['access_token']}", # Custom headers (must be in target allowlist) "x-tenant-id": user_identity.get('tenantId'), "x-correlation-id": request_context.get('requestId') }, "body": event['mcp']['gatewayRequest']['body'] } } }
Kasus penggunaan umum untuk propagasi header pencegat meliputi:
- Pengambilan kredensi
-
Ambil token berumur pendek dari brankas aman dan suntikkan sebagai header Otorisasi, mencegah eksposur kredensi dalam aplikasi klien.
- Injeksi konteks
-
Tambahkan pengenal penyewa, konteks organisasi, atau atribut pengguna yang berasal dari klaim pengguna yang diautentikasi daripada mempercayai nilai yang disediakan klien.
- Transformasi header
-
Mengubah atau membersihkan header berdasarkan logika bisnis, persyaratan kepatuhan, atau kebijakan keamanan sebelum mencapai target.
- Perutean dinamis
-
Menyuntikkan petunjuk perutean, flag fitur, atau header A/B pengujian berdasarkan analisis real-time atribut pengguna atau status sistem.
Pertimbangan keamanan
Saat menerapkan propagasi header dengan lambda pencegat, ikuti praktik terbaik keamanan berikut:
-
Validasi sumber header: Hanya menyebarkan header yang secara eksplisit dikonfigurasi dalam daftar izin target Anda atau dikembalikan oleh lambda pencegat tepercaya
-
Sanitasi data sensitif: Hapus atau tutupi PII dan informasi sensitif sebelum meneruskan header ke server MCP eksternal
-
Gunakan hak istimewa paling sedikit: Konfigurasikan peran IAM lambda pencegat dengan izin minimal yang diperlukan untuk pengambilan kredensi dan pengambilan konteks
-
Menerapkan pencatatan audit: Transformasi header log dan aktivitas pengambilan kredensi untuk pemantauan dan kepatuhan keamanan
-
Validasi konten header: Pastikan header yang dihasilkan lambda memenuhi aturan validasi yang sama dengan header yang dikonfigurasi
Praktik terbaik
Ikuti praktik terbaik ini saat menerapkan propagasi header:
- Gunakan konfigurasi khusus target
-
Konfigurasikan header per target, bukan secara global. Target yang berbeda mungkin memerlukan header yang berbeda, dan konfigurasi khusus target memberikan isolasi keamanan yang lebih baik.
- Minimalkan jumlah header
-
Hanya menyebarkan header yang benar-benar dibutuhkan oleh target. Header yang berlebihan meningkatkan ukuran permintaan dan overhead pemrosesan.
- Gunakan nama header semantik
-
Pilih nama header deskriptif yang secara jelas menunjukkan tujuannya, seperti
x-correlation-iduntuk melacak ataux-tenant-iduntuk multi-tenancy. - Menerapkan penanganan kesalahan yang tepat
-
Menangani kasus di mana header yang diperlukan hilang atau tidak valid. Pertimbangkan apakah akan gagal permintaan atau memberikan nilai default.
- Memantau penggunaan header
-
Gunakan fitur observabilitas gateway untuk memantau header mana yang sedang disebarkan dan mengidentifikasi masalah apa pun dengan validasi atau pemrosesan header.
- Uji propagasi header
-
Verifikasi bahwa header disebarkan dengan benar ke target Anda selama pengembangan dan pengujian. Gunakan alat seperti pencatatan permintaan atau titik akhir debugging untuk memvalidasi alur header.