.Net Core – Worker Servis Nedir?

Worker, .Net uygulamalarının çalışmaya başladığı andan çalışmayı durdurma anına kadar ki geçen süreçte arka planda çalışan servislerin kontrolünü sağlayan yapıdır. Örneğin belirli zaman aralıklarında Cache temizleme işlemleri, belirli zaman aralıklarında sistem durumunu inceleyip raporlayan servisler gibi örnekler verilebilir. Workerlar herhangi bir görünümden (View) bağımsız olarak çalışır. Yani projelerimizde genellikle bir sayfaya girildiğinde ilgili sayfaya ait servisin çalıştırılması sağlanır ama Workerlar projenin sunucuya yüklenip yayına alınmasıyla birlikte çalışır ve proje ömrünü tamamlayana kadar arka planda yaşam döngüsünü sürdürür.

Worker .Net Core 3.0 ile . Net’e eklendi. . Net Core 2.1 de IHostedService olarak kullanımı mevcut ama 3.0 ile gelen Worker, IHostedService yapısını daha derli toplu bir hale getirerek kullanımı kolaylaştırmış oldu.

Worker ile Syslog Loglarını Mongodb’ye Ekleme

Worker’ın çalışma mantığını daha iyi anlamak için bir örnek üzerinden gitmek istiyorum. Örneğin bir SIEM ürünü geliştirdik ve Syslog loglarını arkaplanda dinleyip veritabanına eklemek istiyoruz. Bu işlemler gerçekleşirken SIEM ürününün çalışmasını engellememesi için bu servisin eşzamansız olarak çalışması gerekiyor. Biz bir korelasyon yazarken arka tarafta gelen logları parse edip kaydeden bir servisin çalışıyor olması gerekiyor. İşte arkaplanda çalışacak olan bu servisi worker ile tasarlıyor olacağız.

  1.     Visual Studio ile yeni bir Worker Service (Çalışan Hizmet) Ekliyoruz.
.Net Core Worker Ekleme
.Net Core Worker Ekleme
  1.  Oluşan Worker Projemize BackgroundService sınıfından türeteceğimiz yeni bir Worker sınıfı ekliyoruz. Visual Studio genelde bu sınıfı otomatik olarak ekliyor. 
.Net Core Worker Sınıfı
.Net Core Worker Sınıfı
  1.       Yukarıdaki kodda Worker sınıfı BackgroundService sınıfından türetilerek otomatik olarak çalışma özelliğine sahip oldu. BackgroundService sınıfı StartAsync(), ExecuteAsync(), StopAsync() ve Dispose() olmak üzere 4 adet methoda sahiptir. ExecuteAsync() uygulamamız ayağı kalktığında çalışacağı business logic barındıran methoddur. Dispose() methodunda ise oluşturulan sınıf, nesne instance(örnek)’ları ve GAC boşaltılır.

ExecuteAsync : Bu metod program çalıştırıldığında Worker sınıfında çalıştırılacak ilk metoddur. BackgroundService sınıfına aittir ve biz bu metodu Worker sınıfımızda override ederek eziyoruz.

DoWork : Bu metod bizim iş yaptıracağımız metoddur. İçerisinde SyslogListener sınıfından bir instance oluşturuyoruz. SyslogListener sınıfını aşağıda anlattım şimdilik sadece SyslogListener sınıfının ListenToSyslog metoduna stoppingToken değerini gönderdiğimizi bilelim.

StopAsync : Bu metod program durdurulduğunda çalıştırılır.

stoppingToken : CancellationToken tipinde oluşturulan stoppingToken programın durumunu bildirir. Program eğer çalışıyorsa false durdurulduysa true değeri döndürür. İlerleyen kısımlarda nasıl kullanıldığını daha net anlayacaksınız

Worker sınıfımızı özet geçecek olursam BackgroundService sınıfından türeterek arkaplan servisi olarak çalışmasını sağlamış olduk. Aslında Worker sınıfı içerisinde ExecuteAsync metodu altında da Syslog loglarını dinleyebilir ve Mongodb üzerine yazabilirdik ama bu şekilde bir kullanım projemize farklı arkaplan servisleri eklemek istediğimizde kodlarımızın düzensiz ve karmaşık görünmesine neden olacaktı. Bu nedenle syslog loglarını dinlemek için SyslogListener adında yeni bir sınıf oluşturdum.

ListentoSyslog
ListentoSyslog

SyslogListener sınıfının ListenToSyslog metodunda 514 portunu dinliyoruz ve 514 portuna gelen logları regex ile parse edip veritabanına eklenmesi için logService.Create metoduna aktarıyoruz. Farkettiyseniz Worker class’ından gelen stoppingToken while döngüsünde kontrol ediliyor. stoppingToken’ı yapmak istediğimiz işin devamlılığını sürdürmek için kullanıyoruz. While döngüsü stoppingToken True olana kadar döngüye devam edecek ve gelen logları tek tek alıp parse edip ardından veritanına eklenmesi için LogService sınıfına aktaracak.

Yukarıdaki kodda regex deyimi uzun olduğu için aşağıya aynısını ekşiyorum.

<134>\s+\s+id=(?<id>\S+)\s+sn=(?<sn>\S+)\s+time=(?<date>\d+-\d+-\d+\s+\d+:\d+:\d+)\s+fw=(?<fw>\d+.\d+.\d+.\d+)\s+pri=(?<pri>\d+)\s+c=(?<c>\d+)\s+m=(?<m>\d+)\s+msg=(?<msg>.*)\s+app=(?<app>\d+)\s+n=(?<n>\d+)\s+src=(?<src>\d+.\d+.\d+.\d+:\d+:\S+)\s+dst=

logService ve log nesnelerini Dispose etmemin nedeni anlık gelen log sayısının fazla olması oluşturulan nesnelerin sayısını da arttıracaktır. Bu nedenle kullanılan nesnelerin bir sonraki döngüye kadar bellekten atılması sağlanır.

Şimdi gelelim logların Mongodb’ye eklenmesine.

Bunun için aşağıdaki gibi bir tane Log nesnesi oluşturdum. Log nesnesini oluştururken bana gelecek olan logun yapısını daha önceden inceledim ve log’da bulunan değerlere uygun bir Log nesnesi oluşturdum. Bu log nesnesi Syslogdan gelen logları parse ettikten sonra benim için önemli olan değerleri aktardığım nesne olacak. Ayrıca veritabanına eklerken de belirli bir şablonda eklenmesini sağlayacak.

Veritabanına ekleme işlemini ise LogService sınıfı yapıyor. Daha doğrusu Loglarla ilgili veritabanı Crud işlemlerini bu sınıfta tanımladık.

Log Service
Log Service

4.      Son olarak Worker’ın program başlatıldığı anda otomatik olarak çalışmasını sağlamak için Program.cs aşağıdaki gibi yapılandırılır. 

CreateHostBuilder Yapılandırması

İlginizi Çekebilecek Makaleler
Uçaklarda Bulunan Wi-Fi Verilerinizi Sızdırıyor Olabilir Mi?
Siber Güvenlik

Uçaklarda Bulunan Wi-Fi Verilerinizi Sızdırıyor Olabilir Mi?

Ekim 26, 2021 9:53

Güvenlik uzmanlarına göre uçaktayken internete bağlanmak kişisel verilerinizi riske atıyor olabilir. Bir İngiliz uydu...

Lockbit Fidye Yazılımı
Siber Güvenlik

Lockbit Fidye Yazılımı

Ekim 26, 2021 7:27

LockBit Tanımı LockBit fidye yazılımı, fidye ödemesi karşılığında kullanıcıların bilgisayar sistemlerine erişimini engellemek için...

Winrar Yazılımında Kritik Bir Güvenlik Açığı Tespit Edildi
Siber Güvenlik

Winrar Yazılımında Kritik Bir Güvenlik Açığı Tespit Edildi

Ekim 25, 2021 12:18

Windows için  kullanılan WinRAR’ın (dosya arşivlemeye yarayan program) deneme sürümünde, uzak bir saldırgan tarafından...

Evil Twin Attack-Şeytani İkiz Saldırısı Nedir?
Siber Güvenlik

Evil Twin Attack-Şeytani İkiz Saldırısı Nedir?

Ekim 25, 2021 10:42

Günümüzde kablolu ağlardan daha çok kablosuz ağlar hayatımızın her anında karşımıza çıkmaktadır. Kablolu ağlara...

Typosquatting Nedir?
Siber Güvenlik

Typosquatting Nedir?

Ekim 25, 2021 7:34

Typosquatting, bir arama motoru kullanmak yerine web tarayıcılarına yanlış bir URL yazan internet kullanıcılarını hedef alan...

Cisco SD-WAN Güvenlik Hatası, Kök Kod Yürütülmesine İzin Veriyor
Siber Güvenlik

Cisco SD-WAN Güvenlik Hatası, Kök Kod Yürütülmesine İzin Veriyor

Ekim 24, 2021 10:26

CVE-2021-1529 olarak izlenen yüksek önemdeki hata, bir işletim sistemi komut enjeksiyon hatasıdır. Cisco SD-WAN...

Bozuk Kimlik Doğrulama
Siber Güvenlik

Bozuk Kimlik Doğrulama

Ekim 23, 2021 1:38

İşletmenizin kullanıcı kimliğine bürünme riski altında olup olmadığını ve bu konuda ne yapılması gerektiğini...

HTTP İstek Kaçakçılığı
Siber Güvenlik

HTTP İstek Kaçakçılığı

Ekim 23, 2021 11:56

HTTP istek kaçakçılığı, bir web sitesinin bir veya daha fazla kullanıcıdan alınan HTTP istek...

OS Komut Enjeksiyonu
Siber Güvenlik

OS Komut Enjeksiyonu

Ekim 22, 2021 10:41

OS komut enjeksiyonu ayrıca kabuk enjeksiyonu olarak da bilinir, bir saldırganın bir uygulamayı çalıştıran...

İletişim
OZZTECH Bilgi Teknolojileri olarak siber güvenlik danışmanlığı ve bilgi güvenliği eğitimleri alanlarında 10 yılı aşkın bir süredir ülkemizin önde gelen kurumlarına hizmet vermeye devam etmektedir. Detaylı bilgi ve danışmanlık hizmetlerimiz için aşağıdaki formu kullanarak veya [email protected] adresimiz üzerinden bizlerle iletişime geçebilirsiniz.