Sunday, March 2, 2014

SFTP Chroot ile kısıtlı ve güvenli erişim sağlama

Sunucumda bulunan www.truvakitap.com sitesinin kredi kartı ödeme modülünün güncellemesi için erişim yetkisi vermem gerekiyor. Erişimi isteyen firma FTP erişimi istedi ben de FTP yerine daha güvenli olan SFTP (Secure FTP) erişimi vermeyi seçtim. Erişimi isteyen firmanın sadece truvakitap web dizinine erişmesi için chroot ile kısıtlama yapacağız.

benden tavsiye, var olan bir kullanıcıyı değiştirmek yerine önce yeni bir kullanıcı yaratın
useradd myuser
mkdir /home/myuser
usermod -d /home/myuser myuser
passwd myuser

/home/myuser  dizinin haklarını ayarlayalım.
chown root:root /home/myuser
chmod 755 /home/myuser

/home/myuser dizinin root:root olması önemli! Eğer myuser:myuser olursa ayrıca sftp çalışmayacaktır! myuser:root veya root:root olması gerekiyor çalışması için güvenlik için root:root yapın.

shell atanmasını değiştirelim 
usermod -s /bin/false myuser

şimdi sftp erişimi için yeni bir grup oluşturalım
addgroup sftpusers

myuser'ın grubunu değiştirelim
usermod -g sftpusers myuser

şimdi ssh erişimi deneyelim
ssh myuser@truvakitap.com
Welcome to Ubuntu xxxx
Connection to truvakitap.com closed

kullanıcı önce login oldu  "Welcome to Ubuntu" yazısı çıktı sonra shell'i /bin/false olduğu için bağlantıyı kopardı.

Şimdi /etc/ssh/sshd_config dosyasını edit edelim
öncelikle aşağıda ki satırı bulup başına # koyun
#Subsystem sftp /usr/lib/openssh/sftp-server
ve şunu ekleyin
Subsystem sftp internal-sftp

Şimdi dosyanın en altına aşağıdaki komutları ekleyin
Match Group sftpusers
    X11Forwarding no
    AllowTcpForwarding no
    ForceCommand internal-sftp
ve ssh restart
service ssh restart

şimdi ssh erişimini bir daha deneyelim
This service allows sftp connections only.
Connection to truvakitap.com closed.

artık hoşgeldin Ubuntu'dan önce ssh bizi baştan kabul etmeden sadece sftp'ye iizn veriyorum deyip attı.

şimdi ssh yerine sftp komutu deniyelim veya direk bir SFTP istemcisi kullanın örneğin Filezilla'yı kullanabilirsiniz.
sftp myuser@truvakitap.com
sftp>

evet içerdeyiz fakat bir sorun var kullanıcı sistemde ki tüm dizinleri görebilir durumda şu an biz onu kendi /home dizinine hapsetmek istiyoruz.
O zaman aşağıda ki kırmızı satırı ekliyelim.
Match Group  sftpusers
    ChrootDirectory %h
    X11Forwarding no
    AllowTcpForwarding no
    ForceCommand internal-sftp

ssh restart yapalım
service ssh restart

tekrar sftp deneyelim vola! artık başka dizinleri gezinme yok!

Şimdi asıl erişim vermek istediğiniz diziniyeni kullanıcının home dizinine   bağlamamız gerekiyor.
örneğin ben var olan /var/www/truvakitap/public dizinini bağlayacağım.
yeni bir public dizini oluşturun
mkdir /home/myuser/public
şimdi bağlayalım
mount --bind /var/www/truvakitap/public  /home/myuser/public

Şimdi Filezilla'dan ayarları yaptım başarı ile giriş yaptım
Dosya yüklemeyi denedim Filezilla'dan
"Could not transfer" hatası aldım.

truvakitap dizinin hakları www-data:www-data olması problem çıkardı

chmod -R g+s /home/myuser/public
g+s ile yaratılan dosyaların dizinin kendi grubuna ait olmasını sağladık
Şimdi tekrar deneyelim Filezilla'yı.
Dosya transferi başarılı :-)
Yeni oluşan dosyalar muser:www-data olarak oluşacaktır.
Fakat var olan www-data:www-data dosyalarını SFTP üzerine yazamaz. Üzerine de yazsın istiyorsanız
chown -R myuser:www-data /home/myuser/public yaptığımızda artık
/var/www/truvakitap/public altında ki dosyalar www-data:www-data'dan myuser:www-data dönüşür ve üzerine yazabilirsiniz.

Friday, February 28, 2014

MySQL'i 5.1'den 5.5'e yükseltmek


Önce veritanınızın yedeğini alın
mysqldump --all-databases --routines --events > fulldump.sql
mysqldump mysql --tables user > users.sql

Her ihtimale karşı /var/lib/myql dizinin yedeğini alın

cp -R /var/lib/mysql  /root/mysql-5.1-yedek
Şimdi mysql yükseltme işlemine başlayabilirsiniz.

Şimdi mysql' root olarak giriş yapın ve fulldump.sql ve users.sql'i yükleyin
mysql -u root -p
\r mysql
source users.sql
source fulldump.sql
FLUSH PRIVILEGES;
\q

Ubuntu/Linux Güvenli Sunucu Kurulumu

Ubuntu, Debian tabanlı bir dağıtım. Bu iki dağıtım arasında masaüstü versiyonları açısından (Unity) farklar olsada sunucu kurulumları açısından pek bir fark yok. Sunucu kuracaksanız son Debian stable sürümünü veya son Ubuntu LTS sürümünü kurmanızı tavsiye ederim, benim tercihim Ubuntu LTS.

Kurulum yaparken minimum servis kurmak güvenlik açısından önemli.
Öncelikle sunucunuz yeni kurulduğunda size otomatik atanan root şifresini değiştirmelisiniz.

Ben şifre oluşturma ve yönetimi için açık kaynaklı keepass yazılımını kullanıyorum. 30 karakterli bir şifreyi aşağıda ki ayarlarla üretmek yeterince paranoyakça.


Şimdi root şifresini değiştirelim
passwd

Fail2Ban kurulumu
Şimdi sunucumuzu brute-force ataklardan korumak için fail2ban kuralım.

apt-get install fail2ban


Açık portlarınızı kontrol etmek için aşağıda ki komutu kullanın ve gereksiz portlarınızı kapatın

netstat -an --inet | grep LISTEN | grep -v 127.0.0.1:

/tmp dizinini güvenli hale getirmek
Sunucuzun  /tmp  dizinini ayrı bir bölüm olarak ayırıp noexec nosuid yapmak hackerlara karşı alınacak önemli tedbirlerdendir. Benzer bir şekilde /var/tmp dizininide ayrı  bir bölüm yapmalı veya sembolik bağlantı olarak /var dizinine bağlamak gerekir.

/tmp dizininizin ayrı bir bölüm olup olmadığını öğrenmek için:
df -Th


önce fstab dosyasının ve /tmp dizinini yedeğini alın
cp /etc/fstab /etc/fstab.backup
cp -Rp /tmp /tmp_backup

Eğer /tmp dizini zaten ayrı bir bölümse:

editörünüzle fstab dosyasını açın
/etc/fstab

nosuid,noexec opsiyonlarını aşağıda ki gibi ekleyin
UUID=…   /tmp    ext4 defaults,nodev,nosuid,noexec       10 0

tekrar mount edin
mount -o remount /tmp



/tmp dizini / ile aynı bölümde ise
aşağıda ki önce büyük bir dosya yaratacağız sonra on ayrı bir bölüm olarak mount edeceğiz burda seek parametresini değiştirerek istediğiniz boyutta oluşturabilirsiniz dosyanızı. cd /var
dd if=/dev/zero of=tmp.partition bs=1 count=0 seek=12G
mkfs.ex4 /var/tmp.partition

sonra y ile devam edin
mke2fs 1.42 (29-Nov-2011)
/var/tmp.partition is not a block special device.
Proceed anyway? (y,n) y


bs buffer size ve count ise bs nin kaç kere yazılacağını söylüyor seek komutu ise gerçekten dosyayı oluşturmadan boş bir dosya oluşturmasını sağlıyor. Yani dosya üzerine yazıldıkça büyeyecektir bir çok dosya sistemi buna izin verir böylce çok büyük dosyaları çok kısa zamanda oluşturabilirsiniz.
örneğin aşağıda ki ilk komut altında ki komuttan daha hızlı çalışacaktır
dd if=/dev/zero of=dosya count=0 bs=1G seek=10

dd if=/dev/zero of=dosya count=10 bs=1G

/etc/fstab'a ekleme
öncelikle sistemde hiçbir servisin çalışmadığından emin olun (mysql, nginx, apache…) işlemler bitene kadar /tmp dizini kullanan servisler hata verecektir.
echo "/var/tmp.partition /tmp ext4 loop,rw,noexec,nosuid,nodev 0 0">> /etc/fstab

yeni /tmp dizinini mount edelim
mount -o loop,rw,noexec,nosuid,nodev /var/tmp.partition /tmp

chmod 1777 /tmp
chown root:root /tmp

777 başında ki 1 sticky bit diye adlandırılır ve yaratılan bir dosyanın sadece kendi kullanıcısı ve root tarafından edit elilebilip silinebilmesini sağlar.

/var/tmp dosyasını sembolik bağ ile /tmp 'e bağlama

öncelikle /tmp 'nin içeriğini yedekten aktarıp yedek dizinini silelim
cp -Rp /tmp_backup /tmp/
rm -rf /tmp_backup

/var/tmp 'de dosya varsa önce yedeğini alın sonra
rm -rf /var/tmp
ln -s /tmp /var/tmp

yapabiliyorsanız sunucuzu yeniden çalıştırın
reboot

bölümlerinizi kontrol edin
df -Th

İşlemi yapmak için durdurduğunuz servislerin çalıştığından emin olun.


shared memory'i güvenli hale getirmek

httpd 'e shared memory üzerinden yapılan ataklara karşı shared memory'de noexec nosuid ataması yapalım
Yine /etc/fstab editörünüzle açın ve aşağıda ki satırı ekleyin
tmpfs /dev/shm tmpfs defaults,noexec,nosuid 0 0

ayarın etkin olması için restart veya tekrar mount edilmesi gerekir
mount -o remount /dev/shm

umask ayarı

umask sistemde yaratılan dosyaların varsayılan haklarını ayarlar, Ubuntu 12.04'de /etc/login.defs dosyasında tanımlıdır varsayılan 022 değerini 027 yapın. SSH oturumunuzu kapatıp yeniden açtığınızda ayarın etkin olduğunu göreceksiniz. İlk durumda her dosya 644 değeriyle gelir bu ayar yapıldıktan sonra 640 yeni varsayılan değer olur.  Çalışma mantığı dosyalar için
666 - umask = vasayılan değer
dizinler için :
777 - umask = varsayılan değer
şeklinde bulunur.
Aşağıda ki gibi deneme yapabilirsiniz. umask 022 olduğunda
touch deneme1.txt
ls -al
-rw-r--r--  1 root root    0 Sep 14 13:29 deneme1.txt

umask 027 olduğunda
touch deneme2.txt
ls -al
-rw-r-----  1 root root    0 Sep 14 13:30 deneme2.txt

Sunucunuza ssh root erişimini engellemek iyi bir güvenlik önlemidir ayrıca siteleri /var/www dizinin altına koymak yerine eklediğiniz kullanıcının /home/{kullanıcıadı} dizinine koymak çoklu kullanıcı durumlar için daha iyi bir seçenek. Şimdi yeni bir kullanıcı ekleyelim.

adduser server


IPV6 inaktif yapmak

Eğer IP6 kullanmıyorsanız firewall kurallarında sadece IP4 ile çalışmak daha yönetilebilir olur.