Siber Güvenlik
API’larınızı nasıl daha güvenli hale getirebilirsiniz?
API yazılım bileşenlerinin protokoller ve tanımlar vasıtasıyla iletişim kurmasını sağlayan mekanizmalara verilen isimdir. Açılımı ise Application Programming Interface, yani Uygulama Programlama Arabirimi’dir.
Peki, API’larınız ne kadar güvenli biliyor musunuz? Savunmasız bilgileri sızdırmadığımızdan, uç noktaların spam edilmediğinden, her şeyin yolunda gittiğinden ve uygun şekilde korunduğundan emin olmak için dikkate almanız gereken 5 önemli şey var. Bu yazıda dikkat edilmesi gereken ana noktaları derledim. İyi okumalar.
Güvenli bir API’ın 5 adımına geçmeden önce SOAP ve REST kavramlarına bakmak iyi olacaktır.
SOAP Protokolü nedir?
API güvenliği, veri alışverişi sırasında hassas bilgilerin korunmasını sağlamak için geliştirilen bir dizi önlemleri içerir. Bu önlemler arasında SOAP (Simple Object Access Protocol), güvenli bir veri iletişimini temin etmek adına önemli bir rol oynar.
SOAP, basit nesne erişim protokolü (Simple Object Access Protocol) olarak bilinir ve web servislerinde kullanılan bir iletişim protokolüdür. XML tabanlı bir protokol olan SOAP, farklı platformlardaki uygulamalar arasında yapılandırılmış bilgi alışverişini mümkün kılar.
SOAP (Simple Object Access Protocol):
- Şifreleme ve Güvenlik: SOAP, veri paketlerini şifreleyerek, bilgilerin güvenli bir şekilde iletilmesini sağlar. Bu özellik, API trafiğini ele geçirmeye çalışan kötü niyetli kişilerin verilere erişimini engeller.
- Kimlik Doğrulama: SOAP, kimlik doğrulama mekanizmalarını destekleyerek, iletişimde yer alan tarafların kimliklerini doğrular. Bu sayede, yalnızca yetkili kullanıcılar API'yi kullanabilir.
- Hata Yönetimi: SOAP, hatanın nerede meydana geldiğini belirlemek için ayrıntılı hata mesajları sunar. Bu, geliştiricilerin hata ayıklama sürecini kolaylaştırır ve potansiyel güvenlik sorunlarını hızla tespit etmelerine yardımcı olur.
- Uyumluluk ve Standardizasyon: SOAP, endüstri standardı olması nedeniyle farklı platformlar arasında uyumluluk sağlar. Bu, güvenlik önlemlerinin geniş bir yelpazede benzer şekilde uygulanabilmesini mümkün kılar.
Aşağıda SOAP tabanlı bir API örneğini görebilirsiniz:
Bu örnekte, bir öğrenci bilgi sistemi API'ı simüle edilmektedir. API, öğrenci bilgilerini almak ve güncellemek için SOAP protokolünü kullanır. Ayrıca, güvenlik önlemleri olarak kimlik doğrulama ve veri şifreleme kullanılmaktadır.
- Authentication başlığı altında, API'a erişim izni olan kullanıcı adı (Username) ve şifre (Password) ile kimlik doğrulama sağlanmaktadır.
- SOAP body içinde, GetStudentInfo operasyonu çağrılarak belirli bir öğrenci ID'si ile ilgili bilgi alınmaktadır.
Bu örnekteki güvenliği incelemek gerekirse:
- Kimlik doğrulama: SOAP başlığında bulunan kimlik doğrulama bilgileri, sadece yetkili kullanıcıların API'a erişim sağlamasını mümkün hale getirir. Bu sayede, yetkisiz erişimleri önler ve güvenliği artırır.
- Veri Şifreleme: SOAP, HTTPS protokolü üzerinden kullanıldığında, veri şifrelemesi otomatik olarak devreye girer. Bu, API trafiğinin kötü niyetli kişiler tarafından anlaşılmasını önler ve hassas bilgilerin korunmasına katkı sağlar.
- Hata Yönetimi: SOAP, ayrıntılı hata mesajları sağlar. Bu, geliştiricilere API hatalarını hızlı bir şekilde tespit etme ve düzeltme imkânı verir. Bu da güvenlik açısından önemlidir, çünkü hataların gizli tutulmaması, potansiyel güvenlik sorunlarını açığa çıkarabilir.
REST nedir?
REST ise “Representational State Transfer”ın kısaltmasıdır ve genellikle web tabanlı servisler arasında veri iletişimini kolaylaştırmak için kullanılır. RESTful API'lar, HTTP protokolü üzerinden standart HTTP metodları (GET, POST, PUT, DELETE vb.) kullanarak kaynaklara erişim sağlar.
- Token Tabanlı Kimlik Doğrulama: RESTful API'lar genellikle token tabanlı kimlik doğrulama kullanır. Bu, kullanıcıların ve sistemlerin güvenli bir şekilde kaynaklara erişmesini sağlar. OAuth gibi protokoller, bu kimlik doğrulama yöntemini destekler.
- SSL/TLS Şifreleme: REST, genellikle HTTPS üzerinden iletişim kurar. Bu, verilerin şifrelenerek güvenli bir şekilde taşınmasını ve ortadaki saldırılara karşı korunmasını sağlar.
- CORS (Cross-Origin Resource Sharing) Kontrolü: RESTful servisler, tarayıcı tabanlı uygulamalarda güvenliği artırmak için CORS kontrolü sağlar. Bu, yalnızca belirli domain’lerden gelen isteklere izin verir.
- Hata Yönetimi ve Günlükleme: REST, HTTP durum kodları aracılığıyla hata yönetimini destekler. Ayrıca, günlükleme (logging) kullanarak potansiyel güvenlik sorunlarını tespit etmeye yardımcı olur.
Örnek olarak bir blog uygulamasının yazılarına erişim sağlayan bir API ve Bu API’ın aşağıdaki özellikleri olduğunu düşünelim:
- Token Tabanlı Kimlik Doğrulama:
- Kullanıcıların API'a erişimi için token kullanılmaktadır.
- Her istek, geçerli bir token ile kimlik doğrulaması yapmak zorundadır.
- Bu, yalnızca yetkili kullanıcıların API'a erişmesine izin verir.
- SSL/TLS Şifreleme:
- Tüm veri iletişimi HTTPS üzerinden gerçekleşmektedir.
- Bu, verilerin şifrelenerek güvenli bir şekilde taşınmasını sağlar.
- CORS Kontrolü:
- Sadece belirli domain’lerden gelen isteklere izin verilmektedir.
- Bu, tarayıcı tabanlı uygulamalarda güvenliği artırır.
- Hata Yönetimi ve Günlükleme:
- API, ayrıntılı hata kodları ile hata yönetimi sağlamaktadır.
- Günlük dosyaları, potansiyel güvenlik sorunlarını tespit etmeye yardımcı olur.
5 adımda API güvenliği
1. ADIM: HTTPS
Saldırganların ortadaki adam saldırısını gerçekleştirmemeleri ve client’tan server’a gidip gelen verileri okumamaları için client ve server arasındaki bağlantının şifrelenmiş olduğundan emin olmak gerekir. Bu genelde bizim için otomatik olarak yapılır.
2. ADIM: AUTHENTICATION & AUTHORIZATION
Kullanıcının olduğunu iddia ettiği kişi olduğundan OAuth, Google, Github, email-şifre vs. kullanarak emin olmak “authentication” adına yapmamız gereken şeydir. Bunun karşılığında, bu kimlik bilgileri karşılığında, kullanıcı bir json web token (JWT) olan bir token alır veya bu sizin de bir veritabanında sakladığınız bir oturum token’ı olabilir. Bunlar kimlik doğrulamaya yönelik 2 farklı yaklaşımdır.
Bu “authentication” kısmıydı. Bu adımdan sonra artık kullanıcının olduğunu iddia etti kişi olduğunu biliyoruz.
“Authorization” ise şu soru ile özetlenebilir: “Kullanıcıların ne yapmaya yetkisi var?”
Rol tabanlı kimlik doğrulaması varsa (yönetici mi, kullanıcı mı…) veya yoksa, herhangi bir kullanıcının ne yapmaya izni vardır? Örneğin veri tabanındaki isimlerini değiştirebilirler mi? Veri tabanı ile nasıl iletişim kurabilirler?
“Authorization” aşaması bunlarla ilgilidir.
Genelde yaptığımız şey API endpoint ile link edilmiş kesin bir aksiyon almadan önce mantıksal kontrolleri sağlamaktır. Örneğin bir “endpoint”in amacı veritabanındaki kullanıcı adını değiştirmek olsun. Bunu yapmadan önce, yetkilendirme açısından, şu örnek verilebilir:
“Kullanıcı geçtiğimiz 1 saat içerisinde 3’ten fazla isim değiştirdi mi?”
Eğer değiştirdiyse, aynı işlemi aynı saat içerisinde tekrar yapma yetkisi yoktur.
Amaç, kullanıcı adını değiştirmek:
Artık şifreli veri trafiği gönderiyoruz, kullanıcının kim olduğunu ve ne yapmasına izin verildiğini biliyoruz.
Ama bir saniye! Herhangi biri, oturum açmamış olsa bile, API bağlantı noktanızı tamamen spam’layabilir ve sizi veritabanınıza ileri geri birçok istekte bulunmaya zorlayabilir ve bu da size paraya mal olur.
Bununla ilgili sıradaki adımımız ise: Rate limits.
3. ADIM: RATE LIMITS
Rate limit için “upstash” kullanılabilir. Bu sayede API endpoint’lerimizi korumamız kolaylaşır (özellikle serverless bir environment’ta). Bunun dışında yine rate limit için kullanılan başka paketler de vardır.
Örnek:
Ancak kişinin kötü niyetli bir istekte bulunmaya çalıştığından emin olamayız çünkü kullanıcının kim olduğunu bilmek, onun saldırgan olmadığı anlamına gelmez. Bu yüzden input doğrulaması yapmamız gerekir.
4. ADIM: INPUT VALIDATION
Herkes istediği veriyle API rodlarımızdan herhangi birine istekte bulunabilir. Sunucuya aldığımız ve istekte işlediğimiz verilerin aslında beklediğimiz gibi olduğundan ve kötü niyetli girdi olmadığından emin olmamız gerekir.
Bunun için TypeScript'te yup kütüphanesini veya zod kütüphanesini kullanabiliriz. Öncelikle backend kısmında beklediğimiz ve daha sonra tekrar parse edebileceğimiz veri için belirli bir şemayı tanımlarız. Böylece bu şemaya aykırı ne olursa olsun herhangi bir veriyi ayrıştırabiliriz. Ayrıştırdığımız veriler şemayla eşleşmiyorsa sunucumuz beklemediğimiz verilerle isteği işleyemeyeceğimiz ve yalnızca API uç noktamıza iletilen verileri belirli şema türünde işleyebileceğimiz için hata verecektir.
Örnek:
Tüm bu adımlardan sonra yapabileceğimiz son şey ise hataları yönetmek olacaktır.
5. ADIM: ERROR HANDLING
API'ımızda her şeyin sorunsuz çalıştığından asla emin olamayız. Yanlış gidebilecek pek çok şey olabilir. Burada “try catch” blokları kullanılabilir. İyi hata yönetiminin sırrı, olup bitenlere ilişkin uygun HTTP durum kodlarını geri göndermektir, çünkü daha sonra bunları “client” tarafında kontrol edebilir ve kullanıcıya uygun bir hata mesajı görüntüleyebiliriz.
Örnek:
Hatanın ne olduğu hakkında hiçbir fikrimiz yoksa generic 500 hata mesajını kullanabiliriz.
Bu beş önemli faktörü ele alarak SOAP veya REST API'ımızı potansiyel güvenlik açıklarına karşı güçlendirebilir ve genel güvenliğini artırabiliriz.