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