# Serverless.com Güvenliği {{#include ../banners/hacktricks-training.md}} ## Temel Bilgiler ### Organizasyon Bir **Organizasyon**, Serverless Framework ekosistemindeki en yüksek düzeydeki varlıktır. Birden fazla projeyi, takımı ve uygulamayı kapsayan bir **kolektif grup** olarak bir şirketi, departmanı veya herhangi bir büyük varlığı temsil eder. ### Takım **Takım**, organizasyon içinde erişimi olan kullanıcılardır. Takımlar, üyeleri rollere göre organize etmeye yardımcı olur. **`İşbirlikçileri`**, mevcut uygulamaları görüntüleyip dağıtabilirken, **`Yöneticiler`** yeni uygulamalar oluşturabilir ve organizasyon ayarlarını yönetebilir. ### Uygulama Bir **Uygulama**, bir Organizasyon içindeki ilgili hizmetlerin mantıksal bir gruplamasıdır. Birlikte çalışarak uyumlu bir işlevsellik sağlamak için bir araya gelen birden fazla sunucusuz hizmetten oluşan tam bir uygulamayı temsil eder. ### **Hizmetler** Bir **Hizmet**, bir Sunucusuz uygulamanın temel bileşenidir. Tüm sunucusuz projenizi temsil eder, gerekli tüm işlevleri, yapılandırmaları ve kaynakları kapsar. Genellikle bir `serverless.yml` dosyasında tanımlanır; bir hizmet, hizmet adı, sağlayıcı yapılandırmaları, işlevler, olaylar, kaynaklar, eklentiler ve özel değişkenler gibi meta verileri içerir. ```yaml service: my-service provider: name: aws runtime: nodejs14.x functions: hello: handler: handler.hello ```
Fonksiyon Bir **Fonksiyon**, bir AWS Lambda fonksiyonu gibi tek bir sunucusuz fonksiyonu temsil eder. Olaylara yanıt olarak yürütülen kodu içerir. `serverless.yml` dosyasındaki `functions` bölümünde tanımlanır ve işleyici, çalışma zamanı, olaylar, ortam değişkenleri ve diğer ayarları belirtir. ```yaml functions: hello: handler: handler.hello events: - http: path: hello method: get ```
Olay **Olaylar**, sunucusuz fonksiyonlarınızı tetikleyen tetikleyicilerdir. Bir fonksiyonun nasıl ve ne zaman çalıştırılacağını tanımlarlar. Yaygın olay türleri arasında HTTP istekleri, planlı olaylar (cron işleri), veritabanı olayları, dosya yüklemeleri ve daha fazlası bulunur. ```yaml functions: hello: handler: handler.hello events: - http: path: hello method: get - schedule: rate: rate(10 minutes) ```
Kaynak **Kaynaklar**, hizmetinizin bağımlı olduğu ek bulut kaynaklarını tanımlamanıza olanak tanır; örneğin veritabanları, depolama alanları veya IAM rolleri. `resources` bölümünde belirtilir ve genellikle AWS için CloudFormation sözdizimi kullanılır. ```yaml resources: Resources: MyDynamoDBTable: Type: AWS::DynamoDB::Table Properties: TableName: my-table AttributeDefinitions: - AttributeName: id AttributeType: S KeySchema: - AttributeName: id KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1 ```
Sağlayıcı **Sağlayıcı** nesnesi, bulut hizmet sağlayıcısını (örneğin, AWS, Azure, Google Cloud) belirtir ve o sağlayıcıya ilişkin yapılandırma ayarlarını içerir. Çalışma zamanı, bölge, aşama ve kimlik bilgileri gibi ayrıntıları içerir. ```yaml yamlCopy codeprovider: name: aws runtime: nodejs14.x region: us-east-1 stage: dev ```
Aşama ve Bölge Aşama, hizmetinizin dağıtılabileceği farklı ortamları (örneğin, geliştirme, test, üretim) temsil eder. Ortama özgü yapılandırmalar ve dağıtımlar için olanak tanır. ```yaml provider: stage: dev ``` Bölge, kaynaklarınızın dağıtılacağı coğrafi bölgeyi belirtir. Gecikme, uyumluluk ve kullanılabilirlik açısından önemlidir. ```yaml provider: region: us-west-2 ```
Eklentiler **Eklentiler**, Serverless Framework'ün işlevselliğini yeni özellikler ekleyerek veya diğer araçlar ve hizmetlerle entegre olarak genişletir. `plugins` bölümünde tanımlanır ve npm aracılığıyla yüklenir. ```yaml plugins: - serverless-offline - serverless-webpack ```
Katmanlar **Katmanlar**, paylaşılan kodu veya bağımlılıkları işlevlerinizden ayrı olarak paketlemenizi ve yönetmenizi sağlar. Bu, yeniden kullanılabilirliği teşvik eder ve dağıtım paketlerinin boyutunu azaltır. Katmanlar, `layers` bölümünde tanımlanır ve işlevler tarafından referans gösterilir. ```yaml layers: commonLibs: path: layer-common functions: hello: handler: handler.hello layers: - { Ref: CommonLibsLambdaLayer } ```
Değişkenler ve Özel Değişkenler **Değişkenler**, yer tutucuların kullanımıyla dinamik yapılandırmayı mümkün kılar; bu yer tutucular dağıtım zamanında çözülür. - **Sözdizimi:** `${variable}` sözdizimi, ortam değişkenlerine, dosya içeriklerine veya diğer yapılandırma parametrelerine referans verebilir. ```yaml functions: hello: handler: handler.hello environment: TABLE_NAME: ${self:custom.tableName} ``` * **Özel Değişkenler:** `custom` bölümü, `serverless.yml` dosyası boyunca yeniden kullanılabilecek kullanıcıya özgü değişkenler ve yapılandırmalar tanımlamak için kullanılır. ```yaml custom: tableName: my-dynamodb-table stage: ${opt:stage, 'dev'} ```
Çıktılar **Çıktılar**, bir hizmet dağıtıldıktan sonra döndürülen değerleri tanımlar; bu değerler kaynak ARN'leri, uç noktalar veya diğer yararlı bilgileri içerebilir. `outputs` bölümünde belirtilir ve genellikle diğer hizmetlere bilgi sağlamak veya dağıtım sonrası kolay erişim için kullanılır. ```yaml ¡outputs: ApiEndpoint: Description: "API Gateway endpoint URL" Value: Fn::Join: - "" - - "https://" - Ref: ApiGatewayRestApi - ".execute-api." - Ref: AWS::Region - ".amazonaws.com/" - Ref: AWS::Stage ```
IAM Rolleri ve İzinler **IAM Rolleri ve İzinler**, fonksiyonlarınız ve diğer kaynaklarınız için güvenlik kimlik bilgilerini ve erişim haklarını tanımlar. Gerekli izinleri belirtmek için `provider` veya bireysel fonksiyon ayarları altında yönetilir. ```yaml provider: [...] iam: role: statements: - Effect: 'Allow' Action: - 'dynamodb:PutItem' - 'dynamodb:Get*' - 'dynamodb:Scan*' - 'dynamodb:UpdateItem' - 'dynamodb:DeleteItem' Resource: arn:aws:dynamodb:${aws:region}:${aws:accountId}:table/${self:service}-customerTable-${sls:stage} ```
Ortam Değişkenleri **Değişkenler**, yapılandırma ayarlarını ve gizli bilgileri işlevlerinize sabit kodlama yapmadan geçirmenizi sağlar. Bunlar, sağlayıcı veya bireysel işlevler için `environment` bölümünde tanımlanır. ```yaml provider: environment: STAGE: ${self:provider.stage} functions: hello: handler: handler.hello environment: TABLE_NAME: ${self:custom.tableName} ```
Bağımlılıklar **Bağımlılıklar**, fonksiyonlarınızın ihtiyaç duyduğu dış kütüphaneleri ve modülleri yönetir. Genellikle npm veya pip gibi paket yöneticileri aracılığıyla yönetilir ve `serverless-webpack` gibi araçlar veya eklentiler kullanılarak dağıtım paketinizle birleştirilir. ```yaml plugins: - serverless-webpack ```
Hooks **Hooks** özel betikleri veya komutları dağıtım yaşam döngüsündeki belirli noktalarda çalıştırmanıza olanak tanır. Dağıtımlardan önce veya sonra eylemler gerçekleştirmek için `serverless.yml` içinde veya eklentiler kullanılarak tanımlanırlar. ```yaml custom: hooks: before:deploy:deploy: echo "Starting deployment..." ```
### Eğitim Bu, resmi eğitimin bir özetidir [**belgelerden**](https://www.serverless.com/framework/docs/tutorial): 1. Bir AWS hesabı oluşturun (Serverless.com AWS altyapısında başlar) 2. serverless.com'da bir hesap oluşturun 3. Bir uygulama oluşturun: ```bash # Create temp folder for the tutorial mkdir /tmp/serverless-tutorial cd /tmp/serverless-tutorial # Install Serverless cli npm install -g serverless # Generate template serverless #Choose first one (AWS / Node.js / HTTP API) ## Indicate a name like "Tutorial" ## Login/Register ## Create A New App ## Indicate a name like "tutorialapp) ``` Bu, kontrol edebileceğiniz `tutorialapp` adında bir **uygulama** oluşturmuş olmalı [serverless.com](serverless.com-security.md) ve içinde `helloworld` kodu bulunan bazı JS kodları içeren **`handler.js`** dosyasına sahip `Tutorial` adında bir klasör oluşturmuş olmalı ve bu fonksiyonu beyan eden **`serverless.yml`** dosyası: {{#tabs }} {{#tab name="handler.js" }} ```javascript exports.hello = async (event) => { return { statusCode: 200, body: JSON.stringify({ message: "Go Serverless v4! Your function executed successfully!", }), } } ``` {{#endtab }} {{#tab name="serverless.yml" }} ```yaml # "org" ensures this Service is used with the correct Serverless Framework Access Key. org: testing12342 # "app" enables Serverless Framework Dashboard features and sharing them with other Services. app: tutorialapp # "service" is the name of this project. This will also be added to your AWS resource names. service: Tutorial provider: name: aws runtime: nodejs20.x functions: hello: handler: handler.hello events: - httpApi: path: / method: get ``` {{#endtab }} {{#endtabs }} 4. Bir AWS sağlayıcısı oluşturun, `https://app.serverless.com//settings/providers?providerId=new&provider=aws` adresindeki **dashboard**'a giderek. 1. `serverless.com`'a AWS erişimi vermek için, bu yapılandırma dosyasını kullanarak bir cloudformation yığını çalıştırmanızı isteyecektir (bu yazının yazıldığı sırada): [https://serverless-framework-template.s3.amazonaws.com/roleTemplate.yml](https://serverless-framework-template.s3.amazonaws.com/roleTemplate.yml) 2. Bu şablon, **`SFRole-`** adında bir rol oluşturur ve **`arn:aws:iam::aws:policy/AdministratorAccess`** ile birlikte, `Serverless.com` AWS hesabının bu role erişmesine izin veren bir Güven İlişkisi ile birlikte hesap üzerinde.
Yaml roleTemplate ```yaml Description: This stack creates an IAM role that can be used by Serverless Framework for use in deployments. Resources: SFRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: AWS: arn:aws:iam::486128539022:root Action: - sts:AssumeRole Condition: StringEquals: sts:ExternalId: !Sub "ServerlessFramework-${OrgUid}" Path: / RoleName: !Ref RoleName ManagedPolicyArns: - arn:aws:iam::aws:policy/AdministratorAccess ReporterFunction: Type: Custom::ServerlessFrameworkReporter Properties: ServiceToken: "arn:aws:lambda:us-east-1:486128539022:function:sp-providers-stack-reporter-custom-resource-prod-tmen2ec" OrgUid: !Ref OrgUid RoleArn: !GetAtt SFRole.Arn Alias: !Ref Alias Outputs: SFRoleArn: Description: "ARN for the IAM Role used by Serverless Framework" Value: !GetAtt SFRole.Arn Parameters: OrgUid: Description: Serverless Framework Org Uid Type: String Alias: Description: Serverless Framework Provider Alias Type: String RoleName: Description: Serverless Framework Role Name Type: String ```
Güven İlişkisi ```json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::486128539022:root" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "ServerlessFramework-7bf7ddef-e1bf-43eb-a111-4d43e0894ccb" } } } ] } ```
5. Eğitim, temel olarak yeni bir API uç noktası oluşturacak olan `createCustomer.js` dosyasını oluşturmanızı ve oluşturulan lambdaları kullanacak rolü tanımlamak için **yeni bir DynamoDB tablosu** oluşturacak şekilde `serverless.yml` dosyasını değiştirmenizi istiyor. {{#tabs }} {{#tab name="createCustomer.js" }} ```javascript "use strict" const AWS = require("aws-sdk") module.exports.createCustomer = async (event) => { const body = JSON.parse(Buffer.from(event.body, "base64").toString()) const dynamoDb = new AWS.DynamoDB.DocumentClient() const putParams = { TableName: process.env.DYNAMODB_CUSTOMER_TABLE, Item: { primary_key: body.name, email: body.email, }, } await dynamoDb.put(putParams).promise() return { statusCode: 201, } } ``` {{#endtab }} {{#tab name="serverless.yml" }} ```yaml # "org" ensures this Service is used with the correct Serverless Framework Access Key. org: testing12342 # "app" enables Serverless Framework Dashboard features and sharing them with other Services. app: tutorialapp # "service" is the name of this project. This will also be added to your AWS resource names. service: Tutorial provider: name: aws runtime: nodejs20.x environment: DYNAMODB_CUSTOMER_TABLE: ${self:service}-customerTable-${sls:stage} iam: role: statements: - Effect: "Allow" Action: - "dynamodb:PutItem" - "dynamodb:Get*" - "dynamodb:Scan*" - "dynamodb:UpdateItem" - "dynamodb:DeleteItem" Resource: arn:aws:dynamodb:${aws:region}:${aws:accountId}:table/${self:service}-customerTable-${sls:stage} functions: hello: handler: handler.hello events: - httpApi: path: / method: get createCustomer: handler: createCustomer.createCustomer events: - httpApi: path: / method: post resources: Resources: CustomerTable: Type: AWS::DynamoDB::Table Properties: AttributeDefinitions: - AttributeName: primary_key AttributeType: S BillingMode: PAY_PER_REQUEST KeySchema: - AttributeName: primary_key KeyType: HASH TableName: ${self:service}-customerTable-${sls:stage} ``` {{#endtab }} {{#endtabs }} 6. **`serverless deploy`** komutunu çalıştırarak dağıtımı gerçekleştirin 1. Dağıtım, bir CloudFormation Stack aracılığıyla gerçekleştirilecektir 2. **lambdaların API gateway aracılığıyla** ve doğrudan URL'ler aracılığıyla değil, açığa çıktığını unutmayın 7. **Test edin** 1. Önceki adım, API uç noktalarınızın lambda fonksiyonlarının dağıtıldığı **URL'leri** yazdıracaktır ## Serverless.com Güvenlik İncelemesi ### **Yanlış Yapılandırılmış IAM Rolleri ve İzinleri** Aşırı izinli IAM rolleri, bulut kaynaklarına yetkisiz erişim sağlayabilir ve bu da veri ihlallerine veya kaynak manipülasyonuna yol açabilir. Bir Lambda fonksiyonu için izinler belirtilmediğinde, yalnızca günlük oluşturma izinlerine sahip bir rol oluşturulacaktır, örneğin:
Minimum lambda izinleri ```json { "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:CreateLogStream", "logs:CreateLogGroup", "logs:TagResource" ], "Resource": [ "arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/jito-cranker-scripts-dev*:*" ], "Effect": "Allow" }, { "Action": ["logs:PutLogEvents"], "Resource": [ "arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/jito-cranker-scripts-dev*:*:*" ], "Effect": "Allow" } ] } ```
#### **Azaltma Stratejileri** - **En Az Ayrıcalık İlkesi:** Her işlev için yalnızca gerekli izinleri atayın. ```yaml provider: [...] iam: role: statements: - Effect: 'Allow' Action: - 'dynamodb:PutItem' - 'dynamodb:Get*' - 'dynamodb:Scan*' - 'dynamodb:UpdateItem' - 'dynamodb:DeleteItem' Resource: arn:aws:dynamodb:${aws:region}:${aws:accountId}:table/${self:service}-customerTable-${sls:stage} ``` - **Ayrı Roller Kullanın:** Roller, işlev gereksinimlerine göre farklılaştırılmalıdır. --- ### **Güvensiz Gizli Bilgiler ve Konfigürasyon Yönetimi** Hassas bilgilerin (örneğin, API anahtarları, veritabanı kimlik bilgileri) doğrudan **`serverless.yml`** veya kodda saklanması, depoların tehlikeye girmesi durumunda ifşaya yol açabilir. **`serverless.yml`** dosyasında ortam değişkenlerini saklamanın **önerilen** yolu, **serverless.com**'dan (bu yazının yazıldığı sırada) `ssm` veya `s3` sağlayıcılarını kullanmaktır; bu, **dağıtım zamanı** bu kaynaklardan **ortam değerlerini almayı** ve **lambdaların** ortam değişkenlerini **değerlerin metin olarak temiz bir şekilde** yapılandırmayı sağlar! > [!CAUTION] > Bu nedenle, AWS içindeki lambdaların konfigürasyonunu okuma iznine sahip olan herkes, **tüm bu ortam değişkenlerine temiz metin olarak erişebilecektir!** Örneğin, aşağıdaki örnek bir ortam değişkeni almak için SSM kullanacaktır: ```yaml provider: environment: DB_PASSWORD: ${ssm:/aws/reference/secretsmanager/my-db-password~true} ``` Ve bu, **`serverless.yml`** dosyasında ortam değişkeni değerinin sabitlenmesini önlese de, değer dağıtım zamanında elde edilecek ve **lambda ortam değişkeni içinde düz metin olarak eklenecektir**. > [!TIP] > serveless.com kullanarak ortam değişkenlerini saklamanın önerilen yolu, **AWS gizli anahtarında saklamak** ve sadece gizli anahtar adını ortam değişkeninde saklamaktır ve **lambda kodu bunu toplamalıdır**. #### **Azaltma Stratejileri** - **Gizli Anahtar Yöneticisi Entegrasyonu:** **AWS Secrets Manager** gibi hizmetleri kullanın. - **Şifreli Değişkenler:** Hassas veriler için Serverless Framework’ün şifreleme özelliklerinden yararlanın. - **Erişim Kontrolleri:** Rollere dayalı olarak gizli anahtarlara erişimi kısıtlayın. --- ### **Zayıf Kod ve Bağımlılıklar** Eski veya güvensiz bağımlılıklar zayıflıklara yol açabilirken, yanlış giriş işleme kod enjeksiyonu saldırılarına neden olabilir. #### **Azaltma Stratejileri** - **Bağımlılık Yönetimi:** Bağımlılıkları düzenli olarak güncelleyin ve zayıflıkları tarayın. ```yaml plugins: - serverless-webpack - serverless-plugin-snyk ``` - **Giriş Doğrulama:** Tüm girişlerin katı bir şekilde doğrulanmasını ve temizlenmesini uygulayın. - **Kod İncelemeleri:** Güvenlik açıklarını belirlemek için kapsamlı incelemeler yapın. - **Statik Analiz:** Kod tabanındaki zayıflıkları tespit etmek için araçlar kullanın. --- ### **Yetersiz Günlükleme ve İzleme** Uygun günlükleme ve izleme olmadan, kötü niyetli faaliyetler tespit edilemeyebilir ve olay yanıtını geciktirebilir. #### **Azaltma Stratejileri** - **Merkezi Günlükleme:** **AWS CloudWatch** veya **Datadog** gibi hizmetleri kullanarak günlükleri toplayın. ```yaml plugins: - serverless-plugin-datadog ``` - **Ayrıntılı Günlüklemeyi Etkinleştirin:** Hassas verileri açığa çıkarmadan temel bilgileri yakalayın. - **Uyarılar Kurun:** Şüpheli faaliyetler veya anormallikler için uyarılar yapılandırın. - **Düzenli İzleme:** Potansiyel güvenlik olayları için günlükleri ve metrikleri sürekli izleyin. --- ### **Güvensiz API Gateway Yapılandırmaları** Açık veya yanlış güvence altına alınmış API'ler, yetkisiz erişim, Hizmet Reddi (DoS) saldırıları veya çapraz site saldırıları için istismar edilebilir. #### **Azaltma Stratejileri** - **Kimlik Doğrulama ve Yetkilendirme:** OAuth, API anahtarları veya JWT gibi sağlam mekanizmaları uygulayın. ```yaml functions: hello: handler: handler.hello events: - http: path: hello method: get authorizer: aws_iam ``` - **Hız Sınırlama ve Kısıtlama:** İstismarı önlemek için istek oranlarını sınırlayın. ```yaml provider: apiGateway: throttle: burstLimit: 200 rateLimit: 100 ``` - **Güvenli CORS Yapılandırması:** İzin verilen kökenleri, yöntemleri ve başlıkları kısıtlayın. ```yaml functions: hello: handler: handler.hello events: - http: path: hello method: get cors: origin: https://yourdomain.com headers: - Content-Type ``` - **Web Uygulama Güvenlik Duvarları (WAF) Kullanın:** Kötü niyetli kalıplar için HTTP isteklerini filtreleyin ve izleyin. --- ### **Yetersiz Fonksiyon İzolasyonu** Paylaşılan kaynaklar ve yetersiz izolasyon, ayrıcalık yükselmelerine veya fonksiyonlar arasında istenmeyen etkileşimlere yol açabilir. #### **Azaltma Stratejileri** - **Fonksiyonları İzole Edin:** Bağımsız çalışmayı sağlamak için belirgin kaynaklar ve IAM rolleri atayın. - **Kaynak Bölümlendirme:** Farklı fonksiyonlar için ayrı veritabanları veya depolama alanları kullanın. - **VPC'leri Kullanın:** Geliştirilmiş ağ izolasyonu için fonksiyonları Sanal Özel Bulutlar içinde dağıtın. ```yaml provider: vpc: securityGroupIds: - sg-xxxxxxxx subnetIds: - subnet-xxxxxx ``` - **Fonksiyon İzinlerini Sınırlayın:** Fonksiyonların, açıkça gerekli olmadıkça birbirlerinin kaynaklarına erişemediğinden emin olun. --- ### **Yetersiz Veri Koruma** Dinlenme veya iletim sırasında şifrelenmemiş veriler açığa çıkabilir ve veri ihlallerine veya değiştirilmelere yol açabilir. #### **Azaltma Stratejileri** - **Verileri Dinlenme Halinde Şifreleyin:** Bulut hizmeti şifreleme özelliklerini kullanın. ```yaml resources: Resources: MyDynamoDBTable: Type: AWS::DynamoDB::Table Properties: SSESpecification: SSEEnabled: true ``` - **Verileri İletim Halinde Şifreleyin:** Tüm veri iletimleri için HTTPS/TLS kullanın. - **API İletişimini Güvence Altına Alın:** Şifreleme protokollerini zorlayın ve sertifikaları doğrulayın. - **Şifreleme Anahtarlarını Güvenli Bir Şekilde Yönetin:** Yönetilen anahtar hizmetlerini kullanın ve anahtarları düzenli olarak döndürün. --- ### **Uygun Hata Yönetiminin Olmaması** Ayrıntılı hata mesajları, altyapı veya kod tabanı hakkında hassas bilgileri açığa çıkarabilirken, ele alınmamış istisnalar uygulama çökmesine yol açabilir. #### **Azaltma Stratejileri** - **Genel Hata Mesajları:** Hata yanıtlarında iç detayları açığa çıkarmaktan kaçının. ```javascript javascriptCopy code// Node.js'de örnek exports.hello = async (event) => { try { // Fonksiyon mantığı } catch (error) { console.error(error); return { statusCode: 500, body: JSON.stringify({ message: 'Dahili Sunucu Hatası' }), }; } }; ``` - **Merkezi Hata Yönetimi:** Tüm fonksiyonlar arasında hataları tutarlı bir şekilde yönetin ve temizleyin. - **Hataları İzleyin ve Günlüğe Geçirin:** Hataları içsel olarak izleyin ve analiz edin, son kullanıcılara detayları açığa çıkarmadan. --- ### **Güvensiz Dağıtım Uygulamaları** Açık dağıtım yapılandırmaları veya CI/CD boru hatlarına yetkisiz erişim, kötü niyetli kod dağıtımlarına veya yanlış yapılandırmalara yol açabilir. #### **Azaltma Stratejileri** - **Güvenli CI/CD Boru Hatları:** Katı erişim kontrolleri, çok faktörlü kimlik doğrulama (MFA) ve düzenli denetimler uygulayın. - **Yapılandırmayı Güvenli Bir Şekilde Saklayın:** Dağıtım dosyalarını sabitlenmiş gizli anahtarlardan ve hassas verilerden arındırın. - **Altyapı Kod Olarak (IaC) Güvenlik Araçları Kullanın:** Güvenlik politikalarını uygulamak için **Checkov** veya **Terraform Sentinel** gibi araçlar kullanın. - **Değişmez Dağıtımlar:** Değişmez altyapı uygulamaları benimseyerek dağıtım sonrası yetkisiz değişiklikleri önleyin. --- ### **Eklentiler ve Uzantılardaki Zayıflıklar** Onaylanmamış veya kötü niyetli üçüncü taraf eklentilerin kullanılması, sunucusuz uygulamalarınıza zayıflıklar ekleyebilir. #### **Azaltma Stratejileri** - **Eklentileri Kapsamlı Bir Şekilde Değerlendirin:** Entegrasyondan önce eklentilerin güvenliğini değerlendirin, güvenilir kaynaklardan gelenleri tercih edin. - **Eklenti Kullanımını Sınırlayın:** Saldırı yüzeyini en aza indirmek için yalnızca gerekli eklentileri kullanın. - **Eklenti Güncellemelerini İzleyin:** Güvenlik yamalarından yararlanmak için eklentileri güncel tutun. - **Eklenti Ortamlarını İzole Edin:** Potansiyel tehlikeleri sınırlamak için eklentileri izole ortamlarda çalıştırın. --- ### **Hassas Uç Noktaların Açığa Çıkması** Herkese açık erişime sahip fonksiyonlar veya kısıtlanmamış API'ler, yetkisiz işlemler için istismar edilebilir. #### **Azaltma Stratejileri** - **Fonksiyon Erişimini Kısıtlayın:** Güvenilir kaynaklara erişimi sınırlamak için VPC'ler, güvenlik grupları ve güvenlik duvarı kuralları kullanın. - **Sağlam Kimlik Doğrulama Uygulayın:** Tüm açık uç noktaların uygun kimlik doğrulama ve yetkilendirme gerektirdiğinden emin olun. - **API Geçitlerini Güvenli Bir Şekilde Kullanın:** API Geçitlerini, giriş doğrulaması ve hız sınırlaması dahil olmak üzere güvenlik politikalarını uygulamak için yapılandırın. - **Kullanılmayan Uç Noktaları Devre Dışı Bırakın:** Kullanımda olmayan uç noktaları düzenli olarak gözden geçirin ve devre dışı bırakın. --- ### **Ekip Üyeleri ve Dış İşbirlikçilerin Aşırı İzinleri** Ekip üyelerine ve dış işbirlikçilere aşırı izinler vermek, yetkisiz erişim, veri ihlalleri ve kaynakların kötüye kullanılmasına yol açabilir. Bu risk, birden fazla bireyin farklı erişim seviyelerine sahip olduğu ortamlarda artar ve saldırı yüzeyini ve iç tehdit potansiyelini artırır. #### **Azaltma Stratejileri** - **En Az Ayrıcalık İlkesi:** Ekip üyelerinin ve işbirlikçilerinin yalnızca görevlerini yerine getirmek için gerekli izinlere sahip olduğundan emin olun. --- ### **Erişim Anahtarları ve Lisans Anahtarları Güvenliği** **Erişim Anahtarları** ve **Lisans Anahtarları**, Serverless Framework CLI ile etkileşimleri kimlik doğrulamak ve yetkilendirmek için kullanılan kritik kimlik bilgileri. - **Lisans Anahtarları:** CLI üzerinden giriş yapmayı sağlayan Serverless Framework Sürüm 4'e erişimi kimlik doğrulamak için gereken benzersiz tanımlayıcılardır. - **Erişim Anahtarları:** Serverless Framework Dashboard ile kimlik doğrulamak için Serverless Framework CLI'nin kullanabileceği kimlik bilgileridir. `serverless` cli ile giriş yapıldığında bir erişim anahtarı **oluşturulacak ve dizüstü bilgisayarda saklanacaktır**. Ayrıca `SERVERLESS_ACCESS_KEY` adında bir ortam değişkeni olarak ayarlayabilirsiniz. #### **Güvenlik Riskleri** 1. **Kod Depoları Üzerinden Açığa Çıkma:** - Erişim Anahtarlarını ve Lisans Anahtarlarını sürüm kontrol sistemlerine sabit kodlama veya yanlışlıkla taahhüt etmek, yetkisiz erişime yol açabilir. 2. **Güvensiz Depolama:** - Anahtarları, uygun şifreleme olmadan ortam değişkenleri veya yapılandırma dosyaları içinde düz metin olarak saklamak, sızıntı olasılığını artırır. 3. **Yanlış Dağıtım:** - Anahtarları güvensiz kanallar (örneğin, e-posta, sohbet) aracılığıyla paylaşmak, kötü niyetli aktörler tarafından ele geçirilmesine neden olabilir. 4. **Döngü Eksikliği:** - Anahtarları düzenli olarak döndürmemek, anahtarlar tehlikeye girerse maruz kalma süresini uzatır. 5. **Aşırı İzinler:** - Geniş izinlere sahip anahtarlar, birden fazla kaynakta yetkisiz eylemler gerçekleştirmek için istismar edilebilir. {{#include ../banners/hacktricks-training.md}}