Elastic Stack ile Log Yönetimi ve İzleme [BEATS — LOGSTASH — ELASTICSEARCH-KIBANA ENTEGRASYONU]

Serkan Bingöl
AWS Certified User Group Turkey
9 min readDec 12, 2018

--

DevOps süreçleri ile ilgili olarak şu ana kadar genellikle yazılım derleme ve dağıtım , proje yönetimi süreçleri, uygulama kod geliştirme ve analiz etme gibi konulara değinmiş olsak da aslında devops kavramı sadece bu yaklaşımlardan ibaret değil. Bu kavram geniş çerçeveden bakıldığı takdirde “ Altyapı Otomasyonu, Konfigürasyon Yönetimi, Dağıtım Otomasyonu, Altyapı İzleme, Log Yönetimi, Uygulama ve Performans Yönetimi ” gibi bir çok alanı içinde barındırmaktadır. Bu yazımızda işin biraz da altyapı izleme ve log yönetimi alanlarına bakacağız.

Bu çalışmayı yaparken Elastic ailesinin bileşenlerini kullanarak bir mimari alt yapı kurgulayacağız. Elastic Stack açık kaynak kodlu olarak geliştirilen ve kullanıcılara ,kurguladıkları sistem üzerinden log toplama , arama ve analiz yapmalarına olanak tanıyan bir ürün olarak ortaya çıkmıştır. Daha detaylı bilgi almak adına linki tıklayarak gerekli dokümantasyonları inceleyebilirsiniz.

Elastic Stack Mimarisi ve Sunucu Kurulumu

Sunucu kurulumuna geçmeden önce elastic stack ailesine ait yapıdan ve kullanılan araçlardan kısaca bahsetmek istiyorum.Senaryomuz üzerinde clientlardan topladıkları logları elkstack sunucumuza yollamakla yükümlü aracımız Beats , toplanan bu logları bir sunucu içinde derleyip üzerinde yapılması gereken bir dönüştürme ve anlam kazandırma işlemini gerçekleştiren aracımız Logstash ,bu logları indexlendirerek aranabilir ve analiz edilebilir hale dönüştüren aracımız Elasticsearch ve tüm bu yapılan detaylı çalışmayı bizlere görselleştiren aracımız Kibana olarak karşımıza çıkmaktadır.

Bulut hizmet sağlayıcıları artık geniş kitlelere hizmet verdiği için bazı uygulama hizmetlerini sunucular üzerinde kullanıma hazır bir şeklide sunabiliyor. Azure üzerinde elastic stack için bu şekilde hazır bir çözüm olmasına rağmen ben manuel kurulum üzerinden giderek sunucu ve uygulamaların ayarlama kısımlarına da değinmek istiyorum.

Ayrıca azure üzerinde sistemi kurgulamak istemeyen arkadaşlar olur ise Digital Ocean sayfası üzerinden hizmetleri inceleyerek buradan sağlanan yapı üzerinde bir kurulum gerçekleştirmek isteyebilir.

Sistemi oluştururken gerekli işlemleri yapmak adına elastic stack sunucusu için ( Ubuntu Server 18.04 ) üzerinde bir kurulum gerçekleştiriyoruz. Ayrıca logları toplamak adına bir adet linux ve bir adet windows client kurulumu gerçekleştiriyoruz.

Kapsamlı bir high-available sistem için ilgili link üzerinden yola çıkarak bir kurulum gerçekleştirebilirsiniz. Oluşturmuş olduğumuz elastic stack sunucusu üzerinde public kullanım için bir dns (elkstack.devengers.net) ataması yaparak ileride bu sayfa üzerinden kurgumuzu devam ettiriyor olacağız.

Kurulumları gerçekleştirirken log toplama işlemlerinini besleyecek yapıları (Filebeat )client makinalarda gerçekleştirirken , logları işleme (Logstash) , analiz (Elasticstash) ve görselleştirme (Kibana) kısmında ise kurduğumuz Linux sunucu üzerinde çalışacağız. oluşturulacak mimari için detayı aşağıdaki resimden takip edebilirsiniz. Client sunucular üzerinden toplanan logları , elk stack sunucusuna ileterek gerekli sistemi çalıştırıyor olacağız.

Linux sunucu kurulumunu tamamladıktan sonra putty uygulaması ile gerekli SSH bağlantısı ile sunucumuza bağlanıyoruz. Burada mimari yapı için kurulumlara geçmeden önce Java8 sürümünü ve web sunucusu olan Nginx indirip kurmamız gerekmekte.

Java 8 ve Nginx Kurulumu

Java 8 kurulumu için öncelikle sudo add-apt-repository ppa:webupd8team/java komutunu kullanarak gerekli ön bilgilendirmeleri okuyarak ilgili paket listemize ekleyip sudo apt update ve sudo apt install oracle-java8-installer komutlarını sırası ile çalıştırıp , paketin kurulumunu gerçekleştiriyoruz.

Kurulumu tamamladıktan sonra java -version komutu ile bir sürüm kontrolü yapabiliriz.

Bu işlemden sonra logları yayınlamak ve bir Kibana dashboard üzerinden takip etmek adına bir web sunucusu olan Nginx kurulumuna başlıyoruz. sudo apt update komutu ile paket güncellemesi yaparak sudo apt install nginx komutu ile nginx kurulumunu gerçekleştiriyoruz. Burada ufw ayarlarının tamamen kapalı olduğu bir senaryoda çalışıyoruz. İstenir ise linkten ufw-nginx ayarlarını inceleyebilir ve firewall için gerekli kontrolleri sağlayabilirsiniz. systemctl status nginx komutu kullanarak nginx server için bir durum kontrolü yapıyoruz.

İlgili servis her sistem yeniden başlatmada otomatik olarak start edilecektir gerekir ise sudo systemctl stop nginx ve sudo systemctl start nginx komutları ile servisi manuel tetikleyebiliriz.

Nginx server servisi çalışır konumda olduğu için elkstack.devengers.net adresi üzerinden gerekli kontrolleri yaparak web sunucusunun ayakta olduğunu browser üzerinden kontrol edebiliriz.

Web sunucusu uygun bir şekilde ayağa kaldırıldı.

Beats-Logstash-Elasticsearch-Kibana Kurulumları

Java 8 ve Nginx kurulumlarını gerçekleştirdikten sonra sonra elasticsearch kurulumu için sırası ile wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - komutunu kullanıp elasticsearch paketi için lisans anahtarını oluşturuyoruz. echo “deb https://artifacts.elastic.co/packages/6.x/apt stable main” | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list komutu ile paket içindeki kaynakları oluşturuyoruz ana kaynak listemize dahil ediyoruz. sudo apt-get update ve sudo apt install elasticsearch komutlarını çalıştırarak elasticsearch aracımızın güncel olan 6.5.3 sürümü için kurulumu bitiriyoruz.

Kurulum işlemi için sudo apt install elasticsearch komutu çalıştırılıyor.

Gerekli ayarlamaları yapmak ve gözden geçirmek adına elasticsearch.yml dosyasını sudo vi /etc/elasticsearch/elasticsearch.yml komutu ile açıyoruz. Burada network.host: localhost satırını kontrol ederek yml dosyasından çıkış yapabilirsiniz.

Açılan vim editörde tuş kombinasyonları için aşağıdaki resmi inceleyebilirsiniz. Ek olarak editör üzerinde gG” tuş kombinasyonu tüm içeriğin en başına gider dG tüm içeriği seçer gerekli işlemleri yaptıktan sonra :wq ile değişiklikleri zorunlu şekilde kaydedip kapatabilirsiniz.

Artık elasticsearch servisimizi sudo service elasticsearch start komutu ile çalıştırıp düzgün bir kurulum gerçekleştirmiş isek curl http://localhost:9200 komutunu çalıştırdığımız zaman aşağıdaki json geri dönüşünü görmemiz gerekmektedir.

Elasticsearch çalışır konumda iken istediğimizde bir HTTP isteği ile sistemi test edebiliriz.

Elasticsearch ile ilgili işlemlerimizi tamamladıktan sonra Kibana kurulumu için sudo apt-get install kibana komutunu kullanıp paket indirme ve kurulum işlemini tamamlandıktan sonra servisi aktif etmek adına sudo systemctl enable kibana ve sudo systemctl start kibana komutlarını çalıştırmamız gerekmektedir.

Burada kibana kurulumu gerçekleştirdikten sonra localhost üzerinden yayında olan kibana uygulaması için bir reverse proxy işlemi gerçekleştirmek ve dışarıdan ulaşıma izin vermek adına bir kibanaadmin kullanıcısı oluşturarak bir şifre ataması gerçekleştirmemiz gerekmektedir. echo “kibanaadmin:`openssl passwd -apr1`” | sudo tee -a /etc/nginx/htpasswd.users komutu ile bu işlemleri tamamlayabiliriz.

kibanaadmin ve şifre oluşturmak için echo “kibanaadmin:`openssl passwd -apr1`” | sudo tee -a /etc/nginx/htpasswd.users komutu ile gerekli işlemlerin yapılması gerekmektedir.

Bu işlemlerimiz tamamlandıktan sonra nginx web sunucusu üzerinde public taraftaki yayınımız için gerekli ayarlamaları yapmaya başlıyoruz. sudo vi /etc/nginx/sites-available/elkstack.devengers.net komutu ile bir reverse proxy ayarlaması yapacağımız ve elkstack.devengers.net üzerine gelen http isteklerinin hepsini localhost üzerinde çalışan kibana uygulamasına yönlendireceğimiz dosyayı açarak aşağıdaki kod bloğunu bu belgeye vi editör üzerinden ekliyoruz. burada dns_adi.com yazan alana kendi dnsmiz olan elkstack.devengers.net adresini veriyorum ve belgeyi kaydederek kapatıyorum.

server {
listen 80;

server_name dns_adi.com;

auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/htpasswd.users;

location / {
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}

İlgili işlemleri kendi DNS ayarlarım için yaptığım ekranı aşağıda görebilirsiniz.

Bu işlemleri yaptıktan sonra sudo ln -s /etc/nginx/sites-available/elkstack.devengers.net /etc/nginx/sites-enabled/elkstack.devengers.net komutunu çalıştırarak bu ayarlamaların ve elkstack.devengers.net sitesinin izinli siteler arasına eklenmesini sağlayan işlemi gerçekleştirmiş oluyoruz. sudo nginx -t ile bu işlemin başarılı olup olmadığını kontrol ediyor ve syntax is ok cevabını almayı umuyoruz.

Kibana uygulamasını browser üzerinden kontrol etmek adına http://elkstack.devengers.net/status adresine kibanaadmin ve şifresini kullanarak ilgili ekrana ulaşmış olmamız gerekmektedir.

Kibana uygulamasına web arayüzü üzerinden ulaştıktan sonra bu uygulamayı besleyecek ve gerekli log analizlerini aktaracak uygulamamız olan Logstash için gerekli kurulumu ve ayarlamaları yapmamız gerekiyor. sudo apt install logstash komutu ile gerekli paket kurulumunu yaptıktan sonra Logstash mimarisini ve ayarlamalarını aşağıdaki resim üzerinden takip edebileceğimiz bir anlatım ile gerçekleştirmeye çalışacağım.

Bizim kurgumuzda logstash ayarlamaları için toplamda 3 adet konfigürasyon dosyası oluşturmamız gerekmektedir.Bu ayar dosyaları aslında /etc/logstash/conf.d klasörü içinde tutulmaktadır. Sırası ile logların diğer sunuculardan toplandıktan sonra logstash tarafından dinlenmesini sağlayan input ayar dosyasını sudo vi /etc/logstash/conf.d/02-beats-input.conf komutu ile vi editör üzerinden açarak aşağıdaki kod satırlarını bu dosya içinde konumlandırıyoruz.

input {
beats {
port => 5044
}
}

Burada dışarıdan toplanan logların elkstack sunucusunda logstash adına 5044 portundan dinleneceğini tanımlamış oluyoruz.

İlgili konfigürasyon komutu sudo vi /etc/logstash/conf.d/02-beats-input.conf ile logstashin input tanımlamalarını gerçekleştiriyoruz.

Sistem loglarının mesajları için bir filtreleme dosyası oluşturmak adına sudo vi /etc/logstash/conf.d/10-syslog-filter.conf komutu ile gerekli konfigürasyon dosyasına aşağıdaki kod satırlarını ekleyerek devam ediyoruz.Bu kod satırları sistem loglarını alabilecek bir desen ile oluşturulmuş default kodlardır.

input {
beats {
port => 5044
host => "0.0.0.0"
}
}
filter {
if [fileset][module] == "system" {
if [fileset][name] == "auth" {
grok {
match => { "message" => ["%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} %{DATA:[system][auth][ssh][method]} for (invalid user )?%{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]} port %{NUMBER:[system][auth][ssh][port]} ssh2(: %{GREEDYDATA:[system][auth][ssh][signature]})?",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} user %{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: Did not receive identification string from %{IPORHOST:[system][auth][ssh][dropped_ip]}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sudo(?:\[%{POSINT:[system][auth][pid]}\])?: \s*%{DATA:[system][auth][user]} :( %{DATA:[system][auth][sudo][error]} ;)? TTY=%{DATA:[system][auth][sudo][tty]} ; PWD=%{DATA:[system][auth][sudo][pwd]} ; USER=%{DATA:[system][auth][sudo][user]} ; COMMAND=%{GREEDYDATA:[system][auth][sudo][command]}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} groupadd(?:\[%{POSINT:[system][auth][pid]}\])?: new group: name=%{DATA:system.auth.groupadd.name}, GID=%{NUMBER:system.auth.groupadd.gid}",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} useradd(?:\[%{POSINT:[system][auth][pid]}\])?: new user: name=%{DATA:[system][auth][user][add][name]}, UID=%{NUMBER:[system][auth][user][add][uid]}, GID=%{NUMBER:[system][auth][user][add][gid]}, home=%{DATA:[system][auth][user][add][home]}, shell=%{DATA:[system][auth][user][add][shell]}$",
"%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} %{DATA:[system][auth][program]}(?:\[%{POSINT:[system][auth][pid]}\])?: %{GREEDYMULTILINE:[system][auth][message]}"] }
pattern_definitions => {
"GREEDYMULTILINE"=> "(.|\n)*"
}
remove_field => "message"
}
date {
match => [ "[system][auth][timestamp]", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
geoip {
source => "[system][auth][ssh][ip]"
target => "[system][auth][ssh][geoip]"
}
}
else if [fileset][name] == "syslog" {
grok {
match => { "message" => ["%{SYSLOGTIMESTAMP:[system][syslog][timestamp]} %{SYSLOGHOST:[system][syslog][hostname]} %{DATA:[system][syslog][program]}(?:\[%{POSINT:[system][syslog][pid]}\])?: %{GREEDYMULTILINE:[system][syslog][message]}"] }
pattern_definitions => { "GREEDYMULTILINE" => "(.|\n)*" }
remove_field => "message"
}
date {
match => [ "[system][syslog][timestamp]", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
}
output {
elasticsearch {
hosts => localhost
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
}

Bu filtreleme ayar dosyası , toplanan sistem loglarını yapılandırmak ve kibana uygulaması tarafından kullanılabilecek bir hale dönüştürmek adına hazırlanmaktadır.

İlgili konfigürasyon komutu sudo vi/etc/logstash/conf.d/10-syslog-filter.conf ile logstashin filter tanımlamalarını gerçekleştiriyoruz.

Son olarak oluşan tüm logların işlenmesi ve elasticsearch ile bağlantı kurarak elasticsearch tarafından kullanılabilecek hale getirmek adına gerekli olan output konfigürasyon dosyasını sudo vi /etc/logstash/conf.d/30-elasticsearch-output.conf komutu ile oluşturup gerekli kod satırlarını ilgili dosyanın içinde yazıyoruz.

output {
elasticsearch {
hosts => ["localhost:9200"]
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
}

Bu output ayar dosyası , toplanan beats loglarının elasticsearch için tutmak ve bunları uygun format ile elasticsearch uygulamasına iletmek adına hazırlanmaktadır.

Ayarlamaları test etmek adına sudo -u logstash /usr/share/logstash/bin/logstash — path.settings /etc/logstash -t komutunu kullanarak Configruation OK dönüşünü almamız gerekmektedir.

Tüm işlemleri gerçekleştirdikten sonra logstash servisini aktif hale getirmek adına sudo systemctl start logstash.service ve sudo systemctl enable logstash ile servisi aktif ederek logların toplanması adına diğer işlemlerimize başlayabiliriz.

Logstash servisi için gerekli komutların çalıştırılması gerekmektedir.

Artık clientlarımızdan gerekli logları toplamak adına filebeat kurulumu aşamasına geçebiliriz. Burada öncelikli olarak beat platformundan bahsetmemiz gerekir ise “Beat verilerinizi Elasticsearch platformuna taşımanızı sağlayan açık kaynak ve hafif bir platformdur” konu ile ilgili olarak bir kaç çeşit beat tipi olmasına rağmen biz burada sunucularımızda ki log dosyalarımızı takip edebilmemize olanak tanıyan filebeat ile işlem yapacağız.Genel bilgiyi bu link üzerinden inceleyebilirsiniz.

Bu senaryoda beat kurulumunu üzerinde ubuntu 18.04 sürümü koşan bir sanal makinede yapacağız. sudo apt install filebeat komutunu kullanarak gerekli filebeat kurulum paketini client üzerinde yükleyeceğiz.Windows client üzerinde bir log toplama ve yollama işlemini bu makalede şimdilik ele almayacağız.

Yüklenmiş olan filebeat için sudo vi/etc/filebeat/filebeat.yml komut satırını kullanarak gerekli ayarlamaları yapacağımız dosyayı vi editör üzerinden açıyoruz. Ve belge üzerinde bu filebeat ile elasticsearch yerine logstash üzerine toplanan logların gönderileceğini belirtiyoruz. Logstash output olarak “elkstack.devengers.net:5044" adresi ve portu ile iletişim kurması gerektiğini belirtmemiz ve elasticsearch kısımlarını yorum satırına almamız gerekmektedir.

Bundan sonra bu client üzerinde filebeat için sistem modulünü aktif hale getirmemiz gerekmektedir. sudo filebeat modules enable system komutu ile ilgili aktivasyonu sağlamış oluyoruz. sudo filebeat modules list komutunu kullanarak bu modül aktivasyonunu inceleyebiliriz.

Gerekli işlemleri tamamladıktan sonra sudo systemctl start filebeat ve sudo systemctl enable filebeat komutlarını çalıştırarak client tarafında işlemlerimizi tamamlamış oluyoruz.

Artık elk stack sunucumuza gecerek curl -XGET ‘http://localhost:9200/filebeat-*/_search?pretty' komutu ile ilgili logların logstash’e iletilip elasticsearch üzerinde indexlendiğini kontrol edebiliriz.

Bu komut satırını çalıştırdıktan sonra “took“ parametresi 0 olarak geri döndü ise tüm filebeat ayarlamalarımızı kontrol ederek logstash ile olan bağlantı ayarlamalarının kontrolü sağlanmalıdır.

Elasticsearch üzerinde indexlenmiş loglarımızı artık kibana arayüzü üzerinden takip edebiliriz. Kibana arayüzümüze ulaşıp discovery sekmesinden ilgili filebeat indeksimize ulaşıp default loglarımızı kontrol edebiliriz.

Ayrıca log sekmesinden tüm sistem loglarımızın detaylarına ulaşmamız mümkündür.

Artık devops süreçlerinde log izleme süreçleri ile ilgili kurgulamış olduğumuz log yönetim ve izleme uygulaması makalemizin sonuna gelmiş bulunmaktayız. Bir sonraki makalemizde bir kaç uygulama sunucusu üzerinden aldığımız sistem loglarını , metrikleri ve application loglarını elk stack sunucumuz üzerinde analiz ederek Kibana üzerinden takibini yapabileceğimiz bir senaryo ile görüşmek üzere…

“Önce meseleyi çözün. Sonra kodu yazın.”
John Johnson

Elk Stack kurulum aşamaları :https://1drv.ms/b/s!AskWoAU3NqUug_YqI55lHMFg8PVHAA

--

--

Serkan Bingöl
AWS Certified User Group Turkey

Muzur bir oğlan babası, hayvan sever, Harry Potter hayranı, bazen maceracı düz yazılımcı.