View a markdown version of this page

Tulis kode Fungsi Kon CloudFront eksi untuk validasi TLS (penampil) bersama - 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 Kon CloudFront eksi untuk validasi TLS (penampil) bersama

CloudFront Fungsi Koneksi memungkinkan Anda menulis JavaScript fungsi ringan untuk validasi sertifikat MTL dan logika otentikasi khusus. 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 CloudFront seluruh dunia.

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

Kode Fungsi Koneksi Anda berjalan di lingkungan yang aman dan terisolasi dengan waktu startup submilidetik dan dapat diskalakan 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 tutorial langkah demi langkah, lihat bagian tutorial dalam panduan ini dan jelajahi contoh Fungsi Koneksi yang tersedia di CloudFront konsol.

CloudFront Kasus dan tujuan penggunaan Fungsi Koneksi

Sebelum menulis Fungsi Kon CloudFront eksi 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 MTL opsional — Menangani koneksi MTL dan non-MTLS dengan kebijakan otentikasi yang berbeda, memungkinkan Anda memberikan keamanan yang ditingkatkan untuk klien yang mendukung sertifikat sambil mempertahankan kompatibilitas dengan klien lama.

  • IP-based otentikasi — 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.

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

  • Time-based kontrol akses — Menegakkan pembatasan berbasis waktu di mana sertifikat hanya valid 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. Pengaturan waktu ini memberi Anda fleksibilitas untuk menambahkan kriteria validasi khusus sambil memanfaatkan valid CloudFront asi 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 kustom.

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

CloudFront Struktur acara Fungsi Koneksi dan format respons

CloudFront Fungsi Koneksi menerima struktur peristiwa yang berbeda dari permintaan penampil dan fungsi respons pemirsa. 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", "ocspEndpoint": "string", "san": "string", "spki": "string", "sanHex": "string" }, "intermediates": [ { "serialNumber": "string", "issuer": "string", "subject": "string", "validity": { "notBefore": "string", "notAfter": "string" }, "sha256Fingerprint": "string", "ocspEndpoint": "string", "san": "string", "spki": "string", "sanHex": "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=", "ocspEndpoint": "http://ocsp.example.com", "san": "DNS:api.example.com,DNS:www.example.com,URI:urn:example:client:123,IP Address:192.168.1.100,email:alejandro_rosalez@example.com", "spki": "30820122300d06092a864886f70d01010105000382010f003082010a0282010100b8efe87db798500320936...", "sanHex": "3058820f6170692e6578616d706c652e636f6d820f7777772e6578616d706c652e636f6d8619..." }, "intermediates": [ { "serialNumber": "00:d4:04:a5:fd:cb:20:37:54", "issuer": "C=US, O=Example Corp, CN=Example Root CA", "subject": "C=US, O=Example Corp, CN=Example Intermediate CA", "validity": { "notBefore": "2024-01-01T00:00:00Z", "notAfter": "2034-01-01T23:59:59Z" }, "sha256Fingerprint": "3a8c6b...", "ocspEndpoint": "http://ocsp.example.com/intermediate", "san": "DNS:ca.example.com,URI:urn:ca:intermediate:001", "spki": "30820122300d06092a864886f70d01010105000382010f003082010a0282010100b389dd513b0f1f14cac1...", "sanHex": "302b820e63612e6578616d706c652e636f6d..." } ] } }, "clientIp": "192.0.2.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 Fungsi koneksi fitur JavaScript runtime

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

Lingkungan runtime mencakup dukungan JavaScript bahasa yang komprehensif:

  • Dukungan ECMAScript 2020 (ES11) - JavaScript Fitur modern termasuk rantai opsional (?.) dan koalescing nullish (??)

  • Built-in objek - Objek standar seperti JavaScript Object, Array, JSON, Math, dan Date

  • Konsol 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 yang sangat cepat, memungkinkan pemeriksaan pencabutan sertifikat real-time, 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 pencarian biasanya KeyValueStore 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 API

CloudFront Fungsi Koneksi menyediakan metode pembantu khusus yang dirancang untuk menyederhanakan keputusan validasi sertifikat dan meningkatkan pengamatan. Metode ini dioptimalkan untuk alur kerja validasi koneksi dan terintegrasi 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 ketika validasi sertifikat lulus dan logika otentikasi khusus terpenuhi

  • connection.deny () — Menolak koneksi TLS dan menghentikan 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, otentikasi gagal, atau pelanggaran kebijakan

  • connection.log CustomData () - Tambahkan data kustom ke log koneksi (hingga 800 byte UTF-8 teks). 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. P allow/deny ola memastikan bahwa maksud fungsi Anda jelas dan CloudFront dapat mengoptimalkan penanganan koneksi berdasarkan keputusan Anda. Data logging 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 dan konsisten dengan waktu pencarian mikrodetik di semua CloudFront lokasi tepi. Hal ini membuatnya ideal untuk memelihara 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:

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

  • kvs Handle.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 tidak sinkron dan harus digunakan dengan sintaks async/await. Memiliki KeyValueStore batas ukuran total 10MB dan mendukung hingga 10 juta pasangan nilai kunci. KeyValueStore data 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 pertukaran antara kompleksitas utama dan KeyValueStore kapasitas saat merancang struktur data Anda.

Gunakan async dan tunggu

Fungsi koneksi mendukung operasi asinkron menggunakan async/await sintaks, yang penting ketika bekerja dengan KeyValueStore operasi atau tugas asinkron lainnya. P async/await ola ini memastikan bahwa fungsi Anda menunggu pencarian selesai KeyValueStore 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 infrastruktur CloudFront 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 Connection Function menangani resolusi janji secara otomatis dan memastikan aliran eksekusi yang tepat dalam batasan waktu yang ketat dari pemrosesan jabat tangan TLS. Hindari menggunakan pola.then () atau callback, 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 melakukan batch pemeriksaan validasi terkait dan menggunakan KeyValueStore metode yang paling efisien (exist () vs get ()) untuk kasus penggunaan Anda.

Contoh kode fungsi koneksi

Contoh berikut menunjukkan pola Fungsi Koneksi umum untuk skenario validasi yang berbeda. Gunakan contoh-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 MTL 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.