Derleyicileri Kısıtlama (Hardening Compilers)
Üretim (Production) sunucularında gcc, make, g++ gibi derleyicilerin herkes tarafından ulaşılabilir olması büyük bir güvenlik riskidir.
1. Neden Tehlikeli?
Saldırgan sunucuya sızarsa (örneğin bir web açığı ile www-data kullanıcısı olsa), sunucudaki kernel sürümüne uygun bir Exploit (sömürü kodu) indirip derlemek ister.
⚠️ Önemli Uyarı: Bu Bir "Gümüş Kurşun" Değildir!
Derleyicileri kısıtlamak saldırganı tamamen durdurmaz, sadece yavaşlatır (Speed Bump). Saldırgan şunları hala yapabilir:
- Kendi bilgisayarında derlediği hazır binary'i sunucuya yükleyip çalıştırabilir.
- Python, Perl gibi yorumlayıcılarla exploit çalıştırabilir.
Bu yüzden bu işlem daha çok Lynis/CIS gibi compliance (uyumluluk) standartları için yapılır.
💡 Gerçek Güvenlik Katmanları (Öncelik Sırası):
- 🔴 Kernel Güncellemeleri: Exploit'i anlamsız kılar (En kritik!).
- 🔴 Auditd + Loglama: Saldırıyı görmenizi sağlar.
- 🟡 AppArmor/SELinux: Gerçek process izolasyonu sağlar.
- 🟡 Noexec Mount:
/tmpdizininde çalıştırmayı engeller.- 🟢 Derleyici Kısıtlama: Saldırganı biraz uğraştırır.
2. Yöntem: Grup Tabanlı Kısıtlama (Kapsamlı Script) ✅
Sadece gcc kısıtlamak yetmez. gcc-12 gibi symlink hedefleri ve ld, make, as gibi yardımcı araçlar da kısıtlanmalıdır.
Aşağıdaki scripti lock_compilers.sh olarak kaydedip çalıştırın. Bu script:
compileradında grup oluşturur.- Tüm derleyicileri, linker'ları ve debugger'ları bulur.
- İzinleri
750yapar (sadece root ve compiler grubu çalıştırabilir). - Symlink'lerin gösterdiği asıl dosyaları da kısıtlar.
Script İçeriği
#!/bin/bash
# compiler_hardening.sh - Daha kapsamlı versiyon
COMPILER_GROUP="compiler"
# 1. Grup oluştur
sudo groupadd -f "$COMPILER_GROUP"
echo "[+] '$COMPILER_GROUP' grubu oluşturuldu/kontrol edildi."
# 2. Kısıtlanacak Temel Binary Listesi
# Önce sabit isimleri ekle
BINARIES=(
/usr/bin/gcc
/usr/bin/g++
/usr/bin/cc /usr/bin/c++
/usr/bin/make /usr/bin/cmake
/usr/bin/as /usr/bin/ld /usr/bin/ld.bfd /usr/bin/ld.gold
/usr/bin/ar /usr/bin/ranlib /usr/bin/nm
/usr/bin/objcopy /usr/bin/objdump /usr/bin/strip
/usr/bin/clang /usr/bin/clang++
)
# Versiyonlu binaryleri (gcc-12 gibi) güvenli bir şekilde ekle
for bin in /usr/bin/gcc-* /usr/bin/g++-* /usr/bin/clang-* 2>/dev/null; do
[ -e "$bin" ] && BINARIES+=("$bin")
done
# 3. Binary'leri Kısıtla
for bin in "${BINARIES[@]}"; do
if [ -e "$bin" ] && [ ! -L "$bin" ]; then
sudo chgrp "$COMPILER_GROUP" "$bin"
sudo chmod 750 "$bin"
echo "[+] Kısıtlandı: $bin"
fi
done
# 4. Symlink Hedeflerini Kısıtla (Örn: gcc -> gcc-12)
for bin in /usr/bin/gcc /usr/bin/g++ /usr/bin/cc; do
if [ -L "$bin" ]; then
target=$(readlink -f "$bin")
if [ -e "$target" ]; then
sudo chgrp "$COMPILER_GROUP" "$target"
sudo chmod 750 "$target"
echo "[+] Symlink hedefi kısıtlandı: $target"
fi
fi
done
echo ""
echo "[!] Manuel kontrol önerisi:"
echo " which -a gcc # Başka PATH'te gcc var mı?"
echo " ls /usr/local/bin/gcc* 2>/dev/null"
echo ""
echo "✅ İşlem tamamlandı. Artık sadece 'root' ve 'compiler' grubu derleme yapabilir."
Scripti Çalıştırma
Yetkili Kullanıcı Ekleme
Eğer bir kullanıcının (veya CI/CD agent'ın) derleme yapması gerekirse:
3. Doğrulama
Normal bir kullanıcı (gruba dahil olmayan) ile deneyelim:
# root olmayan, gruba eklenmemiş bir kullanıcıya geç (örn: nobody)
su -s /bin/bash nobody
# Çalıştırmayı dene
gcc --version
# Beklenen Hata: "Permission denied" veya "Erişim engellendi"
# Linker dene
ld --version
# Beklenen Hata: "Permission denied"
exit
Sonuç: Saldırgan artık sunucu üzerinde rahatça "make", "gcc" diyemeyecek. Kernel exploit derlemek için kendi makinesinde cross-compile yapıp taşıması gerekecek (bu da size zaman kazandırır).
4. Geri Alma (Rollback) 🔄
Eğer bu kısıtlamalar bir soruna yol açarsa, şu komutlarla her şeyi eski haline getirebilirsiniz: