Bu belge, sıfırdan bir Debian GNU/Linux işletim sistemi kurulumundan ve kurulum sonrası sunucunun kararlılığı ve günveliliği adına ne tür yapılandırmalarda bulunabileceğiniz üzerine toplanmış başlıklardan oluşmaktadır.
Her sistem yöneticisinin yoğurt yiyişi farklılık göstereceğinden, belge içerisinde sizin kaşık tutma metodolojiniz ile ters düşen ya da eksik/yanlış bulduğunuz fikirler olabilir. Sonuç itibari ile bu yazıların yazarın deneyimleri sonucu toplanmış olduğunu göz önünde bulundurarak, aktarmak istediğiniz herhangi bir değişiklik ya da öneriyi doğrudan e-posta yolu ile yazara iletebilirsiniz.
Bu belgeyi, Free Software Foundation tarafından yayınlanmış bulunan GNU Genel Kamu Lisansının 2 ya da daha sonraki sürümünün koşullarına bağlı kalarak kopyalayabilir, dağıtabilir ve/veya değiştirebilirsiniz. Bu lisansın bir kopyasını http://www.gnu.org/copyleft/gpl.html adresinde bulabilirsiniz.
Bu belgedeki bilgilerin kullanımından doğacak sorumluluklar, ve olası zararlardan belge yazarı sorumlu tutulamaz. Bu belgedeki bilgileri uygulama sorumluluğu uygulayana aittir.
Tüm telif hakları aksi özellikle belirtilmediği sürece sahibine aittir. Belge içinde geçen herhangi bir terim bir ticarî isim yada kuruma itibar kazandırma olarak algılanmamalıdır. Bir ürün ya da markanın kullanılmış olması ona onay verildiği anlamında görülmemelidir.
Sistemde yer alan her kullanılmayan paket potansiyel birer güvenlik açığı
olup, herhangi bir sorun tespiti anında karmaşaya yol açabilir. (Acaba bu dosya
kime ait? Bu programı ben mi kurdum? Bu işlemi hangi process
gerçekleştirdi? Şu an sadece benim başlatıp kullandığım süreçler neler?) Bu
amaçla her Debian GNU/Linux kurulumundan sonra, ben dpkg --l
ile
kurulu paketlerin listesine bakıp, oradan gereksiz gördüğüm tüm paketleri
sistemden kaldırmak ile işe başlarım. Örneğin, yalın -- yani kurulum ekranında
hiçbir paket seçilmemiş, vanilla -- bir Debian GNU/Linux 4.0 kurulumunda
sonra sistemden kaldırdığım paketlerin listesi aşağıdaki gibidir.
aptitude at bc bind9-host dc dictionaries-common dnsutils doc-debian doc-linux-text ed exim4 exim4-base exim4-config exim4-daemon-light finger iamerican ibritish info ispell laptop-detect libbind9-0 libdns22 libevent1 libgc1c2 libgssapi2 libisc11 libisccc0 libisccfg1 liblockfile1 liblwres9 libnfsidmap2 libpci2 libpcre3 librpcsecgss3 libsasl2 libsemanage1 libsigc++-2.0-0c2a m4 mailx mpack mtools mutt nfs-common pciutils pidentd policycoreutils python python2.4 python2.4-minimal python-central python-minimal python-newt python-selinux python-semanage python-support reportbug selinux-policy-refpolicy-targeted strace tasksel tasksel-data ucf usbutils w3m wamerican
Ufak bir not olarak şunu da belirtmeliyim ki, gereksiz paketlerin bulunmasında
deborphan
paketi de sık sık işinize yarayacaktır.
Sistemde gereksiz yere çalışan her servis (ağa bağlantısı olsun, olmasın)
potansiyel birer güvenlik açığı oluşturduğundan dolayı, kullanılmayan tüm
servisler sistemden kaldırılmalıdır. Bunun için öncelikli olarak
/etc/inetd.conf
dosyası düzenlenerek, inetd ile ayağa kalkan
gereksiz servisler devre dışı bırakılmalıdır.
Çalışan tüm işlemlerin listesini ps afx
komutu ile
görebileceğimiz gibi, ek olarak, çalışan ağ servislerinin listesine
netstat -plunt
komutu ile ulaşabiliriz. (netstat
çıktısında hangi yazılımın, hangi portu, hangi adresler arası, hangi protokoller
üzerinden dinlediği görülebilir.)
İskelet sistem kurulumundan sonra /etc/passwd
ve /etc/group
dosyalarına bakılarak gereksiz kullanıcı ve gruplar
sistemden silinmelidir. Servis kullanıcılarının (örneğin HTTP sunucusunu
çalıştıran www-data kullanıcısı gibi) aksi gerekmediği sürece sisteme girişi
engellenmelidir. Bu amaçla aşağıda bahsi geçen yöntemlerden herhangi birini
kullanabilirsiniz.
passwd -l <USER>
komutu kullanılabilir./etc/passwd
dosyasında ilgili kullanıcının bulunduğu
satırdaki kabuk programı /bin/false
olarak da
yapılandırılabilir./etc/shadow
dosyasında ilgili kullanıcının şifre
alanına *
ya da !
yazılabilir.PAM (Pluggable Authentication Modules) sayesinde Linux sisteminde yapılan
kimlik denetimi üzerinde çeşitli eklentileri etkin hale getirip kimlik
doğrulamada kullanılan prosedürlerin daha sıkı denetim yapmalarını şart
koşabiliriz. Bunun için /etc/pam.d
dizini altındaki dosyaları
yapılandırmamız yeterli olacaktır. Öntanımlı olarak gelen yapılandırmalara ek
olarak, aşağıdaki satırlar özel olarak eklenmelidir.
Yapılandırma Dosyası | Eklenecek Satır |
/etc/pam.d/common-auth |
auth required pam_unix.so use_authtok nullok md5 |
/etc/pam.d/common-password |
password required pam_cracklib.so retry=3 minlen=6 difok=3 |
/etc/pam.d/common-session |
session optional pam_tmpdir.so |
/etc/pam.d/su |
auth required pam_wheel.so |
Son olarak /etc/pam.d/other
dosyasının başına su satırlar
eklenecek:
auth required pam_securetty.so auth required pam_unix_auth.so auth required pam_warn.so auth required pam_deny.so account required pam_unix_acct.so account required pam_warn.so account required pam_deny.so password required pam_unix_passwd.so password required pam_warn.so password required pam_deny.so session required pam_unix_session.so session required pam_warn.so session required pam_deny.so
Bu değişikliklerden sonra, yapmanız gereken bazı adımlar şu şekilde:
libpam-cracklib
, libpam-tmpdir
paketlerine
yüklenecek. (apt-get install libpam-cracklib libpam-tmpdir
)su
haklarına sahip olabilecek kullanıcılar wheel
grubuna eklenecek. (usermod -g vy -G vy,wheel vy
) Herhangi bir
kullanıcının önceden hangi gruplara kayıtlı olduğunu grep vy
/etc/group
komutu ile öğrenebilirsiniz.SSH sunucusu (openssh-server
) paketi kurulduktan sonra, SSH
sunucusu ile ilgili ayarlara /etc/ssh
dizini altındaki dosyalardan
ulaşılabilir. Burada, özellikle dikkat edilmesi gereken sshd_config
ayarları şu şekilde:
PermitRootLogin no AllowUsers vy PubkeyAuthentication yes PasswordAuthentication no PermitEmptyPasswords no ClientAliveInterval 300
Burada ilk önce root
kullanıcısının SSH ile doğrudan bağlanmasını
engelliyoruz. Herhangi bir kullanıcıyı (örneğin vy
)
wheel
grubuna ekledikten sonra, sadece bu kullanıcı ile girişe izin
veriyoruz. Bu kullanıcı ile sisteme giriş yapıldıktan sonra isteğe bağlı olarak
su
komutu ile root
kullanıcısına geçiş yapabiliriz. Ek
olarak, doğrudan şifre ile giriş yerine, Public Key Authentication
yönteminin kullanılmasını şart koşuyoruz.
Brute Force yöntemi (belirli bir kullanıcı için bir kelime veritabanından seçilen her kelimeyi teker teker şifre olarak denemek) ile yapılan saldırılara karşı iptables ile şöyle bir önlem alınabilir.
#!/bin/bash # # /etc/network/if-up.d/bfa-protection - Start iptables protection against # brute-force attacks. # # Skip loopback interface. [ "$IFACE" = "lo" ] && exit 0 /sbin/iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set /sbin/iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 6 -j DROP
#!/bin/bash # # /etc/network/if-down.d/bfa-protection - Start iptables protection against # brute-force attacks. # # Skip loopback interface. [ "$IFACE" = "lo" ] && exit 0 /sbin/iptables -D INPUT -p tcp --dport 22 -m state --state NEW -m recent --set /sbin/iptables -D INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 6 -j DROP
Bu dosyada özel olarak olması gereken düzenlemeler şu şekilde:
USERGROUPS=yes DIR_MODE=0750
Burada isteğe bağlı olarak oldukça esnek ve farklı şekilde düzenlemelere gidilebilir olmasına karşın, aşağıdaki temel değişiklikler iskelet bir sistem için yeterli derecede kısıtlama sağlayacaktır.
Örnek /etc/security/limits.conf
dosyası:
* - core 102400 * - rss 10240 * - memlock 10240 * - nproc 100 * - maxlogins 1 * - data 1024000 * - fsize 102400 atlassian - rss 819200 atlassian - maxlogins 2 postgres - rss 819200 postgres - memlock 81920
Örnek /etc/security/access.conf
dosyası:
-:wheel:ALL EXCEPT LOCAL +:root:127.0.0.1 192.168.4.70
login.defs
ayarlarının büyük bir kısmı PAM tarafından eskitilmiş
olmasına rağmen, bazı önemli login.defs
yapılandırmaları aşağıdaki
gibidir.
FAILLOG_ENAB yes LOG_UNKFAIL_ENAB yes LOG_OK_LOGINS yes SYSLOG_SU_ENAB yes SYSLOG_SG_ENAB yes LOGIN_RETRIES 3 LOGIN_TIMEOUT 30 ENCRYPT_METHOD MD5
sysctl.conf
yapılandırması sistemden sisteme farklılık gösterse
de, genel olarak ben aşağıdaki satırı özellikle dışarıya açık sunucularda
bulundurmaya çalışırım.
# ICMP ECHO paketleri (örneğin ping komutu ile gönderilen paketler) gözardı edilsin. net.ipv4.icmp_echo_ignore_all = 1
Birinin sunucunun hayatta olup olmadığını kontrol etmesi gerekiyorsa, ping'den daha akıllı bir yöntem kullanması yeterli olacaktır. Örneğin:
$ telnet <SERVER> <ANY-TCP-SERVICE-PORT-ALLOWED-FROM-OUTSIDE> $ nmap -P0 <SERVER> [-p <ANY-TCP-SERVICE-PORT-ALLOWED-FROM-OUTSIDE>]
Kullanıcı tarafından girilen komutların kaydı (bash kabuğunda) öntanımlı olarak
~/.bash_history
dosyasında tutulmaktadır. Fakat kötü niyetli bir
kişi, bu kaydı silebilir. Bu sebeple bu dosyanın append only olarak
işaretlenmesi en doğrusu olacaktır. Bunun için ilk önce
/etc/profile
dosyasına aşağıdaki satırlar eklenmelidir.
HISTFILE=~/.bash_history HISTSIZE=10240 HISTFILESIZE=40960 HISTIGNORE= HISTCONTROL="ignoreboth" readonly HISTFILE readonly HISTSIZE readonly HISTFILESIZE readonly HISTIGNORE readonly HISTCONTROL export HISTFILE HISTSIZE HISTFILESIZE HISTCONTROL shopt -s histappend readonly PROMPT_COMMAND="history -a"
Bu satırların öntanımlı .bashrc
'deki eşdeğerleri ile çakışmaması için
/etc/skel/.bashrc
dosyasından ilgili satırlar çıkarılmalıdır.
Bu değişikliklerin ardından ~/.bash_history
dosyalarının append only hale getirilmesi için
# touch /home/<USER>/.bash_history # chmod 600 /home/<USER>/.bash_history # chown <USER>:<USER> /home/<USER>/.bash_history # chattr +a /home/<USER>/.bash_history
komutları çalıştırılması yeterli olacaktır. Bu değişikliğin önceden
oluşturulmuş kullanıcılar için geçerli olmadığına dikkat ediniz. Onlar için bu
değişikliği elle yapmanız gerekmekte. (Bu işi otomatize etmek adına,
adduser
perl betiğini elle değiştirmekten başka bir yol
bilmiyorum ben.)
Ek olarak, chattr
komutunun sisteminizde çalışabilmesi için,
ilgili dosya sisteminin (örn. reiserfs) attrs
seçeneği
(option) ile mount
edilmesi gerekebilir.