Debian GNU/Linux Sunucu Yapılandırması

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.


Yasal Uyarı

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.


İçindekiler

I. Gereksiz Paketlerin Kaldırılması
II. Gereksiz Ağ Servislerinin Kaldırılması
III. Gereksiz Kullanıcıların Kaldırılması ve Servis Kullanıcılarının Şifreleri
VII. /etc/adduser.conf Yapılandırması
VIII. /etc/security Dizini Altındaki Dosyaların Yapılandırması
IX. /etc/login.defs Yapılandırması
X. /etc/sysctl.conf Yapılandırması
XI. Geçmiş Komut Kayıtlarının Tutulması

I. Gereksiz Paketlerin Kaldırılması [Y, A]

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.

II. Gereksiz Ağ Servislerinin Kaldırılması [Y, A]

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.)

III. Gereksiz Kullanıcıların Kaldırılması ve Servis Kullanıcılarının Şifreleri [Y, A]

İ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.

IV. PAM Yapılandırması [Y, A]

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:

V. SSH Sunucusunun Yapılandırılması [Y, A]

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.

VI. Brute Force Saldırıların Önlenmesi [Y, A]

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

VII. /etc/adduser.conf Yapılandırması [Y, A]

Bu dosyada özel olarak olması gereken düzenlemeler şu şekilde:

USERGROUPS=yes
DIR_MODE=0750

VIII. /etc/security Dizini Altındaki Dosyaların Yapılandırması [Y, A]

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

IX. /etc/login.defs Yapılandırması [Y, A]

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

X. /etc/sysctl.conf Yapılandırması [Y, A]

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>]

XI. Geçmiş Komut Kayıtlarının Tutulması [Y, A]

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.