class Env‑Düdükçülerle Dans: Laravel ve .env Dosyanızı Nasıl Korumalısınız? extends Post

@created_at( "2025-05-02 10:37" )
# Env‑Düdükçülerle Dans: Laravel ve `.env` Dosyanızı Nasıl Korumalısınız? > "Sunucuna konuksever ol; ama kasanı açık bırakma." – Anonim Sysadmin İnternette gezerken rüzgâr gibi esen bir bot sürüsü var: Ben onlara **env‑düdükçüler** diyorum. Görevleri basit: Dünya üzerindeki her Laravel (veya benzeri) projeyi tarayıp `.env` dosyasına ulaşmaya çalışmak. Orada neler mi var? Veritabanı parolalarından API anahtarlarına kadar her şey! Eğer `.env` dosyan **tek satır** bile sızarsa, kapıyı ardına kadar açmış olursun. Bu yazıda, **example.com** adlı hayalî bir sitede yakaladığımız log’ları inceleyecek ve `.env` avcılarını nasıl bozguna uğratacağımızı konuşacağız. Çayını / kahveni kap, başlıyoruz! ☕️🚀 --- ## 1. Olay Yeri İncelemesi: Log’larda Ne Gördük? ``` 2025/05/02 09:29:33 [error] 144#144: *1234 access forbidden by rule, client: 2001:db8::dead:beef, request: "GET /.env HTTP/1.1", host: "example.com" 2025/05/02 09:29:34 [error] ... "GET /portal/.env" ... 2025/05/02 09:29:35 [error] ... "GET /.env.bak" ... ``` * **Kök dizin** (`/.env`) * **Yaygın alt klasörler** (`/portal/.env`, `/app/.env`, `/public/.env`) * **Yedekler** (`.env.bak`, `.env.save`) * **Bonus tur**: `storage/logs/laravel.log` Bot, birkaç saniyede onlarca varyasyon deniyor. Amacı **yanlış yapılandırılmış** üretim sunucularını avlamak. Bizim Nginx/Apache kuralımız 403 veya 404 döndürdü – güzel; ama “Şimdilik yırttık” demek asla yetmez. --- ## 2. Neden Bu Kadar Tehlikeli? 1. **Tam Yetki** – `DB_PASSWORD` + `APP_KEY` sızarsa verileri şifrelemenin anlamı kalmaz. 2. **Zincirleme Etki** – Mail SMTP kimlik bilgileri çalınırsa siten spam botuna döner. 3. **Sessiz Sızma** – Log dosyaları açığa çıkarsa saldırgan hangi endpoint’in SQL hatası verdiğini öğrenir, sonra… bum! Kısacası `.env` = kasanın anahtarı. O anahtarı kapıya bantlamak mantıklı mı? 🤔 --- ## 3. Siper Kaz: Savunma Taktikleri Aşağıdaki adımları “yaparım‑yapmazsam” diye değil, **otomatik** olacak şekilde uygulamalısın. (CI/CD pipeline’ına koy!) ### 3.1 `.env` Dosyasını Webroot Dışına Taşı ``` /var/www/example.com # Webroot /var/secrets/example.env # Gerçek .env ``` * **PHP‑FPM** ➜ `php_admin_value[auto_prepend_file] = /var/secrets/load-env.php` * **Docker** ➜ `--env-file /var/secrets/example.env` ### 3.2 Sunucu Seviyesinde Blokla **Nginx**
location ~ /(\.env|\.env\..*|\.git|composer\.(json|lock))$ {
  deny all;
}
**Apache (.htaccess)**
<FilesMatch "^\.env">
  Require all denied
</FilesMatch>
### 3.3 Ortam Değişkenleri & Secret Manager * AWS ↔️ **Parameter Store / Secrets Manager** * GCP ↔️ **Secret Manager** * Bare‑metal ↔️ `systemd Environment=` ### 3.4 Fail2ban ile Otomatik Ban ``` [env-scanner] regex = "GET .*\.env" action = iptables[name=ENV, port=http, protocol=tcp] maxretry = 5 findtime = 60 bantime = 86400 ``` ### 3.5 Rate Limiting ``` limit_req_zone $binary_remote_addr zone=env:10m rate=5r/m; limit_req zone=env burst=10 nodelay; ``` ### 3.6 Cloudflare / WAF Kuralları ``` URI Full contains ".env" ➜ Block or JS Challenge ``` ### 3.7 Sürekli Güncelleme > “Patch Tuesday” değil, **Patch Everyday**. PHP, Nginx, Laravel çekirdeği güncel olsun. --- ## 4. Deploy Sonrası Kendine Soracağın 3 Soru 1. `https://example.com/.env` bana **404/403** mü dönüyor? (200 görürsen ışıkları kapatıp kaç!) 2. Log dizinim `deny all` mı? `curl -I /storage/logs/laravel.log` ➜ 403/404? 3. CI pipeline’ımda **security test** stepi var mı? (Evet ➜ rahat uyu. Hayır ➜ kahveden bir yudum daha.) --- ## 5. Sonuç: Botlar Gelecek, Hazır Ol! Env‑düdükçüler her daim kapıda. İyi haber: İki satır konfigürasyon ve biraz “ops disiplin” ile tek ısırık bile alamazlar. Kötü haber: **Bir** yanlış yapılandırma, düşmanın bayramı… > **Ödev:** Yukarıdaki adımları kendi projen için uygula, sonra arkadaşının sitesine zararsızca deneme yap. Ona da öğret; çünkü güvenlik paylaştıkça çoğalır. Şimdi Git push –force değil, **push –secure**! 🚀