Linux Sunucu Güvenliği ve Optimizasyonu I
eğrisindeki konumu nedeni ile günümüzün en çok tercih edilen ağ işletim sistemlerinden
olmuştur. Dışarıdan ve içeriden gelebilecek tehlikelere karşı gerekli önlemler alınmış bir
Linux kurulu makine yıllarca hiç sorun çıkartmadan çalışabilmesine rağmen, her zaman için
bunun aksi de mümkündür. Güvenlik ile ilgilenen herkesin bileceği gibi kesinlikle güvenli
denilecek bir sistem tasarlanması mümkün değildir. Özellikle Internet' in yaygınlaşması ve
kurumların iç ağlarını global ağa bağlaması sonucunda tehlike daha da artmıştır. Bu aydan
itibaren Linux sunucu ve istemci bilgisayarlarda güvenliği artırmak için bazı faydalı bilgiler
vermeye çalışacağız.
Güvenli bir işletim sistemi
Güvenlik, ciddiyet isteyen bir iştir. Tasarımına ilk
aşamada yani, sunucunun kurulumundan
önce başlanması gereklidir. Bilgisayarın ne amaçlı
kullanılacağı bir çizelge üzerinde
belirlenmeli ve temel işlevi dışında hiçbir yazılımın
makine üzerinde bulunmasına izin
verilmemelidir. Unutmamalıyız ki, hatasız bir program
yoktur. Makine üzerinde ne kadar az
program bulunursa, hatalardan etkilenme riskimiz de
aynı derecede azalır.
Eğer sunucumuz üzerinde çok önemli bilgi
bulunduruyorsak RAID kontrol kartları bulunması
kaçınılmazdır. Ayrıca yazılımın her ihtimale karşı
düzenli olarak yedeklenmesi ve
yedeklenmenin de mümkünse ayrı bir optik veya
manyetik medya üzerine yapılması tercih
edilmelidir.
Güvenli bir Linux sistemin kurulumu
Linux kurulumunda deneyimli bir kullanıcı, her Linux
sürümünün kurulum programında
bulunan tipik sunucu veya istemci seçeneklerinden
birisini tercih etmemelidir. Eğer
bilgisayarınızda tam bir hakimiyet kurmak ve üzerinde
bulunan her yazılımın varlığından
haberdar olmak istiyorsanız kurulacak bütün
bileşenleri sizin seçmeniz gereklidir.
Kurulum sırasında /var, /usr, /home dizinlerini ayrı
disklere bağlamak genelde doğru bir
yaklaşımdır. Bu sayede diskin yedeğinin alınması
kolaylaşmakta ve disklerden birinde
oluşacak bir hata sonucunda kaybedilen verinin
minimuma indirilmesi sağlanacaktır.
Eğer sunucuda maksimum güvenlik gerekli ise, Xwindows
bileşenlerinin kurulmaması doğru
bir karar olacaktır. Xwindows sistemi, bir istemci
makinede işlemleri kolaylaştırmasına
rağmen, çok büyük kod yapısı ve kodunda bulunması
muhtemel onlarca hatadan dolayı çok
büyük bir risk taşımaktadır.
Elinizdeki Linux sürümünü çok iyi tanımalı, eğer
ihtiyacınız olan sunucu yazılımlar bu
sürüm ile birlikte geliyorsa onları sisteminize
kurmadan önce versiyonları hakkında ayrıntılı
bilgi edinmelisiniz. Örnek vermek gerekirse: Red Hat
Linux 6.2 işletim sistemi kurulacaksa,
bu sürüm ile birlikte gelen FTP sunucu paketi olan
wu-ftpd-2.6.0 paketinde bulunan bazı
güvenlik açıkları ve bunlardan faydalanan exploitler
nedeni ile yeni kurduğunuz Linux sunucu
birkaç dakika içinde kötü niyetli bir kişi tarafından
ele geçirilebilir. Tavsiyemiz, az önce
hazırlamanızı tavsiye ettiğimiz sunucunun görevi
başlıklı listenize sizin için gerekli olacak
yazılımlar listesini de ekleyerek sırası ile bu
yazılımların Internet'teki ana sayfalarına göz
atmanızdır. Örneğin az önce söz ettiğimiz Red Hat
6.2' deki güvenlik boşluğuna karşı wu-
ftpd-2.6.1 sürümü kullanılmasının gerekliliği,
sitenin ana sayfasında önemle duyurulmaktadır.
Şimdi, Linux sunucularda yaygın olarak kullanılan
bazı ağ servisleri ve bunlar hakkında en
güncel bilgilerin bulunduğu Internet sitelerini
listeleyelim.
| Paketin Adı | Temel Görevi | Web Adresi |
| Wu-FTPD | FTP Sunucu | http://www.wu-ftpd.org |
| Apache | Web Sunucu | http://www.apache.org |
| Bind | DNS Sunucu | http://www.isc.org/products/BIND/ |
| qpopper | POP3 Sunucu | http://www.qpopper.org |
| Cyrus IMAP Server | IMAP Sunucu | http://asg.web.cmu.edu/cyrus/ |
| Sendmail | MTA Yazılımı | http://www.sendmail.org |
Yukarıdaki web sitelerini ziyaret ederken, elinizdeki
Linux sürümündeki yazılımların
versiyonlarını kontrol ettiğinizde büyük ihtimalle en
son sürüme sahip olmadığınızı
göreceksiniz. Bu aşamada en doğru hareket, ilgili
paketin tar.gz uzantılı kaynak kodunu
sunucu makineye kopyalayıp, kodu derlemektir. Pek
çoğumuza zahmetli gelen kod derlemeye
başvurmamızın nedeni, yazılımların kaynak kod olarak
dağıtılması ile rpm veya deb paketi
olarak dağıtılmasına başlanması arasında geçen sürede
sunucumuzun tehdit edilmesini
istemememizdir.
Güvenliği maksimize etmek için bir diğer önemli nokta
da makinede C, C++ derleyici
bulundurulmamasıdır. Eğer ileride bir gün gerekirse
geçici olarak kurulması ve ardından
tekrar kaldırılması doğru olacaktır. Bunun nedeni,
makineye erişen kullanıcıların işletim
sistemine zarar verebilecek bazı kodları derlemesini
engellemektir. Ayrıca, çekirdek (kernel)
kaynak kodunun da sistemde bulunması bazı tehlikeler
ortaya çıkarabilir. Bunun nedeni ise
bazı alt seviye güvenlik kırıcı programların kernel'
daki C++ başlık dosyalarını kullanarak
sistemde root kullanıcı hakkına sahip olmayı
başarmasıdır. Bunu engellemek için en iyi yol,
Linux çekirdeğinin kaynak kodunun sistemde
bulunmamasıdır.
Kurulduktan sonra silinecek bileşenler.
Linux sisteminizi kurduktan sonra ilk yapılması
gereken, bazı tehlikeli paketlerin sistemde
bulunup bulunmadıklarının kontrolü olmalıdır. Tipik
bir sunucuda aşağıda listelenen
programların bulunması ya gereksizdir, ya da bir
güvenlik boşluğu teşkil etmektedir. Bu
nedenle özellikle gerekli değilse silinmeleri daha
akıllıca olacaktır.
- git ve mc
- rsh, rlogin, rcp, rdate, rdist, rusers, rwall, rwho
- ntalk, talk
- telnet sunucu
- Xwindows ile ilgili her türlü program
- KDE, QT kütüphaneleri
- C, C++, tk, derleyici ve yorumlayıcıları
- Snmpd yazılımı
- NFS ve NIS ile ilgili her şey.
- routed
- tftp
- Grafik ile alakalı her şey.
- piranha, linuxconf
- at
- Multimedia ile ilgili her şey
- Pump
- mt-st
- eject
- mailcap
- apmd
- kernel-pcmcia-cs
- getty_ps
- isapnptools
- setserial
- kudzu
- gd
- pciutils
- rmt
Yukarıdaki liste ile paranoyaklık boyutuna ulaşmış olabiliriz fakat hepimiz biliyoruz ki,
güvenlik ciddi derecede paranoyaklık gerektirir.
Ayrıca yukarıdaki listede yer almayan ve makinenize
kuracağınızı varsaydığımız Apache, wu-
ftpd, bind, sendmail gibi programları da şimdi
sisteminizden kaldırmanız ve kaynak
kodlarından derlemeniz tavsiye edilir.
Kullanıcı hesapları
Bir bilgisayar sisteminin kırılmasında izlenen
yolların büyük çoğunluğu, makine üzerinde
geçerli bir kullanıcı hesabına sahip olunmasından
geçer. Güvenlik açıklarından faydalanmayı
amaçlayan kötü niyetli kişiler bu sunucu üzerinde
bulunan hesaplardan bir tanesini eline
geçirdiğinde işi büyük ölçüde kolaylaşmaktadır. Bu
nedenle ana makine üzerindeki bütün
şifrelerin en az root kullanıcının şifresi kadar iyi
korunması gereklidir.
Sistemde kullanılan şifrelerin genel özelliklerini
kısıtlamak mümkündür. Örneğin sistemdeki
bütün şifrelerin minimum 5 karakter ile kısıtlı
olması sağlanabilir. Bunun için /etc/login.defs
dosyasına PASS_MIN_LEN n gibi bir ibare girilmesi
gereklidir. Buradaki n sayısı şifrelerin
minimum uzunluğunu belirtmektedir.
Çok sık yapılan hatalardan bir tanesi de bir
kullanıcının sisteme bağlanması ve uzun süre
bağlı kalmasıdır. Bunu engellemek için de
/etc/profiles dosyası içerisine TMOUT =7200
yazılması bağlı olan kullanıcının hiçbir işlem
yapmadan geçirdiği 7200 saniye sonunda
otomatikman sistemden atılmasını sağlar.
/etc/exports dosyası
Sisteminizde NFS, NIS gibi bir sistem
kullanılmıyorsa, ki kullanılması pek tavsiye edilmez,
/etc/exports dosyası içersinde herhangi bir şey
olması gerekli değildir. Bu dosya NFS
sunucular için paylaştırılacak dizinleri belirtir.
Eğer NFS kullanılacaksa buradaki paylaşım
listesi aşağıdakine benzer bir yapıda olmalıdır.
/paylaştırılacak/dizin1 yetkili.makine.com.tr(ro,root_squash)
/paylaştırılacak/dizin2 192.168.10.4(ro,root_squash)
Yukarıdaki dosyada ro seçeneği, bu paylaşımın salt
okunur olduğunu, root_squash seçeneği
ise root kullanıcı yazma haklarına sahip herhangi bir
koşulun olamayacağı anlamına gelir.
/etc/security/console.apps/ dizini
Red Hat Linux sistemlerde normal kullanıcıların
makineyi kapatmak, yeniden açmak vb...
özel haklara sahip olmalarını sağlayan bazı dosyalar
bulunur. Bu dosyalar,
/etc/security/console.apps dizininde bulunur.
Buradaki bazı dosyaları silmek bizi beklenmedik
sürprizlere karşı koruyacaktır. Aşağıdaki komutlar
ile gereksiz bazı dosyaları temizleyelim.
rm –f /etc/security/console.apps/halt
rm –f /etc/security/console.apps/poweroff
rm –f /etc/security/console.apps/reboot
rm –f /etc/security/console.apps/shutdown
Eğer sistemde root kullanıcı harici kimsenin Xwindows
sistemini kullanmamasını istiyorsak
yine rm –f /etc/security/console.apps/ dizini
içindeki xserver dosyasını da silmemiz yeterli
olacaktır.
/etc/pam.d/ dizini
Bir diğer güvenlik artırımı da pam.d sisteminde
sağlanabilir. Red Hat sistemlerde /etc/pam.d
dizininde bulunan betikler, yazılımların
kullanıcıları nasıl yetkilendireceğini düzenler.
Aşağıdaki komutları verdiğiniz takdirde kullanıcılar
tehlikeli sayılabilecek bazı konsol
haklarından mahrum edileceklerdir.
cd /etc/pam.d
for i in * ; do
sed '/[^#].*pam_console.so/s/^/#/' <$i> temp && mv temp $i
done
/etc/inetd.conf dosyası
Bu dosya Linux makinenizin sunucu yazılımlarının pek
çoğunu kontrol eder. Arka planda
çalışan inetd adlı yazılım, bu dosyada belirtilen
portlarda gelen istekleri dinleyerek bir istek
karşısında yine bu dosyada belirtilen programın bir
kopyasını çalıştırır. Bu şekilde hiç
kullanılmayan ya da az kullanılan bazı sunucu
yazılımların bellekte gereksiz yer kaplamaları
engellenmiş olur.
Dosyanın temel yapısı şu şekildedir.
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l –a
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
Bu dosya, sisteminizin güvenliği için en önemli
dosyalardandır. Gerekli olmayan her şeyi
kapatmalısınız. Örneğin makine ftp sunucu olarak
kullanılmayacak ise yapılması gereken en
doğru hareket ilgili satırın başına bir diyez (#)
işareti koyarak bu servisi aktif halden
kaldırmak olacaktır. Elbette ki bu servis
kullanılmıyorsa, aynı zamanda makineden silmek
doğru bir harekettir. Eğer bir servisin işe yarayıp
yaramadığı hakkında tereddüde
düşüyorsanız, o servisi kaldırın. Büyük ihtimalle
işinize yaramayacaktır. Burada açık
bırakacağınız her bir satır size bir güvenlik boşluğu
olarak geri dönecektir. Örnek vermek
gerekirse çok zararsız gibi görünen "echo" servisi,
bu porta gönderilen her bilgiyi aynen geri
göndermekle görevlidir. Eğer kötü niyetli birisi bu
porta, sürekli işe yaramaz bilgi gönderen
bir yazılım yazarsa, bu servis gelen saçma sapan
karakterlerin hepsine birden cevap vermek
isterken sistem kaynaklarının çok önemli bir kısmını
tüketecektir. Aynı programın bir worm
tarzında yazıldığını ve Internet üzerinde binlerce
makineden aynı anda saçma sapan
karakterler gönderildiğini varsayarsanız, sunucunuz
büyük ihtimalle göçecektir.
Bir diğer önemli madde ise her ihtimale karşı
/etc/inetd.conf dosyasının haklarını kontrol
etmeliyiz. Bu dosyanın hakları 600 yani sadece root
kullanıcı tarafından okunabilir ve
yazılabilir şekilde olmalıdır. Bu, aşağıdaki komut
ile sağlanabilir.
chmod 600 /etc/inetd.conf
Bu dosyanın içeriğinden emin olunduktan sonra, bir
daha root kullanıcı dahil kimse tarafından
değiştirilmemesi için şu komut verilmelidir.
chattr +i /etc/inetd.conf
/etc/hosts.deny dosyası
Bu dosya, ağ servislerinize ulaşmaya yetkili
kullanıcıları kısıtlamaya yarar. Genellikle bu
dosya içinde herkese bütün yetkiler kısıtlanır.
Ardından sisteme girmeye yetkili IP adresi veya
bilgisayar adları /etc/hosts.allow dosyası içinde
belirlenir.
Aşağıda standart bir /etc/hosts.deny dosyası
görünmektedir.
# Bütün erişim haklarını kapat!!!...
ALL:ALL
/etc/hosts.allow dosyası
Bu dosya, /etc/hosts.deny dosyasında tamamen
kapattığınız erişim haklarını bazı yetkili
bilgisayarlara iade etmek için kullanılır. Örneğin
sunucu makinenize sadece trlinux.com
(195.244.37.241) alan adından ve sadece sshd adlı
protokol ile erişilmesini istiyorsanız, bu
dosyada aşağıdaki değişiklikleri yapmalısınız.
sshd: 195.244.37.241 trlinux.com
/etc/issue ve /etc/issue.net dosyaları
Bu dosyalar, sisteminize konsoldan veya telnet yolu
ile bağlanmak isteyen kişilere login:
belirtkecinden önce gösterilen bilgi satırlarını
içerirler. Bu, genelde kişiyi kullandığı sistemin
bir Linux sistem olduğunu göstermesi açısından
faydalı olabilir fakat, yüksek güvenlik
gerektiren sistemlerde kullanılan işletim sistemi,
kullanılan çekirdek(kernel) gibi bilgilerin
kötü niyetli kişilerin eline geçmesi doğru değildir.
Bu nedenle /etc/inetd.conf dosyasında
telnet programını çalıştıran satırda in.telnetd
sonuna –h parametresinin eklenmesi bu bilgilerin
ekrana getirilmemesini sağlar.
telnet protokolü, bir makineye uzaktan erişim amaçlı
kullanılır ve üzerinden akan bilgiyi
şifrelemeden gönderdiği için güvenli bir makinede
bulunması kesinlikle tavsiye edilmez.
Şifrelenmeden yollanan her türlü bilgi, bir sniffer
yazılımı aracılığı ile rahatlıkla dinlenebilir.
Bunu engellemek için ssh adı verilen protokolü tercih
etmelisiniz.
/etc/services
Bu dosya, bir portta bağlanacak olan programa bir
isim vermek amaçlı kullanılır. Örneğin
65000 nolu portu kullanan ve inetd aracılığı ile bu
portu dinleyen bir Netbus tarzı bir worm
programı yazılmak istendiğinde yapılması gereken,
/etc/services dosyasında bu porta bir isim
vermek ve /etc/inetd.conf dosyasında verilen ismi
içeren ve bu porttaki istekleri işleyen bir
program yazılması yeterlidir.
Bunu engellemek için bu dosyada değişiklik yapmayı
engelleyen şu komutun verilmesi
yeterlidir.
chattr +i /etc/services
/etc/securetty dosyası
Bu dosya root kullanıcının sisteme direk login
belirtecinde kullanıcı adı ve şifresini girerek
bağlanabileceği terminal aygıtlarını listeler. Bu
dosya silindiği takdirde sisteme telnet ile
bağlanan herkes kullanıcı adı olarak root verebilir.
Bu çok büyük bir güvenlik açığıdır.
Yapılması gereken eğer bu dosya yerinde yoksa
yaratılması ve içine "tty1" yazılmasıdır. Bu
sayede root kullanıcı sadece bilgisayarın önünde iken
ve 1 nolu sanal terminali kullanırken
sisteme direk bağlanabilir.
/etc/passwd ve /etc/shadow dosyaları
passwd ve shadow dosyaları birlikte, kullanıcı
şifreleri ve hesapları hakkında ayrıntılı bilgiyi
barındırır. Bu nedenle korunmasına özel önem
verilmelidir. Internet' te yer alan pek çok hack-
warez sitesinde, bir Linux sistemi kırmakla ilgili
dokümanda bu dosyaların bir şekilde ele
geçirilmesi ve ardından bir brute force programı
yazılımı ile bu şifrenin güçlü bir bilgisayarda
deneme yanılma yöntemi ile kırılması anlatılmaktadır.
Bunun önüne geçmek gerçekten çok
kolaydır. Yapılması gereken /etc/shadow dosyasının
okuma haklarını normal kullanıcılardan
kaldırmak olmalıdır. Bu işlem şu komutla
gerçekleştirilir.
chmod 600 /etc/shadow
Kullanıcıların su komutu ile root kullanıcı
olmalarının engellenmesi
su komutu herhangi bir kullanıcının root şifresini
bildiği takdirde root kullanıcı haklarına
sahip olmasını sağlar. Bu çok büyük bir güvenlik
riskidir, fakat engellemek mümkündür.
/etc/pam.d/su dosyasının en tepesine aşağıdaki
satırları eklediğimiz takdirde sadece wheel adlı
ön tanımlı gruba üye olan kullanıcılar su komutunu
çalıştırarak root kullanıcı haklarına sahip
olabilirler.
auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/pam_wheel.so group=wheel
Artık sistemimizde wheel grubuna üye olmayan hiçbir
kullanıcı root haklarına sahip
olamayacaktır. Wheel grubuna aşağıdaki komut ile
kolayca umut adlı bir kullanıcı eklenebilir.
chmod –G10 umut
Kullanıcıların CPU ve RAM kullanımlarını
sınırlamak
Bu Linux' un çok gelişmiş özelliklerinden bir
tanesidir. Sisteme bağlanan kullanıcılara
herhangi bir kaynak limiti verilmediği takdirde
sistemi kırmak için özelleşmiş bazı
programları çalıştırarak sistemi meşgul etmelerine ve
belki de sonuçta başarılı olmalarına
neden olunabilir. Aşağıdaki satırlar
/etc/security/limits.conf dosyasına eklendiği
takdirde root
kullanıcı haricindeki kullanıcılar maksimum 20 tane
proses açabilecek ve 5 MB bellek
kullanabileceklerdir.
hard core 0
hard rss 5000
hard nproc 20
Ardından bu özelliği aktif hale geçirmek için
kullanıcılar sisteme bağlanırken kullanılan
/etc/pam.d/login betiğine bu özelliğin belirtilmesi
gereklidir. Sonuçta bu dosya aşağıdaki gibi
olacaktır.
#%PAM-1.0
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_pwdb.so shadow
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_pwdb.so
password required /lib/security/pam_cracklib.so
password required /lib/security/pam_pwdb.so nullok
session required /lib/security/pam_pwdb.so
session required /lib/security/pam_limits.so
Linux işletim sistemi, doğru ellerde dünyanın en
güvenli işletim sistemi haline getirilebilir.
Fakat, pek çoklarının düşündüğü gibi bu özelliklerin
pek çoğu aktif olarak gelmez. Doğru
amaçlar için konfigüre edilmiş bir işletim sistemi
yaratmak için çok çalışmalı ve Linux
dünyasında duyurulan güvenlik uyarılarını dikkate
almalısınız.
Bu yazı Ekim 2000 tarihinde PC Net Türkiye Dergisinde
yayınlanmıştır.