Redis, ElasticSearch ve Kibana’nın Windows Üzerinde Kurulum, Uzaktan Erişim ve .Net İle Güvenliği

Selamlar,

Bugünkü makalede config dosyaları, indirme yolları, kurulumları ve izin verilme şekilleri sürekli değişen Redis, ElasticSearch ve Kibana toolarının, Windows server üzerinde son güncel halleri ile nasıl tanımlanıp konfigüre edileceğinden ve .Net Core bir projede config bilgilerinin nasıl saklanması gerektiğinden detaylıca bahsedeceğim.

Image Source: bdbq-assets.storage.googleapis.com

Redis:

Öncelikle aşağıdaki adresden, “Latest” enson Redis kütüphanesi indirilir.

https://github.com/microsoftarchive/redis/releases

İndirilen dosyanın içinden: “Windows Service Documentation.docx” dosyası, yukarıda görüldüğü gibi açılır. “Installing The Service” kısmından aşağıdaki komut ile redis, servis olarak kurulur. Dikkat edecek olur iseniz, config dosyası olarak “redis.windows-service.conf ” dosyasının kullanıldığını görebilirsiniz. Ayrıca “redis-server” komutu, redisin inidirildiği root folder’ında çalıştırılmalıdır.

Son olarak: Redisin indirildiği klasörün içine,  logs adında bir folderın oluşturulması gerekmektedir. Manuel oluşturulmaz ise hata alınır!

Alttaki komut ile servisler ekranı çağrılır, ve “Redis” servis “Automatic” tipde çalıştırılır.

Ayrıca istenir ise, Redis Servis’i kaldırmak için aşağıdaki komut çalıştırılır.

Redis Güvenlik ve Remote Erişim:

redis.windows-service.conf” dosyasına aşağıdaki satır eklenerek Redis’e şifre atanır. Ve servis Restart edilir.

Uzaktan erişim için FireWall’dan 6379 Redis portuna izin verilmesi gerekmektedir. Bunun için Redis adında yeni bir Role, aşağıdaki gibi tanımlanır.

1-)Windows Defender Firewall => Advanced settings => Inbound Rules => New Rule..

2-) Gelen seçimlerden yaratılmak istenen kural tipi, Port olarak seçilir.

3-) Karşımız gelen ekrandan TCP, ve Port olarak “6379” girilir.

4-)Allow the connection seçili bırakılır.

5-)İzin verilen Porta, anlamlı bir isim verilir.

6-) Tüm durumlar için, eklenen yeni kural aktif edilir.

7-) Remote makinadan redis sunucusuna erişim için, “Redis Desktop Manager” uygulamasının kurulup IP ve Password girilerek, gerekli bağlantının yapılması gerekmektedir.

.Net Core Üzerinde Redis’in, Url,Port ve Password bilgilerinin aşağıdaki gibi encrypted olarak saklanması, güvenlik için son derece önemlidir.

appsettings.json: Hiçbir 3th party tool’a erişim bilgileri, açıkta okunabilir bırakılmamalıdır.

Yukarıdaki bilgilerin nasıl şifrelendiğini merak ederseniz, buradaki makaleyi  inceleyebilirsiniz.

Örnek RedisCacheService: Aşağıda görüldüğü gibi Redis config bilgileri, appsettings.json’dan => appConfig class’ı aracılığı ile alınmıştır. Buradaki amaç, herseferinde config dosyası ile değil, tanımlanan class’ın propertyleri ile çalışılmasıdır. Alınan config bilgilerinin anlamlı hale getirilmesi için, “DecryptText()” methodu çağrılmıştır. Bu sayede şifrelenen Host,Port ve Password bilgileri decrypty  edilerek, ilgili config ile Redis’e bağlanılmıştır ve ilegili RedisClient oluşturulmuştur.

appConfig.cs: AppConfig sınıfı, aşağıda görüdüğü gibi “appsettings.json” altındaki “AppConfig” sekmesine, “Startup.cs“‘deki aşağıdaki tanımlama ile eşleştirilmiştir. Redis, RabbitMQ config ayarları ve Token süreleri bu sekme altında saklanmaktadır.

Startup.cs: “appsettings.json” altındaki “AppConfig” sekmesi ile Appconfig.cs sınıfı aşağıdaki gibi matchlenir.

Appconfig.cs: Appconfig class’ı aşağıdaki gibi tanımlanmıştır.

ElasticSearch:

Aşağıdaki adresden, ElasticSearch Windows için indirilir.

https://www.elastic.co/downloads/elasticsearch

Elasticsearch Install Services:

Elasticsearch root klasör altındaki “bin/“‘in içinde aşağıdaki komut ile servis olarak yüklenir.

Elasticsearch Şifre Atama:

1-) ElasticSearch’ün kurulu olduğu klasörün altındaki “/config” klasörü içinde, “elasticsearch.yml” dosyası bulunur. Aşağıdaki satır, Security sekmesine başında # konmadan eklenir.

2-) Uzaktan erişim için “elasticsearch.yml” dosyasında Network sekmesine, aşağıdaki satır eklenir.

3-) Uzaktan erişim için “elasticsearch.yml” dosyasında Discovery sekmesine, aşağıdaki satır eklenir.

4-) Windows Defender Firewall => Advanced settings => Inbound Rules => New Rule..

FireWall’a bu sefer, “9200” ve “9300” portlarına  Elastic isminde izin veren bir Rule eklenir.

ElasticSearch servisi () “service.msc” üzerinden aşağıdaki gibi çalıştırıldıktan sonra 3-4 dakika beklenir. Yoksa uyarı olmaksızın hata alınır. Servisin ayağa kalkaması, biraz zaman almaktadır!

ElasticSearch’e şifre atama: ElasticSearch’ün kurulu olduğu klasör altındaki “bin” klasörü içinde, aşağıdaki komut çalıştırılır.

Aşağıda görüldüğü gibi, yukarıdaki komut çalıştırıldığında elastic, kibana, logstash gibi birçok tool için şifre istenmektedir. Hepsi için aynı istenen bir şifre, Örn: “borablog123!” girilir.

ElasticSearch sunucusuna uzaktan 9200 portundan erişilmek istendiğinde, aşağıdaki gibi bir şifre ekranı ile karşılaşılır.

Username default “elastic” girilir. Ayrıca, doğru şifre girildikten sonra aşağıdaki gibi bir ekran ile karşılaşılır.

Şu makalede yazılan uygulama ile elastic password bilgisi, şifrelenip config’e kaydedilmiştir.

appconfig.cs: Aşağıda görüldüğü gibi “ElasticConnectionSettings” sekmesinde, ElasticSearch için gerekli config bilgileri, encrypted olarak saklanmaktadır.

ElasticClientprovider.cs: Aşağıda görüldüğü gibi Elastic config bilgileri, appsettings.json’dan => elasticConfig class’ı aracılığı ile alınmıştır. Alınan config bilgilerinin anlamlı hale getirilmesi için, “DecryptText()” methodu çağrılmıştır. Bu sayede şifrelenen ElasticSearchHost ,ElasticSearchUser ve ElasticSearchPass bilgileri decrypty edilerek, ilgili config ile ElasticClient oluşturulmuştur.

ElasticConnectionSettings.cs: ElasticConnectionSettings sınıfı, aşağıda görüdüğü gibi “appsettings.json” altındaki “ElasticConnectionSettings” sekmesine, “Startup.cs“‘deki aşağıdaki tanımlama ile eşleştirilmiştir. ElasticConfig ayarları bu sekme altında saklanmaktadır.

Startup.cs: “appsettings.json” altındaki “ElasticConnectionSettings” sekmesi ile ElasticConnectionSettings.cs sınıfı aşağıdaki gibi matchlenir.

ElasticConnectionSettings.cs: ElasticConnectionSettings class’ı aşağıdaki gibi tanımlanmıştır.

 

Kibana:

Aşağıdaki adresden, Kibana Windows için indirilir.

https://www.elastic.co/downloads/kibana

Öncelikle Kibana’nın kurulu olduğu root’un altındaki “config/” klasöründeki ”kibana.yml” içine, aşağıdaki satırlar eklenir. Dikkat edilir ise, “borablog123!” şifresi elasticsearch altında kibana user’ı için atanan şifrenin ta kendisidir.

Kibanayı Servis Haline Getirme:

Aşağıdaki url’den, “NSSM – the Non-Sucking Service Manager” paketinin Relase son sürümü indirilir.

https://bartwullems.blogspot.com/2020/04/installing-kibana-as-windows-service.html

Nssm uygulamasının indirildiği klasörün altında “win64” klasörü içinde, aşağıdaki komut girilir.  Komutun sonunda girilen “Kibana“, servise verilmek istenen addır.

Yukarıdaki komut girildikten sonra, aşağıdaki gibi bir ekran ile karşılaşılır. Kibanaya ait yol Path ve Startup directory’de tanımlanır. Ve “Install service” buttonuna basılır.

Kibana’ya uzaktan Erişim:

Windows Defender Firewall => Advanced settings => Inbound Rules => New Rule..

FireWall’a bu sefer, “5601” portuna Kibana isminde izin veren bir Rule eklenir.

Son olarak Kibana’nın kurulu olduğu klasörün altındak “config/” klasörü altındaki”kibana.yml” içine, aşağıdaki satır eklenir.

Kibana servisi () “service.msc” üzerinden aşağıdaki gibi çalıştırıldıktan sonra 3-4 dakika beklenir. Yoksa “Certifica hatası” gibi gereksiz bir hata ile karşılaşılır. Kibana servisinin de ayağa kalkaması, biraz zaman almaktadır!

Kibanaya uzaktan 5601 portundan erişilmek istendiğinde, aşağıdaki gibi bir şifre ekranı ile karşılaşılır. Kibana güvenlik karşılama ekranında “Wellcome to Elastic” yazması beni biraz şaşırttı.

Doğru şifre girildiğinde, aşağıdaki gibi bir ekran ile karşılaşılmaktadır.

Kibanayı Yapılandırma:

Amaç, ElasticSearch’e atılan indexlerin Kibana’ya tanımlanıp, monitor edilmesidir. Bu tanımlamanın yapılabilmesi için, uygulamadan ilgili ElasticSearch’e indexlerin yaratılmış olması gerekmektedir.

1-) Management’dan Stack Management’a girilir.

2-) Kibana altında, indexleri eklemek için ilgili pattern “Index Patterns” sekmesi altında yapılır.

3-) Create Index pattern buttonuna basılınca, aşağıdaki gibi bir ekranla karşılaşılır. Name kısmına “log*” yazılarak, tüm log ile başlıyan indexler filitrelenmiştir. “Timestamp field” yani, zaman aralığına göre sıralama işi “postDate” alanına göre yapılacaktır.

4-) Analytics altında Discover sekmesine geçilerek, yukarıda tanımlanan Indexler burada gözlemlenebilir.

5-)Aşağıda görüldüğü gibi log ile başlıyan tüm indexler, son 1 saatlik documentları gözlemlenmektedir. Kısaca son 1 saat içinde  Login olan ve belirlenen Actionlara(GetUserById()) giren clientlar, tespit edilmiştir.

Geldik bir makalenin daha sonuna. Bu makalede, Distributed Cache için kullanılan Redis’in nerden indirilebileceği, servis olarak kurulumu, şifre ile güvenliği ve uzaktan erişimi için yapılması gerekenler anlatılmıştır. Ayrıca login, audit ve error log gibi yüzbinlerce kaydın saklanıp, sonradan içinden istenen kayıtların, belli bir zaman aralığında ve FullTextSearch ile saniyeler içinde aranabilmesine olanak sağlayan ElasticSearch ve gelişmiş Monitor tool’u Kibana’nın, indirilmesi, kuruluması, güvenlik ve uzaktan erişimi için yapılan config ayarları detaylıca anlatılmıştır. Tüm bu tooların config bilgilerinin, .Net 6.0 bir projede güvenli nasıl sakalanacağı ve gerektiği zaman nasıl anlamlı hale getireleceği ayrıca makale içinde anlatılan konular arasındandır.

Bu şekilde, farklı diller ve farklı alt yapılarda kullanılan bu yararlı araçların, nasıl remote sunucularda yayımlanabileceğini detaylıca değindik.

Yeni bir makalede görüşmek üzere, hepinize hoşçakalın.

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

5 Cevaplar

  1. Cem Pehlivan dedi ki:

    Elinize sağlık hocam yine güzel bir makale olmuş.
    Bir sorum olacak; windows için redis reposu arşivlenmiş ve versiyonu 3.0 da kalmış. Bu bizim için güvenlik veya performans sorunu yaratır mı?
    Özellikle .net 6 projemde kullanmak üzere windows server’a redis kurdum ancak .net 6 ile kullanmak istediğimde birtürlü windows üzerindeki redise bağlanamadım. redis-cli ile bağlanıyor veya daha eski .net versiyonlarıyla bağlanıyor ancak .net 6 ile bağlanmadı. Ubuntu üzerinde redis kurduğumda (v6.2) .net 6 üzerinden sorunsuz bağlanabildim.
    Kısaca windows için redis 3.0 versiyonunu kullanmak sağlıklı mı?

    • borsoft dedi ki:

      Selam Cem,
      Öncelikle Teşekkürler.

      Hayır Redis 3.0 versiyonunu artık kullanmak, çok da sağlıklı değil. Redis’e bağlanacağın config’de, makaledeki ayarlarlamaların tamammını yaptın mı?
      1-)Firewall’dan 6379 portuna izin ver.
      2-)Redis.Windows.Service.config’e => “bind 0.0.0.0” eklemen lazım.

      İyi çalışmalar..

  2. Gökhan dedi ki:

    Hocam böyle dolu dolu zengin içerikli makaleler paylaştığınız için size ne kadar teşekkür etsem azdır. Elinize sağlık.
    Bir başka yazınızda “Bütün yumurtaları aynı sepete koymamak gerekir” demiştiniz:) Benim 3 farklı sunucuda çalışan birden fazla rest servisim var. Bunların loglarını en güvenli şekilde elasticsearch üzerinde nasıl tutabilirim? 3 ayrı sunucuyada elastichsearch mü kurmalıyım? Cluster ile ilgili bir yazınız var mı diye aradım bulamadım

    • borsoft dedi ki:

      Teşekkürler Gökhan,

      Tek ElasticSearch yeterli ama tabi ki tekil şekilde 1-3-5 gibi makina sayısında scale etmekte fayda var..
      Bir de istersen, her sunucu için ayrı bir Index açabilirsin.

      İyi çalışmalar.

  3. Sümeyye dedi ki:

    Hocam merhaba, çok güzel bir makale olmuş ellerine sağlık. Fakat ben elastic search kurulumunu anlattıgınız gibi yapmama rağmen
    Bu siteye ulaşılamıyor
    localhost bağlanmayı reddetti. diye hata alıyorum. neyi yanlıs yapmıs olabilirim. Yardımcı olur musunuz?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.