Sysdig ile Docker Sistem Yönetimi

Koray Ağaya
Devops Türkiye☁️ 🐧 🐳 ☸️
9 min readJul 31, 2019

--

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 ?

  1. strace — Sistem üzerindeki çalışan süreçler hakkında bilgi alabiliriz.
  2. tcpdump — Ağ trafiğini izlememizi ve gelen giden trafik hakkında bilgi almamızı sağlar.
  3. netstat — Sistem üzerinde çalışan servisleri öğrenmemizi ve bu servislerin detaylarını almamızı sağlar.
  4. htop — Çalışan servislerin sistem üzerinde kullandığı cpu ve ram bilgilerini almamızı ve buna ait olan pid numalarını öğrenmemizi sağlar.
  5. iftop — Gerçek zamanlı olarak network üzerindeki yükü görmemizi sağlar.
  6. 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 ?

  1. Docker, LXC dahil container teknolojileri için doğal desteği ile birlikte gelir.
  2. Çıktıların filtrelenebilmesini sağlar.
  3. Ansible, Puppet and Logstash ile entegre çalışabilir.
  4. 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.

  1. Field Class: fd
  2. Field Class: process
  3. Field Class: evt
  4. Field Class: user
  5. Field Class: group
  6. Field Class: syslog
  7. 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
  1. evt.num : Event numarası
  2. evt.time : Event tarihi
  3. evt.cpu : Event hangi CPU üzerinde çalıştığı
  4. proc.name : Süreç ismi
  5. thread.tid : Thread ID ( Tek thread süreç )
  6. 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:

--

--