Linux Güvenliği

Transkript

Linux Güvenliği
Linux Güvenliği
C. Ahmet Mercan
Güvenlik - Temel
Güvenlik Açıkları - Port
Tracing, Ping, SSH Saldırıları,
Linux'ta Güvenlik, Firewall
Yapısı ve Basitce SeLinux
Öneri
RedHat Security Guide
RedHat 7:
https://access.redhat.com/documentation/enUS/Red_Hat_Enterprise_Linux/7/html/Security
_Guide/index.html
RedHat 6:
https://access.redhat.com/documentation/enUS/Red_Hat_Enterprise_Linux/6/html/Security
_Guide/index.html
Öneri
Top 20 OpenSSH Server Best Security
Practices
http://www.cyberciti.biz/tips/linux-unix-bsdopenssh-server-best-practices.html
Güvenlik
Bilgisayar Güvenliği:
●
Fiziksel Güvenlik
●
Yazılımsal / Elektronik Güvenlik
–
Ağ Güvenliği
–
İşletim Sistemi Güvenliği
Güvenlik Modeli:
●
Sadece Dışa karşı Güvenlik (Yumurta Modeli)
●
Çok katmanlı Güvenlik
Güvenlik
“Dünyada iki tip kurum vardır:
Hacklendigini bilenler,
ve bilmeyenler”
İnsan Paradoksu
●
●
●
●
Birçok Güvenlik Tedbiri, Saldırganlardan çok
diğer insanların hayatını zorlaştırır.
İnsanlar ise hayatlarını kolaylaştırmak için
güvenliği kolayca ihmal ederler.
Güvenlik tedbirleri hayatı zorlaştırdıkca,
insanlar daha fazla güvenlik ihmali yapar.
Bu sebeble mümkün olduğunca insanların
hayatını zorlaştırmadan güvenlik
sağlanmalıdır.
Yapılacaklar Listesi
●
'Hack' lenmeden Önce:
–
●
Önleyici Güvenlik
'Hack' lenirken:
–
Olaylardan Haberdar Olma
Önleyici Güvenlik
●
Güvenli ama Basit bir Yapının Planlanması
●
Sağlıklı Durumun Bilinmesi
●
Bilinen Açıkların Giderilmesi
●
Gereksiz Programların Kaldırılması
●
Gereksiz İzinlerin Kapatılması
●
Sızma (penetrasyon) Testleri
●
Yedekleme
●
Docker, puppet vb. Otomatik ayarlama araçları
Olaylardan Haberdar Olma
●
İzleme (monitoring)
Ganglia, nagios
Kayıt Tutma (logging)
–
●
●
Yeni Bulunan Açıklardan Haberdar Olma
http://www.cert.org/
– http://www.securityfocus.com/
“Hacklendim mi?”
–
●
Ağ (Ethernet) Paketi
Ethernet Paketinin kabaca yapısı
Alıcının
Mac Adresi
Göndericinin
Mac Adresi
IP Paketi
Switch için gerekli
IP Paketinin kabaca yapısı
Alıcının
IP Adresi
Göndericinin
IP Adresi
TCP Paketi
Router için gerekli
TCP Paketinin kabaca yapısı
Alıcının
Port Numarası
Göndericinin
Port Numarası
Bilgisayar için gerekli
Uygulama Paketi
Port Numarası – Gelen Paketler
dns
Ssh
html
?
Smtp
paketi
Udp
Port
53
paketi
Tcp
Port
22
paketi
Tcp
Port
80
paketi
Tcp
Port
2973
paketi
Tcp
Port
25
Port 22
Açık
Port 80
Açık
Port 2973
Açık
Karşılığı Yok
Geri döner!
Ssh
Sunucu
Karşılığı Yok
Geri döner!
Kullanıcıya
ait Program
Web
Sunucu
Bilgisayar
Ping
●
●
●
icmp protokolu ile uzaktaki bilgisayardan bir
karşılık vermesini istemek için kullanılır.
Genelde “bilgisayar açık mı?” ve “ağ
erişimimiz var mı?” sorularını cevaplamak için
kullanılır.
Ancak bu hizmet firewall ile kapatılmış olabilir.
Ping
$ ping www.google.com
PING www.google.com (173.194.66.104): 56
data bytes
64 bytes from 173.194.66.104: icmp_seq=0
ttl=46 time=62.337 ms
64 bytes from 173.194.66.104: icmp_seq=1
ttl=46 time=64.747 ms
64 bytes from 173.194.66.104: icmp_seq=2
ttl=46 time=64.651 ms
^C
netstat
●
Bağlı bulunduğumuz bilgisayarın ağ
bağlantılarını ve açık portları gösterir.
●
-a tüm protokolleri göster
●
-n isim/adres yerine sayısal olarak IP/port yaz.
●
-p portla ilgili programın adını da göster.
●
-l sadece listening portları göster.
●
-u sadece udp portları göster.
●
-t sadece tcp portları göster.
netstat -pna
Active Internet connections (servers and
established)
Proto Recv-Q Send-Q Local Address
Foreign Address
State
PID/Program
name
tcp
tcp
tcp
0
0 0.0.0.0:3306
LISTEN
4593/mysqld
0
0 0.0.0.0:22
LISTEN
4447/sshd
0
0 127.0.0.1:2207
LISTEN
4409/python
0.0.0.0:*
0.0.0.0:*
0.0.0.0:*
nmap
●
●
Uzaktaki bilgisayarların açık portları hakkında
bilgi verir.
Çok çeşitli tarama metodları ile bilgi
toplayabilir.
●
-sP şeklinde tarama metodu verilir.
●
Tek Makine yada IP bloğu tarayabilir.
●
-O ile işletim sistemini tahmin etmeye çalışır.
nmap
# nmap 10.128.1.20
Starting Nmap 4.11
Interesting ports on ex.ample.com (10.128.1.20):
Not shown: 1677 closed ports
PORT
STATE SERVICE
22/tcp open ssh
111/tcp open rpcbind
652/tcp open unknown
nmap işletim sistemi tespiti
# nmap -O 10.128.1.20
Starting Nmap 4.11
Interesting ports on ex.ample.com (10.128.1.20):
Not shown: 1677 closed ports
PORT
STATE SERVICE
22/tcp open ssh
111/tcp open rpcbind
652/tcp open unknown
TCP Wrappers
●
Her servis TCP wrappers'ı desteklemez.
●
/etc/hosts.deny dosyasında
ALL:ALL
●
/etc/hosts.allow dosyasında
sshd: 10.128.2.5 192.168.17.1
sendmail : 192.168.1.0/255.255.255.0
ALL: localhost
Denyhosts: Otomatik TCP Wrappers
●
●
Ssh için yanlış şifre denemelerini izleyip,
otomatik engelleme yapar.
Ayarlanması:
cd /usr/share/denyhosts
cp denyhosts.cfg-dist denyhosts.cfg
●
●
Sonra denyhosts.cfg dosyasını değiştirin.
denyhosts.py –purge komutu ile engellenen
IPler silinir.
Kuvvetli Şifre
●
●
●
●
Günümüzde ağ ve bilgisayar hızları arttığı için
saldırganlar milyonlarca şifreyi kolayca
deneyebilmekteler.
Kullanıcı adının bilinen isimlerden oluşmaması
tek başına önleyici bir uygulamadır.
ahmet, admin, mysql, user, a gibi basit
kullanıcı adları yerine kullanılmamalıdır.
mercana, jsmith gibi kullanıcı adı ve
soyadından oluşturulan adlar tercih edilmelidir.
Kuvvetli Şifre
●
●
●
●
●
Şifre belirlerken sözlükte bulunabilecek
ifadelerden kaçınılmalıdır.
En yaygın şifre 123456
Sadece Harf ve Sayılardan oluşan şifre güvenli
değildir.
Şifrenin hatırlamayacağınız derecede zor olması
da bir güvenlik sorunudur.
Şifrenin bir Cümleden (harflerin arasına sayı ve
işaretler koyarak) oluşturulması iyidir:
Dx2Go”1_oLuR
Kuvvetli Şifreye Zorlamak
●
/etc/pam.d/passwd dosyasına pwquality açılır:
password
●
●
required
pam_pwquality.so retry=3
/etc/security/pwquality.conf dosyasında:
minlen=8
şifre uzunluğu
minclass=4
şifrede k.harf,b.harf,sayı,diğer olsun
maxsequence=3
şifrede 123 / abc gibi dizi uzunluğu
maxrepeat=3
şifrede 111 / aaa gibi tekrar adedi
Şifrelere zaman sınırı koymak için:
system-config-users
Ssh Ayarlamaları
●
/etc/ssh/sshd_config dosyasında:
Protocol 2
PermitRootLogin no
AllowUsers *@10.8.2.2 mercan
DenyUsers httpd
PermitEmptyPasswords no
●
Şifresiz ssh güvenliği artıracak şekilde
kullanılabilir.
Port Numarası – Gelen Paketler
dns
Ssh
html
?
Smtp
paketi
Udp
Port
53
paketi
Tcp
Port
22
paketi
Tcp
Port
80
paketi
Tcp
Port
2973
paketi
Tcp
Port
25
Port 22
Açık
Port 80
Açık
Port 2973
Açık
Karşılığı Yok
Geri döner!
Ssh
Sunucu
Karşılığı Yok
Geri döner!
Kullanıcıya
ait Program
Web
Sunucu
Bilgisayar
Firewall – Güvenlik Duvarı
dns
Ssh
html
?
Smtp
paketi
Udp
Port
53
paketi
Tcp
Port
22
paketi
Tcp
Port
80
paketi
Tcp
Port
2973
paketi
Tcp
Port
25
Firewall
Karşılığı Yok
Geri döner!
Ssh
Sunucu
Firewall
Port 22
Açık
Port 80
Açık
Port 2973
Açık
Karşılığı Yok
Geri döner!
Kullanıcıya
ait Program
Web
Sunucu
Bilgisayar
firewalld
●
●
firewall-config programı ile grafik arayüz açılır.
firewall-cmd ile komut satırından ayarlamalar
yapılabilir:
# firewall-cmd --permanent --zone="dmz" --addrich-rule='rule family="ipv4" source
address="37.247.108.75" reject'
Firewalld'i kapatmak
●
Firewalld kapatılıp, iptables çalıştırabiliriz:
# systemctl disable firewalld
# systemctl stop firewalld
# yum install iptables-services
# systemctl start iptables
# systemctl start ip6tables
# systemctl enable iptables
# systemctl enable ip6tables
iptables: kural eklemek
●
●
●
●
●
●
iptables -A <kural-grubu> -j <işlem>
Kural-grubu (chain) olarak başlangıçta INPUT, OUTPUT,
FORWARD gelir ve bunlar mecburen olmalıdırlar.
INPUT bilgisayara gelen paketler için olan komutlar bu gruba
aittir.
OUTPUT bilgisayardan giden paketler için olan komutlar için.
FORWARD bilgisayarın yönlendirme yapması (router olarak
çalışması) için olan komutlar için.
-j ile verilen işlemler ise ACCEPT, DROP, ve REJECT.
iptables: genel kural vermek
●
iptables -P <kural-grubu> <işlem>
●
İlave bir şart belirtmeden tüm paketlere uygulanacak işlem.
●
Mesela, tüm routing işlemlerini durdurmak:
# iptables -P FORWARD DROP
●
Tüm giden paketlere izin vermek:
# iptables -P OUTPUT ACCEPT
iptables: kaydetmek
●
●
Normalde iptables komutu ile yapılan değişiklikler çalışan
iptables içindir, reboot ile gider.
Kaydetmek için:
/sbin/iptables-save
●
●
Bu komutla /etc/sysconfig/iptables dosyası yeniden
oluşturulur.
Eski /etc/sysconfig/iptables ise /etc/sysconfig/iptables.save
adıyla saklanır.
iptables: kural eklemek
●
Mesela gelen 80. port paketlerine izin vermek için:
# iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
●
●
Burada -p protokol, -m module, --dport destination port
vermek için.
Belirli bir IP için izin vermek için:
# iptables -A INPUT -s 192.168.0.4 -j ACCEPT
●
Bir IP grubuna izin vermek:
# iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
# iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT
iptables: Örnek
# iptables -P INPUT ACCEPT
# iptables -F
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j
ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
http://wiki.centos.org/HowTos/Network/IPTables
iptables: Örnek
Mevcut durumu görmek için:
# iptables -L -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target
prot opt in
0
0 ACCEPT
all -- lo
0
0 ACCEPT
all -- any
0
0 ACCEPT
tcp -- any
out
any
any
any
source
anywhere
anywhere
anywhere
destination
anywhere
anywhere
state RELATED,ESTABLISHED
anywhere tcp dpt:ssh
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target
prot opt in
out
source
destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target
prot opt in
out
source
destination
http://wiki.centos.org/HowTos/Network/IPTables
SELinux
●
●
●
●
Linux çekirdeğindeki bir “Zorunlu erişim kontrol
mekanizması (mandatory access control
mechanism)” uygulamasıdır.
Dosyalar ve programlar için tanımlı izinlerin
dışına çıkılmasını engeller.
Bu sayede saldırganlar bir sebeble erişim
sağlasalar da selinux'da tanımlı olmayan işleri
yapamazlar.
Tabiki adminler de yapamaz! Problem?
SELinux
●
Httpd sendmail kullanabilir mi?
httpd_can_sendmail --> off / on
●
Httpd diğer kullanıcıların ev dizinlerini
okuyabilir mi?
httpd_read_user_content --> off / on
SELinux çalışıyor mu?
# sestatus
SELinux status:
SELinuxfs mount:
enabled
/sys/fs/selinux
SELinux root directory:
/etc/selinux
Loaded policy name:
targeted
Current mode:
enforcing
Mode from config file:
enforcing
Policy MLS status:
enabled
Policy deny_unknown status:
allowed
SELinux ayritili durum
(fakat tum dizinler gozukmuyor!)
# sestatus -v
SELinux status:
enabled
SELinuxfs mount:
/sys/fs/selinux
SELinux root directory:
/etc/selinux
Loaded policy name:
targeted
Current mode:
enforcing
Mode from config file:
enforcing
Policy MLS status:
enabled
Policy deny_unknown status: allowed
Max kernel policy version:
28
Process contexts:
Current context:
Init context:
/usr/sbin/sshd
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
system_u:system_r:init_t:s0
system_u:system_r:sshd_t:s0-s0:c0.c1023
File contexts:
Controlling terminal:
/etc/passwd
/etc/shadow
/bin/bash
unconfined_u:object_r:user_devpts_t:s0
system_u:object_r:passwd_file_t:s0
system_u:object_r:shadow_t:s0
system_u:object_r:shell_exec_t:s0
SELinux açma / kapama:
/etc/selinux/config dosyasını değiştirip,
sistemi reboot et:
# This file controls the state of SELinux on the
system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of
enforcing.
# disabled - SELinux is fully disabled.
SELINUX=disabled
SELinux'u reboot etmeden
açma/kapama ve durumu görme:
# setenforce Permissive
# getenforce
Permissive
# setenforce Enforcing
# getenforce
Enforcing
SELinux logları
Normalde /var/log/messages yada yoksa
/var/log/audit/audit.log dosyasında log var:
type=AVC msg=audit(1410944310.867:28502): avc: denied { search } for pid=29548 comm="httpd"
name="AdminLinks" dev="dm-1" ino=16324 scontext=system_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:user_home_t:s0 tclass=dir
type=SYSCALL msg=audit(1410944310.867:28502): arch=c000003e syscall=6 success=no exit=-13 a0=7fff6fef1e40
a1=7fff6fef1d30 a2=7fff6fef1d30 a3=34 items=0 ppid=28432 pid=29548 auid=4294967295 uid=48 gid=48 euid=48
suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd"
subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1410944310.867:28503): avc: denied { search } for pid=29548 comm="httpd"
name="AdminLinks" dev="dm-1" ino=16324 scontext=system_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:user_home_t:s0 tclass=dir
type=SYSCALL msg=audit(1410944310.867:28503): arch=c000003e syscall=6 success=no exit=-13 a0=7fff6fef3fb0
a1=7fff6fef3ea0 a2=7fff6fef3ea0 a3=34 items=0 ppid=28432 pid=29548 auid=4294967295 uid=48 gid=48 euid=48
suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd"
subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1410944310.867:28504): avc: denied { getattr } for pid=29548 comm="httpd"
path="/var/www/html/w/extensions/AdminLinks" dev="dm-1" ino=16324 scontext=system_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:user_home_t:s0 tclass=dir
type=SYSCALL msg=audit(1410944310.867:28504): arch=c000003e syscall=6 success=no exit=13 a0=7fff6fef3fb0
a1=7fff6fef3d00 a2=7fff6fef3d00 a3=6e696d64412f736e items=0 ppid=28432 pid=29548 auid=4294967295 uid=48
SELinux Kullanıcı Tanımları
# semanage login -l
Login Name
SELinux User
MLS/MCS Range
Service
__default__
unconfined_u
s0-s0:c0.c1023
*
root
unconfined_u
s0-s0:c0.c1023
*
system_u
system_u
s0-s0:c0.c1023
*
Process izinlerini görmek
# ps -eZ
LABEL
PID TTY
TIME
CMD
system_u:system_r:init_t:s0
1?
00:03:21
systemd
system_u:system_r:kernel_t:s0
2?
00:00:01
kthreadd
system_u:system_r:kernel_t:s0
3?
00:00:12
ksoftirqd/0
system_u:system_r:syslogd_t:s0
453 ?
00:00:28
systemd-journal
system_u:system_r:lvm_t:s0
476 ?
00:00:00
lvmetad
system_u:system_r:udev_t:s0-s0:c0.c1023
487 ? 00:00:00
systemd-udevd
Dosya izinlerini görmek, değiştirmek
# ls -Z /var/www/html/
drwxr-xr-x. www 1001 unconfined_u:object_r:httpd_sys_content_t:s0 AdminLinks
drwxr-xr-x. www 1001 unconfined_u:object_r:httpd_sys_content_t:s0 Cite
drwxr-xr-x. www 1001 unconfined_u:object_r:httpd_sys_content_t:s0 ConfirmEdit
drwxr-xr-x. www 1001 unconfined_u:object_r:httpd_sys_content_t:s0 Gadgets
drwxr-xr-x. www 1001 unconfined_u:object_r:httpd_sys_content_t:s0 ImageMap
drwxr-xr-x. www 1001 unconfined_u:object_r:httpd_sys_content_t:s0 InputBox
httpd_sys_content_t izinini (label) eklemek için:
# chcon -R -t httpd_sys_content_t '/var/www/html/AdminLinks'
SELinux boolean ayarlarını görmek
# getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
antivirus_can_scan_system --> off
antivirus_use_jit --> off
auditadm_exec_content --> on
authlogin_nsswitch_use_ldap --> off
authlogin_radius --> off
authlogin_yubikey --> off
awstats_purge_apache_log_files --> off
boinc_execmem --> on
cdrecord_read_content --> off
cluster_can_network_connect --> off
cluster_manage_all_files --> off
cluster_use_execmem --> off
...
SELinux boolean ayarlarını
değiştirmek
setsebool -P allow_httpd_sys_script_anon_write on
setsebool -P allow_httpd_sys_script_anon_write off
SELinux default dosya ayarlarını geri
döndürmek:
# restorecon -Rv /var/www/html
SELinux hata mesajlarını daha
anlamlı görmek:
audit2allow -w -a
type=AVC msg=audit(1417768671.288:1364): avc: denied { write } for pid=31132
comm="httpd" name=C4B0736C6574696D2D73697374656D692E706E67 dev="dm-1"
ino=351201 scontext=system_u:system_r:httpd_t:s0
tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=dir
Was caused by:
Unknown - would be allowed by active policy
Possible mismatch between this policy and the one under which the audit
message was generated.
Possible mismatch between current in-memory boolean settings vs. permanent
ones.
type=AVC msg=audit(1417768670.147:1359): avc: denied { write } for pid=31132
comm="httpd" name=C4B0736C6574696D2D73697374656D692E706E67 dev="dm-1"
ino=351201 scontext=system_u:system_r:httpd_t:s0
tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=dir
Was caused by:
Unknown - would be allowed by active policy
Hata mesajlarından selinux
ayarlarını değiştirmek:
# tail -n 5 /var/log/audit/audit.log | audit2allow -M
postgreylocal
# grep smtpd_t /var/log/audit/audit.log |
audit2allow -M postgreylocal
# semodule -i postgreylocal.pp

Benzer belgeler

saldırı yöntemleri

saldırı yöntemleri • Network’e erişim yollarının belirlenmesi • Tarama(Scanning) – Çalışan servislerin belirlenmesi. – Açık portların belirlenmesi. – İşletim sisteminin belirlenmesi.

Detaylı