Linux’taki izinler «bu dosyayı kim okuyabilir» sorusunu yanıtlar. AppArmor başka bir soruyu yanıtlar: «bu programın yapmasına hiç izin var mı». Fark bir sızma sırasında ortaya çıkar. Bir web kabuğu web sunucusunun kullanıcısı olarak çalışır ve onun bütün haklarını devralır — bu da sistemin epeyce yarısına okuma erişimi demektir. Bir AppArmor profili süreci işi için gerekenlerin listesiyle sınırlar ve /etc/shadow dosyasını okuma ya da /bin/bash başlatma girişimi, kullanıcının izinlerinden bağımsız olarak bir redle sonuçlanır.
Şu anda ne etkin
sudo aa-status
Çıktı üç soruyu yanıtlar: kaç profil yüklü, bunların kaçı enforce ve complain kipinde ve hangi süreçler hiç profilsiz çalışıyor. Tipik bir Ubuntu’da birkaç düzine profil olacaktır, ama neredeyse hepsi man ve tcpdump gibi yardımcı programlar içindir. Anahtar servisler — nginx, Apache, PHP-FPM — genellikle sınırlandırılmışlar listesinde yoktur.
Birbirinden ayırmaya değer üç kip:
- enforce — kurallar uygulanır, fazlası reddedilir;
- complain — ihlaller yalnızca günlüğe kaydedilir, hiçbir şey engellenmez. Ayarlama kipi;
- unconfined — profil yoktur, program kısıtlamasız çalışır.
aa-status çıktısının en faydalı kısmı sonuncusudur: ağı dinleyen ve hiçbir şeyle sınırlandırılmamış süreçler. Başlanacak liste odur.
Araçlar
sudo apt install apparmor-utils
O paket olmadan aa-complain, aa-enforce ve aa-logprof komutları sistemde bulunmaz, AppArmor’un kendisi çalışıyor olsa bile.
Servisi durdurmadan bir profil nasıl etkinleştirilir
Sıra temeldir. Doğrudan enforce kipine alınan bir profil, yüksek olasılıkla servise ihtiyacı olan bir şeyi reddedecek ve servis çalışmayı bırakacaktır — genellikle hemen değil, dosya yükleme ya da posta gönderme gibi ender bir işlemde.
Doğru sıra:
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx
Bu kipte, olağandışı her senaryoyu kapsayan bir haftalık çalışma: yedek alma, bir güncelleme, büyük dosyaların yüklenmesi. Ardından birikeni gözden geçirin:
sudo aa-logprof
Komut kaydedilmiş ihlalleri tek tek gezer ve her biri için izin verilip verilmeyeceğini sorar. Burada dikkat gerekir: gerçekten servisin işine ait olana izin verin, gözünüze ne çarparsa ona değil — aksi halde elinizde her şeye izin veren bir profil kalır ve anlam yitirilir.
Ve ancak ondan sonra:
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
Redler nerede görülür
Bütün ihlaller çekirdek günlüğüne düşer:
sudo journalctl -k | grep -i apparmor
sudo grep 'apparmor="DENIED"' /var/log/audit/audit.log
İkinci dosya auditd kuruluysa vardır — ve onunla birlikte kayıtlar belirgin biçimde daha ayrıntılıdır. Bir red kaydı profil adını, istenen işlemi ve erişilen yolu gösterir; bu, profili düzeltmek mi gerektiğini yoksa tetiklendiğine sevinmek mi gerektiğini anlamaya yeter.
Ezberlenmeye değer bir belirti: bir servis tuhaf davranır — bir yapılandırmayı okumaz, bir dizine yazmaz, bir soket açmaz — ve kendi günlükleri, izinler apaçık doğruyken bir «permission denied» hatası gösterir. Bu neredeyse her zaman AppArmor’dur ve yapılacak ilk şey çekirdek günlüğüne bakmaktır.
Kuramsal değil, pratik bir önlem
PHP-FPM ya da nginx için bir profil kendini belirli bir biçimde amorti eder. Süreç sınırlandırılmışken siteye ulaşan bir web kabuğu ne sistem dosyalarını okuyabilir, ne bir kabuk başlatabilir, ne de izin verilen dizinlerin dışına bir şey yazabilir. Ele geçirilmiş bir site, bütün makineye erişime dönüşmek yerine ele geçirilmiş bir site olarak kalır — ve zararın büyük kısmını oluşturan tam da o geçiştir.
Makul bir benimseme sırası: önce internete bakan ne varsa onun için bir profil (web sunucusu, PHP-FPM), sonra veritabanları için, sonra gerektikçe. Her şeyi aynı anda açmaya gerek yoktur ve evrensel bir hazır küme yoktur: bir profil, dosyalarınızın nerede durduğuna bağlıdır.
Düzenli olarak neyi kontrol etmeli
Profiller sandığınızdan daha sık unconfined durumuna düşer: bir paket güncellemesi bir profil dosyasının yerine geçebilir, elle hata ayıklama bir servisi complain kipinde bırakır ve yeni bir servis hiç profilsiz gelir. İki rakam faydalıdır: kaç profil enforce kipinde ve ağa bakan kaç süreç unconfined. İkisindeki bir değişikliği bilmeye değer. Bunun tek sayfada toplanmış hali aşağıdaki demoda.