Application Security

Sunucusuz İşlevleri Güvence Altına Almak: AWS Lambda ve Azure Rehberi

Monolitik mimarilerden sunucusuz bilişime geçiş, ölçeklenebilir uygulamalar oluşturma şeklini devrim niteliğinde değiştirdi. AWS Lambda ve Azure Functions gibi hizmetlerle geliştiriciler, altta yatan altyapıyı yönetmeden tamamen koda odaklanabilirler. Ancak bu soyutlama, benzersiz bir güvenlik paradigması getirir. "Sunucusuz" etiketi, sık sık yanlış bir güvenlik hissi yaratır ve yapılandırma hatalarından, aşırı izinlerden ve güvensiz bağımlılıklardan kaynaklanan kritik açıkları gizler.

Bu rehberde, sunucusuz işlevlere yönelik en yaygın saldırı vektörlerini inceleyecek ve ortamınızı güçlendirmek için somut stratejiler sunacağız. AWS veya Microsoft Azure üzerinde dağıtım yapıyor olun, sıfır güven (zero trust) ve en az ayrıcalık ilkeleri her zaman önceliklidir.

Saldırı Yüzeyindeki Değişim: Sunucusuz Riskleri Anlamak

Geleneksel uygulama güvenliği, ağ siper savunmasına, yani güvenlik duvarlarına ve sızma tespit sistemlerine yoğunlaşır. Sunucusuz mimarilerde ise ağ siperi ortadan kalkar. Uygulama mantığı, talep üzerine açıp kapanan geçici konteynerler arasında dağıtılmıştır. Sonuç olarak, saldırı yüzeyi kendisi koda, işlevleri tetikleyen olay kaynaklarına ve bunları yöneten kimlik ve erişim yönetimi (IAM) politikalarına kayar.

Yaygın açıklar genellikle OWASP Top 10'u yansıtır ancak sunucusuz bir dokunuşla. Kullanıcı girdisi, temizlenmeden doğrudan alt hizmetlere aktarıldığında enjeksiyon saldırıları (SQLi, Komut Enjeksiyonu) yaygındır. Ayrıca, sunucusuz ortamlarda üçüncü taraf kütüphanelerin yüksek kullanımı göz önüne alındığında, güvensiz bağımlılıklar büyük bir risktir. Ancak en sık karşılaşılan suçlu, özellikle aşırı yetkili IAM rolleri olmak üzere yapılandırma hatalarıdır.

AWS Lambda'yı Güçlendirme: IAM ve Bağımlılık Yönetimi

AWS Lambda'yı güvence altına alırken, birincil odak yürütme rolü olmalıdır. Geliştiriciler, geliştirme sürecini basitleştireceğini varsayarak işlevlere AdministratorAccess gibi çok geniş izinler verme eğilimindedir. Bu kritik bir hatadır. Geniş izinlere sahip bir işlevin ele geçirilmesi, veri sızdırılmasına veya tüm VPC'niz boyunca yan yana hareket etmeye yol açabilir.

Her zaman en az ayrıcalık ilkesine uyun. İşlevinizin yalnızca belirli bir S3 kovasına yazma iznine ihtiyacı varsa, rolün yalnızca o belirli kovanın ARN'si için s3:PutObject iznini katı bir şekilde vermesi gerekir, başka hiçbir şey değil. Ayrıca, bağımlılıkları yönetmek de hayati önem taşır. Sunucusuz işlevler genellikle saldırı yüzeyini artıran ağır kütüphaneler içerir. Dağıtım paketlerinizdeki açıkları taramak için aws-nuke veya özel betikler gibi araçları kullanın.

import boto3
import json

def lambda_handler(event, context):
    # Örnek: Güvensiz doğrudan DB bağlantısı
    # Koda kimlik bilgilerini GÖMME!
    # Bunun yerine ortam değişkenlerini veya Secrets Manager'ı kullanın
    db_host = event['host'] 
    user = event['user']
    password = event['password']

    # Simüle edilmiş zayıf mantık
    query = f"SELECT * FROM users WHERE user = '{user}' AND pass = '{password}'"
    return {"statusCode": 200, "body": "Zayıf sorgu"}

Azure Functions'ı Güvence Altına Alma: Kimlik ve Ağ İzolasyonu

Azure Functions, benzer güvenlik zorluklarına sahip olsa da, önlem almak için farklı yerel araçlar sunar. Azure'daki en etkili güvenlik önlemlerinden biri Yönetilen Kimliklerin (Managed Identities) kullanılmasıdır. Bağlantı dizilerini veya kimlik bilgilerini işlev kodunda saklamak yerine, Azure Functions, işlev uygulamasına atanmış bir kimlik kullanarak diğer Azure hizmetlerine kimlik doğrulaması yapabilir.

Bunun yanı sıra, Azure güçlü ağ yetenekleri sağlar. İşlevlerinizin sanal bir ağda (VNet) çalışmasını veya veritabanı erişimi için özel uç noktalar kullanmasını sağlamalısınız. Bu, işlevin herkese açık internete maruz kalmamasını ve yalnızca güvenilir iç kaynaklarla iletişim kurabilmesini sağlar. İşlev ele geçirildiğinde veri sızdırma riskini önemli ölçüde azaltan ağ izolasyonu, işlev ele geçirildiğinde veri sızdırma riskini önemli ölçüde azaltır.

function app: {
  "Identity": {
    "Type": "SystemAssigned",
    "PrincipalId": "00000000-0000-0000-0000-000000000000"
  },
  "Network": {
    "VnetName": "mySecureVNet",
    "SubnetName": "appSubnet"
  }
}

Girdi Doğrulama ve Girdi Temizleme

AWS veya Azure kullanıyor olun, ele geçirilmenin en yaygın vektörü güvensiz girdidir. Sunucusuz işlevler olay odaklıdır, yani webhook'lar, mesaj kuyrukları veya API Gateway'ler tarafından tetiklenir. Gelen tüm veriler, bir şemaya karşı katı bir şekilde doğrulanmalıdır.

İstemci tarafından gelen verilere asla güvenmeyin. İşlevlerinizdeki iş mantığına ulaşmadan önce girdileri temizlemek için validator.js gibi kütüphaneleri veya yerleşik çerçeve doğrulayıcılarını kullanın. Örneğin, bir işlevin tam sayı bir kimlik içeren bir JSON nesnesi bekliyorsa, girdiyi kabul etmekle kalmayın; onu ayrıştırın ve türünü doğrulayın. Bu, saldırganın veritabanı sorgularını veya komut satırı argümanlarını manipüle etmeye çalışabileceği enjeksiyon saldırılarını önler.

Sonuç

Sunucusuz işlevleri güvence altına almak, siper savunmasından kimlik ve kod odaklı güvenliğe bir zihin yapısı değişimi gerektirir. En az ayrıcalık ilkesini titizlikle uygulayarak, yönetilen kimlikleri kullanarak, katı ağ izolasyonu uygulayarak ve tüm girdileri doğrulayarak geliştiriciler, sağlam ve dirençli sunucusuz uygulamalar oluşturabilir. Unutmayın, güvenlik tek seferlik bir yapılandırma değil, sürekli bir süreçtir. IAM rollerinizi düzenli olarak denetleyin, bağımlılıklarınızı tarayın ve en son bulut sağlayıcı güvenlik uyarılarına güncel kalın.

Sunucusuz benimseme büyümeye devam ettikçe, güvenlik en iyi uygulamaları ile gerçek dünya uygulamaları arasındaki boşluk kapatılmalıdır. Bugün mevcut işlevlerinizi denetleyerek başlayın. Güvenli bir sunucusuz mimari, güvenilir bir bulut-native uygulamanın temelidir.

Share: