23 Temmuz 2020 Perşembe

Client IP'yi IIS Loguna Yazdırmak

Selam Herkese,

IIS logunuza baktığınızda client bilgisine ihtiyaç duyabilirsiniz, ki bence fazlasıyla duymalısınız. Zira her daim firewall ya da başka bir network cihazı IPsi görmek size anlam ifade etmez. Sonra user bazında anlamaya çalışırsınız ki, o daha da zorlaşır.

Sizi çağıran clientın IPsini görebilmek için, öncelikle firmanızdaki network ekiplerince bu bilginin paketin içinde gönderilmesi lazım. Bu kısmı network ekipleriyle hallettikten sonra, IIS'te Logging'e girin.


Select field deyin. 

Çıkan ekranda Add Fields diyoruz.

En kritik kısım sarı ile boyadığım yer. XFF yani X-Forwarded-For seçmelisiniz. Siyah kutu içine aldığım yere, network ekibiniz firewalldan geçirip paketi size iletirken, paket içinde nasıl tutuyorsa, o ismi yazmalısınız. 


Sonra görüşürüz.

WinDBG ile Dump Analizi

Merhaba Arkadaşlar,

Daha önceki yazılarımda envai çeşit dump alma yöntemini paylaşmıştım. Şimdi ise aldığımız bu dump'ları çok kısa nasıl inceleyebileceğimize bakalım. Burada her şeyiyle dumpı analiz etmekten bahsetmiyorum. Onu yapmak başlı başına bir sanat. Ciddi bir tecrübe ve pratik gerektiriyor(ben de çoğunuz gibi bu konuda guru değilim, kendime de söylüyorum bu kısmı=) ). Burada daha ziyade konsept olarak ve belli komutlarla neler yapılabilir ona değineceğim. 

WinDBG tool'u ile almış olduğumuz dump'ı inceleyeceğiz. Dump'ı her önüne gelene vermemenin ne kadar öenmli olduğuna da değineceğiz, subliminal mesaj olarak. =)
Uygulamayı açıyoruz öncelikle, File sekmesinden, Open crash dump tıklanır. Ve dump'ınızı burdan verirsiniz.(benim dump adına takılmayın, full dump almakta tereddüt ettiğim bir andı=) )


Burada aldığınız dump ile, dump aldığımız sunucu ile de ilgili bazı bilgileri görebiliyoruz. 
System Uptime: uygulama sunucunuzun ne kadar süredir ayakta olduğunu gösterir. Bu süre çok uzunsa, demek ki uzun süredir sunucu restart almamış. Atıyorum sunucu 120 gündür restart görmediyse, son 4 aylık patch'leri de geçilmediğini anlayabiliriz. Ve kötü niyetli kişiler bunu kullanır.
Process Uptime: Process'in ne kadar süredir ayakta olduğudur. Bu süre çok uzunsa, process'in recycle edilmediğini gösterir. IIS dump'ı ise bu, application pool recycle'ı düşünmek gerektiğini gösterebilir. Genelde günde 1 defa recycle geçilmesi best practise olarak geçer.
Symbol search path alanı boş gelmiş. Kısaca Symbol şudur: uygulamalar, işletim sistemi ile vs iletişim kurduğunda, ki bildiğiniz üzere bu makina diliyle oluyor, dll veya exe gibi dosya yarattığında bir de pdb dosyası oluşturur. Symbol tam da budur. Symbol içinde assembly için debugging sembolleri vardır. Windbg'nin dumpı çözebilmesi için global, Microsoft'un sitesinden bu sembolleri indirmesi gerekmektedir.

File sekmesi altından, Symbol File Path deyip, Symbol Path'e tıklanır. Sonrasında SRV*https://msdl.microsoft.com/download/symbols yazılır. Artık symboller de hazır.
.sympath yazarak symbollerin nereden alındığını da görebiliyoruz.



.reload yazarak ilgili adresten cache'imize çekebiliriz de bu sembolleri:

!analyze -v komutu ile crash analizi başlatılabilir.

Analiz sonrası !threads komutu ile dump alınan sistem üzerindeki aktif threadlerin durumunu görebiliyoruz.

En soldaki 164-166 olanlar threadIDlerdir. ThreadID alanında XXX yazanlar ise, işini bitiren threadlerdir ve dump aldığımız esnada henüz Garbage Collector işini tamamlamamıştır. 

Mex diye bir extension var debuggingi incelemek için. Onu kurabiliriz.

!us komutu ile unique stacklerin listesini verir. Çalışan threadler işini yaparken, biz dump alarak, onları böldük. Onlar da işlerini bırakıp bize dump verdi. 
36 stack(s) with 203 threads displayed (203 Total threads) à 36 farklı iş yapan thread var. 203 total treadin.

Şimdi bir threade bakalım mesela.

~(tilda): thread demektir.
87s: 87 nolu threadi select ediyor. Onu çağırıyor yani.

!clrstack2 :  .net stacki döker.(mex ile gelen komuttur)

0:000> ~87s

eax=00000000 ebx=00000001 ecx=00000000 edx=00000000 esi=00000001 edi=00000001

eip=7741c8ac esp=39b2ec10 ebp=39b2ed98 iopl=0         nv up ei pl nz ac po nc

cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000212

ntdll!NtWaitForMultipleObjects+0xc:

7741c8ac c21400          ret     14h


0:087> !clrstack2  à artık başında a görüldüğü gibi 87 nolu thread'e geçti.

DbgId ThreadId Apartment Kind CLR              GC Mode    GC Suspending?

   87    11fc4 MTA            v4.0.30319.34209 Preemptive no

 

MonitorWait

-----------

Method          XXXXXXX.Esb.Queue.QueueManager.GetNextMessage()

Monitor Address 0x0000000020421088

 

SP       IP       Function                                                                                                                                   Source

39b2ef7c 00000000 GCFrame                                                                                                                                   

39b2f02c 00000000 HelperMethodFrame_1OBJ [System.Threading.Monitor.ObjWait(Boolean, Int32, System.Object)]      à alttaki de bunu çağırmış.                                            

39b2f0b0 72625d16 System.Threading.Monitor.Wait(System.Object, Int32, Boolean)     à alttaki getnextmessage methodu bir yerde threadslep yapıyor; bekliyor yani. 87 nolu thread bekliyor.                                                                        

39b2f0c0 39006df7 XXXXXX.Esb.Queue.QueueManager.GetNextMessage()                                                                                         

39b2f104 39006ff5 XXXXXXXX.Esb.Queue.WorkerThread.Run()                                                                                                     

39b2f128 7259ab43 System.Threading.ThreadHelper.ThreadStart_Context(System.Object)                                                                          

39b2f134 725ada07 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)

39b2f1a0 725ad956 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)        

39b2f1b4 725ad921 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)        à http contextin içine konup istek gelir soaptan vs. burda contextin içi kounuyor.         

39b2f1cc 7259aacc System.Threading.ThreadHelper.ThreadStart()       à threadim burda başlar.                                                                                         

39b2f320 00000000 GCFrame                                                                                                                                   

39b2f500 00000000 DebuggerU2MCatchHandlerFrame                                                                                                              

39b2f56c 00000000 ContextTransitionFrame                                                                                                                     

39b2f6f4 00000000 DebuggerU2MCatchHandlerFrame



System'den ziyade XXXXX ile başlayanlar önemli. Bunları ben maskeledim. Kütüphaneler vs belli olmasın diye. =) Sizinkiler ne ise onu yazar.



!name2ee * XXXXXX.Esb.Queue.WorkerThread.Run        komutu ile bu classın bu methodunu tüm kütüphanelerde ararız.

 

--------------------------------------

Module:      3647869c   à esb.dll’in memorydeki adresi

Assembly:    XXXXXX.Esb.dll

Token:       0600d745

MethodDesc:  38f4b56c

Name:        XXXXX.Esb.Queue.WorkerThread.Run()

JITTED Code Address: 39006fd0

--------------------------------------

 

!savemodule 3647869c C:\Temp\XXXXX.Esb.dll     à bu komut ile esb.dll’i Temp dizinine oluşturmuş oluruz.


Yani dump dosyasından dll'i elde etmek de mümkün. 

Dediğim gibi temel komutlara kısaca baktık. Yoksa dump analizi başlı başına bir alan.

Birazdan görüşürüz.


22 Temmuz 2020 Çarşamba

Unix'te Text/IP Replacement

Merhaba Arkadaşlar,

Üst üste Windows konuları yazdım. Bu defa da unix'te kullanabileceğiniz bir bilgi paylaşalım. Unix makinanızda bir text ya da IP aramak istiyorsunuzdur, yetkiniz dahilinde. Bunu çok hızlı yapabileceğiniz mini bir shell scriptini aşağıda paylaşıyorum:

for x in `find . -name \* | xargs grep -l "127.0.0.1"`;
do
echo $x
done

Sarı ile verdiğim IPyi bulunduğunuz dizin ve onun alt dizinlerinde aratacak, yetkiniz varsa da listeleyecektir.

Mesela bir connection string değişimi veyahut server IP değişimi yapacaksınız. IPleri listelettiniz yukarıdaki gibi. Tek tek elle mi değiştireceksiniz? Tabi ki hayır. Küçük bir ilave ile onu da aşağıdaki gibi yapabilirsiniz:

for x in `find . -name \* | xargs grep -l "127.0.0.1"`;
do
echo $x
sed "s@127.0.0.1@19.86.19.03@g" $x > temp;
mv temp $x;
done

Sarı ile yazılı olan IP yerine --> yeşil ile yazılı olan IP yazılacaktır. 

Sonra görüşürüz.

DebugDiag ile Dump Almak

Merhaba Arkadaşlar,

Daha önceki yazımda WER ile otomatik IIS Dump almasını paylaşmıştım. Şimdi ise DebugDiag toolu ile nasıl dumplar alabileceğimize bakacağız.

Öncelikle DebuDiag'ın msi dosyasını indirip kurulumunu yapmanız gerekiyor. (Windows server'lar için anlattığımdan direkt msi dedim)

Kurulumlar sonrası, DebugDiag Collection tool'unu açalım. Bu sayede örneğin crash ya da response time 'a göre dump alabiliriz. Diyelim ki uzun response time'ı olan bir webservice'niz var. Onu izlemek ve dump'ını almak istiyorsunuz. 

Toolu açınca şöyle bir ekran göreceksiniz:

Add Rule diyerek ilerliyoruz. Akabinde aşağıdaki ekranı görmeniz gerekiyor:

Performance'a tıklayıp, gelen ekrandan HTTP Response Times tıklanır:


Çıkan ekrandan Add URL deriz:


Yukarıda değindiğim webservice'nizi başına / koymadan, sonuna / koyarak burada yazıyorsunuz. Örneğin webserviceniz https://ml.googleapis.com/$discovery/rest?version=v1 olsun. Tamamen atıyorum; arama kısmına discovery/ yazıyorsunuz.
Webservice'nizin 30 sn ve üstü sürelerdeki cevap anlarının dump'ını almak isteyelim.  Timeout after alanına kaç yazarsam, o kadar süre geçtikten sonra dump almaya başlar.

OK dedikten sonra, aşağıdaki ekran gelir; orada da next'e tıklanır.


Aşağıdaki ekran çıkacaktır. Bu ekrandan da  Add Dump Target butonuna tıklanır.

Çıkan ekrandan target type: web application pool deyip, hangi application pool'u seçersek, onun üstündeki uygulama servislerini izleyebiliriz. Uygulamalarımın listesi görüneceğinden, hepsini buzlamak da uzun iş, burayı yazılı olarak geçtim. :)

OK deyip, gelen ekranda Next dediğinizde, aşağıdaki ekrana geçmeniz lazım. İlk alanda şartı sağlar sağlamaz (yani 30saniyeyi geçtiği an servisimizin cevap verme süresi) 5 sn aralıklarla, 3 adet dump alacak demektir. Son seçimde de full mu mini mi onu seçiyorsunuz. 


Çıkan ekrandan Next deyip, Activate dediğinizde alt ekranda kuralın adı ve path'i yazar.


Dump'ınız hazır. Bu tool ile istediğiniz parametreye göre, çok kolay bir şekilde dump alabilirsiniz.

Sonra görüşürüz.

21 Temmuz 2020 Salı

WER ile Otomatik IIS Dump Almak

Merhaba Arkadaşlar,

Windows Error Reporting (WER), bildiğiniz üzere, Microsoft'un bize sunduğu, uygulama hatalarını, crahslerini, cevap vermeyen işlemlerini, kernel hatalarını vs raporlayan bir feature'dır. Biz de IIS'imiz için DebugDiag vb tool'lar yerine, direkt olarak WER üzerinden otomatik dump aldırabiliriz(gerçi ben DebugDiag seviyorum; arayüzü çok basitleştiriyor=) ).

Öncelikle Regedit'e girilip, şuraya gidilir: 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\
Burada LocalDumps adında bir key var mı kontrol edilir. Yoksa Windows Error Reporting'e sağ tıklayarak: New Key deyin ve adını LocalDumps verin.

Sonra LocalDumps'a da sağ tıklayıp, orada tekrar New key diyerek, w3wp.exe adında yeni bir key oluşturun. Artık w3wp.exe için otomatik dump almasını sağlayacak parametreleri girebilir durumdayız.


DumpFolder, DumpType, DumpCount adında 3 value yaratırız burada.

DumpFolder: Oluşacak olan dump dosyası nerede yaratılsın
DumpCount: Kaç adet dump alsın
DumpType: Ne tür bir dump alınsın(1:mini , 2: Full -- Bir de 0 var ama wer üstünden hiç denemedim, bilen arkadaşım dürtebilir; revize edebiliriz yazıyı)


Örneğimizde(üstteki görsel) F altında Dumps adında bir klasöre atıyoruz. 3 defa, full dump aldırıyoruz. Bu sayede crash anında, arıza telaşına düşmeden, arka planda birileri bizim için dump alabilir.


Burada oluşan dump'ı yine DebugDiag'a verip, raporunu inceleyebilirsiniz.


Sonra görüşürüz.

IIS Application Pool Identity

Merhaba Arkadaşlar,

IIS kullanan arkadaşlarımın malumu olacağı üzere, IIS'te güvenlik kontrolü baabında application pool identity diye bir feature var. Bu özellik, application pool'larınıza nevi şahsına münhasır bir kimlik kazandırır. Yani her application pool'unuz, bu application pool'un sağladığı kimlik(identity) üzerinden çalışmış olur. 

Elimdeki w3processlerimin hepsinde spesifik isimlendirme olmasından mütevellit, internetten yürüttüğüm yukarıdaki resimden de görüleceği üzere, bir w3wp process'imiz, yani IIS'in worker process'i, DefaultAppPool diye bir kimlik ile çalışmaktaymış, windows üzerinde. (Task Manager'ın ekran görüntüsüdür, yukarıdaki resim)

Şimdi IIS üzerindeki application pool'lar bu kimlik tiplerinin neler olduğuna ve farklarına bakalım.

Önce IIS'e giriyoruz ve herhangi bir application pool'a normal tıklıyoruz ve sağ panelden Advanced Settings'e tıklıyoruz.



Burada Process Model altındaki, Identity kısmında 3 nokta var, üstteki ekrandan da göreceğiniz üzere. Ona tıklıyoruz.

Gördüğünüz üzere 4 adet Identity tipi var burada. Bunlara değinelim şimdi.

Local System: Verilebilecek en sakat yetkidir. :) Server'ınızın C dizini altındaki Windows'u bile kilitleyebilir uzaktan çalıştırılabilir kodlarla. NW'e sisteme özetle her yere erişir. Çok büyük patlamışsınızdır, yetkiden şüphelenirken, deployment esnasında anlık verilebilir ama onun dışında kullanmamanız önerilir.

Network Service: Local System'in bir tık daha az yetkili hali gibi düşünebilirsiniz. NW'e çıkıp işlem yapma yetkisi vermiş olursun uygulamaya. ActiveDirectory'ne veyahut database'ine erişmeyi deneyebilirler. Hatta nw search işlemi bile yapılabilir. Bu da örneğin bir NFS ortak diskiniz vardır; erişim sorununuz olduğunu düşünüyorsunuzdur, yine identity kaynaklı. Onu test etmeniz için faydalı olacaktır. Ancak yine önerilmez.

Local Service: Network Service'in network'e çıkamayan versiyonudur. :) Tavsiye edilmez. NW'den şüphelenmediğiniz durumlarda, yine sorun tespitinde kullanın en fazla derim.

Application Pool Identity: Yukarıdakilere göre en masum yetkilendirmedir.  IIS'te siz bir app pool yarattığınızda, IIS de sizin için app ppol ile aynı isimde bir sanal account yaratır. O account ile app pool'u kullanırsınız. Bu user sadece bulunduğu ilgili server'da iş yapar. Örneğin aynı örneği vereyim; NFS'e gideyim; veyahut ortak makinalarımın ftp'sine bağlanayım derseniz, bu user ile sorun yaşarsınız. 
 
Peki hepsine bir kulp taktık. O zaman ne yapmak lazım. Çözüm çok sevimli: Custom Account.
Yani ActiveDirectory üzerinde bir user yaratırsınız. Bu user ile gerekli yetkileri, ihtiyaç duyduğu ölçüde kontrollü verirsiniz. Bu sayede kontrolünüz dışında security açığı ortaya çıkmamış olur.

Sonra görüşürüz.

20 Temmuz 2020 Pazartesi

Perfmon User Defined Collector Ekleme

Merhaba Arkadaşlar,

Yakında kayıt ekleyeceğim deyip de, 1 saat sonra eklemeyi ben de beklemiyordum. :) Ani gelişen bir istek diyelim. :)

Bu yazımda, Windows sunucularımız üzerinde yer alan, Performance Monitoring aracı ile istediğimiz collector'ü nasıl ekleyeceğimize bakacağız. Çok kullanmayanlar için, kısaca PerfMon, server'ın, IIS'in performans verilerini toplayabileceğimiz bir tooldur. İşlemci, bellek, w3process'ler, paging... Aklınıza gelebilecek her şeyi izleyebilirsiniz.

Perfmon üzerinde varsayılan tanımlı ajanlar/collectorler sizin için data toplayabilir, aktiflerseniz şayet. Şimdi bu yazımızla birlikte, istediğimiz Collectoru eklemeyi göreceğiz.

Önce performance monitöre girilir.



Açılan ekrandan User Defined’a sağ tıklanır. Yeni bir data collector oluşturulmaya geçilir.

Bir isim uyduralım şimdi de. Collector'ümüzün adı ne olacaksa buraya bir isim verebilirsiniz. Sonra next'e tıklarsınız. Benim verdiğim isim Microsoft'taki abilerimizden bir hatıra. :)

Bu noktada, paketlenmiş, hazır collector templatei kullanacaksanız(yani open source bir ortamda veyahut başka birisi sizin yerinize 10-15 kriter seçip template yapmışsa), aşağıdaki ekrandan Browse deyip, template'i de yükleyebilirsiniz. Veyahut girip tek tek kendiniz neleri izlemek istiyorsanız, seçebilirsiniz. Bendeki template'i yükleyip, collector ekleme başlığından sapmayacağım.

İsterseniz ayarlamalarınızı yapmak için Properties'e girebilirsiniz. Burada önemli bir iki ayar var. Ben girilmiş şeklini göstereceğim.

Dosya adında makina ismi görünmesi için bir ayar yaptık önce:

Her 700mb'a geldiğinde yeni bir dosya başlasın diye ayar yaptık:

Apply dedik ve Collector'ümüz oluşmuş oldu:



Start verilerek data toplanmaya başlanır.

Bir sonraki yazıda görüşmek üzere.

Merhaba

Merhaba Herkese,
Çok uzun bir aradan sonra tekrar siteye giriş yaptım. Covid-19 salgını yüzünden birçok aktiviteyi gerçekleştiremediğimiz bu günlerde, en azından sitemi tekrar aktiflemeye karar verdim. Yakında yeni içeriklerle tekrar paylaşımlara başlayacağım.
Görüşmek üzere.

10 Ocak 2017 Salı

Oracle: Çalışan SQL ve Session Bilgileri

Merhaba Tekrar,
Şimdi başlığı görüp de Grid varken, neden lazım diyebilirsiniz.. Ancak herkes gride giremiyor malumunuz; özellikle kurumsal firmalarda roller ayrımından ötürü girmeniz pek mümkün değil, dba olmadığınız sürece.

Sıkça kullandığım ama umarım hep keyfi bakmanız gerektirecek bir sql paylaşmak istiyorum:(executing sql, username, lockwaits..)

select sid,serial#,username,lockwait,status,schemaname,
osuser,machine,logon_time,last_call_et,event,t2.sql_text from v$session t1,v$sql t2 where t1.sql_hash_value=t2.hash_value
and t1.status='ACTIVE' and t1.username<>'SYS'
order by username asc

Bu şekilde hem sid serial, hem hangi user hangi makinadan bağlı ve ne çekiyor göürsünüz.. Ayrıca lock var mı yok mu, wait oluşmuş mu, net şekilde yazıyor..

Lockları zaten anlarsınız da, wait oluşursa şurdan kopya çekersiniz:

https://docs.oracle.com/cd/B28359_01/server.111/b28320/waitevents003.htm#BGGIBDJI

SQL: Kolon İçeriğinde Değişim

Selamlar,
Sql'de ifade içindeki minik bir kısmı değiştirme ihtiyacım oldu. Belki işi düşen olursa, hızlıca kullansın diye paylaşıyorum. Bu arada Rusya'dan bir mail aldım; bir konuda yazımdan bir şey alaşılmamış, ödev konusuymu vs. Ara Ara orijinal ifadelerini de yazımda değinmeye çalışacağım, özellikle teknik konularda.

Bir kolon içindeki ifadeyi, başka bir ifade ile değiştirme(find a text --> replace with another text, using replace() function)
degisecekIfade-->mevcuttaki degerdir(current expressin in column)
dogruIfade-->dogru, gelmesini istediginiz deger(new value/expression/text)

update tabloAdiniz
set kolonAdi=REPLACE(kolonAdi, 'degisecekIfade', 'dogruIfade')
where kriterleriniz(criterias);