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!
1 |
redis-server --service-install redis.windows-service.conf --loglevel verbose |
Alttaki komut ile servisler ekranı çağrılır, ve “Redis” servis “Automatic” tipde çalıştırılır.
1 |
service.msc |
Ayrıca istenir ise, Redis Servis’i kaldırmak için aşağıdaki komut çalıştırılır.
1 |
redis-server --service-uninstall |
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.
1 |
requirepass borsoft6379 |
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.
1 2 3 4 5 |
"AppConfig": { "RedisEndPoint": "nsv3N877xZf508V6aV6CnduGNag6Jxcf", "RedisPort": "O+14hXFQrWYht7tBUAv0AQ==", "RedisPassword": "9N64WSX3e1EWa6VKxTJ5+QUzQVx+4Un+TMASFMf8YBk=" } |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public RedisCacheService(IOptions<AppConfig> appConfig, IEncryption encryption) { _appConfig = appConfig; conf = new RedisEndpoint { Host = encryption.DecryptText(_appConfig.Value.RedisEndPoint), Port = Convert.ToInt32(encryption.DecryptText(_appConfig.Value.RedisPort)), Password = encryption.DecryptText(_appConfig.Value.RedisPassword) }; } public IList<T> GetAll<T>(string key) { try { using (IRedisClient client = new RedisClient(conf)) { ... } } catch { throw new RedisNotAvailableException(); } } |
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.
1 |
services.Configure<AppConfig>(Configuration.GetSection("AppConfig")) |
Appconfig.cs: Appconfig class’ı aşağıdaki gibi tanımlanmıştır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using System; using System.Collections.Generic; using System.Text; namespace Dashboard.Core.Configuration { public class AppConfig { #region Props public string WebApiUrl { get; set; } public string PrivateKey { get; set; } public string RedisEndPoint { get; set; } public string RedisPort { get; set; } public string RedisPassword { get; set; } public string RabbitMqHostname { get; set; } public string RabbitMqUsername { get; set; } public string RabbitMqPassword { get; set; } public string MobileVersion { get; set; } public int TokenExpireTime { get; set; } public int RefreshTokenExpireTime { get; set; } public int MobileRefreshTokenExpireTime { get; set; } #endregion } |
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.
1 |
elasticsearch-service install |
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.
1 2 |
xpack.security.transport.ssl.enabled: true xpack.security.enabled: true |
2-) Uzaktan erişim için “elasticsearch.yml” dosyasında Network sekmesine, aşağıdaki satır eklenir.
1 |
network.host: 0.0.0.0 |
3-) Uzaktan erişim için “elasticsearch.yml” dosyasında Discovery sekmesine, aşağıdaki satır eklenir.
1 |
discovery.type: single-node |
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.
1 |
elasticsearch-setup-passwords interactive |
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.
1 2 3 4 5 6 7 8 |
"ElasticConnectionSettings": { "ElasticSearchHost": "8oNosPrKu9spFR3M5DkyqjdnO3yiT0d3NsylNElcreUXDZ/tdyz8A8eOOI0uyoV2", "ElasticSearchUser": "8R0dLOEdWblSR+dEMjgO6Q==", "ElasticSearchPass": "8R0dLOEdWbleyYjyFgeWISmYK46h6s49m0x5BIlKJPf0gKBG5mzDUQ==", "ElasticLoginIndex": "login_log", "ElasticErrorIndex": "error_log", "ElasticAuditIndex": "audit_log" }, |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class ElasticClientProvider { private readonly IEncryption _encryption; Microsoft.Extensions.Options.IOptions<ElasticConnectionSettings> _elasticConfig; public ElasticClientProvider(Microsoft.Extensions.Options.IOptions<ElasticConnectionSettings> elasticConfig, IEncryption encryption) { _encryption = encryption; _elasticConfig = elasticConfig; ElasticSearchHost = encryption.DecryptText(elasticConfig.Value.ElasticSearchHost); ElasticClient = CreateClient(); } private ElasticClient CreateClient() { var connectionSettings = new ConnectionSettings(new Uri(ElasticSearchHost)) .BasicAuthentication(_encryption.DecryptText(_elasticConfig.Value.ElasticSearchUser), _encryption.DecryptText(_elasticConfig.Value.ElasticSearchPass)) .DisablePing() .DisableDirectStreaming(true) .SniffOnStartup(false) .SniffOnConnectionFault(false); return new ElasticClient(connectionSettings); } ..... } |
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.
1 |
services.Configure<ElasticConnectionSettings>(Configuration.GetSection("ElasticConnectionSettings")); |
ElasticConnectionSettings.cs: ElasticConnectionSettings class’ı aşağıdaki gibi tanımlanmıştır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using System; using System.Collections.Generic; using System.Text; namespace Dashboard.Core.Configuration { public class ElasticConnectionSettings { public string ElasticSearchHost { get; set; } public string ElasticLoginIndex { get; set; } public string ElasticErrorIndex { get; set; } public string ElasticAuditIndex { get; set; } public string ElasticSearchUser { get; set; } public string ElasticSearchPass { get; set; } } } |
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.
1 2 3 4 5 |
elasticsearch.username: "elastic" elasticsearch.password: "borablog123!" xpack.security.session.idleTimeout: "1h" xpack.security.session.lifespan: "30d" |
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.
1 |
nssm install Kibana |
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.
1 |
server.host: "0.0.0.0" |
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.
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ı?
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..
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
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.
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?