Bir Linux sunucusunda çalışan bir servis ele geçirildiğinde saldırganın neye erişebileceğini klasik dosya izinleri değil, o servisin çalıştığı kullanıcı belirler. AppArmor bu tabloyu değiştirir: her programa, yalnızca ihtiyaç duyduğu dosyalara, yeteneklere (capability) ve ağ erişimine izin veren bir profil tanımlar. Program kök (root) yetkisiyle çalışsa bile profilin dışına çıkamaz. Bu rehberde AppArmor durumunu okumaktan profil üretmeye, sözdiziminden DENIED loglarını yorumlamaya, systemd ve Docker entegrasyonuna kadar uçtan uca bir iş akışı anlatıyoruz. Komutlar ve seçenekler Ubuntu Server belgeleri, Debian wiki, AppArmor man sayfaları ve Docker belgelerine dayanır.

AppArmor nedir, profiller nerede durur?

AppArmor, Linux çekirdeğinde çalışan, yol (path) tabanlı bir zorunlu erişim denetimi (MAC) sistemidir. Debian ve Ubuntu'da profiller /etc/apparmor.d/ dizininde bulunur ve açılışta apparmor.service tarafından yüklenir. Profil üretme ve yönetme araçları apparmor-utils paketindedir; hazır ek profiller için apparmor-profiles ve apparmor-profiles-extra paketleri kullanılabilir.

CODE TERMINAL
sudo apt install apparmor-utils apparmor-profiles apparmor-profiles-extra


Debian wiki'ye göre Debian'da AppArmor'un çekirdek parametreleriyle etkinleştirilmesi gerekebilir. Bunun için /etc/default/grub dosyasına şu satır eklenir, ardından GRUB güncellenip sistem yeniden başlatılır:

CODE TERMINAL
GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT apparmor=1 security=apparmor"
sudo update-grub
sudo reboot


Profil üretim araçlarının olayları daha güvenilir yakalaması için Debian wiki auditd kurulmasını da önerir.

Durumu görmek: aa-status

aa-status (Ubuntu belgelerindeki karşılığıyla apparmor_status) yüklü profilleri ve hangi kipte olduklarını listeler:

CODE TERMINAL
sudo aa-status
sudo aa-status --enabled; echo $?
sudo aa-status --enforced
sudo aa-status --complaining
sudo aa-status --pretty-json


--enabled AppArmor etkin değilse hata koduyla döner; betiklerde ön kontrol için kullanışlıdır. --enforced ve --complaining ilgili kipteki profil sayısını verir, --json ve --pretty-json ise izleme sistemlerine aktarılabilecek JSON çıktısı üretir.

Kipler: enforce ve complain

KipDavranışLogdaki ifade
enforceVarsayılan kip; profil dışı erişim EACCES/EPERM ile reddedilirapparmor="DENIED"
complainErişime izin verilir, yalnızca loglanırapparmor="ALLOWED"
audit bayrağıflags=(audit) ile tüm erişimler loglanır-


Kip değiştirmek için profil dosyasının veya programın yolunu verebilirsiniz:

CODE TERMINAL
sudo aa-complain /usr/sbin/ornek
sudo aa-enforce /usr/sbin/ornek


Kipi profil dosyasında sabitlemek de mümkündür: profile /usr/bin/app flags=(complain) { ... }. Yeni bir profil her zaman önce complain kipinde denenmeli, loglar temizlendikten sonra enforce kipine alınmalıdır.

aa-genprof ile sıfırdan profil üretme

aa-genprof, çalışan bir programın davranışını izleyerek profil iskeleti üretir. Ubuntu belgeleri, başlamadan önce bir test planı hazırlamayı önerir: servisin başlatılması, durdurulması, yeniden yüklenmesi ve tüm özelliklerinin kullanılması.

CODE TERMINAL
sudo aa-genprof /usr/local/bin/ornek


Akış şöyledir:


  1. Profil yoksa oluşturulur, complain kipine alınır ve loga bir işaret bırakılır.
  2. Başka bir terminalde program çalıştırılır ve test planındaki tüm işlemler yapılır.
  3. aa-genprof ekranında (S)can seçilerek complain logları taranır; her erişim için karar verilir.
  4. İşlem bitince (F)inish seçilir; ana profil ve üretilen alt profiller enforce kipine alınır.



-d (profil dizini, varsayılan /etc/apparmor.d) ve -f (okunacak log dosyası) seçenekleri standart dışı kurulumlarda işe yarar.

aa-logprof ile profili güncelleme

Profil enforce kipindeyken program yeni bir dosyaya erişmek istediğinde engellenir ve olay loglara düşer. aa-logprof bu olayları tarar ve profili etkileşimli olarak günceller:

CODE TERMINAL
sudo aa-logprof
sudo aa-logprof -m "deneme-baslangic"


-m seçeneği, verilen işaretten önceki olayları yok sayar. Her olay için sunulan yanıtlar şunlardır:

YanıtEtkisi
(A)llowKuralı profile ekler
(D)enyErişimi reddeden ve loglamayı susturan deny kuralı ekler
(I)gnoreOlayı bu seferlik atlar
(N)ewElle joker ifade girilmesini sağlar
(G)lobYolun son parçasını jokerle genelleştirir
(Q)uitİşlenmemiş olayları bırakarak çıkar


Program başka bir programı çalıştırdığında ise aa-logprof yürütme kipi sorar: ix, px, ux veya reddetme. G seçeneğini ölçülü kullanın; çok geniş jokerler profilin koruma değerini düşürür.

Profil sözdizimi

Basit bir profil şöyle görünür:

CODE TERMINAL
#include 

/usr/local/bin/ornek {
  #include 

  capability net_bind_service,
  network inet tcp,

  /usr/local/bin/ornek mr,
  owner @{HOME}/.config/ornek/** rw,
  /var/log/ornek.log w,

  deny /etc/shadow r,
}


Temel öğeler:


  • tunables: /etc/apparmor.d/tunables/ altında tanımlı @{HOME}, @{PROC} gibi değişkenler. Profilin başında include edilir.
  • abstractions: Birçok programın ortak ihtiyacını tek satırda veren hazır kural kümeleri (#include <abstractions/base>).
  • capability: CAP_ öneki olmadan yazılır: capability chown, veya capability net_admin net_raw,
  • network: network, tüm ağ erişimini, network inet tcp, yalnızca IPv4 TCP'yi açar.
  • owner: Kuralı yalnızca sürecin sahibi olduğu dosyalarla sınırlar.
  • deny: Açıkça yasaklar; diğer kurallardan önceliklidir. audit deny ile hem yasaklanır hem loglanır.
  • Her kural virgülle biter; unutulan virgül en sık yapılan sözdizimi hatasıdır.



Dosya izin bayrakları:

BayrakAnlamıNot
rOkuma-
wYazmaa ile birlikte kullanılamaz
aYalnızca eklemeLog dosyaları için uygundur
mÇalıştırılabilir bellek eşleme (mmap)Kütüphaneler ve ikili dosyalar için
kDosya kilitleme-
lSabit bağlantı (hard link)-
ixÇalıştırılan program aynı profili devralır-
px / PxAyrı profiliyle çalışır (Px ortamı temizler)Hedef profil yüklü olmalı
cx / CxProfil içi alt profile geçer-
ux / UxKısıtsız çalışırKorumayı kaldırır, kaçının


Paketle gelen profillerde değişiklik yapmak yerine /etc/apparmor.d/local/ altındaki yerel dosyaları kullanın; böylece paket güncellemeleri eklemelerinizi ezmez.

Profili yükleme: apparmor_parser

CODE TERMINAL
sudo apparmor_parser -r /etc/apparmor.d/usr.local.bin.ornek
sudo systemctl reload apparmor.service


Seçenekİşlevi
-aProfili ekler (varsayılan); aynı adlı profil yüklüyse hata verir
-rÇekirdekteki aynı adlı profili değiştirir
-RProfili çekirdekten kaldırır
-CProfili complain kipinde yükler
-QÇekirdeğe yüklemeden işler; sözdizimi denetimi için uygundur
-pInclude'ları açılmış hâliyle çıktıya döker
-WDerlenmiş profili önbelleğe yazar
-KÖnbellek kullanmaz


Profili devre dışı bırakma

CODE TERMINAL
sudo ln -s /etc/apparmor.d/profil.adi /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/profil.adi


Yeniden etkinleştirmek için disable/ altındaki bağlantıyı silip profili apparmor_parser -a ile yükleyin. Debian'da aynı iş için aa-disable komutu da kullanılabilir.

DENIED loglarını okuma

AppArmor olayları çekirdek mesajlarına yazılır; dağıtıma göre dmesg, systemd journal, /var/log/syslog, /var/log/kern.log veya auditd kuruluysa audit logunda görünür. Ubuntu belgelerindeki örnek satır:

CODE TERMINAL
audit: type=1400 audit(1571868402.378:24425): apparmor="DENIED" operation="open" profile="/usr/sbin/cups-browsed" name="/var/lib/libvirt/dnsmasq/" pid=1128 comm="cups-browsed"


Bu satırda operation denenen işlemi, profile engelleyen profili, name erişilmek istenen kaynağı, pid ve comm ise süreci gösterir. Hızlı arama için:

CODE TERMINAL
sudo dmesg | grep 'apparmor="DENIED"'
sudo journalctl -k | grep 'apparmor="DENIED"'


Önerilen sorun giderme döngüsü: profili complain kipine alın, sorunlu işlemi tekrarlayın, aa-logprof ile önerilen kuralları tek tek değerlendirin, apparmor_parser -r ile yükleyin ve enforce kipine dönün.

systemd servisleriyle kullanım

systemd, birim dosyasındaki AppArmorProfile= ayarıyla servisin belirli bir profile geçerek başlamasını sağlar. systemd.exec belgesine göre profil çekirdekte önceden yüklü olmalıdır, aksi hâlde birim başarısız olur; değerin başına "-" konursa hatalar yok sayılır. AppArmor etkin değilse ayarın etkisi yoktur ve "+" önekli komutları etkilemez.

CODE TERMINAL
# systemctl edit ornek.service
[Service]
AppArmorProfile=ornek-profil


Docker ile kullanım

Docker belgelerine göre Docker, başlangıçta docker-default adlı profili üretip yükler ve aksi belirtilmedikçe konteynerlere uygular. Bu profil, geniş uygulama uyumluluğunu korurken orta düzey koruma sağlar. Kendi profilinizi kullanmak için:

CODE TERMINAL
sudo apparmor_parser -r -W /yol/ozel_profil
docker run --rm -it --security-opt apparmor=ozel_profil hello-world
sudo apparmor_parser -R /yol/ozel_profil


Reddedilen işlemler dmesg çıktısında profil adıyla görünür; yüklü profilleri aa-status ile doğrulayabilirsiniz. Docker'a özel profilleri açılışta yeniden yüklemeyi unutmayın; çekirdekte yüklü olmayan bir profili isteyen konteyner başlatılamaz.

Kaynaklar
TR Siber Ekibi Yazar · TRSiber
← Ana sayfaya dön