Ada banyak cara untuk membangun otentikasi dalam produk berbasis API seperti SparkPost, dan yang kami pilih di awal adalah penggunaan kunci API. Menyuntikkan kunci API Anda sebagai header Otorisasi mentah atau melalui HTTP Basic Auth standar membuatnya sangat mudah untuk menggunakan API kami. Kunci API seperti ini adalah standar umum untuk layanan web, tetapi seberapa aman sistem ini?
Risiko
Ketika menggunakan layanan web manapun, jika seorang penyerang mendapatkan kunci API Anda, mereka dapat bertindak atas nama Anda, dan melakukan hal-hal seperti (dalam kasus kami):
mengirim email mereka secara gratis melalui akun Anda
mengunduh daftar penerima Anda dan memberikannya kepada spammer (jika mereka bukan spammer itu sendiri)
mengedit template Anda untuk menyuntikkan tautan phishing
mengirim spam atau phishing atas nama Anda
Setiap hasil ini dapat sangat merugikan reputasi Anda dan bisnis Anda, dan dalam hal phishing dapat menyebabkan kerusakan langsung pada pengguna akhir Anda. Inilah sebabnya mengapa sangat penting untuk memastikan tidak ada yang dapat menemukan kunci API Anda.
Peluang
Apakah saya mendengar bruteforce? Kunci API kami dihasilkan secara acak dalam bentuk string hexadecimal sepanjang 40 karakter. Ini menghasilkan total 1.4615e+48 kunci API. Jika semua 3 miliar komputer dan smartphone di dunia mencoba 100 kunci API per detik, dengan asumsi bahwa server kami akan mengizinkan itu, melalui semua kemungkinan kunci API akan memakan waktu lebih dari 150.000.000.000.000.000.000.000.000.000 tahun. Jadi, memaksa kunci API hanya tidak masuk akal.
Jadi, bagaimana seseorang dapat menemukan kunci API Anda? Karena kunci tersebut dikirim sebagai header, dapat dibaca dengan serangan man-in-the-middle, jadi Anda harus selalu memastikan bahwa klien Anda memeriksa sertifikat SSL saat terhubung ke API kami (ini adalah salah satu alasan utama mengapa kami mewajibkan https untuk koneksi API). Juga, jika Anda ceroboh dalam penggunaan repositori kode publik seperti github, kunci API Anda bisa dengan mudah terekspos di alam liar. Ini bukan masalah akademis: ada bot yang dikenal yang menjelajahi github untuk mencari kunci API, dan telah terjadi serangan yang berhasil melalui vektor itu.
Whitelist IP untuk menyelamatkan
Ketika Anda membuat kunci API, sekarang Anda dapat menentukan daftar IP yang diizinkan untuk menggunakan kunci ini. Anda dapat menentukan beberapa IP, serta blok IP, menggunakan notasi CIDR, sehingga Anda tidak perlu mencantumkan server Anda satu per satu. Ketika kunci API digunakan, untuk API REST atau SMTP, kami akan mencocokkan IP yang terhubung dengan daftar ini untuk mengizinkan atau menolak akses.
Dengan fitur ini, bahkan jika kunci API Anda ditemukan atau dicuri, hanya server Anda yang akan dapat menggunakannya. Mengingat risikonya dan seberapa mudahnya untuk mengaturnya, kami sangat merekomendasikan semua pelanggan kami untuk menggunakan fitur ini.
Kata terakhir
Beberapa rekomendasi pribadi tentang keamanan:
Jangan simpan kunci API Anda dalam kode. Ada banyak manfaat dengan menyimpannya sebagai variabel lingkungan, seperti yang dilakukan Heroku
Anda dapat membuat jumlah kunci API yang tidak terbatas, dan yang terbaik untuk keamanan adalah membagi tanggung jawab di antara beberapa kunci API, alih-alih hanya satu kunci swiss-knife. Ini juga memungkinkan Anda memiliki whitelist IP yang berbeda per kunci, untuk pemisahan masalah yang lebih baik
Jika Anda bekerja dengan pihak ketiga, jangan bagikan kunci API Anda tetapi buat yang baru untuk mereka, dengan hanya pemberian yang diperlukan, dan terhubung dengan IP mereka
Karena kunci API hanya dapat dibuat melalui UI, mengaktifkan otentikasi 2 faktor pada akun SparkPost Anda adalah suatu keharusan dan hanya memerlukan waktu 2 menit