format_list_bulletedBu İçerikte Bahsedilen Konular
- arrow_rightNginx ile Gelişmiş API Koruma ve Hız Sınırlama: Kapsamlı Rehber
- arrow_rightAPI Güvenliği Neden Önemli?
- arrow_rightNginx Rate Limiting Temelleri
- arrow_rightRate Limiting Nedir ve Nasıl Çalışır?
- arrow_rightTemel Rate Limiting Yapılandırması
- arrow_rightGelişmiş Rate Limiting Stratejileri
- arrow_rightÇok Katmanlı Hız Sınırlama
- arrow_rightKullanıcı Bazlı Rate Limiting
- arrow_rightIP Beyaz ve Kara Liste Uygulaması
- arrow_rightTemel IP Kontrolü
- arrow_rightKara Liste Dosyası Örneği
- arrow_rightDDoS Koruma Stratejileri
- arrow_rightBağlantı Sınırlama
- arrow_rightSlowloris ve Benzeri Saldırılara Karşı Koruma
- arrow_rightSSL/TLS Yapılandırması ve Güvenlik
- arrow_rightGüvenli Bağlantı Ayarları
- arrow_rightGüvenlik Başlıkları ile Koruma
- arrow_rightJWT Token Doğrulama
- arrow_rightMonitoring ve Logging
- arrow_rightRate Limit Log'ları
- arrow_rightDeğerleri Anlama
- arrow_rightKullanım Senaryolarına Göre Yapılandırma
- arrow_rightKarşılaştırma Tablosu: Rate Limiting Stratejileri
- arrow_rightÖrnek: Tam Kapsamlı API Koruma Yapılandırması
Nginx ile Gelişmiş API Koruma ve Hız Sınırlama: Kapsamlı Rehber
Modern web uygulamalarında API güvenliği, dijital varlıkların korunması için en kritik unsurlardan birini oluşturmaktadır. Nginx, yüksek performanslı web sunucusu ve ters proxy olarak, API endpoint'lerini korumak için kapsamlı araçlar sunmaktadır. Bu rehberde, Nginx kullanarak gelişmiş API koruma mekanizmaları ve hız sınırlama (rate limiting) tekniklerini detaylı olarak inceleyeceğiz.
API Güvenliği Neden Önemli?
Günümüzde API'ler, dijital hizmetlerin omurgasını oluşturmaktadır. Sektör istatistiklerine göre, web trafiğinin %83'ü API'ler üzerinden gerçekleşmektedir (Kaynak: Akamai State of the Internet Report). Bu nedenle, API'lerin kötüye kullanıma karşı korunması kritik önem taşımaktadır.
Yetersiz korunan API'ler şu risklere yol açmaktadır:
- Servis Reddi (DoS/DDoS): Aşırı istek yüküyle sunucuların çökertilmesi
- Veri Sızıntısı: Hassas bilgilerin yetkisiz erişimle ele geçirilmesi
- Brute Force Saldırıları: Hesap ele geçirme girişimleri
- Kaynak Tükenmesi: Sunucu kaynaklarının kötüye kullanımı
Nginx Rate Limiting Temelleri
Rate Limiting Nedir ve Nasıl Çalışır?
Rate limiting, belirli bir zaman diliminde bir istemciden gelen istek sayısını sınırlamak için kullanılan bir tekniktir. Nginx, bu işlemi "leaky bucket" (sızdıran kova) algoritması kullanarak gerçekleştirmektedir. Bu algoritma, gelen istekleri bir kova gibi işler ve sabit bir hızda "sızdırır".
Temel Rate Limiting Yapılandırması
Nginx'te rate limiting için öncelikle limit_req_zone direktifi tanımlanmalıdır:
http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://backend;
}
}
}
Bu yapılandırmada:
- zone=api_limit:10m: 10 megabaytlık bir bellek alanı oluşturur
- rate=10r/s: Saniyede 10 istek sınırı belirler
- burst=20: 20'ye kadar bekleyen isteğe izin verir
- nodelay: Burst isteklerinde gecikme uygulamaz
Gelişmiş Rate Limiting Stratejileri
Çok Katmanlı Hız Sınırlama
Farklı endpoint'ler için farklı limitler belirlemek, kaynakların daha verimli kullanılmasını sağlar:
http {
# Temel IP bazlı limit
limit_req_zone $binary_remote_addr zone=basic_limit:10m rate=5r/s;
# API için daha yüksek limit
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=50r/s;
# Giriş endpoint'i için sıkı limit
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=3r/s;
server {
location /api/v1/ {
limit_req zone=api_limit burst=50 nodelay;
proxy_pass http://api_backend;
}
location /api/v1/auth/login {
limit_req zone=login_limit burst=5 nodelay;
proxy_pass http://api_backend;
}
location / {
limit_req zone=basic_limit burst=10;
proxy_pass http://frontend;
}
}
}
Kullanıcı Bazlı Rate Limiting
IP adresi yerine JWT token veya session ID kullanarak daha granüler kontrol sağlanabilir:
http {
# Kullanıcı ID'sine göre limit
limit_req_zone $http_authorization zone=user_limit:10m rate=100r/s;
server {
location /api/ {
# Token'dan kullanıcı ID çıkarma
set $user_id $jwt_claim_sub;
limit_req zone=user_limit burst=50 nodelay;
proxy_pass http://backend;
}
}
}
IP Beyaz ve Kara Liste Uygulaması
Temel IP Kontrolü
Güvenilir IP'leri beyaz listeye eklemek ve şüpheli IP'leri engellemek kritik bir güvenlik katmanıdır:
geo $limited {
default 1;
10.0.0.0/8 0;
172.16.0.0/12 0;
192.168.0.0/16 0;
203.0.113.0/24 0; # Örnek beyaz liste
}
map $limited $limit {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit zone=api_protect:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api_protect burst=20 nodelay;
# Kara liste kontrolü
include /etc/nginx/blocked_ips.conf;
proxy_pass http://backend;
}
}
Kara Liste Dosyası Örneği
# /etc/nginx/blocked_ips.conf
if ($blocked_ip) {
return 403;
}
DDoS Koruma Stratejileri
Bağlantı Sınırlama
Aynı IP'den gelen eşzamanlı bağlantı sayısını sınırlamak, DDoS saldırılarına karşı etkili bir koruma sağlar:
server {
# Tek IP'den maksimum 10 eşzamanlı bağlantı
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
location /api/ {
limit_conn conn_limit 10;
# Her bağlantı için istek sınırı
limit_req zone=api_protect burst=20 nodelay;
proxy_pass http://backend;
}
}
Slowloris ve Benzeri Saldırılara Karşı Koruma
HTTP başlıklarında zaman aşımı ayarlarını yaparak yavaş bağlantı saldırılarına karşı koruma sağlanabilir:
server {
client_body_timeout 10s;
client_header_timeout 10s;
keepalive_timeout 15s;
send_timeout 10s;
# Tam istek gövdesi için zaman aşımı
proxy_read_timeout 30s;
location /api/ {
proxy_pass http://backend;
}
}
SSL/TLS Yapılandırması ve Güvenlik
Güvenli Bağlantı Ayarları
API uç noktaları için TLS zorunlu kılınmalı ve güvenli protokol/şifreleme tercih edilmelidir:
server {
listen 443 ssl http2;
ssl_certificate /etc/nginx/ssl/api.crt;
ssl_certificate_key /etc/nginx/ssl/api.key;
# TLS versiyon kısıtlaması
ssl_protocols TLSv1.2 TLSv1.3;
# Güvenli şifreleme paketleri
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
# HSTS desteği
add_header Strict-Transport-Security "max-age=31536000" always;
location /api/ {
proxy_pass http://backend;
}
}
Güvenlik Başlıkları ile Koruma
API yanıtlarına güvenlik başlıkları eklemek, XSS ve clickjacking gibi saldırılara karşı koruma sağlar:
location /api/ {
# Güvenlik başlıkları
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# API için CORS yapılandırması
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
add_header Access-Control-Allow-Headers "Authorization, Content-Type";
add_header Access-Control-Max-Age 3600;
return 204;
}
proxy_pass http://backend;
}
JWT Token Doğrulama
API'ye erişim için JWT token doğrulaması uygulamak, yetkisiz erişimi önler:
server {
location /api/protected/ {
# Token doğrulama
auth_jwt "Protected API" key=realm="api";
auth_jwt_key_file /etc/nginx/jwt.key;
proxy_pass http://backend;
# Token bilgilerini backend'e ilet
proxy_set_header X-User-ID $jwt_claim_sub;
proxy_set_header X-User-Role $jwt_claim_role;
}
}
ModSecurity WAF Entegrasyonu
Web Application Firewall (WAF) entegrasyonu, OWASP Top 10 açıklarına karşı koruma sağlar. Nginx ile güvenlik duvarı yapılandırması hakkında daha fazla bilgi için blog yazılarımızı inceleyebilirsiniz.
server {
location /api/ {
# ModSecurity WAF
ModSecurityEnabled on;
ModSecurityConfig /etc/nginx/modsecurity/modsecurity.conf;
proxy_pass http://backend;
}
}
Monitoring ve Logging
Rate Limit Log'ları
Sınırlama olaylarını loglamak, saldırı tespiti ve analiz için kritiktir:
http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
log_format limit_log 'IP: $remote_addr | Limit: $limit_req_status | Time: $time_local';
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
access_log /var/log/nginx/api_limit.log limit_log;
proxy_pass http://backend;
}
}
}
Değerleri Anlama
Limit log'larında görünebilecek durumlar:
- LIMITED: İstek sınırı aşıldı
- DELAYED: İstek beklemede (burst durumu)
- REJECTED: İstek reddedildi
Kullanım Senaryolarına Göre Yapılandırma
Karşılaştırma Tablosu: Rate Limiting Stratejileri
| Senaryo | Önerilen Rate | Burst Değeri | Kullanım Alanı |
|---|---|---|---|
| Genel API Erişimi | 10-50 r/s | 20-50 | Standart web servisleri |
| Giriş Ekranı | 3-5 r/s | 5-10 | Kullanıcı kimlik doğrulama |
| Arama Endpoint'i | 5-10 r/s | 10-20 | Kaynak yoğun işlemler |
| Dosya Yükleme | 1-2 r/s | 2-3 | Bandwidth yoğun istekler |
| Webhook | 100-500 r/s | 100-200 | Yüksek hacimli bildirimler |
Örnek: Tam Kapsamlı API Koruma Yapılandırması
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 2048;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format detailed '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log detailed;
# Rate limiting zone'ları
limit_req_zone $binary_remote_addr zone=api_general:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=api_critical:10m rate=3r/s;
limit_req_zone $http_x_api_key zone=api_client:10m rate=100r/s;
# Bağlantı sınırlama
limit_conn_zone $binary_remote_addr zone=addr:10m;
# Beyaz liste
geo $whitelist {
default 0;
10.0.0.0/8 1;
172.16.0.0/12 1;
}
# Slowloris koruma
client_body_timeout 10s;
client_header_timeout 10s;
server {
listen 80;
listen 443 ssl http2;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
# Güvenlik başl