Tulis kode Fungsi CloudFront Koneksi untuk validasi TLS (penampil) timbal balik - Amazon CloudFront

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Tulis kode Fungsi CloudFront Koneksi untuk validasi TLS (penampil) timbal balik

CloudFront Fungsi Koneksi memungkinkan Anda untuk menulis JavaScript fungsi ringan untuk validasi sertifikat mTLS dan logika otentikasi kustom. Kode Fungsi Koneksi Anda dapat memvalidasi sertifikat klien, menerapkan aturan otentikasi khusus perangkat, menangani skenario pencabutan sertifikat, dan membuat allow/deny keputusan untuk koneksi TLS di lokasi tepi di seluruh dunia. CloudFront

Fungsi koneksi menyediakan cara yang ampuh untuk memperluas CloudFront validasi sertifikat bawaan dengan logika bisnis Anda sendiri. Tidak seperti permintaan penampil dan fungsi respons penampil yang memproses data HTTP, Fungsi Koneksi beroperasi pada lapisan TLS dan memiliki akses ke informasi sertifikat, alamat IP klien, dan detail koneksi TLS. Ini membuatnya ideal untuk menerapkan model keamanan tanpa kepercayaan, sistem otentikasi perangkat, dan kebijakan validasi sertifikat khusus yang melampaui validasi PKI standar.

Kode Fungsi Koneksi Anda berjalan di lingkungan yang aman dan terisolasi dengan waktu startup submilidetik dan dapat menskalakan untuk menangani jutaan koneksi per detik. Runtime dioptimalkan untuk beban kerja validasi sertifikat dan menyediakan integrasi bawaan CloudFront KeyValueStore untuk operasi pencarian data real-time, memungkinkan skenario otentikasi canggih seperti pemeriksaan daftar pencabutan sertifikat dan validasi daftar izin perangkat.

Untuk membantu Anda menulis kode Fungsi Koneksi yang efektif, lihat topik berikut. Untuk contoh kode lengkap dan step-by-step tutorial, lihat bagian tutorial dalam panduan ini dan jelajahi contoh Fungsi Koneksi yang tersedia di CloudFront konsol.

CloudFront Fungsi Koneksi menggunakan kasus dan tujuan

Sebelum menulis Fungsi CloudFront Koneksi Anda, tentukan dengan cermat jenis validasi sertifikat atau logika otentikasi yang perlu Anda terapkan. Fungsi koneksi dirancang untuk kasus penggunaan tertentu yang memerlukan validasi khusus di luar pemeriksaan sertifikat PKI standar. Memahami kasus penggunaan membantu Anda merancang kode efisien yang memenuhi persyaratan keamanan Anda sambil mempertahankan kinerja optimal.

Kasus penggunaan Fungsi Koneksi Umum meliputi:

  • Penanganan pencabutan sertifikat — Menerapkan kebijakan khusus untuk menangani sertifikat yang dicabut, termasuk masa tenggang untuk rotasi sertifikat, pengecualian jaringan tepercaya untuk perangkat internal, atau skenario akses darurat di mana sertifikat yang dicabut mungkin memerlukan akses sementara.

  • Dukungan mTLS opsional — Menangani koneksi mTL dan non-MTL dengan kebijakan otentikasi yang berbeda, memungkinkan Anda memberikan keamanan yang ditingkatkan untuk klien yang mendukung sertifikat sambil mempertahankan kompatibilitas dengan klien lama.

  • Otentikasi berbasis IP — Gabungkan validasi sertifikat dengan pemeriksaan alamat IP klien untuk keamanan yang ditingkatkan, seperti membatasi akses dari wilayah geografis tertentu, jaringan perusahaan, atau rentang IP berbahaya yang diketahui.

  • Validasi sertifikat multi-penyewa - Menerapkan aturan validasi khusus penyewa di mana otoritas sertifikat atau kriteria validasi yang berbeda berlaku berdasarkan penerbit sertifikat klien atau atribut subjek.

  • Kontrol akses berbasis waktu - Menerapkan pembatasan berbasis waktu di mana sertifikat hanya berlaku selama jam tertentu, jendela pemeliharaan, atau periode bisnis, bahkan jika sertifikat itu sendiri belum kedaluwarsa.

Fungsi koneksi berjalan setelah CloudFront melakukan validasi sertifikat standar (verifikasi rantai kepercayaan, pemeriksaan kedaluwarsa, dan validasi tanda tangan) tetapi sebelum koneksi TLS dibuat. Waktu ini memberi Anda fleksibilitas untuk menambahkan kriteria validasi kustom sambil memanfaatkan CloudFront validasi sertifikat bawaan. Fungsi Anda menerima hasil validasi standar dan dapat membuat keputusan berdasarkan informasi tentang apakah akan mengizinkan atau menolak koneksi berdasarkan kriteria standar dan khusus.

Saat merancang Fungsi Koneksi Anda, pertimbangkan implikasi kinerja logika validasi Anda. Fungsi memiliki batas eksekusi 5 milidetik, sehingga operasi yang kompleks harus dioptimalkan untuk kecepatan. Gunakan KeyValueStore untuk pencarian data yang cepat daripada perhitungan yang rumit, dan struktur logika validasi Anda agar cepat gagal untuk sertifikat yang tidak valid.

CloudFront Fungsi Koneksi struktur acara dan format respons

CloudFront Fungsi Koneksi menerima struktur peristiwa yang berbeda dari permintaan penampil dan fungsi respons penampil. Alih-alih request/response data HTTP, fungsi koneksi menerima sertifikat dan informasi koneksi yang dapat Anda gunakan untuk membuat keputusan otentikasi.

Struktur acara untuk Fungsi Koneksi

Fungsi Koneksi menerima objek acara yang berisi sertifikat dan informasi koneksi. Struktur acara fungsi ditunjukkan di bawah ini:

{ "clientCertificate": { "certificates": { "leaf": { "serialNumber": "string", "issuer": "string", "subject": "string", "validity": { "notBefore": "string", "notAfter": "string", }, "sha256Fingerprint": "string" } } }, "clientIp": "string", "endpoint": "string", "distributionId": "string", "connectionId": "string" }

Di bawah ini adalah contoh struktur objek acara:

{ "clientCertificate": { "certificates": { "leaf": { "serialNumber": "00:9e:2a:af:16:56:e5:47:25:7d:2e:38:c3:f9:9d:57:fa", "issuer": "C=US, O=Ram, OU=Edge, ST=WA, CN=mTLS-CA, L=Snoqualmie", "subject": "C=US, O=Ram, OU=Edge, ST=WA, CN=mTLS-CA, L=Snoqualmie", "validity": { "notBefore": "2025-09-10T23:43:10Z", "notAfter": "2055-09-11T00:43:02Z" }, "sha256Fingerprint": "_w6bJ7aOAlGOj7NUhJxTfsfee-ONg_xop3_PTgTJpqs=" } } }, "clientIp": "127.0.0.1", "endpoint": "d3lch071jze0cb.cloudfront.net", "distributionId": "E1NXS4MQZH501R", "connectionId": "NpvTe1925xfj24a67sPQr7ae42BIq03FGhJJKfrQYWZcWZFp96SIIg==" }

Format respons Fungsi Koneksi

Fungsi Koneksi Anda harus mengembalikan objek respons yang menunjukkan apakah akan mengizinkan atau menolak koneksi. Gunakan metode pembantu untuk membuat keputusan koneksi:

function connectionHandler(connection) { // Helper methods to allow or deny connections if (/* some logic to determine if function should allow connection */) { connection.allow(); } else { connection.deny(); } }

Tidak seperti permintaan penampil dan fungsi respons penampil, Fungsi Koneksi tidak dapat mengubah permintaan atau tanggapan HTTP. Mereka hanya dapat mengizinkan atau menolak koneksi TLS.

CloudFront Fitur JavaScript runtime Fungsi Koneksi

CloudFront Fungsi Koneksi menggunakan CloudFront Functions JavaScript runtime 2.0, yang menyediakan lingkungan aman dan berkinerja tinggi yang secara khusus dioptimalkan untuk beban kerja validasi sertifikat. Runtime dirancang untuk memulai dalam sub-milidetik dan menangani jutaan eksekusi bersamaan di seluruh CloudFront jaringan edge global.

Lingkungan runtime mencakup dukungan JavaScript bahasa yang komprehensif:

  • ECMAScript Dukungan 2020 (ES11) - JavaScript Fitur modern termasuk rantai opsional (?.) , penggabungan batal (??) , dan BigInt untuk menangani nomor seri sertifikat besar

  • Objek bawaan - JavaScript Objek standar seperti Objek, Array, JSON, Matematika, dan Tanggal

  • Console logging — Gunakan console.log () untuk men-debug dan memantau keputusan validasi sertifikat. Log tersedia secara real-time selama pengujian dan dapat membantu memecahkan masalah logika validasi dalam pengembangan

  • KeyValueStore integrasi — Akses asli CloudFront KeyValueStore untuk operasi pencarian data ultra-cepat, memungkinkan pemeriksaan pencabutan sertifikat waktu nyata, validasi daftar izin perangkat, dan pengambilan konfigurasi khusus penyewa

Fungsi koneksi dioptimalkan untuk kinerja tinggi untuk skenario validasi sertifikat. Runtime secara otomatis menangani manajemen memori, pengumpulan sampah, dan pembersihan sumber daya untuk memastikan kinerja yang konsisten di jutaan koneksi bersamaan. Semua operasi dirancang untuk menjadi deterministik dan cepat, dengan KeyValueStore pencarian biasanya selesai dalam mikrodetik.

Lingkungan runtime benar-benar terisolasi antara eksekusi fungsi, memastikan bahwa tidak ada kebocoran data antara koneksi klien yang berbeda. Setiap eksekusi fungsi dimulai dengan keadaan bersih dan tidak memiliki akses ke hasil eksekusi sebelumnya atau data klien dari koneksi lain.

CloudFront Metode pembantu Fungsi Koneksi dan APIs

CloudFront Fungsi Koneksi menyediakan metode pembantu khusus yang dirancang untuk menyederhanakan keputusan validasi sertifikat dan meningkatkan observabilitas. Metode ini dioptimalkan untuk alur kerja validasi koneksi dan diintegrasikan secara mulus dengan CloudFront sistem pencatatan dan pemantauan koneksi.

  • connection.allow () - Izinkan koneksi TLS untuk melanjutkan. Metode ini memberi sinyal CloudFront untuk menyelesaikan jabat tangan TLS dan memungkinkan klien untuk membuat koneksi. Gunakan ini saat validasi sertifikat berlalu dan logika otentikasi kustom apa pun terpenuhi

  • connection.deny () - Tolak koneksi TLS dan hentikan jabat tangan. Metode ini segera menutup koneksi dan mencegah lalu lintas HTTP mengalir. Klien akan menerima kesalahan koneksi TLS. Gunakan ini untuk sertifikat yang tidak valid, autentikasi gagal, atau pelanggaran kebijakan

  • koneksi. logCustomData() — Tambahkan data khusus ke log koneksi (hingga 800 byte teks UTF-8). Metode ini memungkinkan Anda untuk menyertakan hasil validasi, detail sertifikat, atau alasan keputusan dalam log CloudFront koneksi untuk pemantauan keamanan, audit kepatuhan, dan pemecahan masalah

Metode ini menyediakan antarmuka deklaratif yang bersih untuk membuat keputusan koneksi dan mencatat informasi yang relevan untuk pemantauan dan debugging. allow/deny Pola ini memastikan bahwa maksud fungsi Anda jelas dan CloudFront dapat mengoptimalkan penanganan koneksi berdasarkan keputusan Anda. Data pencatatan khusus segera tersedia di log CloudFront koneksi dan dapat digunakan dengan alat analisis log untuk pemantauan keamanan dan wawasan operasional.

Selalu panggil connection.allow () atau connection.deny () sebelum fungsi Anda selesai. Jika tidak ada metode yang dipanggil, CloudFront akan menolak koneksi secara default sebagai tindakan pencegahan keamanan.

CloudFront KeyValueStore Integrasi Fungsi Koneksi

CloudFront Fungsi Koneksi dapat digunakan CloudFront KeyValueStore untuk melakukan pencarian data ultra-cepat untuk skenario validasi sertifikat. KeyValueStore sangat kuat untuk Fungsi Koneksi karena menyediakan akses data global yang akhirnya konsisten dengan waktu pencarian mikrodetik di semua lokasi tepi. CloudFront Ini membuatnya ideal untuk mempertahankan daftar pencabutan sertifikat, daftar izin perangkat, konfigurasi penyewa, dan data validasi lainnya yang perlu diakses selama jabat tangan TLS.

KeyValueStore integrasi dirancang khusus untuk alur kerja validasi koneksi berkinerja tinggi:

  • KVShandle.exists (key) - Periksa apakah ada kunci di tanpa mengambil nilainya. KeyValueStore Ini adalah metode yang paling efisien untuk skenario validasi biner seperti pemeriksaan pencabutan sertifikat, di mana Anda hanya perlu tahu apakah nomor seri sertifikat ada dalam daftar pencabutan

  • KVShandle.get (key) - Ambil nilai dari skenario validasi yang lebih kompleks. KeyValueStore Gunakan ini saat Anda perlu mengakses data konfigurasi, aturan validasi, atau metadata yang terkait dengan sertifikat atau pengenal perangkat

KeyValueStore operasi asinkron dan harus digunakan dengan sintaks async/await. Ini KeyValueStore memiliki batas ukuran total 10MB dan mendukung hingga 10 juta pasangan nilai kunci. KeyValueStore data pada akhirnya konsisten di semua lokasi tepi, dengan pembaruan biasanya menyebar dalam hitungan detik.

Untuk kinerja optimal, susun KeyValueStore kunci Anda untuk meminimalkan operasi pencarian. Gunakan nomor seri sertifikat sebagai kunci untuk pemeriksaan pencabutan sederhana, atau buat kunci komposit yang menggabungkan hash penerbit dan nomor seri untuk lingkungan multi-CA. Pertimbangkan trade-off antara kompleksitas dan KeyValueStore kapasitas utama saat merancang struktur data Anda.

Gunakan async dan await

Fungsi koneksi mendukung operasi asinkron menggunakan async/await sintaks, yang penting saat bekerja dengan KeyValueStore operasi atau tugas asinkron lainnya. async/await Pola ini memastikan bahwa fungsi Anda menunggu KeyValueStore pencarian selesai sebelum membuat keputusan koneksi, sambil mempertahankan karakteristik kinerja tinggi yang diperlukan untuk pemrosesan jabat tangan TLS.

async/await Penggunaan yang tepat sangat penting untuk Fungsi Koneksi karena KeyValueStore operasi, meskipun sangat cepat, masih merupakan operasi jaringan yang memerlukan koordinasi di seluruh CloudFront infrastruktur terdistribusi. Runtime secara otomatis menangani resolusi janji dan memastikan bahwa fungsi Anda selesai dalam batas eksekusi 5 milidetik.

contoh : Fungsi Koneksi Async dengan KeyValueStore
import cf from 'cloudfront'; async function connectionHandler(connection) { const kvsHandle = cf.kvs(); // Async operation to check KeyValueStore for certificate revocation const isRevoked = await kvsHandle.exists(connection.clientCertificate.certificates.leaf.serialNumber); if (isRevoked) { // Log the revocation decision with certificate details connection.logCustomData(`REVOKED_CERT:${connection.clientCertificate.certificates.leaf.serialNumber}:${connection.clientCertificate.certificates.leaf.issuer}`); console.log(`Denying connection for revoked certificate: ${connection.clientCertificate.certificates.leaf.serialNumber}`); return connection.deny(); } // Log successful validation for monitoring connection.logCustomData(`VALID_CERT:${connection.clientCertificate.certificates.leaf.serialNumber}`); console.log(`Allowing connection for valid certificate: ${connection.clientCertificate.certificates.leaf.serialNumber}`); return connection.allow(); }

Selalu gunakan async/await saat memanggil KeyValueStore metode atau operasi asinkron lainnya. Runtime Fungsi Koneksi menangani resolusi janji secara otomatis dan memastikan alur eksekusi yang tepat dalam batasan waktu yang ketat dari pemrosesan jabat tangan TLS. Hindari menggunakan .then () atau pola panggilan balik, karena async/await memberikan penanganan kesalahan yang lebih bersih dan kinerja yang lebih baik di lingkungan Fungsi Koneksi.

Saat merancang Fungsi Koneksi async, susun kode Anda untuk meminimalkan jumlah KeyValueStore operasi dan lakukan sedini mungkin dalam logika validasi Anda. Ini memastikan kinerja maksimum dan mengurangi risiko masalah batas waktu selama periode lalu lintas tinggi. Pertimbangkan untuk mengelompokkan pemeriksaan validasi terkait dan menggunakan KeyValueStore metode yang paling efisien (exists () vs get ()) untuk kasus penggunaan Anda.

Contoh kode fungsi koneksi

Contoh berikut menunjukkan pola Fungsi Koneksi umum untuk skenario validasi yang berbeda. Gunakan contoh ini sebagai titik awal untuk implementasi Fungsi Koneksi Anda sendiri.

contoh : Validasi sertifikat perangkat

Contoh ini memvalidasi nomor seri perangkat dan bidang subjek sertifikat untuk perangkat IoT, konsol game, dan skenario otentikasi klien lainnya:

async function connectionHandler(connection) { // Custom validation: check device serial number format const serialNumber = connection.clientCertificate.certificates.leaf.serialNumber; if (!serialNumber.startsWith("DEV")) { connection.logCustomData(`INVALID_SERIAL:${serialNumber}`); return connection.deny(); } // Validate certificate subject contains required organizational unit const subject = connection.clientCertificate.certificates.leaf.subject; if (!subject.includes("OU=AuthorizedDevices")) { connection.logCustomData(`INVALID_OU:${subject}`); return connection.deny(); } // Allow connection for valid devices connection.logCustomData(`VALID_DEVICE:${serialNumber}`); return connection.allow(); }

Fungsi ini melakukan beberapa pemeriksaan validasi di luar validasi sertifikat standar, termasuk format nomor seri perangkat dan verifikasi unit organisasi.

contoh : MTL opsional dengan otentikasi campuran

Contoh ini menangani koneksi mTLS dan non-MTLS dengan kebijakan otentikasi yang berbeda:

async function connectionHandler(connection) { if (connection.clientCertificate) { // mTLS connection - enhanced validation for certificate holders const subject = connection.clientCertificate.certificates.leaf.subject; connection.logCustomData(`MTLS_SUCCESS:${subject}:${connection.clientIp}`); console.log(`mTLS connection from: ${subject}`); return connection.allow(); } else { // Non-mTLS connection - apply IP-based restrictions const clientIp = connection.clientIp; // Only allow non-mTLS from specific IP ranges if (clientIp.startsWith("203.0.113.") || clientIp.startsWith("198.51.100.")) { connection.logCustomData(`NON_MTLS_ALLOWED:${clientIp}`); console.log(`Non-mTLS connection allowed from: ${clientIp}`); return connection.allow(); } connection.logCustomData(`NON_MTLS_DENIED:${clientIp}`); return connection.deny(); } }

Fungsi ini memberikan keamanan yang ditingkatkan untuk klien dengan sertifikat sambil mempertahankan kompatibilitas dengan klien lama dari rentang IP tepercaya.