appArmor
Bu blog girdisi aslında bir wiki sayfası olacaktı ama pardus-wiki.org'da uzun uzun döküman yazarken ff'in kendi kendine refresh etmesi sonucu (wiki'de auto-refresh açık mı Ahmet?) buraya kaldık, madem buraya kaldı ve benim gece gece döküman yazma şevkim baltalandı LSM nedir, IEEE POSIX.1e kabiliyetleri ne demektir v.s gibi appArmor'a giriş konularını kendiniz de öğrenebilirsiniz diye konuya geçiyorum;
Birkaç zaman önce GPL lisanslı hale getirilen appArmor, uygulamaları değiştirmeden, hızlı, kolay kullanılabilir ve güvenilir bir güvenlik katmanı yaratma hedefinde olan sevdiğimiz bir arkadaşımız. SELinux gibi uygulamaların libselinux'a linklenmesini gerektirmeyen, uygulama profili oluşturmak için parantez otistiği olmadığınız (ben bunu bi yerlerden daha hatırlıyorum ama), yeni bir programlama diline yakın bir şekilleki dosyalar ile boğuşmadığınız bir araç appArmor.
Peki sabahın 4:45'inde deli mi dürttü de bunları yazıyorsun diyenler için laflar hazırladım. Buyrunuz laflar; Öncelikle appArmor pardus-devel deposuna girdi ve _bu dünyadaki_ insanların kullanmasını amaçladığımız Pardus'un (bunun birde evrendeki acayip uzaylılar tarafından kullanılanı varmış, öyle duyumlar alıyoruz) bir parçası oldu. SUSE ve deney ortamı OpenSUSE'den sonra gözlerim beni yanıltmıyorsa appArmor'u dağıtımına entegre eden 3. dağıtım olduk (2.side korunmaya alınmış değerli sit alanları için burada). Peki oldunuzda ne oldu? Kuş mu çıktı diye düşünenler varsa bu noktada yazıyı okumaya devam etmek yerine şuradan hayatlarına devam etsinler.
Bir önceki paragraftan sağ çıkanlarla ise appArmor'un nasıl çalıştığına ve çalıştırmak için ne yapmak gerektiğine dair konulu denizlere yelken açalım;
Efenim appArmor'u, pardus-devel deposunda bulunan kernel-appArmor, libapparmor, apparmor-parser, apparmor-utils, apparmor-profiles ve bağımlılıklarını bir şekilde kurduktan sonra (bu bir şekil o kadar kolayki anlatmaya bile gerek yok, PiSi sağolsun!) ve dünyalıların işletim sistemi Pardus'u appArmor yamaları ile bezenmiş çekirdeği kullanarak nefis müdür ile ~15 saniyede boot edip afiyetle kullanmaya başlayabilirsiniz.
Eee, açtık sistemi değişen birşey yok, nasıl kullanacağız daha doğrusu neyi kullanacağız diyenlerle ise bu paragraftan devam edelim. Efendim appArmor başta değinmeye çalıştığımız gibi belli uygulamalar için belli profil dosyaları barındırmakta ve deyim yerindeyse bu uygulamaların başına kötü şeyler gelmesini knazar ile birlikte engellemeye çalışmaktadır (evet knazar'ın bir işi oldu artık, kendisini appArmor arayüzü yapmaya karar verdim). Bu önceden tanımlanmış bir seri profil dosyası 3 aşağı 5 yukarı şöyle görünmektedir;
caglar@pardus abstractions $ cat /etc/subdomain.d/usr.bin.traceroute # vim:syntax=subdomain /usr/bin/traceroute { #include base> #include nameservice> capability net_raw, capability setgid, capability setuid, /proc/net/route r, /usr/bin/traceroute r, }
Bu dosyaların bir kısmı apparmor-profiles pakedi ile birlikte gelmekteyken aklınıza bunların dışında kalan uygulamalar için ne yapacağım sorusu gelebilir. Tam bu noktada appArmor > diğer güvenlik çözümleri eşitliğini sağlamanıza olanak veren genprof aracı devreye girmektedir. Kendisi bir uygulamanın çalışmasını sizin için izleyip, o uygulama için bu profil dosyalarından oluşturabilmektedir. appArmor'un bir diğer güzelliği ise profil dosyası oluşur oluşmaz o uygulamanın korunmaya başlamasıdır, yani söz gelimi uygulama bir servis ise yeniden başlatılması v.s gerekmez. Bu ünlü genprof'un kullanımını ise ailemizin indirme yöneticisi wget ile anlatmaya çalışalım, fakat önce "/etc/init.d/subomain start" komutu ile appArmor'u başlatalım;
Daha sonra şu aşağıdaki komutu verelim;
caglar@pardus ~ $ sudo /usr/sbin/genprof /usr/bin/wget Setting /usr/bin/wget to complain mode. Please start the application to be profiled in another window and exercise its functionality now. Once completed, select the "Scan" button below in order to scan the system logs for AppArmor events. For each AppArmor event, you will be given the opportunity to choose whether the access should be allowed or denied. Profiling: /usr/bin/wget [(S)can system log for SubDomain events] / (F)inish
Bu konsolda bu komut böylece dururken başka bir konsola geçip "wget http://svn.uludag.org.tr/pardus/devel/applications/security/kernel-appArmor/pspec.xml" komutu ile wget'i çalıştıralım. İndirme işlemi bitince ise bir önceki konsola geri dönelim ve logları tarayarak wget profili oluşturmak için "S" tuşuna basıp, soru/cevap şeklinde giden diyaloğu aşağıdakine benzer bir şekilde bitirelim;
caglar@pardus ~ $ sudo /usr/sbin/genprof /usr/bin/wget Setting /usr/bin/wget to complain mode. Please start the application to be profiled in another window and exercise its functionality now. Once completed, select the "Scan" button below in order to scan the system logs for AppArmor events. For each AppArmor event, you will be given the opportunity to choose whether the access should be allowed or denied. Profiling: /usr/bin/wget [(S)can system log for SubDomain events] / (F)inish Reading log entries from /var/log/messages. Updating subdomain profiles in /etc/subdomain.d. Complain-mode changes: Profile: /usr/bin/wget Path: /etc/hosts Mode: r Severity: unknown 1 - #include nameservice> [2 - etc/hosts] [(A)llow] / (D)eny / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish Profile: /usr/bin/wget Path: /etc/hosts Mode: r Severity: unknown [1 - #include nameservice>] 2 - etc/hosts [(A)llow] / (D)eny / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish Adding #include nameservice> to profile. Profile: usr/bin/wget Path: /etc/nss_mdns.conf Mode: r Severity: unknown [1 - /etc/nss_mdns.conf] [(A)llow] / (D)eny / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish Adding /etc/nss_mdns.conf r to profile. Profile: /usr/bin/wget Path: /etc/wget/wgetrc Mode: r Severity: unknown [1 - /etc/wget/wgetrc] [(A)llow] / (D)eny / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish Adding /etc/wget/wgetrc r to profile. Profile: /usr/bin/wget Path: /home/caglar/pspec.xml Mode: w Severity: 6 1 - #include user-download> 2 - #include user-write> 3 - /home/caglar/pspec.xml [4 - /home/*/pspec.xml] [(A)llow] / (D)eny / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish Profile: /usr/bin/wget Path: /home/caglar/pspec.xml Mode: w Severity: 6 1 - #include user-download> 2 - #include user-write> 3 - /home/caglar/pspec.xml [4 - /home/*/pspec.xml] [(A)llow] / (D)eny / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish Profile: /usr/bin/wget Path: /home/caglar/pspec.xml Mode: w Severity: 6 1 - #include user-download> 2 - #include user-write> 3 - /home/caglar/pspec.xml 4 - /home/*/pspec.xml [5 - /home/*/*] [(A)llow] / (D)eny / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish Profile: /usr/bin/wget Path: /home/caglar/pspec.xml Mode: w Severity: 6 1 - #include user-download> 2 - #include user-write> 3 - /home/caglar/pspec.xml 4 - /home/*/pspec.xml [5 - /home/*/*] [(A)llow] / (D)eny / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish Adding /home/*/* w to profile. Writing updated profile for /usr/bin/wget. Profiling: /usr/bin/wget [(S)can system log for SubDomain events] / (F)inish Setting /usr/bin/wget to enforce mode. Reloaded SubDomain profiles in enforce mode. Finished generating profile for /usr/bin/wget.
Anlaşılacağı gibi wget'i profil etme işi bitti ve otomatik olarak gerekli profil yüklendi, peki sonuçtaki profil neye benzedi?
pardus ~ # cat /etc/subdomain.d/usr.bin.wget # vim:syntax=subdomain # Last Modified: Sun Mar 12 05:21:00 2006 /usr/bin/wget { #include base> #include nameservice> /etc/nss_mdns.conf r, /etc/wget/wgetrc r, /home/*/* w, /usr/bin/wget r, }
Buradaki /home/*/* kuralına göre wget sadece bu dizinlerin içinde okuyup/yazabiliyor, hemen deneyelim;
caglar@pardus ~ $ cd /tmp/ caglar@pardus tmp $ wget http://svn.uludag.org.tr/pardus/devel/applications/security/kernel-appArmor/pspec.xml --05:27:10-- http://svn.uludag.org.tr/pardus/devel/applications/security/kernel-appArmor/pspec.xml => `pspec.xml.1' svn.uludag.org.tr çözümleniyor... 193.140.100.210 svn.uludag.org.tr[193.140.100.210]:80 bağlanılıyor... bağlantı kuruldu. HTTP isteği gönderildi, yanıt bekleniyor... 200 OK Uzunluk: 5.979 (5.8K) [text/plain] pspec.xml.1: Erişim engellendi `pspec.xml.1'e yazılamadı (Erişim engellendi). caglar@pardus tmp $
Voila, you made it! Daha fazla bilgi ve appArmor'un daha neler yapabildiğini görmek için bkz: appArmor