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-extraDebian 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 rebootProfil ü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
| Kip | Davranış | Logdaki ifade |
|---|---|---|
| enforce | Varsayılan kip; profil dışı erişim EACCES/EPERM ile reddedilir | apparmor="DENIED" |
| complain | Erişime izin verilir, yalnızca loglanır | apparmor="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/ornekKipi 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/ornekAkış şöyledir:
- Profil yoksa oluşturulur, complain kipine alınır ve loga bir işaret bırakılır.
- Başka bir terminalde program çalıştırılır ve test planındaki tüm işlemler yapılır.
- aa-genprof ekranında (S)can seçilerek complain logları taranır; her erişim için karar verilir.
- İş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ıt | Etkisi |
|---|---|
| (A)llow | Kuralı profile ekler |
| (D)eny | Erişimi reddeden ve loglamayı susturan deny kuralı ekler |
| (I)gnore | Olayı bu seferlik atlar |
| (N)ew | Elle joker ifade girilmesini sağlar |
| (G)lob | Yolun 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ı:
| Bayrak | Anlamı | Not |
|---|---|---|
| r | Okuma | - |
| w | Yazma | a ile birlikte kullanılamaz |
| a | Yalnızca ekleme | Log dosyaları için uygundur |
| m | Çalıştırılabilir bellek eşleme (mmap) | Kütüphaneler ve ikili dosyalar için |
| k | Dosya kilitleme | - |
| l | Sabit bağlantı (hard link) | - |
| ix | Çalıştırılan program aynı profili devralır | - |
| px / Px | Ayrı profiliyle çalışır (Px ortamı temizler) | Hedef profil yüklü olmalı |
| cx / Cx | Profil içi alt profile geçer | - |
| ux / Ux | Kısıtsız çalışır | Korumayı 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 |
|---|---|
| -a | Profili ekler (varsayılan); aynı adlı profil yüklüyse hata verir |
| -r | Çekirdekteki aynı adlı profili değiştirir |
| -R | Profili çekirdekten kaldırır |
| -C | Profili complain kipinde yükler |
| -Q | Çekirdeğe yüklemeden işler; sözdizimi denetimi için uygundur |
| -p | Include'ları açılmış hâliyle çıktıya döker |
| -W | Derlenmiş 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.adiYeniden 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-profilDocker 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_profilReddedilen 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
- Ubuntu Server, AppArmor: https://ubuntu.com/server/docs/how-to/security/apparmor/
- Debian Wiki, AppArmor/HowToUse: https://wiki.debian.org/AppArmor/HowToUse
- apparmor.d(5): https://manpages.debian.org/testing/apparmor/apparmor.d.5.en.html
- aa-genprof(8): https://manpages.debian.org/testing/apparmor-utils/aa-genprof.8.en.html
- aa-logprof(8): https://manpages.debian.org/testing/apparmor-utils/aa-logprof.8.en.html
- apparmor_parser(8): https://manpages.debian.org/testing/apparmor/apparmor_parser.8.en.html
- aa-status(8): https://manpages.debian.org/testing/apparmor/aa-status.8.en.html
- systemd.exec(5): https://manpages.debian.org/testing/systemd/systemd.exec.5.en.html
- Docker, AppArmor security profiles: https://docs.docker.com/engine/security/apparmor/
TR Siber Ekibi