Apache`yi kafeste koşturmak. (v1.1)

0
conan
Bir kaç zamandır üzerinde çalışmakta olduğum Apache Web Sunucu'sunu chroot çevresinde çalıştırma ile ilgili dökümanımın ilk bölümünü sonunda bitirmiş bulunmaktayım. chroot nedir? gibi sorulara bu versiyonda cevap vermiyorum. Anlamak için ilk etapta "man chroot" yapmanız gerekiyor şimdilik. :( Onun dışında işte dokumanın ilk versiyonu...
(Not: Bu dokumanın en son versiyonuna her zaman gsu.linux.org.tr/~conan adresinden ulaşabilirsiniz. Hataları lütfen "conan at kingdom nokta 2y nokta net" adresine bildiriniz.)

Apache'yi kafeste koşturmak. (v1.1)

[24/04/2002]

Bu döküman neyi anlatıyor?

Bu döküman apache server'ini, Linux sistemlerde chroot kullanarak yaratılan bir çevrede (environment) çalıştırmayı anlatmaktadır. Ek olarak php4 ve de mod_perl, mod_ssl derlemeyi de içine alacağını umuyorum (uşenmezsem yani)

Bu döküman neyi anlatmıyor?

Bu doküman, apache nasıl ayarlanır, web server nedir, linux nasıl kullanılır, apache nedir, gibi şeyleri anlatmamaktadır! Lutfen bu konudaki sorularınıza cevapları Linux Documentation Project (LDP) ya da favori Linux Kullanıcıları Grubunuzun (LKG) kaynaklarından arayınız.

Bu döküman kimlere hitap ediyor?

Bu döküman apache server`ini maksimum güvenli olarak çalıştırmak isteyen sistem yöneticilerine hitap ediyor. Daha önce program derlemiş olmak, apache ayarlarında deneyim, Linux UNIX üzerinde deneyim anlatılanları anlamada oldukça yardımcı olur, ama bilinmesi şart değildir. Bu dökümanın en son versiyonu her zaman gsu.linux.org.tr/~conan/apache.html adresinde bulunmaktadır.

DİKKAT!

Bu döküman yararlı şeyler anlatmakla birlikte hatalı hareketinizde sisteminize zarar verecek (verebilecek demiyorum dikkat!) sonuçlar doğurabilir. Bu sonuçlardan kesinlikle sorumluluk kabul etmiyorum. Sadece benim öğrendiğim bazı şeyleri sizin de öğrenebilmeniz için yazılmış bir döküman olarak algılanmasını doğru buluyorum. Dökümandaki her şey insan yazısıdır. Hata olması muhtemeldir ve düzeltmeleriniz kesinlikle olumlu tepki ile karşılanacaktır. Düzeltmeler için "conan at kingdom nokta 2y nokta net" adresine email atabilirsiniz.

Anlatacağım sistem özellikleri:

  • Vector Linux 2.0
  • Linux kernel 2.4.X
  • Apache 1.3.23
  • php 4.1.2 Bu anlattıklarımın ufak tefek değişikliklerle bir çok UNIX sistemine uygulanabileceğini düşünüyorum. (Test etmedim)

Başlamadan önceki son notlar ve ipuçları:

  • Bir programın çalışması icin hangi kütüphanelerin (library) gerekli olduğunu bulan komut ldd`dir.
  • Root user`ının yaptığı işleri gösterirken klasik:
         # komut_satırı
    normal bir kullanıcının yaptıklarını gösterirken de:
         $ komut_satırı
    kullanacağım.
  • chroot çevresindeki dosya sistemi için italik yazı stili kullanacağım. DİKKAT: /usr/bin ile usr/bin farklı şeyler unutmayın!
  • RedHat dağıtımını kullanan sistemler genelde root kullanıcı olarak cp komutunu kullanırken interaktif modu açık tutarlar. Eğer sizinki farklı bir sistemse, cp, mv, rm gibi komutları denerken bir kere daha düşünmeniz için şiddetle size -i seçeneğini açik tutun derim. Alias olarak eklemeyi deneyin ;)
  • Apache'nin Dynamic Shared Object (DSO) özelliği açık olarak derlenmesinden bahsedeceğim, eger non-DSO istiyorsaniz sizin uğraşmanız gerekecek. Eger mod_ssl ve mod_perl birlikte derlemek istiyorsanız o zaman sıralama şu şekilde olmalıdır. (mod_ssl icin apache kaynak kodunu biraz değiştirmeniz gerekiyor)
    1. Apache derle
    2. mod_ssl derle ve Apache'ye ekle
    3. mod_perl derle ve Apache'ye ekle
  • Son olarak bütün programları nerelerden indirebileceğinizi bildiğinizi tahmin ediyorum!

Başlayalım mı?

chroot-lanabilecek bir dosya sistemi yaratalım.
  1. Tamamen paranoyak olalım. Mümkünse Apache kurulumumuzu bir başka partisyona yapalım. ve bu partisyonu da root'a (yani /) sembolik olarak linkleyelim. Ben partisyonumu /next olarak monte edilmiş alıyorum. Siz nasıl alıyorsanız gerekli değişiklikleri yapın.
       # mkdir /next/www
       # ln -s /next/www /www
    
  2. İlk dizinleri yaratmaya başlayalım ve usr/bin dizinine bin diye bir link yaratalım.

    İŞTE BURASI BÜYÜK HARFLERLE YAZILACAK KADAR ÖNEMLİ! BURADAN SONRA YAPTIĞINIZ/YAPACAĞINIZ EN UFAK HATA SİSTEMİNİZİN ZARAR GÖRMESİNE YOL AÇAR!!! chroot ÇEVRENİZİ '/' ÇEVRENİZLE ASLA KARIŞTIRMAYIN!!!!!! ÖRNEĞIN: VERDİĞİM KOMUTLARDA etc/passwd YAZDIĞIM YERDE /etc/passwd YAZARSANIZ KÖTÜ SONUÇLAR DOĞURUR!!!! UYARMADI DEMEYİN!

       # cd /www
       # mkdir -p usr/bin usr/lib lib etc tmp dev webhome
       # ln -s usr/bin bin 
    
  3. tmp dizinine gerekli özel izinleri verelim
       # chmod 1777 tmp
  4. /dev/null yaratalım
       # mknod -m 666 dev/null c 1 3
  5. ldd ile bulduğumuz paylaştırılmış kütüphaneleri (shared libraries) yaratmaya başladığımız çevreye ekleyelim.
       # cp -pi /lib/libtermcap.so.2 /lib/ld-linux.so.2 /lib/libc.so.6 lib/
  6. İstediğimiz ortam hemen hemen hazır. Şimdi sıra denemeye geldi.
       # cp -pi /bin/ls /bin/sh /bin/cat bin/
       # chroot /www /bin/ls -l /
         lrwxrwxrwx   1 0        0               7 Jan 29 09:24 bin -> usr/bin
         drwxr-xr-x   2 0        0            1024 Jan 29 09:28 dev
         drwxr-xr-x   2 0        0            3072 Jan 29 13:17 etc
         drwxr-xr-x   2 0        0            1024 Jan 29 13:12 lib
         drwxrwxrwt   2 0        0            1024 Jan 29 09:23 tmp
         drwxr-xr-x   5 0        0            1024 Jan 29 09:23 usr
         drwxr-xr-x   2 0        0            1024 Jan 29 10:41 webhome
    
  7. Daha sonra kopyaladığımız ls komutunu silebiliriz. Nasıl olsa işimize yaramayacak. Test amaçlı kopyalamıştık.
       # rm bin/ls

Kullanıcı yaratımı, DNS ayarları

Buraya kadar her şey güzel gitti umarım. Şimdi bir kullanıcı yaratacağız ve Apache'nin DNS sorgulamaları yapabilmesi için gerekli işlemleri tamamlayacağız.
  1. Sistemde olmayan bir kullanıcı yaratalım. Kullanıcının sistemde olmaması aynı özellikleri kullanarak sisteme kötü kişilerin ulaşamamaları için gereklidir! UID ve GID'i de istediğiniz gibi seçebilirsiniz. (0 olmamak şartıyla tabii ki!) TEKRAR EDİYORUM! BU KOMUTLARI ÇALIŞTIRIRKEN SÜPER, ULTRA, MEGA, HİPER DİKKATLİ OLUN. HARD DİSKİNİZİN NERESİNDESİNİZ? BUNU KESİNLİKLE GÖZÖNÜNDE BULUNDURUN!!!
       # cd /www
       # touch etc/passwd etc/group etc/shadow
       # chmod 400 etc/shadow 
       # chmod 664 etc/passwd
    
  2. passwd, group ve shadow dosyalarında bir kullanıcı/grup yaratalım.
       # echo 'www:x:666:666:Apache Kullanıcısı:/webhome:/usr/bin/False' > etc/passwd
       # echo 'www:x:666:' > etc/group
       # echo 'www:*:10882:-1:99999:-1:-1:-1:134537804' > etc/shadow
    
  3. İsterseniz herşeyin en sağlam olması için kullanıcıya bir de geçersiz shell erişimi de verelim. Öncelikle shell'imizi yaratalım:
       # echo 'int main(int argc, char *argv[]) { return(1); }' > /tmp/False.c
        (Basit bir C programı.)
       # gcc -o /www/usr/bin/false /tmp/False.c
       # rm /tmp/False.c
    
  4. /www/usr/bin dizini içindeki dosyalarımızı sadece çalıştırılabilir yapalım.
       # cd /www
       # chmod 111 usr/bin/*
    
  5. Şimdi de DNS sorgulamaları için gerekli kütüphaneleri ayarlayalım. (Eğer name service ile ilgili hatalar alırsanız 'man nsswitch' ile gerekli olan bazı kütüphaneleri daha eklemeniz gerekiyor demektir. Özellikle de NIS kullanıyorsanız! Aşağıdaki satırlar benim için yeterli oldu. Ben NIS kullanmıyorum.)
       # cp -pi /lib/libnss_files.so.2 lib/
       # cp -pi /lib/libnss_dns.so.2 lib/
    
  6. Şimdi iki tip dosya yaratmamız gerekiyor. Bunlar DNS sorgulanırken kullanılan ayar dosyalarıdır. Sizin IP ve de DNS sunucularınızın (ya da ISPnizin DNS'leri) ayarlarına göre değiştirmeyi unutmayın. (NIS kullanmadığım için sadece DNS için olanını burada anlatıyorum.)
       # cd /www
        (etc/resolv.conf içindekiler şöyle olmalıdır, zaten varolan 
         /etc/resolv.conf dosyanızdan kopya çekebilirsiniz)
          domain mynet.home
          ## Sisteminizde bind tipi bir DNS yoksa DNS Server`ınızın IP`sini kullanın.
          nameserver 123.123.123.123
        (etc/hosts dosyası da aşağıdakine benzemeli, yine 
         /etc/hosts dosyasından kopya çekilebilir)
          127.0.0.1 localhost loopback
          192.168.196.2 bilgisayar.alanadi.com takmaisim
    

Derleme, yerleştirme ve çalıştırma

Hala işler güzel güzel gidiyorsa şimdi apache'yi derleyip yerleştirmenin tam sırası!
  1. Herşeyden önce apache'nin yerleştirileceği tepe dizini yaratalım ve bu yarattığımız dizine de kök dizinden (root) bir sembolik link yaratalım.
       # mkdir /www/apache
       # ln -s /www/apache /apache
       # ls -al /
         total 129
         drwxr-xr-x   28 root     root         3072 Apr  8 10:27 ./
         drwxr-xr-x   28 root     root         3072 Apr  8 10:27 ../
         lrwxrwxrwx    1 root     root           12 Mar  6 16:11 apache -> /www/apache/
         ....
    
  2. Bu dökümanı yaratırken oldukça faydalandığım Denice Deatrich'in dökümanında her programı normal kullanıcı olarak derleyip, root olarak yerleştirmek gerektiği tavsiyesine uyarak normal bir kullanıcıya geçiyorum. (yukarıda da belirttiğim gibi normal kullanıcı $ işareti ile, root # işareti ile gösteriliyor) Benim apache kaynak kodlarım /opt/tars/apache_1.3.23/ içerisinde. (kimi de /usr/local/src kullanır tamamen size kalmış ;) )
       $ cd /opt/tars/
       $ tar xzvf apache_1.3.23.tar.gz
       $ cd apache_1.3.23
    
  3. Burası önemli! config.layout dosyasını değiştirmemiz gerekiyor ki apache derlenirken chroot'a göre derlenebilsin. chroot isimli özel bir layout ekliyoruz. config.layout dosyasının en sonuna aşağıdakine benzer satırlar ekleyin.
            
               prefix:        /apache
               exec_prefix:   $prefix
               bindir:        $exec_prefix/bin
               sbindir:       $exec_prefix/bin
               libexecdir:    $exec_prefix/libexec
               mandir:        $prefix/man
               sysconfdir:    $prefix/conf
               datadir:       $prefix
               iconsdir:      $datadir/icons
               htdocsdir:     $datadir/htdocs
               cgidir:        $datadir/cgi-bin
               includedir:    $prefix/include
               localstatedir: $prefix/var
               runtimedir:    $localstatedir/logs
               logfiledir:    $localstatedir/logs
               proxycachedir: $localstatedir/proxy
            
    
  4. Şimdi configure ve make:
       $ ./configure --with-layout=chroot --enable-module=most --enable-shared=max
        ...
       $ make
       # make install (rootsunuz unutmayın ;)
    

    Gerekli bütün dosyaların /apache içinde olması gerekli. İsterseniz bir kontrol edin. # ls /apache/

    bin/ cgi-bin/ conf/ htdocs/ icons/ include/ libexec/ man/ var/

  5. Gerekli olan bazı kütüphaneleri de yarattığımız chroot çevresine yerleştirmemiz lazım. Asağıdaki kütüphaneler benim için yeterli oldu. Ama açıkçası benim önerim, ldd komutunu kullanarak httpd dosyasının hangi kütüphanelere ihtiyaç duyduğunu bulup o kütüphaneleri chroot çevresine taşımanız.
       # cd /www
       # cp -pi /lib/libm.so.6 /lib/libcrypt.so.1 /lib/libdb.so.3 /lib/libdl.so.2 
         /lib/libc.so.6 /lib/ld-linux.so.2 lib/
    
  6. Şimdi bir deneme yapalım bakalım apache çalışıyor mu.

    httpd.conf dosyasının yerinde olduğunu kontrol edin! /apache/conf dizini içinde olması lazım.
    httpd.conf dosyası en azından şu satırları içinde bulundurmalı.

         User www
         Group www
         ServerName serveriniz.alanadiniz.com(org,net,herneyse)
         Port 80 #ya da hangi porttan calistiracaksaniz.
       www kullanışını ve grubunu belirtmeniz çok önemli!
    
    
  7. root olarak şu komutu deneyelim.
       # chroot /www /apache/bin/apachectl start
    
    
  8. Şimdi ise sunucumuzun çalışıp çalışmadığını kontrol edelim.
       $ lynx http://serveriniz.alanadiniz.com/
    
    
  9. Dilerseniz apachenin html, vs... dökümanlarının yayınlandığı htdocs dizininin sahipliğini de chroot çevresindeki www kullanıcısına verebilirsiniz.
       # chown -R 888:888 /www/apache/htdocs
    
    
Her şey yolunda gittiyse şu anda sizin chroot kafesinde koşan bir apache'niz, (kızılderilerin kafeste olması her nekadar hoşuma gitmese de...) benim de yayınlanmaya hazır bir dökümanım olmuş olması gerekiyor ;)

Dökümanın ikinci versiyonunda: "mysql, php nasıl chroot çevresinde çalıştırılır?"

Görüşler

0
m1a2
Ellerine saglik kardes, bir miktar in -house testinden sonra (yani burasi :) gecikmeden dokumani linux HOWTOya da gonder ;) Yalniz onun için docbook--- sgml kullanmak gerekiyordu galiba, emin degilim...
0
conan
Bi tamamiyle bitsin spam yapip herkese bile yollarim ;))))
OK kuskun olmasin. LDP, linux.org.tr dokuman arsivi, heryere heryere yollayacagim ;)
0
conan
> (Not: Bu dokumanın en son versiyonuna her zaman
> gsu.linux.org.tr/~conan adresinden
> ulaşabilirsiniz. Hataları lütfen

Hatalari lutfen conan at kingdom nokta 2y nokta net adresine bildiriniz.

Onaylanirken sanirim silinmis ;)

Görüş belirtmek için giriş yapın...

İlgili Yazılar

21 Günde Değil 10 Yılda Programlama Öğrenin

FZ

Herhangi bir kitapçıya gittiğinizde Teach Yourself Java in 7 Days (7 Günde Java Öğrenin) benzeri, size birkaç günde veya birkaç saatte Visual Basic, Windows, Internet (vs.) öğretmeyi vadeden kitaplarla karşılaşırsınız...

... Birkaç günde, Beethoven, kuantum fiziği ya da köpek eğitimi öğreten kitaplar yok. Bu sonuçlara bakılırsa, ya insanlar bilgisayar hakkında yeni şeyler öğrenmek için çok hevesli ve aceleci ya da bu iş bir şekilde inanılmaz derecede kolay.

... Araştırmacıların da (Hayes, Bloom) ortaya koyduğu üzere, satranç oynamaktan beste yapmaya, resimden piyanoya, yüzmeden tenise ya da nöropiskoloji ve topoloji alanlarında araştırma yapmaya kadar bir çok alanda uzman olmak, on yıl civarında bir zaman alıyor ve bunun bir kısayolu var gibi gözükmüyor.

Peter Norvig'in "Teach Yourself Programming in Ten Years" başlıklı makalesinin çevirisini On Yılda Programlama Öğrenin adresinde okuyabilirsiniz.

C64 Türkiye #4 Çıktı

anonim

Ne zaman çıkacağı belli olmayan C64 dergisi C64 Türkiye'nin 4. sayısı sonunda çıktı. Derginin son sayısı ve dergide tanıtılan programlar için internet sitemize uğrayabilirsiniz: http://geocities.com/c64turkiye

Python 101: Eğlenceli bir programlama diline genel bir bakış

FZ

FM üyelerinden tongucyumruk'un yazdığı Eğlenceli bir programlama dili: Python başlıklı belgeyi FM camiası ile paylaşıyoruz.

Hazır 2.4 sürümü çıkmış iken meraklısı için iyi bir başlangıç olur diye düşündük.

Not:Bu belge LATEX belge hazırlama sistemi ile hazırlanmıştır. LaTeX ile üretilen PDF ve sıkıştırılmış PostScript belgelerini de kağıda kaliteli çıktı almak için kullanabilirsiniz.

Dil Üstadları ile Araç Ustaları: IDE Ayrımı

FZ

Geliştirici dünyası iki kampa ayrılmıştır. Bir kampta dil üstadları vardır, bu yazılımcılar yüksek seviyeli programlamadan -- birinci-sınıf fonksiyonlar, aşamalı programlama, AOP, MOP, kendi kendini sorgulama -- bahsederler. Araç ustaları ise tümleşik geliştirme ve hata ayıklama araçlarında ustadırlar, kod tamamlama, "refactoring", vs. Dil üstadları Emacs ya da VIM kullanır, bu tür editörler yeni dilleri denemek için daha uygundur. Araç ustaları ise Visual Studio, Eclipse, IntelliJ gibi IDE'leri kullanırlar.

Laszlo ve Groovy gibi yeni diller ya da AOP (Aspect Oriented Programming) gibi dil uzantıları genellikle öncelikli olarak metin-editörü tabanlı yazılım geliştirme ortamlarında ortaya çıkarlar ve ancak ondan bir süre sonra IDE dünyası bu tür desteklere kavuşur. Eğer dil ya da uzantı gerçekten başarılı ise araçlar da bunu desteklemeye başlar. Bu ayrımın tek sebebi araç geliştirmenin dil geliştirmekten zor olması değildir. Asıl mesele bir dile hakim olmak ile bir araç setine hakim olmanın çok farklı iki mantalite olmasıdır, belli bir ölçüye dek bunlar birbirlerini dışlayan alternatiflerdir. Acaba neden? İşte sebepleri...

Oliver Steele'nin The IDE Divide başlıklı makalesini tüm yazılım geliştiricilerin okumasında fayda var. (Not: Şöyle sağlam bir FM üyesi çıksa da bahsi geçen makaleyi Türk diline kazandırsa... hani yani küçük bir olasılık olsa da, belki diyorum, belki biri üstlenir, FM'ye bir katkıda bulunur...)

Açık Akademi'den Ajax kitabı: Sağlamlığı Kanıtlanmış Tekniklerle Web 2.0 AJAX

yenigul

New Riders yayınlarından çıkan Bulletprof AJAX kitabı, Açık Akademi yayınlarından Sağlamlığı Kanıtlanmış Tekniklerle Web 2.0 AJAX adıyla yayınlanmıştır.