Masa Üstü Linux'umu Nasıl Güvenli Hale Getiririm? (Yazar ve Kaynak göstererek sitenizde yayınlayabilirsiniz) Gerek sunucu sistemi gerekse masa-üstü kişisel bilgisayarımız olarak linux , her geçen gün kullanıcı sayısını artırmaktadır. Buna paralel olarak linux çalışan sistemler, kötü niyetli kişilerin daha belirgin bir hedefi haline gelmektedir. Şu anda mutlu şekilde çalışmamıza izin veren linux'umuz, eğer gerekli önlemleri almazsak farkında bile olmadan başımızı ciddi belaya sokabilir. Bu belgede linux'a yeni başlayanlar ve orta derecede linux bilenler için birtakım güvenlik önlemlerinin nasıl alınacağını anlatmaya çalıştık. Bu önlemlerin bir kısmı tek aşamada ve basit bir şekilde yapılabileceği gibi bir kısmı da periyodik olarak ve özen gösterilerek yapılmalıdır. Belgemizin kronolojik bir sıra takip etmesi açısından konuya ilk olarak kurulum aşamasından başlamak istiyoruz. Temelde bilgisayarımızın (bilgisayar kelimesini aslında kişisel bilgisayar yerine kullanıyoruz. Sunucu sistemlerde güvenlik konusu çok daha boyutlu ve biraz daha karmaşık yapıdadır) güvenliğini 3 değişik aşamada gerçekleştirebiliriz: - Kurulum aşamasında - Kurulumdan hemen sonra - Ve kullanırken KURULUM AŞAMASINDA: Temiz Kurulum: Eğer linux kuracağınız bilgisayarınızda daha önce kurulu olan herhangi bir linux sürümü varsa, sizin açınızdan tavsiye edilen edilen en güvenli kurulum , "disk" e "format" atarak yapacağınız bir kurulumdur. Bu şekilde "disk" inizi sıfırlamış olup temiz bir kuruluma başlayabilirsiniz. Güvenlik Seviyesi: Bazı Linux sürümleri (örn: Mandrake 8.1) kurulum aşamasında bilgisa- yarımızı hangi güvenlik seviyesinde kuracağımızı sorar. Eğer kuracağımız sistem kritik bir iş yapacaksa veya önemli bilgiler barındıracaksa yüksek güvenlikte kurmamızda fayda vardır. Bu şekilde kurulum seçtiğimizde bazı güvenlik araçları kurulum aşamasında seçili hale gelecek ve bazı güvenlik ayarlarını kurulum programı otomatik olarak yapacaktir. Fakat, en yüksek seviyede kurulan bir sistem, herhangi bir saldırıda yapılan fakat normalde de oluşabilen bazı işlem- lerde uyarı mesajı vereceğinden sizi gereksiz yere üzebilir. Bu nedenle kişisel kullanım için orta seviyede bir güvenlik ayarı yeterli olacaktir. Disk Bölme: İlk defa bir işletim sistemi kuracak birisi, "disk" üstünde tek bir bölmenin yeterli olacağını düşünerek tüm sistemini bu bölmeye kurar. Linux'umu- zun çalışması açısından fazla bir problem teşkil etmiyecek olan bu kurulum, hiç beklemediğimiz bir anda veri kaybımıza neden olabilir. Yoğun istekte bulunarak herhangi bir sunucu programımızın planladığımızdan daha fazla "log" almasına ve tek olan "disk" bölmesini doldurmasına neden olabilecek kötü niyetli bir arkada- şımız, böylelikle o esnada başka bir program tarafından "disk" e yazılması gereken ve bize çok gerekli olan herhangi bir bilginin disk dolu olduğu için kaybolmasına neden olabilir. Bu nedenledir ki "disk" bölme aşamasında a) Sistem dosyalarını koyacağımız kök bölmesi (/) b) Çeşitli programların "log" larının yazıldığı, "mail" sunucusu çalışıyorsa, gelen mesajların yazıldığı, ve yazıcı dosyala- rının gönderildiği bir bölme (/var) c) Eğer sistemimizde bizden başka kullanıcıların da çalışmasını istiyorsak, onların programlarının çıktılarının yazıldığı bir bölme (/home) d) Eğer önemli belgelerimiz varsa ve sistemi tekrar kurmak gerektiğinde bu belgeleri başka bir yere taşımak istemiyorsak bunları koyacağımız başka bir bölme (/backup) şeklinde "disk" bölmeleri açmamız, hiç beklemediğimiz bir anda hayatı- mızı çok kolay bir hale getirebilir. Az Paket Seçimi: Kurulum aşamasında bizim işimizi halledecek ve yakın bir zamanda kullanmayı planladığımız paketleri seçmek güvenlik açısından önemlidir . Çünkü her geçen gün bir programın açığı bulunmakta ve yükleyeceğimiz her bir paket o anda sağlam olsa dahi potansiyel olarak güvenlik tehlikesi oluşturmaktadır. KURULUMDAN HEMEN SONRA: Yamaların Atılması: Daha önce bahsedildiği gibi kuracağınız sürümün bazi paketlerinin güvenlik açığı bulunabilir. Sürümünüzü öğrenen kötü niyetli arkadaşımız kullan- dığınız delik programın açığını kullanarak başınıza dertler açabilir . Bu nedenle kurulum yaptıktan sonra sürümünüze göre linux'unuza yamaları atmakta her zaman fayda vardır. Bunu yapmak için Mandrake ve RedHat'lerde "rpm" komutunu, bu işi oto- matik olarak yapmak istiyorsanız Mandrake'de "MandrakeUpdate", RedHat'te "autorpm" komutunu kullanabilirsiniz. Gereksiz Servislerin Kapatılması: Linux'umuzu kurup, yamalarını atıp tekrar sistemimizi başlattığımızda artık bilgisayarımızın açık kapılarını kapatma zamanı gelmiştir. Yabancı insanların bilgisayarımıza ulaşabileceği en temel yollardan birisi çalışan sunucu programlar üzerindendir. Bu nedenle sizin işinize yaramayan sunucu programların sisteminizde çalışmasına izin vermeyin. Kişisel bir masa-üstü linux'da sadece "sshd" sunucu programının çalışması yeterlidir. Sunucu program- ları genelde 3 değişik şekilde çalıştırılır: 1- Sunucu programın ismini yazarak çaliştirma: Bu tip çalıştırma tamamen insiyatifinizde olan bir çalıştırma şek- lidir. Genelde linux'unuza daha sonra kurduğunuz ve belirli zamanlarda ihtiyaç duyduğunüz sunucu programlarını çalıştırırken bu yolu izler- siniz. Eğer bu şekilde çalıştırdığınız sunucu programına ihtiyacınız yoksa "ps -ef | grep sunucu_program_ismi" komutu ile "process id" sini öğrenip, "kill process_id" komutu ile bu sunucu proğramı öldürebilirsiniz. Eğer hala size direniyorsa "kill -9 process_id" komutunu en son çare olarak düşünebilirsiniz. 2- Açılırken Otomatik Olarak Çalıştırılan Sunucu Programları: Başlangıçta çalışacak programlar ".rc" betikleri (script) ile belirlenir. Linux'unuz açıldıktan sonra KDE ya da GNOME gibi grafiksel arabirim otomatik olarak çalıştırılıyorsa çalışma-düzeyiniz 5 demektir ve başlangıç betikleriniz /etc /rc.d/rc5.d dizini altında bulunur. Başlangıçta çalıştırılan betiklerin başlarında "S" vardır. Eğer bu betiğin çalışmasını istemiyorsanız isminin baş harfini "S" yerine "s" yapın. "K" ile başlayan betikler çalışan servisleri öldürmek için kullanılır. İlk harften sonra gelen numaralar ise bu betiklerin çalıştırılma sıralarını belirler (küçükler daha önce çalıştırılır). Aşağıda bu betiklerin bir kısmını ve açıklamalarını göreceksiniz: S05apmd (You only need this for laptops) S10xntpd (Network time protocol) S11portmap (Required if you have any rpc services, such as NIS or NFS) S15sound (Saves sound cared settings) S15netfs (This is the nfs client, used for mounting filesystems from a nfs server) S20rstatd (Try to avoid running any services beginning with "r", they provide too much information to remote users) S20rusersd S20rwhod S20rwalld S20bootparamd (Used for diskless clients, you probably don't need this vulnerable service) S25squid (Proxy server) S34yppasswdd (Required if you are a NIS server, this is an extremely vulnerable service) S35ypserv (Required if you are a NIS server, this is an extremely vulnerable service) S35dhcpd (Starts dhcp server daemon) S40atd (Used for the at service, similar to cron, by not required by the system) S45pcmcia (You only need this script for laptops) S50snmpd (SNMP daemon, can give remote users detailed information about your system) S55named (DNS server. If you are setting up DNS, upgrade to the latest version of BIND, http://www.isc.org/bind.html) S55routed (RIP, don't run this unless you REALLY need it) S60lpd (Printing services) S60mars-nwe (Netware file and print server) S60nfs (Use for NFS server, do not run unless you absolutely have to). S72amd (AutoMount daemon, used to mount remote file systems) S75gated (used to run other routing protocols, such as OSPF) S80sendmail (You can still send email if you turn this script off, you just will not be able to receive or relay) S85httpd (Apache webserver, I recommend you upgrade to the latest version, http://www.apache.org) S87ypbind (Required if you are a NIS client) S90xfs (X font server) S95innd (News server) S99linuxconf (Used to remotely configure Linux systems via browser, every black-hat's dream :) Eğer başlangıç programlarını yukarda açıklanan şekilde değiştirmek zorunuza gidiyorsa bunun başka yolları da vardır. Çoğu dağıtımlarda bulabileceğiniz "chkconfig", Mandrake'de "/usr/sbin/setuptool", RedHad'ta "/usr/bin/setup" yapılandırma programları ile istediğiniz başlangıç betiklerini açıp ya da kapatabilirsiniz. Bilgisayarınız açıldıktan sonra hangi sunucu programların çalıştığınız öğrenmek için "netstat -an | grep -i listen" komutundan faydalanabilirsiniz. 3- Süper Sunucu (inetd/xinetd) Yardımı ile: Bilgisayarınızda birden fazla sunucunun aynı anda çalışarak istek gelmesini beklemesi, hiç kimse o anda servis almıyorsa dahi sistem kaynağımızı tüketen bir olaydır. Bu yüzden birçok sunucu yerine bir sunucu çalışır (inetd) ve gelen isteği bazı güvenlik kontrollerinden geçmesi için "tcpd" sunucusuna devreder. Bu şekilde birçok sunucu program merkezi bir yapılandırma dosyasından (/etc/inetd.conf) kontrol edilebildiği gibi aynı zamanda bilgisayarımız daha az kaynak tüketerek çalışmış olur. Tipik bir "/etc/inetd.conf" dosyasının içeriğine bakalım: ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -L -i -o telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd #smtp stream tcp nowait root /usr/bin/smtpd smtpd #nntp stream tcp nowait root /usr/sbin/tcpd in.nntpd Eğer "inetd" nin bir sunucuya istek geldiğinde ilgili sunucu progra- mını çalıştırmasını istemiyorsanız, sunucu programın olduğu satırın başına "#" koymanız yeterli olacaktır. "Inetd" nin, gelen istekleri bazı kontrollerden geçirdiğini belirt- miştik. "Inetd.conf" dosyasının 6. sütununda görülen "/usr/sbin/tcpd" programı bu kontrolleri yapan bir sunucudur. "Ftpd" sunucusuna gelen isteği ilk önce "inetd" sunucusu alır ve yapılandırma dosyasındaki "ftp" satırının başında "#" yoksa bu isteği "tcpd" ye yönlendirir. Ger- ekli kontrolleri yapan "tcpd" bu kontrollerden geçen isteği, "in.ftpd" programını yukarıda gösterilen parametrelerle çalıştırarak devreder. "Tcpd" sunucusu bu kontrolleri 2 yapılandırma dosyasına bakarak yapar. "hosts.allow" ve "hosts.deny". İçeriklerine bakacak olursak: /etc/hosts.deny: ALL: ALL : spawn (/usr/sbin/safe_finger -l @%h > /var/log/denied) & /etc/hosts.allow: in.telnetd: 192.168.1.0/255.255.255.0 : banners /etc/bannerfile :ALLOW in.ftpd: 192.168.1.30 :ALLOW Linux ilk kurulduğunda bu yapılandırma dosyaları boş gelir. Yapı- landırma yaparken: 1- Alan adları yerine IP adresleri kullanın 2- İlk önce bütün istekleri "hosts.deny" dosyasında reddedin. Daha sonra izin vereceklerinizi "hosts.allow" dosyasının içerisine yazın. Güvenli Parola Seçimi: Linux'unuzda herhangi bir kullanıcı açarken şifresini sözlüklerde bulunmayan kelimeler yapın. Hatta şifrenin içindeki bazı karakterleri rakam (1,5,2 gibi) bazılarını da rakam ve harf dışıkdaki karakterlerden (@ , /, -) yapın ki, kötü niyetli arkadaş sizin "encrypted" şifrenizi eline geçirdiğinde herhangi bir şifre-kıran program ile kolayca kıramasın. Ayrıca seçtiğiniz şifreleri periyodik aralıklarla değiştirin. Root Hakları ile Çalışan Programların Tespiti ve Kontrolü: Unix ve Linux sistemlerde bazı programlar vardır ki bunların root hakları ile çalışması gerekir (örn: ping, mount gibi). Ama sisteminize sizden habersiz giren kişi kendi istediği herhangi bir programı da root hakları ile çalıştırmak isteyebilir. Bunu yapabilmek için "setuid" ve "setgid" program- larından faydalanabilir. Bu tür programlar çalıştırıldıklarında program sahibinin haklarıyla çalışır. Bu nedenle, Linux'unuzda hangi "setuid" program- ların root hakları ile çalıştığını tespit edin ve süphelendiğiniz programlardan bu hakkı kaldırın. Bunun için find / -perm +4000 -exec ls -l '{}' ';' komutunu kullanabilirsiniz. Uzaktan Erişimin Yapılandırılması: Linux'unuza erişimi iki dosya yardımıyla yapılandırabilirsiniz. "/etc/securetty", dosyasında root kullanıcısının sisteminize hangi terminal- lerden bağlanabileceğini belirtirsiniz. Eğer bu dosyaya sadece "ttyX" şeklinde terminaller yazarsanız, root kullanıcısı bilgisayarınıza uzaktan erişemez. Sadece fiziksel olarak makinanızın önünden bağlanabilir. (Tabi uzaktan başka kullanıcı ile bağlanıp, root kullanıcısına "su" yapabilir). "/etc/login.access" (Mandrake'de /etc/security/access.conf) dosyası yardımı ile daha esnek bir yapılandırma yapabilirsiniz. Bu dosyadaki kurallar yardımıyla hangi kullanıcının nerden bağlanabileceğini yapılandırabilirsiniz. Her kural, tek bir satırda 3 bölmeden oluşur hak : kullanıcı(lar) : bağlantı_noktası "hak" kısmının + veya - oluşuna göre "kullanıcıya" "bağlantı_noktası" ndan giriş izni verilir. "kullanıcı(lar)" kısmı bu kuralın hangi kullanıcı(lar) veya gruba uygulanacağını gösterir. Üçüncü kısım ise bağlantının kaynağını gösterir ("tty" isimleri, IP adresleri gibi). Örnek verecek olursak: # # /etc/login.access - restrict logins # -:ALL EXCEPT wheel : console # -:wheel : ALL EXCEPT LOCAL # -:httpd ftpd : ALL # # all other accounts are allowed to login # Bu dosyaya göre ilk kural, sadece "wheel" grubundaki kullanıcıların "console" dan bilgisayara erişebileceğini belirtiyor. İkinci kural "wheel" grubundaki kullanıcıların "local" olmayan bilgisayarlardan bağlantı yapamıya- cağını söylüyor. Üçüncü kural ise "httpd" ve "ftpd" kullanıcıların hiçbir şekilde bağlantı yapamıyacağını belirtiyor. Eğer herhangi bir kullanıcı herhangi bir yerden bağlanmaya çalışırken bu dosyadaki herhangi bir kurala uymazsa, otomatik olarak bağlantı hakkı verilir. Sistem Kaynaklarının Paylaştırılması ve Sınırlandırılması: Bilindiği üzre "harddisk" gibi "memory" gibi bilgisayarımızın sınırlı kaynakları vardır. Eğer bu kaynakları kullanıcılara sınırsız açarsak, kötü niyetli arkadaşımız istediği bir anda (ki bu genelde çok kritik bir an olur) kaynakların hepsini tüketerek sistemimizi çalışamaz durumda bırakabilir. Hangi kullanıcının kaynaklar üzerinde ne kadar hakkı olduğunu "ulimit" komutu ile görebilirsiniz. LILO Parolası: İnsanlar bazen evi için tüm güvenlik önlemlerini alırlar. Değerli eşyalarını kilitli yerlerde saklarlar, tüm pencerelerini kapalı tutarlar, evde bekçi köpeği beslerler fakat evin ön kapısını bazen açık unutabilirler. Bilgisayar güvenliği dediğimizde de tüm önlemleri alırız fakat biz farkında olmadan bilgisayarımıza fiziksel olarak erişecek kişiyi bazen hiç düşünmeyiz. Bu nedenle bilgisayarımızın açılması için bazı parolalar koymamız şarttır. Bunlardan bir tanesi BIOS parolasıdır. Bilgisayar üzerinde çalışan işletim sisteminden bağımsız, anakart üzerindeki yongalarda tutulan BIOS parolası, "jumper" ayarları ve anakart pili ile oynanarak sistem üzerinden silinebilir. BIOS parolasını bir şekilde atlatan arkadaşımızı (eğer bilgisayarımıza fiziksel olarak erişip bunu yapabilmişse artık arkadaşımız değildir kendisi) durdurmak istiyorsak, işletim sistemimizin yüklenebilmesi için de parola koyabiliriz. Eğer sisteminiz LILO ile açılıyorsa, LILO'nun başlatacağı herhangi bir işletim sistemi için parola koymak mümkündür. Bunun için "/etc/lilo.conf" dosyasının başına password= your_password optinal satırlarını ekleyiniz ve parola SORULMAYACAK işletim sistemi bloğunun altına restricted satırı ekleyeniz. Bundan sonra LILO, "/etc/lilo.conf" dosyası içindeki bloğunun içinde restricted yazmayan her işletim sistemi için parola soracaktir. KULLANIRKEN: "Log" ların Kontrol Edilmesi: Linux "log" larını "/var/log" dizini altına depolar. Sisteminizde kont- rolünüz dışında birşeylerin gittiğini anlamak için burdaki dosyalar periyodik olarak bakmanızda fayda vardır. Mümkünse loglar üzerinde çalışan bir analiz programı yardımıyla bu işi otomatik hale getirmeniz de mümkün. Bilgisayarınıza Uzaktan Güvenli Bağlantı: Uzaktan bağlantı dediğimizde çoğumuzun aklına "telnet" ve "ftp" gelir. Bu programlar internetle tanıştığımızdan beri yardımımıza koşmakta ve her işimizi görmektedir. Peki bu programların güvenli olduğunu hiç düşündük mü? Sunucu sistemle istemci arasındaki tüm veri aktarımını (kullanıcı ismi ve parola da dahil) şifrelenmemiş düz metin halinde yapan programlara ne kadar güvenebilirsiniz? Evet "telnet" ve "ftp" den bahsediyoruz. Ağ üzerinde iyi bir yere konuşlanmış kötü niyetli arkadaşımız, internetten kolayca bulacağı bir ağ dinleyen program ile şifrelerinizi toplayabilir. Bu nedenle bu iki programın yerine "ssh" kullanmanızı tavsiye ediyoruz. "Sshd" çalışan herhangi bir sunucu sisteme "ssh" ve "sftp" sayesinde güvenli şekilde bağlanabilir (parolanız şifre- lenmiş şekilde iletilir), "telnet" ve "ftp" ile yaptığınız tüm işleri rahatlıkla yapabilirsiniz. Sunucu Programların ve Diğer Programların Çalıştırılması: Eğer herhangi bir sunucu program çalıştıracaksanız, mümkünse bu programı root olarak çalıştırmayın. Root, sistem üzerinde en geniş yetkiye sahip olan (sistemi tamamen yoketmek de buna dahil) kullanıcı olduğundan, root haklarıyla çalışan bir sunucu program kötü amaçlı yönlendirilerek sisteminizde onarılmaz hatalara yol açabilir. Bu nedenle, bu tür programları mümkünse hakları en az kullanıcı ile çalıştırınız. Ahmet ÖZTÜRK ve Mustafa ATAKAN ODTU Bilgi İşlem Daire Başkanlığı Internet Teknolojileri Güvenliği (security@metu.edu.tr 24/12/2001)