
Flask Uygulamanızda Güvenlik ve Performans: SSL, Firewall, Loglama ve Optimizasyon
Flask uygulamanızı Narweb VDS üzerinde güvenli ve yüksek performanslı hale getirmek için SSL kurulumu, güvenlik duvarı ayarları, loglama ve optimizasyon tekniklerini öğrenin.

Giriş
İlk bölümde Flask uygulamanızı Narweb VDS üzerine deploy ettiniz. Ancak, üretim ortamında bir uygulamanın sadece çalışması yetmez; güvenli, hızlı ve sürdürülebilir olmalıdır. Bu bölümde, HTTPS desteği, temel güvenlik önlemleri, performans iyileştirmeleri ve log yönetimini ele alacağız.
SSL (Let’s Encrypt & Certbot) ile HTTPS Kurulumu
Güvenli bir bağlantı için SSL sertifikası eklemek şarttır. Let’s Encrypt ve Certbot ile ücretsiz bir SSL sertifikası kurabilirsiniz. Öncelikle, bir alan adınızın (ör. example.com
) sunucuya yönlendirildiğinden emin olun.
Certbot’u kurun:
apt install -y certbot python3-certbot-nginx
Certbot ile SSL sertifikasını alın:
certbot --nginx -d example.com -d www.example.com
Certbot, Nginx yapılandırmasını otomatik olarak günceller ve HTTPS’yi etkinleştirir. Sertifikanın otomatik yenilenmesini test edin:
certbot renew --dry-run
Nginx Yapılandırmasında SSL Detayları
Certbot, Nginx yapılandırmanızı güncellese de, manuel kontrol için /etc/nginx/sites-available/flask-uygulama
dosyasını inceleyin. Tipik bir HTTPS yapılandırması şöyle görünür:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Yapılandırmayı test edin ve Nginx’i yeniden başlatın:
nginx -t
systemctl restart nginx
UFW ile Temel Güvenlik Duvarı Ayarları
UFW (Uncomplicated Firewall), sunucunuzu korumak için basit bir araçtır. Yalnızca gerekli portları açık tutun:
# UFW kurulumu
apt install -y ufw
# SSH (22), HTTP (80) ve HTTPS (443) portlarını aç
ufw allow 22
ufw allow 80
ufw allow 443
# UFW’yi etkinleştir
ufw enable
UFW durumunu kontrol edin:
ufw status
SSH Anahtar Tabanlı Giriş ve Root Erişiminin Kapatılması
Parola tabanlı SSH girişini devre dışı bırakarak güvenliği artırın. Yerel makinenizde bir SSH anahtarı oluşturun:
ssh-keygen -t rsa -b 4096
Anahtarı sunucuya kopyalayın:
ssh-copy-id root@<sunucu-ip-adresi>
Sunucuda, SSH yapılandırmasını düzenleyin (/etc/ssh/sshd_config
):
PasswordAuthentication no
PermitRootLogin prohibit-password
SSH servisini yeniden başlatın:
systemctl restart sshd
Artık yalnızca anahtar tabanlı giriş mümkün. Root erişimini tamamen kapatmak için yeni bir kullanıcı oluşturabilirsiniz:
adduser yeni-kullanici
usermod -aG sudo yeni-kullanici
Fail2ban Kurulumu ve Brute-Force Koruması
Fail2ban, brute-force saldırılarını engeller. Kurulumu yapın:
apt install -y fail2ban
SSH için bir jail yapılandırın (/etc/fail2ban/jail.local
):
[sshd]
enabled = true
port = 22
maxretry = 5
bantime = 3600
Fail2ban’ı başlatın:
systemctl start fail2ban
systemctl enable fail2ban
Nginx ve Gunicorn için Performans Ayarları
Performansı artırmak için Nginx ve Gunicorn’u optimize edin:
- Nginx: Gzip sıkıştırmasını etkinleştirin ve rate limiting ekleyin.
/etc/nginx/nginx.conf
dosyasına şu ayarları ekleyin:
http {
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
}
Rate limiting’i site yapılandırmanıza ekleyin:
location / {
limit_req zone=mylimit burst=20;
proxy_pass http://127.0.0.1:8000;
...
}
- Gunicorn: Worker sayısını CPU çekirdek sayısına göre ayarlayın. Örnek komut:
gunicorn --workers 3 --bind 0.0.0.0:8000 wsgi:app
Statik Dosyaların Nginx ile Sunulması
Flask uygulamanızın statik dosyalarını (CSS, JS, resimler) Nginx ile sunarak performansı artırın. Nginx yapılandırmanıza şu bloğu ekleyin:
location /static {
alias /var/www/flask-uygulama/static;
}
Flask uygulamanızda statik dosyaların doğru yolunu ayarlayın:
app = Flask(__name__, static_url_path='/static')
Flask DEBUG Modunun Kapatılması ve Güvenli Yapılandırma
Üretimde DEBUG
modunu kapatın. app.py
veya ana Flask dosyanızda:
app.config['DEBUG'] = False
Güvenli bir SECRET_KEY
ayarlayın:
app.config['SECRET_KEY'] = 'uzun-ve-rastgele-bir-anahtar'
Loglama: Flask, Gunicorn ve Nginx Loglarının Yönetimi
Logları düzenli tutmak için:
- Flask: Python’un
logging
modülünü kullanın:
import logging
logging.basicConfig(filename='app.log', level=logging.INFO)
app.logger.info('Uygulama başlatıldı')
- Gunicorn: Logları bir dosyaya yönlendirin:
gunicorn --access-logfile access.log --error-logfile error.log --bind 0.0.0.0:8000 wsgi:app
- Nginx: Log dosyalarını kontrol edin (
/var/log/nginx/access.log
veerror.log
). Log rotasyonu içinlogrotate
kullanın:
apt install -y logrotate
Kontrol Listesi
- [ ] SSL sertifikası kuruldu ve HTTPS çalışıyor mu?
- [ ] Nginx yapılandırması HTTPS için güncellendi mi?
- [ ] UFW ile gerekli portlar açık mı?
- [ ] SSH anahtar tabanlı giriş ayarlandı mı?
- [ ] Fail2ban brute-force koruması aktif mi?
- [ ] Nginx ve Gunicorn performans ayarları yapıldı mı?
- [ ] Statik dosyalar Nginx ile sunuluyor mu?
- [ ] Flask DEBUG modu kapalı mı?
- [ ] Loglama yapılandırmaları tamamlandı mı?
Sıkça Sorulan Sorular
S: Let’s Encrypt yerine başka bir SSL sağlayıcısı kullanabilir miyim?
C: Evet, Cloudflare, ZeroSSL veya ücretli sağlayıcılar kullanılabilir, ancak Let’s Encrypt ücretsiz ve kolaydır.
S: Fail2ban olmadan güvenlik sağlanabilir mi?
C: Evet, ancak Fail2ban brute-force saldırılarına karşı ek bir koruma katmanı sağlar.
Bir Sonraki Bölümde Neler Var?
Bir sonraki bölümde, uygulamanızın sürdürülebilirliğini artırmak için otomatik deploy, izleme araçları, yedekleme stratejileri ve sıfır kesintiyle güncelleme tekniklerini ele alacağız.
Bir yanıt yazın