|
|
| 5. Dosyalar ve Dosyasistemi Güvenliği |
|---|
| Önceki | Linux Güvenlik NASIL | Sonraki |
|---|
|
|
5. Dosyalar ve Dosyasistemi 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 oluşturulması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ıclarınızın dosya yaratma umask'ini mümkün
olduğu kadar sınırlı tutun. Bkz. Umask Ayarları.
-
Eğer, NFS gibi bir ağ dosya sistemini kullanarak dosya sistemlerini
bağlıyorsanız, /etc/exports dosyasında uygun
sınırlama ayarlarını yaptığınızdan emin olun. Tipik olarak,
"nodev", "nosuid", ve belki de "noexec" gerekli olanlardır.
-
Dosya sistemlerinin sınırları belirleyin, varsayılan
unlimited [12] 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.
- Aynı sınırlamaları, /etc/login.defs
dosyasında da belirtebilirsiniz.
-
/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,
olağan 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ğ oluşturulması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.
-
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
oluşturulursasa, 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 oluşturmama maskesi 777'den istenen
değerin çıkarılmasıyla elde edilebilir. Diğer bir deyişle, umask ayarı
777 olduğu zaman, yeni oluşturulan bir dosya kimse için okuma, yazma ve
çalıştırma izinlerini bulundurmayacaktır. 666 gibi bir maske, yeni
oluşturulan 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 oluşturulan dizinlerin izinleri, 777 - 033 = 744
olacaktır. Yeni oluşturulan 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 oluşturma
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.
[13]
-
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[14]. 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
[15]
-
Bir dizinde arama yapabilme, okuma izinleri ile birlikte
[16]
-
- Metin Sakla Niteliği: (Dizinler için)
-
"Yapışkan bit" 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[17]
-
- SUID Niteliği: (Dosyalar için)
-
Bu, dosyanın "kullanıcı-kimliği-belirle" izinleriyle ilgilidir.
Eğer sahip izinleri bölümünde bu bit 1 ise, ve dosya
çalıştırılabilir bir dosya ise, çalışan süreçler 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.[18]
-
- 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 de okuma izni 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 yazabiliyor 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[19]
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ılandırma 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.
-
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
adresinde bulabilirsiniz. Kitapçıklar ve destek ise satın alınabilir.
-
Aide
http://www.cs.tut.fi/~rammer/aide.html adresinde,
-
Osiris
http://www.shmoo.com/osiris/ adresinde bulunabilir.
-
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
vermekle 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.
|