Pro FTP Ayarları
ProFTPD bir FTP sunucusu yazılımıdır. Apache’ye benzer yapılandırma dosyaları ile kurulumu ve yapılandırması son derece kolay olan ProFTPD, aynı zamanda çok gelişmiş özelliklere sahiptir.
1 FTP
FTP (File Transfer Protocol - Dosya Aktarım Protokolü), ağ üzerinden dosya transferi gerçekleştirmek için tanımlanmış bir protokoldür (iletişim kuralları). Bir FTP istemcisi (client), bir FTP sunucusuna (server) dosya transferi için bağlantı açar ve istekte bulunur (dosya gönderme ya da alma gibi). FTP sunucusu gelen kullanıcıyı ve isteği değerlendirir ve her şey yolunda ise istemciye dosyayı gönderir (ya da istemcinin gönderdiği dosyayı kabul eder). FTP sunucusu ile FTP istemcisi arasındaki bu iletişimin belli kuralları vardır. Bu iletişim kurallarına FTP denir.
FTP protokolü üzerinden dosyalarınızı yayınlarken, FTP sunucunuza kullanıcı doğrulama zorunluluğu getirerek, yetkisiz kişilerin dosya transferini önleyebilir ya da isimsiz kullanıcılarında FTP sunucunuza okuma erişimini sağlayabilirsiniz.
2 ProFTPD
Bu belge Debian Linux dağıtımı esas alınarak hazırlanmıştır.
2.1 ProFTPD Kurulumu
ProFTPD sunucusunu kurmak için:
# aptitude install proftpd
komutunu kullanalım. Aptitude paket yöneticisi, ProFTPD kurulum işlemi sırasında, size ProFTPD’nin inetd altında mı yoksa kendi başına çalışan bir servis olarak mı (standalone) çalıştırmak istediğinizi sorar. Eğer bu devamlı FTP hizmeti veren bir sunucu ise, standalone seçeneğini seçin (Daha sonradan ProFTPD’nin çalışma şeklini değiştirmek isterseniz, /etc/proftpd/proftpd.conf dosyasındaki ServerType yönergesinin değerini inetd ya da standalone yapın. inetd’den standalone’a geçiyorsanız, inetd’nin ftp servisini update-inetd --disable ftp komutu ile devre dışı bırakmayı unutmayın).
Kurulum işlemi tamamlandıktan sonra, ProFTPD otomatik olarak başlatılır. Eğer daha sonradan elle başlatmak isterseniz:
# /etc/init.d/proftpd start
komutunu kullanabilirsiniz (Yeniden başlatmak için start yerine restart, durdurmak için stop yazın).
İlk olarak, ProFTPD kurulumunu test edelim. Bunun için ProFTPD’yi yüklediğimiz sunucuda, herhangi bir FTP istemcisi ile ProFTPD’ye bağlanmayı deneyelim. Biz işimizi görmesi dolayısıyla komut satırından çalışan, ftp komutuyla çağırdığımız, FTP istemcisini kullanacağız. Sunucuya bağlanırken, kullanıcı olarak, sunucumuzda var olan dogan hesabını seçeceğiz (Varsayılan olarak, ProFTPD kullanıcı doğrulaması için /etc/passwd dosyasını kullanır. Bu yüzden giriş yaparken seçtiğiniz kullanıcı, sunucu sisteminde var olan bir kullanıcı olmalıdır):
$ ftp localhost Connected to localhost. 220 ProFTPD 1.3.0 Server (Debian) [::ffff:127.0.0.1] Name: dogan 331 Password required for dogan. Password: 230 User dogan logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 200 PORT command successful 150 Opening ASCII mode data connection for file list drwx------ 2 dogan dogan 4096 Jul 31 11:54 Desktop 226 Transfer complete. ftp>
Örnekte görüldüğü gibi, localhost’a (yerel konak) dogan kullanıcısı ile bağlandık. Daha sonradan FTP sunucusundaki dosyaları listelemek için ls komutunu kullandık.
Eğer bağlanmakta bir problem yaşıyorsanız, /var/log/syslog log dosyasını ve /var/log/proftpd/ dizini altındaki logları takip edin ve Sorun Giderme bölümünü inceleyin.
3 ProFTPD Yapılandırması
ProFTPD yapılandırma dosyaları /etc/proftpd/ dizini altında bulunur. Standart yüklemede, bu dizin içerisinde ana yapılandırma dosyası proftpd.conf ve modül yapılandırma dosyası modules.conf olmak üzere iki dosya vardır.
Bu iki yapılandırma dosyasını incelemeden önce ProFTPD yapılandırma dosyaları söz dizimini inceleyeceğiz.
3.1 Yapılandırma Dosyaları Söz dizimi
ProFTPD yapılandırma dosyaları, Apache’nin yapılandırma dosyalarına oldukça benzer. Yapılandırma dosyaları çoğunlukla yönergelerden oluşur. Söz dizimi Yonerge parametre şeklindedir. Örneğin:
ServerName "Magma FTP Server"
Yönergelerin yanında bazı durumlar için (dizinler, sanal konaklar gibi) birden fazla yönergeyi içerinde barındıran etiketler vardır. Örneğin bir dizin ile ilgili ayarlar <Directory "dizin_yolu"> </Directory> etiketleri arasında bulunur (bu etiketler sadece belirtildiği yeri etkileyecek bir context oluşturur. Bu yüzden ProFTPD belgelendirmelerinde bunlar için context sözcüğü kullanılır. Tüm etiketlerin dışındaki alan, server context’idir).
3.2 Anonim (Anonymous) Bağlantılar
Sadece sunucu sisteminde bulunan kullanıcıların (/etc/passwd dosyasında) yanında, anonim kullanıcıların da FTP sunucusuna bağlanmasına izin vermek istediğiniz durumlar oluşabilir. Örneğin Debian GNU/Linux dağıtımının FTP yansısı olduğunuzu düşünelim. Bu durumda her kullanıcının sizin FTP sunucunuza erişebilmesi gereklidir. Böyle durumlarda FTP sunucusunun anonim kullanıcıları nasıl karşılayacağı, anonim kullanıcılara ne gibi izinler vereceği önemli bir konu olmaya başlar.
Anonim kullanıcıların erişimine izin vermek için proftpd.conf dosyasını açıyoruz <Anonymous ftp> </Anonymous> etiketlerinin arasındaki bütün satırların başındaki # işaretini siliyoruz (<Anonymous ftp> </Anonymous> satırlarının başındaki # işaretleri de dahil olmak üzere). Sonuç olarak bu kısım aşağıdakine benzer bir yapıda olmalı (Dosyadaki bizi ilgilendirmeyen kısımlar ve yorum satırları buraya yazılmadı):
<Anonymous ~ftp> User ftp Group nogroup UserAlias anonymous ftp DirFakeUser on ftp DirFakeGroup on ftp RequireValidShell off MaxClients 10 DisplayLogin welcome.msg DisplayFirstChdir .message <Directory *> <Limit WRITE> DenyAll </Limit> </Directory> </Anonymous>
<Anonymous ∼ftp> </Anonymous> etiketi, ProFTPD anonim kullanıcılarının bağlantı ayarlarının bekirtildiği yerdir. <Anonymous ∼ftp> etiketindeki ∼ftp kısmı, sistem kullanıcısı olan ftp isimli kullanıcının ev dizinine işaret eder (Eğer isterseniz ∼ftp yerine açıkça /home/ftp şeklinde bir yol da belirtebilirsiniz). Bu dizin, anonim giriş yapıldığında anonim kullanıcının başlangıç dizini olur.
<Anonymous ∼ftp> </Anonymous> etiketi içerisindeki yönergeleri sırayla inceleyelim:
User yönergesi, anonim kullanıcının sistemdeki kullanıcı hesabını belirtir. Yani anonim kullanıcı giriş yaptığında, bu yönergede belirtilen kullanıcı olarak sisteme giriş yapmış olur. Aynı şekilde Group yönergesi anonim kullanıcının grubunu belirler.
UserAlias yönergesi, anonim kullanıcı için takma adlar belirler. FTP sunucusunu anonim kullanıcı olarak giriş yapılacağı zaman, kullanıcı adı olarak bu isimlerden herhangi biri kullanılabilir.
MaxClients yönergesi, aynı anda FTP sunucusunu kullanabilecek maksimum anonim kullanıcıyı belirler.
DisplayLogin yönergesi, anonim kullanıcı giriş yaptığında, gösterilecek mesajın bulunduğu dosyanın ismini belirtir. Mutlak veya göreceli bir yol belirtilebilir. Göreceli yol belirtildiğinde, başlangıç yolu olarak <Anonymous ∼ftp> etiketinde belirttiğiniz yol kullanılır.
DisplayFirstChdir yönergesi eskimiş ve kullanımı azalmış (deprecated) bir yönergedir. Yerine DisplayChdir kullanılmaktadır. DisplayChdir yönergesi bir dizine girildiğinde gösterilecek mesajın bulunduğu dosyanın ismini belirtir.
<Anonymous> etiketi içerisinde, <Directory>; ve bu <Directory> etiketi içerisinde bir <Limit> etiketi görülmektedir. Bir etiket içerisindeki ayarların sadece o etiketin context’ini etkilediğini hatırlayın (Örneğin <Anonymous> etiketi içerisindeki ayarlar sadece anonim kullanıcıları, <Directory> etiketi içerisindeki ayarlar sadece belirtilen dizini, <Limit> etiketi içerisindeki ayarlar sadece belirtilen limiti etkiler). Şimdi yukarıdaki etiketlerin içiçe yuvalandığı yapıyı açıklayalım:
Anonim kullanıcılara (<Anonymous ∼ftp>); bütün dizinler içerisindeki (<Directory *>); yazma limiti (<Limit WRITE>) yasak olarak ayarlanmıştır (DenyAll).
3.3 Kullanıcıları Kendi Ev Dizinlerine Hapsetmek
FTP kullanıcılarınızın, başka kullanıcıların dosyalarını görmesini engellemek, onları kendi ev dizinleri içine hapsetmek oldukça çok kullanılan bir özelliktir. Çünkü bir kullanıcı sadece kendi ev dizini ile ilgilenmeli ve sadece onunla ilgili işlem yapmalıdır.
FTP kullanıcıları ev dizinlerine hapsetmek için proftpd.conf dosyasını açıyoruz ve aşağıdaki satır yoksa ekliyoruz:
DefaultRoot ~
3.4 Sanal Kullanıcılar
Eğer SSL/TLS kullanmadan FTP sunucusuna bağlanıyorsanız, kullanıcı paroları ağ üzerinde çıplak bir şekilde taşındığı için, ağı dinleyen biri tarafından ele geçirilip, daha sonradan telnet ya da ssh ile sunucunuza bağlanmak üzere kullanılabilir. Bu yüzden /etc/passwd dosyasında belirtilmiş sistem kullanıcıları yerine, sadece FTP servisi için sanal kullanıcılar oluşturmalısınız. Bu sanal kullanıcıların bilgileri /etc/passwd benzeri bir başka dosyada tutulabileceği gibi, LDAP dizinlerinde ya da SQL tablolarında da tutulabilir.
Biz bu belge de ProFTPD sunucusu üzerinde sanal kullanıcı bilgilerini saklamak için metin dosyalarını kullanacağız (Kullanıcı bilgilerinin yanında grup bilgilerimiz için de ayrı bir metin dosyası yaratacağız). Kullanıcı bilgilerinin bulunacağı dosya ve grup bilgilerinin bulunacağı dosya, sırasıyla, /etc/passwd ve /etc/group dosyaları ile aynı biçimde olmalıdır. Eğer bu dosyaların biçimleri hakkında bir fikriniz yoksa ya da elle yaratmaya korkuyorsanız, dert etmeyin. Dosyaları oluşturma işini ProFTPD yazılımı ile birlikte gelen ftpasswd aracına bırakacağız.
Sanal kullanıcılarımızın ev dizinlerinin bulunacağı dizini yaratalım. Biz bunun için /var/ftp/vusers dizinini seçtik:
# mkdir -p /var/ftp/vusers
Yaratacağımız kullanıcının ev dizinini oluşturalım (bu örnekte kullanıcı adı olarak mehmet seçtik):
# mkdir /var/ftp/vusers/mehmet
Yarattığımız bu dizini, biraz sonra yaratacağımız 3000 numaralı ID’ye sahip mehmet kullanıcısı ve 3000 numaralı users grubuna devrettik:
# chown 3000:3000 /var/ftp/vusers/mehmet
Şimdi ilk kullanıcımızı oluşturalım:
# ftpasswd --passwd --name mehmet --home /var/ftp/vusers/mehmet --shell /bin/sh --uid 3000 --gid 3000
Komutu çalıştırdığınızda mehmet kullanıcısı için bir parola girmeniz istenecek. Bu komut, eğer bulunduğumuz dizinde ftpd.passwd dosyası yoksa yaratır, var ise verdiğimiz parametrelere göre bu dosyayı günceller. --passwd parametresi yaratılacak (ya da güncellenecek) dosyanın kullanıcı dosyası olduğunu, --name parametresi kullanıcının ismini, --home parametresi kullanıcının ev dizinini (kullanıcı giriş yaptığında başlayacağı dizin), --shell kullanıcının kabuğunu (komut satırı), --uid kullanıcı ID’sini, --gid ise kullanıcının grup ID’sini belirtir. Belirttiğimiz kullanıcı ID’si keyfidir. Genel davranış ls gibi uygulamaların şaşırmaması için sistem kullanıcılarının ID’leri dışında değerler seçmektir. Belirttiğimiz grup ID’si ilerde yaratacağımız gruba referans etmektedir.
Gruplarımızın bulunacağı dosyayı oluşturalım, users adında bir grup ekleyelim ve mehmet kullanıcısını bu grubun üyesi yapalım:
# ftpasswd --group --name users --gid 3000 --member mehmet
Bu komut eğer bulunduğumuz dizinde ftpd.group dosyası yoksa yaratır, var ise verdiğimiz parametrelere göre bu dosyayı günceller. --group parametresi yaratılacak (ya da güncellenecek) dosyanın grup dosyası olduğunu, --name parametresi grubun ismini, --gid parametresi ise grubun ID’sini belirler (Burada 3000 seçmemiz tamamıyla keyfidir. Genellikle /etc/group dosyasındaki grupların ID’lerinden farklı bir ID seçmeniz tavsiye edilir. Çünkü ls gibi uygulamalar /etc/passwd dosyasındaki ID’lere bakarak kullanıcı bilgilerini gösterdikleri için, bu tür uygulamaların çıktıları beklediğiniz gibi olmayabilir). Bu komutu çalıştırdıktan sonra, bulunduğunuz dizinde yaratılmış olan ftpd.group dosyasını bir metin editörü ile inceleyebilirsiniz.
Son olarak ProFTPD’ye kullanıcı bilgileri ve grup bilgileri için hangi dosyaları kullanacağını söyleyelim. proftpd.conf dosyasını açıyoruz ve aşağıdaki satırları ekliyoruz (Siz ftpd.passwd ve ftpd.group dosyalarını bir başka dizinde tutuyorsanız aşağıdaki yönergeleri kendinize göre değiştirin):
AuthUserFile /etc/proftpd/ftpd.passwd AuthGroupFile /etc/proftpd/ftpd.group
Şimdi bir başka senaryoya bakalım. Diyelim ki bir kullanıcının, HTTP üzerinden yayınlanan bir web sitesi var. Ve bu kullanıcı web sitesi dosyalarını FTP yolu ile transfer etmek istiyor. Şimdi bu senaryoyu gerçekleştirelim.
Kullanıcının web sitesinin /srv/www/magmalinux.org/htdocs dizini altında olduğunu düşünelim. Bu amaçla oluşturacağımız FTP kullanıcısının ev dizinini /srv/www/magmalinux.org olarak belirleyeceğiz.
Dikkat! FTP yoluyla transfer ettiğimiz dosyaların izinleri, HTTP servisini çalıştıran kullanıcının erişimine uygun olması gerekir.
Apache HTTP servisi www-data kullanıcısı ve www-data grubu ile çalıştığı için, sanal kullanıcımızın ID’sini ve sanal kullanıcımızın grup ID’sini, sistemdeki www-data kullanıcısı ile aynı yapacağız. Kullanıcımızı yaratmadan önce /etc/passwd dosyasını açalım ve www-data kullanıcı ID’si ve grup ID’sini öğrenelim. /etc/passwd dosyasındaki bizi ilgilendiren satır şu şekilde olmalı:
www-data:x:33:33:www-data:/var/www:/bin/sh
Üçüncü sütundaki değer yaratacağımız sanal kullanıcının ID’si ve dördüncü sütun bu sanal kullanıcının grup ID’si olacak (Bizim sistemimizde iki değer de 33).
Şimdi ev dizini /srv/www/magmalinux.org olan enes isminde bir kullanıcı yaratalım:
# ftpasswd --passwd --name enes --home /srv/www/magmalinux.org --shell /bin/sh --uid 33 --gid 33
www-data isminde bir sanal grup oluşturalım:
# ftpasswd --group --name www-data --gid 33 --member enes,mehmet
Sıra en heyecanlı test aşamasına geldi:
- Herhangi bir FTP istemcisi ile sunucunuza bağlanın:
$ ls anasayfa.html belgeler code Desktop dosya $ ftp ftp.magmalinux.org Connected to ftp.magmalinux.org. 220 ProFTPD 1.3.0 Server Name: enes 331 Password required for enes. Password: 230 User enes logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 200 PORT command successful 150 Opening ASCII mode data connection for file list drwxr-xr-x 2 enes www-data 4096 Aug 6 08:12 htdocs 226 Transfer complete.
- htdocs dizinine geçin:
ftp> cd htdocs 250 CWD command successful
- Dosyalarınızı FTP sunucusuna gönderin:
ftp> put anasayfa.html local: anasayfa.html remote: anasayfa.html 200 PORT command successful 150 Opening BINARY mode data connection for anasayfa.html 226 Transfer complete. 37 bytes sent in 0.00 secs (708.5 kB/s) ftp> ls 200 PORT command successful 150 Opening ASCII mode data connection for file list -rw-r--r-- 1 enes www-data 37 Aug 6 08:23 anasayfa.html 226 Transfer complete. ftp>
- Bir internet tarayıcısı ile web sayfanızı ziyaret edin.
3.5 Kota Yapılandırması
Bu bölümde FTP kullanıcılarımıza kota sınırlaması getirmek için ProFTPD mod_quotatab modülünü kullanacağız. ProFTPD kota desteğini dosya sisteminin sağladığı kota desteğinden farklı olarak, ProFTPD uygulaması düzeyinde gerçekleştirir. Yani FTP kullanıcılarınızın telnet ya da ssh hesabı da var ise, ProFTPD için yaptığınız kota ayarları, bu uygulamalar için geçerli olmayacaktır.
ProFTPD’de kota desteği için kullanılan iki dosya vardır. Bunlardan birincisi limit tablosu (dosyası) olup, kullanıcıların mutlak kapasite limitlerini belirler. İkincisi ise kullanıcıların mevcut durumda hesaplarının ne kadarının dolu olduğunu tutan çetele (tally) tablosudur. Bu tabloları oluşturmak için ProFTPD yazılımı ile birlikte dağıtılan ftpquota aracını kullanacağız.
İlk olarak limit tablosunu oluşturalım (Aşağıdaki komutu çalıştırmadan önce cd /etc/proftpd komutu ile dizin değiştirmeniz tavsiye edilir. Çünkü ftpquota komutu varsayılan olarak, kota dosyalarını çalıştırıldığı dizin içerisinde yaratır):
# ftpquota --create-table --type=limit
Bu komut bulunduğumuz dizin içerisinde bir ftpquota.limittab dosyası yaratacak. Şimdi de çetele tablosunu oluşturalım:
# ftpquota --create-table --type=tally
Bulunduğumuz dizin de bir de ftpquota.tallytab dosyası yaratılmış olmalıdır. Tablolarımızı yarattıktan sonra, ProFTPD’yi bu tablolardan haberdar edelim. Bunun için proftpd.conf dosyasını açıyoruz ve aşağıdaki satırları ekliyoruz (Dikkat! Bu satırları eklemeden önce benzer satırların dosya içerisinde daha önceden var olup olmadığını kontrol edin. Eğer Debian üzerinde ProFTPD’nin 1.3.0-19etch1 sürümünü kullanıyorsanız, paketle birlikte gelen proftpd.conf içerisinde <IfModule mod_quota.c> satırını <IfModule mod_quotatab.c> olarak değiştirin):
<IfModule mod_quotatab.c> QuotaEngine on QuotaLog /var/log/proftpd/quota.log <IfModule mod_quotatab_file.c> QuotaLimitTable file:/etc/proftpd/ftpquota.limittab QuotaTallyTable file:/etc/proftpd/ftpquota.tallytab </IfModule> </IfModule>
QuotaEngine yönergesi, değeri on ise kota desteğini açar, off ise kapatır. Kota desteğini kapatmak istediğiniz zaman, kota ile ilgili tüm yapılandırmaları yorum satırı haline getirmek yerine, bu yönergeye off değerini vermek çok daha kolaydır.
QuotaLog yönergesi, mod_quotatab modülünün kullanacağı log dosyasını belirler.
<IfModule mod_quotatab_file.c> etiketi mod_quotatab_file modülü yüklü ise uygulanacak yönergeleri belirler (Kota tablolarını dosyalarda tutmak yerine MySQL ya da LDAP dizinlerinde de tutabilirsiniz. Bu durumda mod_quotatab_file yerine, sırasıyla, mod_quotatab_sql ya da mod_quotatab_ldap modülünü kullanmalısınız).
QuotaLimitTable yönergesi, limit tablosunun yolunu belirler. ftpquota.limittab dosyası, ftpquota uygulamasını hangi dizinde çalıştırır iseniz o dizinde oluşturulur. Bu yüzden sizin ftpquota.limittab dosyanızın yolu farklı ise bu yönergeyi kendinize uygun bir biçimde değiştirin (ya da bu dosyayı /etc/proftpd dizinine taşıyın. Düzen açısından bu şekilde yapmanız tavsiye edilir).
QuotaTallyTable yönergesi, çetele tablosunun yolunu belirler. QuotaLimitTable yönergesinin açıklamasında da belirtildiği gibi, bu yönergeyi kendinize uygun bir biçimde değiştirmelisiniz (Tavsiye edilen davranış ftpquota.tallytab dosyasını /etc/proftpd dizinine taşımaktır).
Bu ayarlamaları yaptıktan sonra, ProFTPD servisini yeniden başlatalım:
# /etc/init.d/proftpd restart
Test için enes kullanıcısının gönderebileceği (upload) maksimum byte sayısını belirleyelim (aşağıdaki komutu ftpquota.limittab ve ftpquota.tallytab dosyasını yarattığınız dizinde çalıştırın):
# ftpquota --add-record --type=limit --name=enes --quota-type=user --bytes-upload=10000000
Yukarıdaki komuttaki --bytes-upload parametresi, --name parametresi ile belirtilmiş kullanıcı için gönderebileceği maksimum byte limitini belirler (Örneğimizde 10000000 Byte, yani 10 MB).
Şimdi enes kullanıcısı ile 10MB’ı sınırını zorlayalım:
$ ftp ftp.magmalinux.org Connected to ftp.magmalinux.org. 220 ProFTPD 1.3.0 Server Name: enes 331 Password required for enes. Password: 230 User enes logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> put dosya.zip 200 PORT command successful 150 Opening BINARY mode data connection for dosya.zip netout: Broken pipe 552-Transfer aborted. Disk quota exceeded 552-STOR: notice: quota reached: used 10016368.00 of 10000000.00 upload bytes 552 STOR: notice: quota reached: 'dosya.zip' removed ftp>
FTP sunucusuna SITE QUOTA komutunu göndererek enes kullanıcısının kota durumunu görelim:
ftp> quote SITE QUOTA 200-The current quota for this session are [current/limit]: 200-Name: enes 200-Quota Type: User 200-Per Session: False 200-Limit Type: Hard 200- Uploaded bytes: 359696.00/10000000.00 200- Downloaded bytes: unlimited 200- Transferred bytes: unlimited 200- Uploaded files: unlimited 200- Downloaded files: unlimited 200- Transferred files: unlimited 200 Please contact root@magmalinux.org if these entries are inaccurate
Daha sonradan enes kullanıcısı için bu 10MB ın yetersiz olduğuna karar verdiğimizi düşünelim. Bu değeri değiştirmek için yine ftpquota aracını kullanacağız. Fakat bu sefer --add-record yerine --update-record parametresini kullanacağız (Eğer enes için tanımlanmış kota kayıdını silmek istiyor isek --delete-record parametresini, tanımlanmış kota seçeneklerini görmek istiyorsak --show-records parametresini kullanmalıyız). Aşağıdaki komut ile enes kullanıcısının kotasını limitsiz yapalım (-1 değeri limitsiz anlamına gelir):
# ftpquota --update-record --type=limit --name=enes --quota-type=user --bytes-upload=-1
Yaptığımız değişikliği aşağıdaki komut yardımı ile kontrol edelim:
# ftpquota --show-records --type=limit ------------------------------------------- Name: enes Quota Type: User Per Session: False Limit Type: Hard Uploaded bytes: unlimited Downloaded bytes: unlimited Transferred bytes: unlimited Uploaded files: unlimited Downloaded files: unlimited Transferred files: unlimited
Bir kullanıcı için nasıl kota tanımlandığından bahsettik. Peki ya aynı ayarları yüzlerce kullanıcı için yaptığınızı bir düşünün. Aynı adımları her kullanıcı için tekrarlamak yerine, gruplar için nasıl kota belirtebileceğimize bir bakalım. Örneğimiz için www-data grubunu seçtik. Bu gruba dahil kullanıcılara 50MB’lık kota verelim:
# ftpquota --add-record --type=limit --name=www-data --quota-type=group --bytes-upload=50000000
Değişen parametrelere dikkat edin. Birincisi artık kullanıcı adı yerine grup adı alan --name parametresi, diğeri ise --quota-type parametresidir.
Grup için belirtilen kota ayarları, öncelik sıralamasında, kullanıcı için tanımlananlardan sonra gelir. Yani www-data grubunda bulunan enes kullanıcısı için kota limiti yok iken, www-data grubundaki diğer kullanıcıların 50MB kotası vardır (Çünkü enes, www-data grubunda bulunduğu halde, bu kullanıcı için özel bir kota tanımlaması yapılmıştır).
3.6 Sanal Konaklar (Virtual Hosts)
Aynı ProFTPD sunucusunu, birden fazla IP adresine ya da birden fazla porta aynı anda FTP hizmeti verebilecek şekilde yapılandırabilirsiniz. FTP hizmeti verilen bu her bir IP adresi veya port sanal konak olarak adlandırılır.
FTP iletişim kurallarında HTTP/1.1 de olduğu gibi, istemcinin ulaşmak istediği alan adını belirten Host başlığı olmadığından, FTP sunucusunun gelen isteğin hangi alan adına yapılmakta olduğunu bilme gibi bir şansı yoktur. Bu durumda sanal konak tanımlamanın iki yolu var. Birincisi her bir konak için farklı bir IP adresi kullanmak ya da aynı IP adresi üzerinde farklı portlar kullanmaktır.
Örnek olması açısından iki sanal konak tanımlayalım ve yukarıda bahsettiğimiz iki yöntemi de deneyelim. İlk olarak her bir konak için farklı bir IP adresi kullanalım. Sanal konak tanımlarımız için yine proftpd.conf dosyamızı kullanıyoruz (Düzen olması açısından eğer isterseniz sanal konak tanımlarını başka bir dosya içerisinde yapıp proftpd.conf dosyasına Include yönergesi ile dahil edebilirsiniz):
<VirtualHost 192.168.1.2> ServerName "Ikinci Magma FTP Sunucusu" DefaultRoot ~ </VirtualHost> <VirtualHost 10.1.0.1> ServerName "Ucuncu Magma FTP Sunucusu" DefaultRoot ~ </VirtualHost>
Şimdi aynı IP adresini fakat farklı bir portları kullanan iki tane sanal konak tanımlayalım.
<VirtualHost 192.168.1.2> ServerName "Dorduncu Magma FTP Sunucusu" DefaultRoot ~ Port 1027 </VirtualHost> <VirtualHost 192.168.1.2> ServerName "Besinci Magma FTP Sunucusu" DefaultRoot ~ Port 990 </VirtualHost>
Tanımladığımız bu sanal konakları sırayla test edelim:
$ ftp 192.168.1.2 Connected to 192.168.1.2. 220 ProFTPD 1.3.0 Server (Ikinci Magma FTP Sunucusu) [::ffff:192.168.1.2] Name: dogan 331 Password required for dogan. Password: 230 User dogan logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp>
$ ftp 10.1.0.1 Connected to 10.1.0.1. 220 ProFTPD 1.3.0 Server (Ucuncu Magma FTP Sunucusu) [::ffff:192.168.1.2] Name: dogan 331 Password required for dogan. Password: 230 User dogan logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp>
$ ftp 192.168.1.2 1027 Connected to 192.168.1.2. 220 ProFTPD 1.3.0 Server (Dorduncu Magma FTP Sunucusu) [::ffff:192.168.1.2] Name: dogan 331 Password required for dogan. Password: 230 User dogan logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp>
3.7 proftpd.conf
ProFTPD ana yapılandırma dosyası olup değişikliğin en yoğun yapılacağı dosyadır. Bir proftpd.conf dosyasındaki en çok ilgileneceğimiz yönergeleri ayrıntısıyla inceleyelim:
Include /etc/proftpd/modules.conf UseIPv6 on ServerName "Debian" ServerType standalone DeferWelcome off
İlk satır modül ayarlarının bulunduğu modules.conf dosyasını bu dosya içerisine dahil eder.
UseIPv6 yönergesi IPv6’nın kullanıp kullanılmayacağını belirler. Eğer sadece IPv4 ile çalışıyorsanız, değerinin off olmasında bir sakınca yoktur.
ServerName yönergesi, FTP bağlantısı sırasında kullanıcıya gösterilecek sunucu ismini belirler.
ServerType yönergesinin değeri inetd ise FTP hizmeti inetd altında verilir. Değeri standalone ise sunucu ayrı bir süreç olarak çalışır.
DeferWelcome yönergesinin değeri on olduğunda, kullanıcı girişi doğrulanana kadar ServerName yönergesinde yazan sunucu ismi gösterilmez.
DefaultServer on ShowSymlinks on
DefaultServer yönergesi, gelen istek herhangi bir sanal konak (virtual host) ile eşleşmez ise sunucunun cevap verip vermeyeceğini belirler. Değeri off ise, sunucu "no server available to service your request" cevabını gönderir. Değeri on ise, DefaultServer hangi sanal konakta on olarak belirtilmiş ise bu sanal konak varsayılan sunucu olur. Yani herhangi bir sanal konakla eşleşmeyen istekler için bu sanal konak geçerli olur.
ShowSymlinks yönergesi, gelen isteklere sembolik linklerin gösterilip gösterilmeyeceğini belirler.
DisplayLogin welcome.msg DisplayFirstChdir .message ListOptions "-l"
DisplayLogin yönergesi, herhangi bir kullanıcı giriş yaptığında, gösterilecek mesajın bulunduğu dosyanın ismini belirtir. Mutlak ya da göreceli yol belirtilebilir. Göreceli yol belirtilirse, kullanıcı giriş yaptığında hangi dizinde bulunuyorsa bu belirtilen dosya o dizinde aranır. Ayrıca kullanıcı chroot yöntemi ile hapsedilmiş ise bu dosya kullanıcının hapsedildiği dizinin altında olmalıdır, aksi taktirde dosyaya ulaşılamayacaktır.
DisplayFirstChdir yönergesi eskimiş ve kullanımı azalmış (deprecated) bir yönergedir. Yerine DisplayChdir kullanılmaktadır. DisplayChdir yönergesi bir dizine girildiğinde gösterilecek mesajın bulunduğu dosyanın ismini belirtir.
ListOptions yönergesi, dizinin içeriği listelenmek istendiğinde, ls komutuna verilecek parametreleri belirler.
Port 21 # PassivePorts 49152 65534
Port yönergesi, dinlenecek portu belirler. Sanal konaklar için ana sunucunun dinlediği porttan farklı portlar belirtilebilir. Port değerini 0 yapmak, ilgili sanal konağı kapatacaktır.
PassivePorts yönergesi, istemci PASV komutunu gönderdiğinde FTP sunucusunun pasif ftp bağlantısı için kullanacağı port aralığını belirler. FTP sunucusu PASV komutu geldiğinde, bu aralık içerisinde kullanımda olmayan bir portu rasgele seçer (Burda yetki gerektirmediğinden 1024 ten büyük port numaraları seçmeniz tercih edilir).
MaxInstances 30
MaxInstances yönergesi, DoS saldırılarından etkilenmemek için aynı anda bağlanabilecek maksimum kullanıcı sayısını belirler.
User proftpd Group nogroup
User ve Group yönergeleri, ProFTPD sürecini çalıştıran kullanıcıyı ve grubu belirler.
Umask 022 022
Umask yönergesi, FTP sunucusuna bir dosya gönderildiğinde yaratılacak dosya ve dizin için kullanılacak umask'ı belirler (Birinci değer dosyalar için, ikinci değer dizinler içindir. umask, User file creation mode MASK, yaratılacak dosyalar için silinecek hakları belirler. Örneğin bir dosyanın hakları 777 ve umask 022 ise, 777 değeri 022 ile maskelenir ve bu dosyanın yeni hakları 755 olur. Ayrıntılı bilgi için http://en.wikipedia.org/wiki/Umask).
AllowOverwrite on
AllowOverwrite yönergesi, FTP ile sunucuya transfer edilen dosya ile aynı isimde bir dosya var ise, üzerine yazılıp yazılmayacağını belirler (AllowOverride yönergesi ile karıştırmayınız).
# UseSendFile off
UseSendFile yönergesi, sendfile sistem çağrısının kullanılıp kullanılmayacağını belirler. sendfile sistem çağrısı, veri okuma yazma işini, tek seferde, işletim sistemi çekirdeği düzeyinde hallettiği için read ve write sistem çağrılarının ayrı ayrı çağrılmasına göre oldukça hızlıdır.
TransferLog /var/log/proftpd/xferlog SystemLog /var/log/proftpd/proftpd.log
TransferLog yönergesi, veri transferleri ile ilgili logların tutulduğu dosyanın yolunu belirtir. SystemLog yönergesi ise ProFTPD sürecinin genel loglarının tutulacağı dosyayı belirler. Belirtilmemiş ise /var/log/syslog kullanılır.
4 SSL/TLS üzerinden FTP desteği
4.1 Sertifika oluşturmak
İlk olarak TLS bağlantısı sırasında, sunucu tarafından kullanılacak gizli anahtarımızı oluşturalım:
# openssl genrsa -des3 -out server.key 1024
Bu gizli anahtarımız oluşturulurken bizden bir passphrase (password ile aynı anlama gelir. Eski UNIX’lerde password 8 karakterle sınırlı iken passphrase daha uzun password anlamında kullanılırdı.) girmemiz istenecek (Çünkü yaratılacak olan bu gizli anahtar bilgisayarımıza kaydedilirken Triple DES algoritması ile şifrelenip kaydedilecek. Böylece bu dosyamız başka birinin eline geçse bile gizli anahtarı kullanabilmesi için, passphrase i bilmesi gerekir).
Şimdi gizli anahtarımızı kullanarak, imzalanmak üzere oluşturulacak Sertifika İmzalama İsteği (Certificate Signing Request - CSR) oluşturalım:
# openssl req -new -key server.key -out server.csr
CSR oluşturulurken openssl uygulaması sizinle ilgili bir takım sorular soracak. Bu sorulardan bizim için en önemli olanı ftp adresini (örneğin ftp.magmalinux.org gibi) girdiğimiz Common Name sorusudur. Common Name değeri olarak FTP sunucunuzun adresi ne ise onu girin.
CSR’nin bulunduğu dosya olan server.csr’yi VeriSign, GlobalSign gibi CA firmalarına belli bir ücret karşılığında imzalattırmamız gerekiyor. server.csr dosyamızı seçtiğimiz bir CA’ya gönderdikten sonra, bize gönderdikleri sertifika dosyasını (genellikle .crt uzantılı olur ama uzantının pek bir önemi yok). Bir diğer seçeneğimiz ise, kendi kendimizin CA’sı olmak ve kendi CSR’lerimizi kendimiz imzalamaktır. Biz bu belge de kendi CA’mızı oluşturup, kendi sertifikalarımızı kendimiz imzalayacağız.
Eğer CA firmalarına imzallattığınız bir sertifikanız varsa yazının bu kısmını atlayabilirsiniz.
İlk olarak CA’mız için bir gizli anahtar oluşturalım:
# openssl genrsa -des3 -out ca.key 1024
Bu aşamada bize ca.key dosyamız için bir passphrase sorulacak. Bu passphrase sayesinde, oluşturulacak bu gizli anahtar şifrelenmiş bir şekilde diskimize kaydedilecek.
Sırada CA’mız için kendinden imzalı bir sertifikaya ihtiyacımız var (Dikkat edin, bu sefer bir Sertifika İmzalama İsteği yerine kendi CA sertifikamızı CA’mızın gizli anahtarı ile imzalıyoruz). Aşağıdaki komut ile kendinden imzalı 365 gün boyunca geçerli bir sertifika oluşturuyoruz.
# openssl req -new -x509 -days 365 -key ca.key -out ca.crt
Artık kendi CA’mızın gizli anahtarı ve sertifikası hazır. Şimdi bunları kullanarak bir önceki bölümde oluşturduğumuz Sertifika İmzalama İsteği’ni (server.csr dosyasını) imzalayalım (komutun ilk satırının sonundaki işareti komutun bir alt satırdan devam ettiğini belirtir):
# openssl x509 -req -in server.csr -out server.crt -sha1 -CA ca.crt -CAkey ca.key -CAcreateserial -days 365
Sonunda FTP sunucumuzun kullanacağı sertifikayı yaratabildik.
4.2 ProFTPD’yi Yapılandırmak
ProFTPD sunucusunda SSL/TLS desteğini açmak için proftpd.conf dosyasını aşağıdaki gibi düzenliyoruz:
<IfModule mod_tls.c> TLSEngine on TLSLog /var/log/proftpd/tls.log TLSProtocol TLSv1 TLSRequired off # Sunucu sertifikalari TLSRSACertificateFile /etc/proftpd/ssl/server.crt TLSRSACertificateKeyFile /etc/proftpd/ssl/server.key # CA sertifikasi TLSCACertificateFile /etc/proftpd/ssl/ca.crt TLSVerifyClient off TLSRenegotiate required off </IfModule>
<IfModule> etiketi bir modülün yüklenip yüklenmediğini kontrol eder. Eğer etikette belirtilen modül (bizim bu örneğimizde mod_tls) yüklemiş ise etiket içerisindeki yönergeler çalıştırılır.
TLSEngine yönergesi, TLS üzerinden bağlantıları aktif hale getirir. Değeri on ya da off olabilir.
TLSLog yönergesi, TLS ile ilgili logların tutulacağı dosyayı belirler.
TLSProtocol yönergesi, TLS bağlantılar için kullanılacak TLS sürümünü belirler. Alabileceği değerler SSLv23 uyumluluk modu (SSLv3 ve TLSv1 bir arada kullanılır), SSLv3 ve TLSv1’dir. SSLv2 kullanılamaz çünkü ProFTPD’de SSLv2 desteği kaldırılmıştır.
TLSRequired yönergesinin değeri on olduğunuda, istemci hem denetleme hem de veri kanalında TLS kullanmaya zorunlu tutulur. off değeri herhangi bir kanalda zorunluluğu ortadan kaldırır. ctrl değeri sadece denetleme kanalında, data değeri ise sadece veri kanalında TLS kullanmayı zorunlu kılar. auth değeri, denetleme kanalında sadece kullanıcı doğrulaması esnasında TLS kullanmayı zorunlu kılar. Son olarak auth+data değeri ise, denetleme kanalında sadece kullanıcı doğrulaması esnasında ve veri kanalında TLS kullanmayı zorunlu kılar.
TLSRSACertificateFile yönergesi, sertifika dosyasının yolunu belirtir.
TLSRSACertificateKeyFile yönergesi, gizli anahtar dosyasının yolunu belirtir.
TLSCACertificateFile yönergesi, CA’mızın sertifika dosyasının yolunu belirtir.
TLSVerifyClient yönergesinin değeri off ise ProFTPD istemciden gelen sertifikayı doğruluğunu kontrol etmeden kabul eder ve bağlantı sağlanır. Eğer değeri on ise istemciden gelen sertifikanın doğruluğu kontrol edilir. Bu yönergenin değeri on iken ProFTPD istemciden sertifika istediği taktirde, istemci göndermez ise, bağlantı hata ile sonuçlanır.
Bu ayarları yaptıktan sonra ProFTPD sunucusunu yeniden başlatalım. Servis başlatılırken size sunucu için yarattığınız sertifika dosyasının passphrase’i sorulacak:
# /etc/init.d/proftpd restart Stopping ftp server: proftpd. Starting ftp server: proftpd Please provide passphrases for these encrypted certificate keys: RSA key for the 192.168.1.2#21 (Magma FTP Server) server:
5 Sorun Giderme
5.1 ProFTPD’yi başlatırken
- "module ’mod_ctrls_admin.c’ already loaded" şeklinde bir hata alıyorsanız, /etc/proftpd/proftpd.conf dosyasında modules.conf dosyasının birden fazla kez dahil edilip edilmediğini kontrol edin. Fazlalık olan Include ile başlayan satırı silip, ProFTPD’yi yeniden başlatmayı deneyin.
- "IPv6 getaddrinfo ’hostname’ error: Name or service not known" şeklinde bir hata alıyorsanız, /etc/hosts dosyanızdaki hostname’iniz (konak adınız) ile ilgili tanımları, IPv6 için de yapın (Örneğin konak adınız magma ise, /etc/hosts dosyasında ::1 magma satırı bulunmalı).
5.2 ProFTPD’ye bağlanıldığında
- Bağlanırken eğer çok bekliyorsanız, muhtemelen ProFTPD, istemci IP adresinin ters DNS sorgusunu ve Ident doğrulamasını yapmaya çalışıyordur. Bu ikisini kapatmak için /etc/proftpd/proftpd.conf dosyasına aşağıdaki iki satırı ekleyin:
UseReverseDNS off IdentLookups off
Verifying - RSA key for the 192.168.1.2#21 (Magma FTP Server) server
Sistem başlangıcında da ProFTPD başlatılıyorsa, her seferinde passphrase girmek canınızı sıkabilir. Bundan kurtulmak için gizli anahtarınızı şifrelemeden saklamanız gerekiyor. server.key dosyasında duran gizli anahtarımızı şifrelemesiz saklamak istersek:
# openssl rsa -in server.key -out server.key.unsecure
komutunu çalıştırın ve server.key dosyasının passphrase’ini girin. Bu işlemden sonra şifrelenmemiş gizli anahtarımız server.key.unsecure isminde bir dosyaya kaydedilecek. Şimdi ProFTPD’ye bu gizli anahtarı kullanması gerektiğini söyleyelim. Bunun için tekrardan proftpd.conf dosyasını açın ve TLSRSACertificateKeyFile yönergesine yeni dosyanın yolunu verin.
TLSRSACertificateKeyFile /etc/proftpd/ssl/server.key.unsecure
Şimdi ProFTPD servisini yeni baştan başlatmayı deneyin.
5.3 Test İçin
ssh üzerinden ftp localhost komutu kullanılarak ftp hesabı testi yapılabilir.
-
Samet ULUTÜRK
merhaba, öncelikle böyle bi yazı için teşekkürler. Ubuntu 11.04 e kurarken Şöyle bir problem ile karşılaştım. Bahsettiğiniz;
ftpasswd passwd name mehmet home varftpvusersmehmet
shell binsh uid 3000 gid 3000
bu komutu verdigim zaman mehmet için şifreyi olusutuyorum ama bulundugumuz dizin neresi oluyor ? entry created dedigi halde konsolda ben bu bahsettiğiniz ftpd.passwd dosyasını bulamıyorum hiç bi yerde acaba nerde hata yapıyor olabilirim ? aynı şekilde ftpd.group dosyasıda oluşmuyor ama konsolda oluşturuldu diyor. Teşekkürler11 Mart 2012 20:23:46, Pazar