Linux Güvenlikve Dosya sistemi Güvenliği
Sistemlerinizi ağa bağlı hale getirmeden önce yapılacak bir kaç dakikalık hazırlık ve planlama, sistemlerinizin ve üzerlerinde saklanan verinin korunmasında yardımcı olabilir.
Kullanıcıların, SUID/SGID programları ev dizinlerinden çalıştırmalarına izin vermek için herhangi bir sebep olmamalıdır. /etc/fstab dosyasında, root'tan başkalarının da yazma izninin olduğu disk bölümleri için nosuid seçeneğini kullanın. Ayrıca, kullanıcıların ev dizinlerinin bulunduğu bölümlerde, ve /var dizininde, program çalıştırılmasını ve karakter veya blok cihazların yaratılmasını engellemek için (ne de olsa hiçbir zaman böyle bir şey gerekmeyecektir) nodev ve noexec seçeneklerini kullanabilirsiniz.
NFS kullanarak dosyasistemlerini dışarı açıyorsanız, /etc/exports dosyasında en fazla sınırlandırma sağlayan seçenekleri kullandığınızdan emin olun. Bu, genel karakter kullanılmaması, root kullanıcısına yazma izninin verilmemesi, ve mümkün olduğu yerlerde salt-okunur şekilde dışa açılması anlamına geliyor.
Kullanıcılarınızın dosya yaratma umask'ini mümkün olduğu kadar sınırlı tutun. Bkz. http://www.antivirus.metu.edu.tr/belgel ... html#umask umask ayarları.
Eğer, NFS gibi bir ağ dosyasistemini kullanarak dosyasistemlerini bağlıyorsanız, /etc/exports dosyasında uygun sınırlama ayarlarının yaptığınızdan emin olun. Tipik olarak, "nodev", "nosuid", ve belki de "noexec" gerekli olanlardır.
Dosyasistemlerinin sınırları belirleyin, varsayılan unlimited (Ç.N.: sınırsız) ayarına izin vermeyin. Kullanıcı bazındaki sınırları, kaynak-limitleri PAM modülünü kullanarak, ve /etc/pam.d/limits.conf dosyasındaki ayarlar aracılığı ile yapabilirsiniz. Örneğin, users grubu için sınırlar şu şekilde olabilir:
@users hard core 0
@users hard nproc 50
@users hard rss 5000
Burda söylenen, core dosyalarının yasaklanması, işlem sayısının 50 ile sınırlanması, ve bellek kullanımının 5M ile sınırlandırılmasıdır.
/var/log/wtmp ve /var/run/utmp dosyaları sisteminizdeki tüm kullanıcıların sisteme giriş bilgilerini içerir. Bu dosyaların bütünlükleri korunmalıdır, çünkü bir kullanıcının (ya da bir saldırganın) ne zaman ve nereden giriş yaptığını belirlemede kullanılabilirler. Bu dosyaların erişim izinleri, normal işlevlerini gerçekleştirmelerine engel olmayan 644 olmalıdır.
Korunması gereken bir dosyanın kazara silinmesi veya üzerine yazılmasını önlemek için değişmez biti kullanılabilir. Bu ayrıca, dosyaya bir simgesel bağ yaratılmasını da engelleyecektir (bu tür simgesel bağlar, /etc/passwd veya /etc/shadow dosyaların silinmesi gibi saldırılarda temel oluşturmuştur). Değişmez biti ile ilgili daha fazla bilgi için chattr (1) man sayfasına bakın.
Sisteminizdeki SUID ve SGID dosyaları, potansiyel bir güvenlik riski oluşturur ve yakından izlenmelidir. Bu programlar, onları çalıştıran kullanıcıya özel yetkiler verdiği için, güvensiz programların kurulu olmadığından emin olmak gereklidir. Korsanların gözde bir numarası da SUID-root programlarından yararlanarak, bir sonraki girişlerinde arkakapı olarak kullanmak üzere bir SUID programı yerleştirmektir. Bu şekilde asıl delik kapatılsa bile yeni arkakapı sayesinde sisteme giriş yapabilirler. Sisteminizdeki bütün SUID/SGID programları bularak ne olduklarını izleyin. Böylelikle, bir değişiklik olduğunda, ki bu değişiklikler potansiyel bir saldırganın göstergesi olabilir, haberiniz olmuş olur. Sisteminizdeki bütün SUID/SGID programları bulmak için aşağıdaki komutu kullanabilirsiniz:
root# find / -type f \( -perm -04000 -o -perm -02000 \)
Debian dağıtımı, hangi SUID programlarının bulunduğunu belirlemek için her gece bir iş çalıştırır. Daha sonra bunu bir önceki gece ile karşılaştırır. Bu günlük için /var/log/setuid* dosyalarına bakabilirsiniz.
Şüpheli bir programdaki SUID ve SGID erişim izinlerini chmod ile kaldırabilir, daha sonra mutlak şekilde gerektiğini hissederseniz tekrar yerine koyabilirsiniz.
Herkes tarafından yazılabilir dosyalar, özellikle sistem dosyaları, bir korsan sisteminize erişir ve üzerlerinde değişiklik yaparsa bir güvenlik deliği haline gelebilir. Ayrıca herkes tarafından yazılabilir dizinler de tehlikelidir, çünkü bir korsanın istediği gibi dosya ekleme ve silmesine izin verir. Sisteminizdeki herkes tarafından yazılabilen dosyaları bulmak için, aşağıdaki komutu kullanın:
root# find / -perm -2 ! -type l -ls
ve bu dosyaların neden yazılabilir olduklarını bildiğinizden emin olun. Normal işlevler sırasında, herkes tarafından yazılabilir bir takım dosyalar bulunur, bunlar arasında /dev dizinindekiler ve simgesel bağlar da vardır. Bu nedenle yukarıdaki find komutunda simgesel bağları dışarıda bırakan ! -type l seçeneğini kullandık.
Sahipsiz dosyalar da bir saldırganın sisteminize eriştiğinin bir göstergesi olabilir. Sahibi olmayan veya hiçbir gruba ait olmayan dosyaları aşağıdaki komut ile bulabilirsiniz:
root# find / -nouser -o -nogroup -print
.rhosts dosyalarına sisteminiz üzerinde izin vermemelisiniz, dolayısıyla sistem üzerindeki bu dosyaların bulunması düzenli yönetim görevlerinizin bir parçası olmalı. Unutmayın, bir korsan bütün ağınıza erişebilmek için sadece bir güvensiz hesaba gereksinim duyar. Aşağıdaki komutla sistem üzerindeki tüm .rhosts dosyalarını bulabilirsiniz:
root# find /home -name .rhosts -print
Son olarak, herhangi bir sistem dosyası üzerindeki erişim izinlerini değiştirmeden önce, ne yaptığınızı anladığınızdan emin olun. Sadece bazı işlerin daha kolay olduğunu düşündüğünüz için bir dosyanın erişim izinlerini değiştirmeyin. Daima değiştirmeden önce neden o dosyanın o izinlere sahip olduğunu belirleyin.
5.1 Umask Ayarları
umask komutu, sistem üzerinde varsayılan dosya yaratma kipini belirlemek amacıyla kullanılabilir. İstenen dosya kipinin sekizli sayı düzeninde tümleyicisidir. Eğer dosyalar, erişim ayarlarına bakmaksızın yaratılırsa, kullanıcı dikkatsizce, okuma veya yazma izni olmaması gereken birine bu izinleri verebilir. Tipik umask ayarları, 022, 027, ve 077 (en fazla sınırlama budur) ayarlarıdır. Normal olarak, umask /etc/profile dosyasında belirlenir, dolayısıyla bütün kullanıcılar için geçerlidir. Dosya yaratma maskesi 777'den istenen değerin çıkarılmasıyla elde edilebilir. Diğer bir deyişle, umask ayarı 777 olduğu zaman, yeni yaratılan bir dosya kimse için okuma, yazma ve çalıştırma izinlerini bulundurmayacaktır. 666 gibi bir maske, yeni yaratılan dosyaların 111 (Ç.N.: Herkes için sadece çalıştırma) izninde olmasını sağlayacaktır. Örneğin, aşağıdaki gibi bir satır olabilir:
# Kullanıcının varsayılan umask değerini belirle
umask 033
Root'un umask değeri 077 olmalıdır; bu, root'tan başka herkesi okuma, yazma ve çalıştırma izinlerinden, açık bir şekilde chmod ile izin verilene kadar yoksun bırakır. Yukarıdaki örnekte, yeni yaratılan dizinlerin izinleri, 777 - 033 = 744 olacaktır. Yeni yaratılan dosyaların ise bu maske ile erişim izinleri 644 olur.
Eğer Red Hat kullanıyorsanız, ve onların kullanıcı ve grup ID yaratma düzenlerine bağlı kalıyorsanız, umask için gereken sadece 002 değeridir. Bunun sebebi, Red Hat'te varsayılan ayarın her kullanıcı için ayrı bir grup olmasıdır. (Ç.N.: Red Hat dağıtımında, yeni bir kullanıcı açtığınız zaman, grubunu belirtmediğiniz sürece, kullanıcı ismiyle aynı yeni bir grup açılır ve kullanıcı bu grupta yer alır.)
5.2 Dosya İzinleri
Sistem dosyalarınızın, kullanıcılar tarafından, ve sistem dosyalarının bakımından sorumlu olmayan kişiler tarafından açılmadığını garanti altına almak önemlidir.
Unix, dosya ve dizinlerdeki erişim denetiminde üç ayrı özelliğe göre sağlar: sahip, grup, ve diğer. Bir dosyanın her zaman bir sahibi ve grubu vardır, geriye kalan herkes "diğer" özelliğine sahiptir.
Unix izinlerini kısaca açıklayacak olursak:
Sahiplik - Hangi kullanıcı(lar) ve grup(lar), dosyanın (veya dizin/üst dizinin) izin haklarını denetim altında tutuyor?
İzinler - Kimi erişim tiplerine müsade etmek için 1 veya 0 olabilen bitler. (Ç.N.: bit, binary digit'in kısaltması olup, ikili rakam anlamına gelir. İkili sayı düzeninde zaten iki rakam vardır, 1 ve 0). Dosyaların izinleri, dizinlerinkinden farklı anlamlar taşır.
Okuma:
Dosyanın içeriğini görebilme
Dizinde hangi dosyaların bulunduğunu görebilme
Yazma:
Bir dosya üzerinde değişiklik veya ekleme yapabilme
Bir dizindeki dosyaları silebilme veya taşıyabilme
Çalıştırma:
İkili yapıdaki bir programı veya kabuk betiğini çalıştırma (Ç.N.: Betikler, ikili dosya türünde olmayıp, bildiğimiz okunabilir metin dosyalarıdır. Diğer metin dosyalarından farkları çalıştırılabilme özellikleridir. Bu özellikleri, betiklerin ikili dosya tipleri, yani programlar tarafından yorumlanması şeklindedir. Örneğin bir kabuk betiği bash programı tarafından, bir perl betiği perl programı (veya modülü) tarafından, ve bir php betiği ise php programı (veya modülü) tarafından okunarak, içindeki komutlar yerine getirilir)
Bir dizinde arama yapabilme, okuma izinleri ile birlikte (Ç.N.: Bir dizin için çalıştırma bitinin durumu, o dizine cd veya chdir komutlarıyla girilip girilemeyeceğini de belirler)
Metin Sakla Niteliği: (Dizinler için) "Yapışkan bit" de dizinlere ve dosyalara uygulandığında farklı anlamlar taşır. Eğer bir dizinin yapışkan biti 1 ise, bir kullanıcı o dizinde yeni bir dosya oluşturabilir, fakat dizindeki diğer dosyaları, kendine ait olmadığı veya açık bir şekilde izin verilmediği sürece silemez. Bu bit, /tmp gibi herkesin yazabileceği, ama diğer hiçbir kullanıcının başkalarının dosyalarını silmemesinin sağlanması gereken dizinler için tasarlanmıştır. Uzun dizin listesinde yapışkan bit t olarak görünür (Ç.N.: Bir başka örnek, dosya göndermenize izin verilen ftp sunucularıdır. Burda aynı dizine herkes dosya aktarımı yapabilir, ama bir kullanıcının koyduğu dosyayı diğer bir kullanıcı silemez.)
SUID Niteliği: (Dosyalar için) Bu, dosyayı "kullanıcı-kimliği-belirle" izinleriyle ilgilidir. Eğer sahip izinleri bölümünde but bit 1 ise, ve dosya çalıştırılabilir bir dosya ise, çalışan işlemler sistem kaynaklarına, işlemi başlatan kişinin değil, dosya sahibinin kimliğinde erişim sağlar. Bu, bir çok "tampon taşması" açıklarının da sebebidir. (Ç.N.: Normalde Unix sistemlerde bir bir programı veya kabuk betiğini çalıştırarak bir işlem başlattığınızda, o işlemin kullanıcı kimliği ve izinleri, başlatan kişininkiyle aynıdır. Söz konusu dosyanın sahip izinleri bölümünde SETUID (Set User ID) biti 1 ise, bu, dosya sahibinin kullanıcı kimliğinin, işlemin etkin kullanıcı kimliği haline getirilmesini sağlar, ve işlem o dosya sahibinin erişim izinleri ile çalışır. Bunun pratik olarak anlamı şudur: Bir dosyanın sahibi root ise, ve SETUID biti 1 ise, o dosya çalıştırıldığında, çalıştıran kişi işlemin çalışması boyunca root olur, işlem bittiğinde eski kullanıcı kimliğine (gerçek kullanıcı kimliği) geri döndürülür. Tampon taşmaları, programın "göçmesine" ve yarım kalmasına sebep olan böceklerdir. Program henüz bitmemiş olduğu için çalıştıran kullanıcı hala root erişim iznindedir. Bu noktada bir kabuk çalıştırılabilirse bu kişi pratik anlamda root'un yapabileceği herşeyi yapabilir anlamına gelir.) SGID Niteliği: (Dosyalar için) Bu bit grup izinlerinde 1 ise, dosyanın "grup-kimliği-belirle" durumunu denetler. Bu kullanıcı-kimliği-belirle biti ile aynı şekilde çalışır, fakat bu kez grup kimliği etkilenir. Bu bitin etkili olabilmesi için dosyanın çalıştırılabilir olması şarttır (Ç.N.: SGID - set group id, grup kimliğini belirle)
SGID Niteliği: (Dizinler için) Eğer bir dizinin bu bitini 1 yaparsanız (chmod g+s dizin ile), bu dizinde yaratılan dosyaların grupları, bu dizinin grubu ile aynı olacaktır. Siz - Dosyanın sahibi
Grup - Ait olduğunuz grup
Diğer - Sizin ve grubunuzun diğer üyelerinin dışında kalan herkes.
Dosya Örneği:
-rw-r--r-- 1 kevin users 114 Aug 28 1997 .zlogin
1. bit - dizin mi? (hayır)
2. bit - sahibi okuyabilir mu? (evet, kevin tarafından)
3. bit - sahibi yazailiror mu? (evet, kevin tarafından)
4. bit - sahibi çalıştırabiliyor mu? (hayır)
5. bit - grup üyeleri okuyabilir mu? (evet, users tarafından)
6. bit - grup üyeleri yazabiliyor mu? (hayır)
7. bit - grup üyeleri çalıştırabiliyor mu? (hayır)
8. bit - diğerleri okuyabiliyor mu? (evet, herkes tarafından)
9. bit - diğerleri yazabiliyor mu? (hayır)
10. bit - diğerleri çalıştırabiliyor mu? (hayır)
Aşağıdaki satırlar, dosyalar için açıklanan erişim izinlerinin uygulanabilmesi için verilmesi gereken en az izinlerin örnekleridir. Herhangi birine burdakilerden daha fazla izin vermek isteyebilirsiniz, fakat bunların en azları açıklanmaktadır:
-r-------- Dosya sahibinin dosyayı okumasına izin verir.
--w------- Dosya sahibinin dosyayı değiştirmesine veya silmesine izin verir.
(Dosyanın içinde bulunduğu dizine yazma hakkı olan herkes, dosyanın
üzerine yazabilir, dolayısıyla dosyayı silebilir)
---x------ Dosyanın sahibi programları çalıştırabilir. Kabuk betiklerini çalıştıramaz,
çünkü onlar için okuma izni de olmalıdır.
---s------ Etkin kullanıcı kimliğini dosya sahibinin kullacı kimliği haline getirir.
--------s- Etkin grup kimliğini dosyanın grup kimliği haline getirir.
-rw------T "Son değiştirilme zamanı" güncellenmez. Genelde takas dosyaları için
kullanılır.
---t------ Etkisi yoktur. (Önceleri yapışkan bit olarak kullanılırdı)
Dizin Örneği:
drwxr-xr-x 3 kevin users 512 Sep 19 13:47 .public_html/
1. bit - dizin mi? (evet, bir sürü dosya içeriyor)
2. bit - sahibi okuyabilir mu? (evet, kevin tarafından)
3. bit - sahibi yazailiror mu? (evet, kevin tarafından)
4. bit - sahibi çalıştırabiliyor mu? (evet, kevin tarafından)
5. bit - grup üyeleri okuyabilir mu? (evet, users tarafından)
6. bit - grup üyeleri yazabiliyor mu? (hayır)
7. bit - grup üyeleri çalıştırabiliyor mu? (evet, users tarafından)
8. bit - diğerleri okuyabiliyor mu? (evet, herkes tarafından)
9. bit - diğerleri yazabiliyor mu? (hayır)
10. bit - diğerleri çalıştırabiliyor mu? (evet, herkes tarafından)
Aşağıdaki satırlar, dosyalar için açıklanan erişim izinlerinin uygulanabilmesi için verilmesi gereken en az izinlerin örnekleridir. Herhangi birine burdakilerden daha fazla izin vermek isteyebilirsiniz, fakat bunların en azları açıklanmaktadır:
dr-------- Dizin içeriği listelenebilir, fakat dosya nitelikleri okunamaz.
d--x------ Dizine girilebilir, ve tam çalıştırma yollarında kullanılabilir
(Ç.N.: Dizin içindeki dosyalar listelenmediği için, çalıştırmak istediğiniz
dosyanın ismini de bilmenizi gerektirir, ve dizinle birlikte tam yolunu
yazdığınız takdir çalıştırmanız mümkündür).
dr-x------ Dosya nitelikleri sahip tarafından okunabilir.
d-wx------ Dosyalar, dizinin içine girilmeksizin yaratılabilir/silinebilir.
d------x-t Dosyaların yazma hakkı olan diğerlerince silinmesini engeller. /tmp dizininde
kullanılır.
d---s--s-- Bir etkisi yoktur.
Sistem yapılanış dosyaları (genelde /etc içinde), genelde 640 kipindedir (-rw-r-----), ve sahipleri root'tur. Sitenizin güvenlik gereksinimlerine bağlı olarak, bunun üzerinde değişiklik yapmak isteyebilirsiniz. Asla herhangi bir sistem dosyasını grup veya herkes tarafından yazılabilir durumda bırakmayın. Bazı yapılanış dosyaları, /etc/shadow da buna dahildir, sadece root tarafından okunabilir durumda olmalı. /etc içindeki bazı dizinler de en azından diğer kullanıcılar tarafından erişebilir olmamalı.
SUID Kabuk Betikleri SUID kabuk betikleri, ciddi bir güvenlik riskidir, ve bu sebeple çekirdek tarafından hoş karşılanmazlar. Bir kabuk betiğinin ne kadar güvenli olduğunu düşünürseniz düşünün, bir korsan ondan yararlanarak bir root kabuğuna erişebilir.
5.3 Bütünlük Denetimi
Yerel (ve ağ) saldırılarını ortaya çıkarmanın çok iyi bir yolu da bir bütünlük denetleyici, örneğin Tripwire, Aide veya Osiris gibi bir program çalıştırmaktır. Bu bütünlük denetleyiciler, bütün önemli ikili dosyalarınızın üzerinde bir sağlama toplamı hesaplar, ve dosyalar iyi durumda olduklarındaki toplamlarla karşılaştırır. Sonuç olarak, dosyalardaki değişiklikler farkedilebilir.
Bu tür programları bir diskete kurmak, ve disketin yazma korumasını kapatmak iyi bir fikirdir. Bu yolla saldırganlar bütünlük denetleyicisinin kendisini veya veritabanını kurcalayamazlar. Bir kere bunun gibi bir düzeneğiniz olduktan sonra, bu düzeneği normal yönetim görevleriniz arasında kullanmak, ve değişen bir şeyler olup olmadığını görmek de iyi bir fikirdir.
Hatta, crontab'a denetleyicinizin her gece disketten çalışması için bir girdi ekleyebilir, ve sabaha sonuçlarını gözden geçirebilirsiniz. Aşağıdaki gibi bir şey size her sabah 5:15'te bir raporu mektup olarak yollar:
# set mailto
MAILTO=kevin
# run Tripwire
15 05 * * * root /usr/local/adm/tcheck/tripwire
Bütünlük denetleyicileri, aksi takdirde farkedilmesi zor olan saldırganları ortaya çıkarmak konusunda bir nimettir. Ortalama bir sistemde çok fazla dosya değiştiği için, hangisinin bir korsan tarafından, hanginizin kendiniz tarafından değiştirildiği konusunda dikkatli olmak zorundasınız.
Tripwire'ın açık kaynak sürümünü, ücretsiz olarak http://www.tripwire.org/ http://www.tripwire.org bulabilirsiniz. Kitapçıklar ve destek ise satın alınabilir.
Aide, http://www.cs.tut.fi/%7Erammer/aide.html http://www.cs.tut.fi/~rammer/aide.html adresinde,
Osiris ise http://www.shmoo.com/osiris/ http://www.shmoo.com/osiris/ adresinde
bulunabilir.
5.4 Truva Atları
Truva Atlarının ismi Homeros'un İlyada destanındaki ünlü numaradan gelmektedir. Bunun arkasındaki fikir, bir korsanın, kulağa çok hoş gelen bir program veya ikili dosya dağıtıp, diğer insanların dosyayı indirmesi ve root olarak çalıştırmasını teşvik etmesidir. Çalıştırılan program, sistem güvenliğini dikkat çekmeden bozar. İnsanlar indirdikleri ve çalıştırdıkları dosyanın tek bir şey yaptığını (ve bunu çok iyi yapıyor da olabilir) düşünürler, ama program bir taraftan güvenliğe de zarar vermek ile meşguldür.
Makinenize hangi programları kurduğunuza dikkat edin. Red Hat, RPM dosyaları için, programın gerçeğini kurduğunuzu doğrulayabilmeniz amacıyla, MD5 sağlama toplamları ve PGP imzaları sağlar. Diğer dağıtımlar da benzer yöntemler kullanır. Asla bilmediğiniz, kaynak kodu elinizde bulunmayan bir ikili dosyayı, root olarak çalıştırmayın! Çok az saldırgan kaynak kodlarını halka açık hale getirir.
Karmaşık olabilir, fakat bir programın kaynak kodunu gerçek dağıtım sitesinden aldığınıza emin olun. Eğer program root olarak çalışacaksa, güvendiğiniz birinin kaynak koduna bakmasını ve doğrulamasını sağlayın.




