AppArmor ile Uygulama Güvenlik Profili Oluşturma

Sunucularınızda çalışan uygulamalar ele geçirildiğinde ne olur? Saldırgan sadece o uygulamanın yetkilerini değil, çoğu zaman tüm sistemin kapılarını aralayabilir. İşte tam bu noktada AppArmor devreye giriyor. Zorunlu erişim kontrolü (MAC) sağlayan bu Linux güvenlik modülü, uygulamaların sistem üzerinde tam olarak ne yapabileceğini ve ne yapamayacağını belirlemenize olanak tanıyor. Bu yazıda AppArmor’u sıfırdan kurarak, gerçek dünya senaryolarında profil oluşturmayı ve yönetmeyi ele alacağız.

AppArmor Nedir ve Neden Kullanmalısınız?

AppArmor, Linux çekirdeğine entegre bir güvenlik modülüdür. SELinux’a kıyasla öğrenmesi ve yönetmesi çok daha kolaydır. SELinux etiket tabanlı bir yaklaşım kullanırken, AppArmor dosya yolu tabanlı çalışır. Bu fark, günlük yönetim açısından devasa bir kolaylık sağlar.

Peki AppArmor’un temel mantığı nedir? Her uygulama için bir profil tanımlarsınız. Bu profil, uygulamanın hangi dosyalara erişebileceğini, hangi ağ bağlantılarını kurabileceğini, hangi sistem çağrılarını yapabileceğini belirler. Uygulama bu sınırların dışına çıkmaya çalıştığında AppArmor ya engeller ya da yalnızca log’lar. İkinci moda “complain mode” diyoruz ki bu profil geliştirme aşamasında çok işe yarıyor.

Gerçek bir senaryo düşünelim: Web sunucunuzda çalışan bir PHP uygulaması SQL injection açığı içeriyor olsun. Saldırgan bu açıktan yararlanarak shell komutları çalıştırmak istiyor. AppArmor profili olmadan, web sunucusunun çalıştığı kullanıcının erişebildiği her şeye saldırgan da erişebilir. Profil varsa, web sunucusu sadece /var/www/html altındaki dosyalara ve belirli portlara erişebilir, başka hiçbir şeye dokunamaz.

Kurulum ve Temel Araçlar

Ubuntu ve Debian tabanlı sistemlerde AppArmor varsayılan olarak gelir. Durumu kontrol edelim:

# AppArmor durumunu kontrol et
sudo apparmor_status

# veya daha detaylı çıktı için
sudo aa-status

Eğer kurulu değilse veya ek araçlara ihtiyaç duyuyorsanız:

# Temel paketleri kur
sudo apt update
sudo apt install apparmor apparmor-utils apparmor-profiles apparmor-profiles-extra

# Servis durumunu kontrol et
sudo systemctl status apparmor

# Çekirdek modülünün yüklenip yüklenmediğini doğrula
sudo cat /sys/module/apparmor/parameters/enabled

Çıktı “Y” ise AppArmor aktif demektir. aa-status komutu size kaç profilin yüklendiğini, kaçının enforce modda kaçının complain modda çalıştığını gösterir.

Profil dosyaları /etc/apparmor.d/ dizininde saklanır. Bu dizine bir göz atalım:

ls -la /etc/apparmor.d/
# Mevcut profilleri ve yardımcı dosyaları listeler

# Bir profil nasıl görünür?
cat /etc/apparmor.d/usr.sbin.nginx

Profil Modları: Enforce ve Complain

AppArmor’da iki temel mod var:

Enforce Modu: Profil aktif olarak uygulanır. Profil dışı işlemler engellenir ve loglanır. Üretim ortamı için bu mod kullanılır.

Complain Modu: Profil ihlalleri yalnızca loglanır, engellemez. Profil geliştirirken kullanın. “Audit mode” olarak da bilinir.

Bir profili modlar arasında geçirmek:

# Profili complain moduna al
sudo aa-complain /usr/sbin/nginx

# Profili enforce moduna al
sudo aa-enforce /usr/sbin/nginx

# Profili tamamen devre dışı bırak
sudo aa-disable /usr/sbin/nginx

# Tüm profilleri complain moduna al (geliştirme ortamı için)
sudo aa-complain /etc/apparmor.d/*

Sıfırdan Profil Oluşturma: aa-genprof ile

En güçlü özelliklerden biri, AppArmor’un uygulamayı izleyerek otomatik profil oluşturabilmesidir. aa-genprof aracı tam da bunu yapar.

Örnek senaryo: Şirkette kullanılan özel bir Python script’i için profil oluşturalım. Bu script log dosyalarını analiz edip rapor üretiyor.

# Önce script'i inceleyelim
cat /usr/local/bin/log-analyzer.py
#!/usr/bin/env python3
# Log analiz scripti - /var/log/app/*.log okur
# /tmp/reports/ dizinine rapor yazar
# Harici API'ye veri gönderir

# Profil oluşturmaya başla
sudo aa-genprof /usr/local/bin/log-analyzer.py

aa-genprof çalıştırdığınızda sizi interaktif bir arayüze yönlendirir. Terminali ikiye bölün: bir pencerede aa-genprof çalışsın, diğerinde uygulamayı normal koşullarda çalıştırın. Uygulama tüm tipik işlemlerini tamamladıktan sonra aa-genprof penceresine dönüp S (scan) tuşuna basın. Araç tespit ettiği erişimleri size gösterir ve ne yapmak istediğinizi sorar.

Her erişim için şu seçenekler sunulur:

  • Allow: Bu erişime izin ver ve profile ekle
  • Deny: Bu erişimi reddet
  • Glob: Daha geniş bir glob pattern kullan (örn. /var/log/*.log)
  • Glob with Extension: Uzantıya göre genişlet
  • Abort: Değişiklikleri kaydetmeden çık
  • Finish: Profili kaydet

Manuel Profil Yazımı

aa-genprof harika bir başlangıç noktası olsa da, profilleri manuel anlamak ve düzenlemek şart. Bir Nginx profili örneği üzerinden profil sözdizimini inceleyelim:

# Nginx için temel profil oluştur
sudo nano /etc/apparmor.d/usr.sbin.nginx
# AppArmor profil dosyası içeriği
#include <tunables/global>

/usr/sbin/nginx {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  #include <abstractions/openssl>

  # Capabilities
  capability net_bind_service,
  capability setuid,
  capability setgid,
  capability dac_override,

  # Binary ve kütüphaneler
  /usr/sbin/nginx mr,
  /usr/lib/nginx/modules/*.so mr,

  # Konfigürasyon dosyaları (sadece okuma)
  /etc/nginx/** r,
  /etc/ssl/certs/** r,
  /etc/ssl/private/** r,

  # Web içeriği (okuma)
  /var/www/html/** r,
  /srv/www/** r,

  # Log dosyaları (yazma)
  /var/log/nginx/ rw,
  /var/log/nginx/** rw,

  # PID ve socket dosyaları
  /run/nginx.pid rw,
  /run/nginx/ rw,
  /run/nginx/** rw,

  # Geçici dosyalar
  /tmp/nginx_* rw,

  # Ağ erişimi
  network tcp,
  network udp,

  # /proc erişimi (sınırlı)
  /proc/*/status r,

  # Worker process'ler için
  /usr/sbin/nginx px,
}

Profili yükleyelim ve test edelim:

# Profili yükle
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx

# Nginx'i yeniden başlat
sudo systemctl restart nginx

# Hataları kontrol et
sudo journalctl -u nginx -f
sudo tail -f /var/log/syslog | grep apparmor

Profil Sözdizimi: Erişim İzinleri

Profil yazarken kullanılan izin karakterlerini bilmek kritik:

  • r: Okuma izni (read)
  • w: Yazma izni (write)
  • x: Çalıştırma izni (execute)
  • m: Memory map izni (mmap)
  • k: Dosya kilitleme (lock)
  • l: Hard link oluşturma
  • ix: Inherit execute – çocuk process aynı profili devralır
  • px: Discrete profile execute – farklı profil ile çalıştır
  • ux: Unconfined execute – profil olmadan çalıştır (dikkatli kullanın)
  • Cx: Child profile execute

Ağ erişimi için:

# Ağ kuralları örnekleri
network tcp,           # Tüm TCP
network udp,           # Tüm UDP
network inet tcp,      # IPv4 TCP
network inet6 tcp,     # IPv6 TCP
tcp addr=:80,          # Sadece port 80
tcp addr=:443,         # Sadece port 443

Gerçek Dünya Senaryosu: MySQL için Profil

Veritabanı sunucuları en kritik bileşenlerinizden biridir. MySQL/MariaDB için sıkı bir profil oluşturalım:

sudo nano /etc/apparmor.d/usr.sbin.mysqld
#include <tunables/global>

/usr/sbin/mysqld {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  #include <abstractions/user-tmp>
  #include <abstractions/mysql>

  capability dac_override,
  capability sys_resource,
  capability setuid,
  capability setgid,

  # MySQL binary
  /usr/sbin/mysqld mr,

  # Konfigürasyon
  /etc/mysql/** r,
  /etc/mysql/conf.d/** r,

  # Veri dizini - burada özellikle dikkatli olun
  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,

  # Log dosyaları
  /var/log/mysql/ r,
  /var/log/mysql/** rw,

  # Run dizini
  /run/mysqld/ rw,
  /run/mysqld/mysqld.sock rw,
  /run/mysqld/mysqld.pid rw,

  # Geçici dosyalar
  /tmp/** rw,
  /var/tmp/** rw,

  # Sistem bilgisi (sadece okuma)
  /proc/*/status r,
  /proc/sys/vm/overcommit_memory r,
  /sys/kernel/mm/transparent_hugepage/enabled r,

  # InnoDB için
  /dev/urandom r,

  # Backup için (opsiyonel, ihtiyaca göre kaldırın)
  deny /etc/shadow r,
  deny /etc/passwd w,
  deny /home/** rw,
}
# Profili yükle ve MySQL'i yeniden başlat
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld
sudo systemctl restart mysql

# AppArmor log'larını izle
sudo tail -f /var/log/syslog | grep -i "apparmor.*DENIED"

aa-logprof ile Profil Güncelleme

Üretime aldıktan sonra uygulamanın bazı erişimleri reddedilebilir. aa-logprof bu durumları log’lardan okuyarak profili güncellemenize yardımcı olur:

# Log'lardaki ihlalleri analiz et ve profili güncelle
sudo aa-logprof

# Belirli bir log dosyasını analiz et
sudo aa-logprof -f /var/log/syslog

# Sadece belirli bir profil için
sudo aa-logprof -p /etc/apparmor.d/usr.sbin.nginx

aa-logprof çalıştırdığınızda, log’larda tespit ettiği her ihlal için size ne yapmak istediğinizi sorar. Tıpkı aa-genprof gibi interaktif bir arayüz sunar. Bu araç, profil geliştirme döngüsünün belkemiğidir: önce complain modda çalıştır, normal kullanımı simüle et, aa-logprof ile profili güncelle, enforce moda al, tekrar test et.

Docker Konteynerleri ile AppArmor

Docker, AppArmor ile mükemmel entegrasyon sunar. Her konteynere özel profil atayabilirsiniz:

# Docker için özel profil oluştur
sudo nano /etc/apparmor.d/docker-custom-webapp

# Profil içeriği
#include <tunables/global>

profile docker-custom-webapp flags=(attach_disconnected,mediate_deleted) {
  #include <abstractions/base>

  network inet tcp,
  network inet udp,

  # Konteyner içindeki dosya sistemi erişimi
  / r,
  /** r,
  /var/www/html/** rw,
  /tmp/** rw,

  # Tehlikeli işlemleri engelle
  deny /proc/sys/kernel/core_pattern w,
  deny mount,
  deny /sys/** w,

  # Kritik sistem dosyalarına yazma engeli
  deny /etc/passwd w,
  deny /etc/shadow rw,
  deny /etc/hosts w,
}
# Profili yükle
sudo apparmor_parser -r /etc/apparmor.d/docker-custom-webapp

# Docker konteyneri bu profil ile başlat
docker run --security-opt apparmor=docker-custom-webapp 
  -p 80:80 
  -v /var/www/html:/var/www/html 
  nginx:latest

# Kubernetes pod'unda kullanmak için annotation ekleyin:
# container.apparmor.security.beta.kubernetes.io/nginx: localhost/docker-custom-webapp

Profil Test ve Doğrulama

Profili üretime almadan önce kapsamlı test şart:

# Profil sözdizimini kontrol et (yükleme yapmadan)
sudo apparmor_parser -p /etc/apparmor.d/usr.sbin.nginx

# Profili debug modda yükle
sudo apparmor_parser -d /etc/apparmor.d/usr.sbin.nginx

# AppArmor ihlallerini gerçek zamanlı izle
sudo journalctl -f | grep -E "apparmor|DENIED|ALLOWED"

# audit2allow benzeri bir araç olan aa-logprof ile ihlalleri analiz et
sudo ausearch -m apparmor --ts recent

# Belirli bir process'in profilini kontrol et
cat /proc/$(pgrep nginx | head -1)/attr/current

Kapsamlı bir test senaryosu için şunları yapın:

#!/bin/bash
# apparmor-test.sh - Profil test scripti

APP_PATH="/usr/sbin/nginx"
LOG_FILE="/tmp/apparmor_test.log"

echo "AppArmor profil testi basliyor..."

# Complain moduna al
aa-complain "$APP_PATH"
echo "Complain modu aktif"

# Uygulamayı yeniden başlat
systemctl restart nginx

# Normal test trafiği oluştur (burada kendi test senaryonuzu ekleyin)
for i in {1..10}; do
  curl -s http://localhost/ > /dev/null
  sleep 1
done

# İhlalleri topla
journalctl --since "5 minutes ago" | grep apparmor > "$LOG_FILE"
echo "Log dosyasi: $LOG_FILE"

# Enforce moduna geç
aa-enforce "$APP_PATH"
echo "Enforce modu aktif - Profil üretime hazir"

Sık Karşılaşılan Sorunlar ve Çözümleri

Problem: Uygulama AppArmor profili yüklendikten sonra başlamıyor.

# İlk önce log'lara bak
sudo journalctl -u uygulama-adi -n 50
sudo grep "apparmor.*DENIED" /var/log/syslog | tail -20

# Profili geçici olarak devre dışı bırak ve test et
sudo aa-disable /etc/apparmor.d/profil-adi
sudo systemctl restart uygulama-adi
# Çalışıyorsa sorun profilde
sudo aa-enable /etc/apparmor.d/profil-adi

Problem: Profil dosyasında sözdizimi hatası var.

# Profili yükleme yapmadan doğrula
sudo apparmor_parser --preprocess /etc/apparmor.d/profil-adi

# Hata satır numarasını öğren
sudo apparmor_parser -r /etc/apparmor.d/profil-adi 2>&1

Problem: Tüm profiller devre dışı kaldı (sistem güncellemesi sonrası).

# AppArmor servisini yeniden başlat
sudo systemctl restart apparmor

# Tüm profilleri yeniden yükle
sudo apparmor_parser -r /etc/apparmor.d/*

# Enforce modunda olması gerekenleri kontrol et
sudo aa-status | grep "enforce"

Abstractions Kullanımı

AppArmor’un en kullanışlı özelliklerinden biri abstractions, yani hazır profil parçalarıdır. /etc/apparmor.d/abstractions/ altında bulunurlar ve tekrar tekrar kullanılan izin setlerini gruplar:

  • #include : Temel sistem kütüphaneleri için gerekli izinler
  • #include : DNS ve host çözümleme için
  • #include : SSL sertifika dosyaları için
  • #include : Python uygulamaları için
  • #include : Apache benzeri web sunucuları için
  • #include : Kullanıcı geçici dizinleri için

Kendi abstraction’ınızı da oluşturabilirsiniz:

sudo nano /etc/apparmor.d/abstractions/my-company-base
# Şirket içi ortak kütüphane ve araçlar için abstraction
/opt/company/lib/** mr,
/opt/company/share/** r,
/var/log/company/ rw,
/var/log/company/** rw,
/etc/company/** r,

Bu abstraction’ı tüm şirket uygulamalarının profiline #include ile ekleyebilirsiniz.

Sonuç

AppArmor, doğru yapılandırıldığında sistem güvenliğinize ciddi bir derinlik katmanı ekler. Saldırgan bir açık bulsun ve uygulamayı ele geçirsin, AppArmor sayesinde hasarı minimumda tutabilirsiniz. “Defense in depth” yani savunmada derinlik yaklaşımının en somut örneklerinden biridir.

Başlamak için büyük adımlar atmak zorunda değilsiniz. Önce kritik servislerinizi (web sunucusu, veritabanı, mail sunucusu) complain modunda izleyin. aa-logprof ile profilleri otomatik olarak şekillendirin. Test ortamında enforce moduna alıp birkaç gün bekleyin. Sorun yoksa üretime taşıyın. Bu döngüyü tüm uygulamalarınız için uygulayın.

SELinux ile karşılaştırdığınızda AppArmor öğrenme eğrisi çok daha kısa ve yönetimi çok daha basit. Özellikle küçük ve orta ölçekli ekipler için ideal seçimdir. Profil geliştirme araçları (aa-genprof, aa-logprof) bu işi neredeyse otonom hale getiriyor.

Son olarak şunu söyleyeyim: AppArmor profili olmayan bir sistem, kemer takmadan araba kullanmaya benzer. Kaza olmayabilir, ama olduğunda sonuçlar çok daha ağır olur. Bugün başlayın, en azından en kritik servislerinizi complain modda izleyin. İlk haftanın sonunda neler öğreneceğinize şaşıracaksınız.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir