Sysdig ile Docker Sistem Yönetimi
Sysdig, açık kaynak kodlu bir araç olup güçlü ve esnek yapısı sayesinde sistem izleme ve sorun giderme aracı olarak kullanılmaktadır. Bu yazımda container üzerinde nasıl kullanabileceğimizi göstereceğim.
Ek bilgi olarak sysdig aracının Windows ve Mac OSX üzerinde çalışabilir olduğunu ama bu ortamlar üzerinde sınırlı işlevsellik gösterdiğini söylemek isterim.
Sysdig bazı araçları tek bir çatı altında toplamaktadır. Bu araçlar nedir ona bakalım ?
- strace — Sistem üzerindeki çalışan süreçler hakkında bilgi alabiliriz.
- tcpdump — Ağ trafiğini izlememizi ve gelen giden trafik hakkında bilgi almamızı sağlar.
- netstat — Sistem üzerinde çalışan servisleri öğrenmemizi ve bu servislerin detaylarını almamızı sağlar.
- htop — Çalışan servislerin sistem üzerinde kullandığı cpu ve ram bilgilerini almamızı ve buna ait olan pid numalarını öğrenmemizi sağlar.
- iftop — Gerçek zamanlı olarak network üzerindeki yükü görmemizi sağlar.
- lsof — Hangi dosya hangi işlevi kullanıyor, bu işleve kimler bağlanmaya çalışmış öğrenebilmemizi sağlar.
Sysdig kullanmamız bize ne gibi faydalar sağlar ?
- Docker, LXC dahil container teknolojileri için doğal desteği ile birlikte gelir.
- Çıktıların filtrelenebilmesini sağlar.
- Ansible, Puppet and Logstash ile entegre çalışabilir.
- Geriye dönük veri almamızı ve bir atak olduğunda onu kolayca yönetebilmemizi sağlar.
Sysdig Aracının Docker ile Etkileşimi
Sysdig, Linux çekirdeğinde yapılan sistem çağrılarını yakalayarak çalışır. Buda Sysdig’e uygulamaların container ların içinde olsa bile nasıl çalıştıklarına dair benzersiz bir görünürlük sağlar. Örnek olarak wireshark’ı kullandığınızı düşünün bunu sadece kendi ağ etkinliği için değil, tüm çalışan container ların ağ aktivitelerini öğrenmek için yapabilirsiniz.
Şimdi sysdig aracını kullanacağımız bir senaryo oluşturmamız gerekli. Bu senaryo içerisinde 1 adet Mysql sunucusu, 2 adet Wordpress web sunucusu ve 1 adet Nginx proxy sunucu olacak. Bu ortamı aşağıdaki yönergeleri kullanarak oluşturabiliriz.
1 Adet Mysql
docker run --name mysqlnew -v /data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD='A123456!' -d mysql
2 Adet Wordpress
docker run --name korwp1 -e VIRTUAL_HOST=wp --link mysqlnew:mysqlnew -d wordpressdocker run --name korwp2 -e VIRTUAL_HOST=wp --link mysqlnew:mysqlnew -d wordpress
1 Adet Nginx Proxy
docker run --name proxy -p 80:80 -e DEFAULT_HOST=wp -v /var/run/docker.sock:/tmp/docker.sock:ro -d jwilder/nginx-proxy:alpine
Proxy sunucusu sayesinde web tarayıcımız üzerinden 80 portuna talep de bulunduğumuzda Wordpress kurulum ekranı gelmektedir. Buda kurulumları düzgün olarak yaptığımızı gösteriyor.
http://localhost
Şimdi sysdig uygulamamızın çalışacağı container ımızın kurulumunu yapalım.
Sysdig Kurulum
docker run -it --rm --name=sysdig --privileged=true --volume=/var/run/docker.sock:/host/var/run/docker.sock --volume=/dev:/host/dev --volume=/proc:/host/proc:ro --volume=/boot:/host/boot:ro --volume=/lib/modules:/host/lib/modules:ro --volume=/usr:/host/usr:ro sysdig/sysdig
Sysdig üzerinde komut çalıştıralım !
Sysdig komutunu tek başına çalıştırdığımızda;
sysdig
terminal üzerine çok fazla logun düştüğünü görürüz. Sysdig bu logları anlandırmak için kendi içerisinde birden çok filtre barındırmaktadır.
Kurduğumuz container lar içerisinde apache2 servisisinin olduğunu biliyoruz. Bu servise yönelik aktiviteleri görmek için aşağıdaki komutu kullanabiliriz.
sysdig proc.name=apache2
Sysdig üzerinde filtreleme yaparken kendi içerisinde aşağıdaki gibi
( =, !=, <, <=, >, >= ) (“and”, “or” ve “not”)
filtre operatörleri kullanabiliriz.
sysdig -l
komutu ile tüm kategori seçeneklerini görebilirsiniz.
Bu kategori çeşitlerinden birkaçını aşağıda bulabilirsiniz.
- Field Class: fd
- Field Class: process
- Field Class: evt
- Field Class: user
- Field Class: group
- Field Class: syslog
- Field Class: container
Sysdig komutunu çalıştırdığımızda ekrana dökülen bilgilerin sırasıyla kolon kolon anlamlandırılması aşağıdaki gibidir.
%evt.num %evt.time %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.args
- evt.num : Event numarası
- evt.time : Event tarihi
- evt.cpu : Event hangi CPU üzerinde çalıştığı
- proc.name : Süreç ismi
- thread.tid : Thread ID ( Tek thread süreç )
- evt.args : Event argüman
Tüm event listesini almak için;
sysdig -L
Sysdig — Chisels Kullanımı
Chisels , sysdig üzerinden elde edilen verinin anlamlandırılması için kullanılan scriptlere verilen bir isimdir. Bu scriptlere ulaşmak için aşağıdaki komutu kullanabiliriz.
sysdig -cl
Chisels scriptleri hakkında daha fazla bilgi almak için -i parametresini kullanabilirsiniz;
sysdig -i list_login_shells
Genel bilgilerden sonra yavaş yavaş sysdig aracının detaylı olarak kullanmaya başlayalım . İlk olarak bizde çalışan container ların IP lerini öğrenelim.
docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'
Çalışan portlarıda aşağıdaki komutla öğrenebiliriz.
docker ps --quiet | xargs docker inspect --format '{{.Id}}:Ports={{.NetworkSettings.Ports}}'
Ayrıcalıklı bir konteyner olup olmadığını aşağıdaki komutla öğrenebiliriz.
docker ps --quiet -all | xargs docker inspect --format '{{ .Id }}: Privileged={{ .HostConfig.Privileged }}'
Konteyner kullandığı volume leri aşağıdaki komutla öğrenebiliriz.
docker ps --quiet -all | xargs docker inspect --format '{{ .Id }}: Volumes={{ .Mounts }}
Network modunu öğrenmek için aşağıdaki komutu kullanabilirsiniz.
docker ps --quiet -all | xargs docker inspect --format '{{ .Id }}: NetworkMode={{ .HostConfig.NetworkMode }}'
Sysdig — Network
Çalışan container lar içerisinde network’ü en çok kullanan servisi görüntüleme;
sysdig -c topprocs_net
Çalışan sunucu container lar içerisinde “established” olan bağlantıları görüntüleme;
sysdig -c fdcount_by fd.sport "evt.type=accept"
Çalışan sunucu container lar içerisinde en çok bağlantıyı tüken servisi byte cinsinden görüntüleme;
sysdig -c fdbytes_by fd.sport
Sunucu container lara bağlanan client bazında “established” olan bağlantıları görüntüleme;
sysdig -c fdcount_by fd.cip "evt.type=accept"
Sunucu container lara bağlanan client bazında en çok bağlantıyı tüken servisin byte cinsinden görüntüleme;
Bütün gelen bağlantıları dinle ama içerisinde apache sunucusu olmasın;
sysdig -p"%proc.name %fd.name" "evt.type=accept and proc.name!=httpd"
Sysdig — Container
Çalışan container ları listele ve kullandığı kaynakları görüntüleme;
csysdig -vcontainers
Container lar içerisinde çalışan process leri görüntüleme;
csysdig -pc
Belirtiğimiz container için en çok cpu kullanan servisi görüntüleme;
sysdig -pc -c topprocs_cpu container.name=korwp1sysdig -pc -c topprocs_cpu container.name=proxy
Belirtiğimiz container için en çok bandwith kullanan process leri görüntüleme;
sysdig -pc -c topprocs_net container.name=proxysysdig -pc -c topprocs_net container.name=korwp1
Belirttiğimiz container için en çok yazma işlemine uğrayan dosyayı görüntüleme;
sysdig -pc -c topfiles_bytes container.name=proxy
Belirttiğimiz container için en fazla network bağlantısı kuran bağlantıları görüntüleme
sysdig -pc -c topconns container.name=mysql
Belirttiğimiz container içerisinde interaktif çalıştırılan komutları görüntüleme;
sysdig -pc -c spy_users container.name=mysql
Sysdig — Application
Container lar içerisinde GET HTTP taleplerini alan bağlantıları görüntüleme;
sysdig -s 2000 -A -c echo_fds fd.port=80 and evt.buffer contains GET
Container lar içerisinde SELECT sorgusunu kullanan sorguları görüntüleme;
sysdig -s 2000 -A -c echo_fds evt.buffer contains SELECT
Apache üzerinden yapılan sorguları, gerçek zamanlı olarak MySQL sunucusu tarafında görüntüleme;
sysdig -s 2000 -A -c echo_fds fd.sip=192.168.30.5 and proc.name=apache2 and evt.buffer contains SELECT
Sysdig — Disk I/O
Disk bant genişliği kullanımı açısından değeri en yüksek olan işlemleri görüntüleme;
sysdig -c topprocs_file
Çok sayıda dosya kullanan işlemleri görüntüleme;
sysdig -c fdcount_by proc.name "fd.type=file"
En fazla okuma + yazma yapan dosyanın baytı açısından görüntülüme;
sysdig -c topfiles_bytes
Apache servisinin en fazla okuyup yazdığı dosyayı görüntüleme;
sysdig -c topfiles_bytes proc.name=httpd
Basic opensnoop: açılan snoop dosyalarını görüntüleme;
sysdig -p "%12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open
En fazla R + W disk etkinliği olan üst dizinleri görüntüleme;
sysdig -c fdbytes_by fd.directory "fd.type=file"
/tmp dizinindeki R + W disk etkinliği açısından en çok kullanılan işlevleri görüntüleme;
sysdig -c fdbytes_by fd.filename "fd.directory=/tmp/"
‘Passwd’ adlı tüm dosyalarda disk I/O etkinliğini görüntüleme;
sysdig -A -c echo_fds "fd.filename=passwd"
I/O etkinliğini FD türüne göre görüntüleme;
sysdig -c fdbytes_by fd.type
Sysdig — Process ve CPU Kullanımı
CPU kullanımı açısından en iyi süreçleri görüntüleme;
sysdig -c topprocs_cpu
cat uygulamasının kullanıldığı output larını görüntüleme;
sysdig -s4096 -A -c stdout proc.name=cat
Sysdig — Performans ve Hatalar
En çok zaman harcanan dosyaları görüntüleme;
sysdig -c topfiles_time
Apache’nin en çok zaman harcadığı dosyaları görüntüleme;
sysdig -c topfiles_time proc.name=httpd
I/O hataları açısından en iyi işlemleri görüntüleme;
sysdig -c topprocs_errors
I/O hataları açısından en iyi dosyaları görüntüleme;
sysdig -c topfiles_errors
Tüm başarısız disk I/O aramalarını görüntüleme;
sysdig fd.type=file and evt.failed=true
Httpd tarafından açılan tüm başarısız dosyaları görüntüleme;
sysdig "proc.name=httpd and evt.type=open and evt.failed=true"
En fazla zaman harcanan sistem aramalarını görüntülüme;
sysdig -c topscalls_time
En fazla dönen sistem hatalarını görüntüleme;
sysdig -c topscalls "evt.failed=true"
snoop tarafında başarısız dosya oluştukça ekranda görüntüleme;
sysdig -p "%12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open and evt.failed=true
Gecikme süresi 1ms’den büyük olan I/O çağrıları dosyasını görüntüleme;
sysdig -c fileslower 1
Sysdig — Security
“Root” kullanıcısının ziyaret ettiği dizinleri görüntüleme;
sysdig -p"%evt.arg.path" "evt.type=chdir and user.name=root"
Ssh aktivitelerini görüntüleme;
sysdig -A -c echo_fds fd.name=/dev/ptmx and proc.name=sshd
/etc dizini altındaki açık alan dosyaları görüntüleme;
sysdig evt.type=open and fd.name contains /etc
“Tar” komutunu başlatan tüm oturum açma kabuklarının kimliğini görüntüleme;
sysdig -r file.scap -c list_login_shells tar
Giriş kabuğu tarafından yürütülen tüm komutları verilen kimliğe göre görüntüleme;
sysdig -r trace.scap.gz -c spy_users proc.loginshellid=5459
Sysdig — Tracing
Web sitesi gecikmesini ölçmek için bir izleme oluşturma;
echo ">::website-latency::" > /dev/null
curl -s http://sysdig.org > /dev/null
echo "<::website-latency::" > /dev/null
Oturum açma girişimi izleme oluşturma;
echo ">:t:login:username=koray:" > /dev/null
echo "<:t:login::" > /dev/null
Profilime tıklayarak diğer yazılarıma göz atabilirsiniz.
Kişisel Bloğuma göz atmak isterseniz: