6.09.2024

Linux'ta beklenmeyen kapanmalar - 2

Daha önce şu yazımda Linux'ta beklenmeyen kapanmaların nasıl tespit edileceğini yazmıştım. O yazımda da bahsettiğim ve bu yazının altında yer alan adreslerde de kullanımından bahsedilen systemd birim dosyası ile beklenmeyen kapanmaların tespit edilmesi yöntemine journal loglarını da dahil ettim, bu konuyu da paylaşmak istedim.

Hedefimiz şu:

1. İşletim sistemi düzgün kapatılırken /root/graceful_shutdown dosyasını yazsın. İçi boş bir dosya. Sadece varlığı, kapanmanın düzgün olduğunu gösterecek. Kapatılırken de journal'a "graceful shutdown" yazsın.

2. Açılışta ilk adımda oluşturulan /root/graceful_shutdown dosyasının varlığı kontrol edilsin. Dosya varsa silinsin (çünkü kapatılırken tekrar oluşturulacak) ve journal'a "startup found graceful shutdown" yazsın.

3. Açılışta /root/graceful_shutdown dosyası yoksa journal'a "startup did not find graceful shotdown" gibi bir mesaz yazsın.

Bu hedef doğrultusunda 3 systemd birim dosyası oluşturacağız. Konumumuz /etc/systemd/system klasörü. İlk dosyamız birinci hedefimiz ile ilgili. Aşağıdaki dosyayı /etc/systemd/system/set_gracefulshutdown.service olarak kaydedelim.

[Unit]
Description=Set flag for graceful shutdown
DefaultDependencies=no
RefuseManualStart=true
Before=shutdown.target

[Service]
Type=oneshot 
ExecStartPre=logger "graceful shutdown"
ExecStart=/bin/touch /root/graceful_shutdown

[Install]
WantedBy=shutdown.target

İkinci hedefimiz için aşağıdaki dosyayı /etc/systemd/system/check_graceful.service olarak kaydedelim.

[Unit]
Description=Check if previous system shutdown was graceful
ConditionPathExists=/root/graceful_shutdown
RefuseManualStart=true
RefuseManualStop=true

[Service]
Type=oneshot
RemainAfterExit=true
ExecStartPre=logger "startup found graceful shutdown"
ExecStart=/bin/rm /root/graceful_shutdown

[Install]
WantedBy=multi-user.target

Üçüncü hedefimiz için de aşağıdaki dosyayı /etc/systemd/system/check_notgraceful.service konumuna kaydedelim. Bunun yegane amacı sistem loglarına bir düzgün kapanma olmadığını yazabilmek.

[Unit]
Description=Detect unexpected shutdown
ConditionPathExists=!/root/graceful_shutdown
RefuseManualStart=true
RefuseManualStop=true

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=logger "startup did not find graceful shutdown"

[Install]
WantedBy=multi-user.target

Sonra bunları etkinleştirmek için şu adımları uygulayalım:

# sudo systemctl daemon-reload
# sudo systemctl enable set_gracefulshutdown
# sudo systemctl enable check_graceful
# sudo systemctl enable check_notgraceful

İşletim sistemi açıldıktan sonra da bir önceki kapanışın beklenmeyen bir kapanış mı olduğunu anlamak için check_graceful hizmetinin başlayıp başlamadığını kontrol edebiliriz:

# systemctl is-active check_graceful

ya da journalctl ile son 3 günlük loglarda graceful geçip geçmediğine bakabiliriz:

# journalctl --since "3 days ago" -g graceful

Galiba oldu. logger yerine systemd-cat kullanılabilir. Bu komutun -p ile mesajın öncelik seviyesi de belirtilebilir:

# echo "No graceful_shutdown file found" | systemd-cat -p info

gibi.

Bu dosyaları oluşturuken yaşanabilecek muhtemel yazım hatalarını tespit edebilmek için systemd-analyze'ın verify komutunu da kullanabiliri.

# systemd-analyze verify /etc/systemd/system/check_notgraceful.service

 [12/2023]

---

[1] https://access.redhat.com/articles/2642741

[2] https://www.suse.com/support/kb/doc/?id=000020272

4.09.2024

Powershell ve Windows Kayıt Defteri

Powershell'de, normal bir depolama aygıtlarının dışında da bazı sürücüler var. Bunlara PSDrive deniyor. Bütün PSDrive nesnelerinin listesini almak için

PS> Get-PSDrive
Name           Used (GB)     Free (GB) Provider      Root
----           ---------     --------- --------      ----
Alias                                  Alias
C                 170,45        129,55 FileSystem    C:\
Cert                                   Certificate   \
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan

Burada C gibi sürücüler, komut satırı ve dosya gezgininden de aşina olduğumuz gibi dosya sistemi sürücüleri. Ancak Cert, Env, HKCU ve HKLM gibi sürücüler Powershell'e özgü sürücüler. Örneğin Cert ile sistemimizdeki sertifikalara, Env ile ortam değişkenlerine (environment variables), HKCU ve HKLM ile kayıt defterine erişebiliyoruz. Ancak kayıt defteri HKCU (HKEY_CURRENT_USER) ve HKLM'den (HKEY_LOCAL_MACHINE) ibaret değil. Örneğin HKEY_CLASSES_ROOT ve HKEY_CURRENT_CONFIG gibi hive'lar da var. Bunlara erişmek için yeni PSDrive nesneleri oluşturmak mümkün:

New-PSDrive -Name "HKCR" -PSProvider Registry -Root "HKEY_CLASSES_ROOT"

Bundan sonra bu sürücü üzerinde bir değere erişmek için

Get-ItemProperty -Path "HKCR:\.txt\" -Name "(default)"

kullanılabilir. New-PSDrive cmdlet'i aslında ağ sürücüleri ve diğer bazı şekillerde kullanılabiliyor. Örneğin:

New-PSDrive -Name "K" -PSProvider FileSystem -Root "\\sunucu\paylasim"
New-PSDrive -Name "M" -PSDrive FileSystem -Root "C:\Users\metin\Documents"

Ancak bu şekilde geçici sürücüler oluşturulur, mevcut powershell penceresi kapatıldığında oluşturulan sürücüler de kaybolur. Kalıcı olması için -Persist parametresi de eklenmeli.

New-PSDrive -Name "HKCR" -PSProvider Registry -Root "HKEY_CLASSES_ROOT" -Persist 

Bu parametreyi de sadece ikinci örnekte kullanamadığımızı öğrendim. Bu işlem sanal sürücüler yöntemi ile de yapılabilir. Örneğin C:\Users\metin\Documents klasörünü M: sürücüsü olarak kullanabilmek için

subst.exe M: C:\Users\metin\Documents

kullanabiliriz. Ama bu yöntem de kalıcı değil. Kalıcı yapmak için bunu profil dosyamıza iki yöntemden birini eklemek gerek.

17.08.2024

Windows 11 yalınlaştırıcı araçlar

Özellikle Windows'un son sürümleri (10 ve 11) gizlilik (privacy, mahremiyet) açısından çok eleştirilen bileşenlere sahip. Çalıştırılan her programın, ziyaret edilen her internet sayfasının, hatta basılan her tuşun bilgisayarımızın dışına aktarılması kullanıcıların onayladığı şeyler değil. Öte yandan Linux gibi seçeneklerin olmadığı durumlarımız var (iş hayatı). Bu amaçla geliştirilen bazı araçlar var. Bu araçların *yeteri kadar* (!) güvenli olup olmadığı, kurumsal veya yüksek güvenlikli (bankacılık işlemlerinin yapılması bile) durumlarda güvenilip güvenilmeyeceği konusu biraz hassas. Genel olarak hiçbir antivirüs tarafından engellenmediği, Reddit gibi çevrelerde kırmızı bayrak açılmadığı için şimdilik güvenli olarak görüyoruz, ama tetikte olmakta fayda var. Elbette doğru kaynaklardan indirilmesine dikkat etmek gerek.

O&O Shutup 10

https://www.oo-software.com/en/shutup10

Aslında ilk olarak Windows 10 sürümü için çıkmıştı, ama artık Windows 11 desteği de var. Geniş bir özelleştirme seçeneğine sahip. Yapılacak değişiklikler kesinlikle gerekli, biraz gerekli ve gerekli değil olarak sınıflandırılmış. Varsayılan olarak kesinlikle gerekli sınıfındakiler güvenli bir şekilde uygulanabilir, ama örneğin Windows Update gibi bileşenler kapatılması bilgisayarı daha az güvenli yapacağı için kullanıcının tercihine bırakılmış.

Powershell ile indirmek için  

$r=((iwr "https://www.oo-software.com/en/shutup10").Links.href | 
where {$_ -match "exe"})[0];iwr $r -Outfile (split-path -leaf $r)

Ultimate Windows Tweaker

https://www.thewindowsclub.com/ultimate-windows-tweaker-5-for-windows-11

Güvendiğim bir Youtube kanalı olan PC Security Channel'in şu videosundan öğrendiğim bir araç.

Powershell ile indirmek için

iwr "https://www.thewindowsclub.com/downloads/UWT5.zip" -OutFil UWT5.zip;Expand-Archive UTW5.zip 

Windows Utility

https://github.com/christitustech/winutil

Yine çok başarılı bir Youtube içerik üreticisi olan Chris Titus'un github sayfasında ve sitesinde paylaştığı ve örneğin şu videosunda anlattığı gibi bu da yetenkli bir araç. Bu aracın içinden O&O Shutup da çalıştırılabiliyor.

İndirmek ve çalıştırmak için

iwr https://christitus.com/win | iex

31.07.2024

Windows Defender'dan kurtulmak

Son dönemde Windows 11'in daha "hafif" sürümü olan 24H2 IoT LTSC sürümünü gördüm. Denemek istedim. Ancak alıştığımız Windows 11'den biraz farklı. Üzerinde Microsoft Store uygulaması gelmiyor. Sıradan bir Windows 11 bilgisayarda bulunan Virus ve Tehdit Koruması (Virus & Threat Protection) uygulaması yok (bu aslında sadece arka planda çalışan Windows Defender Antivirus'un durumunu görüntülemek ve ayarlarını değiştirmek için bir uygulama. Yoksa Defender Antivirus var ve çalışıyor). Bu ve bunun gibi yan uygulamaları kurmak istediğimde başarısız oldum. Denemek için Windows Defender'ı (antivirus) durdurmak istedim, onu da şu adımlarla yaptım.

Öncelikle bilgisayarı güvenli kipte açtım. Güvenli kipte açabilmek için msconfig'i çalıştırıp önyükleme sekmesinde önyükleme seçeneklerinden "güvenli önyüklemeyi" seçip alttaki ayarı en azda bıraktım.

Yeniden başlatıp C:\Programdata\Microsoft\Windows Defender klasörünün altındaki Platform klasörünün sahibini SYSTEM'den Administrators grubuna değiştirdim. Bağlantısını verdiğim LazyAdmin sayfasında bunu sadece Administrator kullanıcısı olarak göstermiş, ama benim sistemimde Administrator devre dışıydı. Administrators grubuna üye olan kendi kullanıcımla bunu yapabilmek için bu küçük değişikliği yaptım. Sonra bu klasörün yetkilerine SYSTEM ve TrustedInstaller kullanıcılarına ait satırları sildim, sadece Administrators grubuna ait bir tam yetki bıraktım.

Bu aşamadan sonra bazı Windows Defender hizmetlerini devre dışı bırakmak için kayıt defteri düzenleyicisini (regedit) açarak HKLM\SYSTEM\CurrentControlSet\Service anahtarı altında aşağıdaki hizmetlere ait Start değişkenlerinin değerini 4 (devre dışı) yapmak:

  • Sense
  • WdBoot
  • WdFilter
  • WdNisDrv
  • WdNisSvc
  • WinDefend

Benim yaptığım hatayı yaparak wd ile başlayan hizmetlerin tümünün (Wdf01000 gibi) başlamasını devreden çıkarmayın. Bu hatayı yaparsanız Wdf01000'ın varsayılan başlangıç değeri 0. Ve bunu değiştirmek için USB veya DVD'den açarak

reg load HKLM\Temp C:\Windows\System32\config\SYSTEM

ile SYSTEM hive'ını yüklemek ve Wdf01000'ın start'ını 0 yaparak 

reg unload HKLM\Temp

yaptıktan sonra yeniden başlatmak gerek. Bu hatayı yapmayanlar zaten bir sonraki açılışta Defender'i devre dışı bulacaklar.

PS> Get-Service  Sense, WdBoot, WdFilter, WdNisSvc, WdNisSvc, WinDefend
Status   Name               DisplayName
------   ----               -----------
Stopped  Sense              Windows Defender Gelişmiş Tehdit Ko...
Stopped  WdBoot             Microsoft Defender Virüsten Koruma ...
Stopped  WdFilter           Microsoft Defender Virüsten Koruma ...
Stopped  WdNisDrv           Microsoft Defender Virüsten Koruma ...
Stopped  WdNisSvc           Microsoft Defender Antivirus Networ...
Stopped  WinDefend          Microsoft Defender Antivirus Service

komutu ile hizmetlerin durduğu görülebilir. Tamamen deneme amaçlı yaptığım bu kurulumda elim değmişken Dosvc, wuausrv ve BITS hizmetlerini de durdurmayı tercih ettim.

20.07.2024

Crowdstrike strikes back

Dün, 19 Temmuz 2024, bir çok firma için bir siber felaket gibiydi. Havayolları, bankalar, hastaneler, büyük basın kuruluşları... Hepsi ya hizmet veremediler, ya da hizmetlerinde kesintiler yaşandı. Uçak seferleri durdu, ameliyatlar iptal edildi, TV yayınları durdu. Herkes dünya çapında mavi ekran yaşayan Windows'ları görünce Microsoft kaynaklı olduğunu düşündü. Ama bugünkü suçlumuz Crowdstrike.

Bütün internet bu konu ile ilgili haberlerle dolu [1],[2]. Önemli konu şu ki, bu ne ilk ne de son olacak. Daha önce bu olayın benzerini benim hatırladığım McAfee ve Avira ile de yaşamıştık. Bilişim dünyası bu gibi olaylara hazır değil mi acaba? Bu gibi olaylara hazır olunabilir mi? Güncellemelerin önce küçük bir grup üzerinde denenmesi ve sorun yaşanmaması sonrasında diğer sistemlere uygulanabilmesi yeni kavramlar değil, ama bunların bir uzman tarafından her gün yapılması çok pratik değil. Belki bunları önümüzdeki günlerde otomatik olarak yapan sistemler tasarlanabilir. Aynı şey işletim sistemi güncellemeleri (Windows, Linux, vs) için de gerekli. Ama güncellemeleri kapatmak hiç bir zaman çözüm olarak düşünülmemeli.

---

[1] https://www.bbc.com/news/articles/cp4wnrxqlewo
[2] https://edition.cnn.com/2024/07/19/tech/crowdstrike-update-global-outage-explainer/index.html

19.07.2024

Get-ChildItem ve -Exclude parametresi

Bazen bir dosya aramak için -Path, -Recurse, -Include parametrelerini kullanmak yetmez, bir de -Exclude kullanmak gerekir. Örneğin Windows klasörünün altında sysdm.cpl dosyasını arıyorum, ama WinSxS klasörünün altındaki kopya(lar|s)ını listelemek istemiyorum. O amaçla aşağıdaki komutlardan herhangi birini kullandığımda hiç sonuca ulaşamıyorum.

Get-ChildItem -Path C:\Windows -Include sysdm.cpl -Recurse -Exlude "C:\Windows\WinSxS"
Get-ChildItem -Path C:\Windows -Include sysdm.cpl -Recurse -Exlude "C:\Windows\WinSxS*"
Get-ChildItem -Path C:\Windows -Include sysdm.cpl -Recurse -Exlude "*WinSxS*"

Çünkü, Exclude parametresi bunun için tasarlanmamış. Sadece dosya isimlerinde bir kıyaslama yapabiliyor. Aynı -Include'da olduğu gibi. Alternatif çözümler mevcut. Örneğin

Get-ChildItem -Path C:\Windows -Include sysdm.cpl -Recurse | where-Object {$_.FullName -notlike "*WinSxS*"}

Ama bu şekilde aslında Get-ChildItem bütün WinSxS alt klasörünü tarıyor, ama çıkan sonuçarın içinde WinSxS geçiyorsa bunlar ekrana yazılmıyor. Bu istediğim birşey değil, ama daha iyisini bulamadım.

Windows klasörünün altında bazı yüksek güvenlikli alt klasörler olduğu için ekranın kırmızı hata mesajları ile dolmasını engellemek için -ErrorAction SilentlyContinue (veya kısaca -EA silent) kullanılabilir.

Get-ChildItem -Path C:\Windows -Include sysdm.cpl -Recurse -ErrorAction SilentlyContinue | 
	Where-Object {$_.FullName -notlike "*WinSxS*"}

Bunu uzun bulanlar için (ki ben de buluyorum) alias'lar ve kısaltmalar var

dir C:\Windows sysdm.cpl -r -ea silent | ? fullName -notlike "*WinSxS*"

18.07.2024

WinSxS, sfc ve dism

Uzun dönem Windows kullanıcıları, sistem klasörlerinin (genellikle C:\Windows) altında WinSxS adında bir klasörün olduğunu görmüşlerdir. Bu klasör korunan ve içeriği administrator ile bile değiştirilemeyen bir yapıya sahiptir. Kurulumdaki bütün sistem dosyalarının asılları bu klasörün altındadır. Kullanımdaki kopyası ise aslında bir kopya değil, dosyanın aslına bir harlink'tir. Örnek olarak explorer.exe'ye bakalım.

C:\> dir C:\Windows\explorer.exe | fl FullName, LinkType, Target

FullName : C:\Windows\explorer.exe
LinkType : HardLink
Target   : {C:\Windows\WinSxS\amd64_microsoft-windows-explorer...

Bu klasördeki bütün dosyaları görmek için

dir * -file | ft Name, LinkType

kullanabiliriz. Evet, bu güvenlik önlemlerine karşı kötü niyetli yazılımların da karşı yöntemleri var. Herşeye rağmen hardlink bozulabilir, sistem dosyası kötü bir kopya ile değiştirilebilr. Hatta WinSxS klasörü altındaki dosya bile değiştirilebilir. Sistemimizde beklenmeyen bir durum olduğunda her kaynakta ilk yapılması gereken

sfc /scannow

olarak önerilmiş. Arka planda bu komut, sistem dosyalarını tarar, bütünlüğünü, denetler ve güvenilir bir katalogdaki özelliklere (imza, hash vs) sahip olup olmadığını kontrol eder. Ayrıca hardlink'inin doğru olup olmadığına da bakar. Sonra eğer burada bir sorun algılarsa WinSxS altındaki doğru dosyaya olan hardlink'i tekrar oluşturarak onarmaya çalışır. WinSxS altında bir dosyanın birden fazla sürümü olabilir. Bütün sürümler yinw WinSxS klasöründe saklanır. O yüzden en son güncelleme ile gelen sürüme hardlink oluşturulması önemli.

WinSxS klasöründe bir bozulma olmuşsa sfc bu aşamada yetersiz kalır. Bu bozulmayı onarmak için kullanılacak araç dism. Dism'in kafa karıştıran 3 farklı komutu var:

  • CheckHealth
  • ScanHealth
  • RestoreHealth

Bu 3 komutu, bir disk taramasındaki işlemlere benzeterek açıklamaya çalışacağım.

Diskimizde bir sorun olduğunu anlamak için bir tarama yapmak istiyoruz. Ama hızlı olmasını istiyoruz. Bütün diski taramak çok zaman ve enerji alan bir işlem. Aslında diskte işlem yaparken hata ile karşılaşan bir program var mı diye baksak olmaz mı? Bunun için önce evenlog'a bakıyoruz, herhangi bir program buraya disk ile ilgili hata olayı yazmış mı diye. Bu CheckHealth'a karşılık gelen bir işlem. Bütün WinSxS klasöründeki dosyaları taramak da çok zaman ve enerji alan bir işlem olduğu için kaydı düşülen bir sorun var mı, ona bakıyoruz. Bu işlemde bir düzeltme işlemi uygulanmıyor. Örnek kullanım:

DISM /Online /Cleanup-Image /CheckHealth

İkinci komut ScanHealth, daha çok diskte bir düzeltme işlemi yapmadan taramaya benziyor. Sistem açıkken diskte onarım yapmak istemiyorsak, sadece hata var mı yok mu bize onu söylesin diyorsak bu işlem uygulanabilir. Yine bu adımda da diskte bir düzeltme yapılmayacak. Örnek kullanım:

DISM /Online /Cleanup-Image /ScanHealth

Üçüncü komut RestoreHealth ise aktif olarak diskte hataları bul ve düzelt komutu gibi. Bütün WinSxS klasörü taranır, bulunan hatalar (ISO dosyasından veya internetten) bozulmamış kopyalar kullanılarak düzeltilir. Örnek kullanım:

DISM /Online /Cleanup-Image /RestoreHealth

Dism, bunun yanı sıra açık olan Windows kurulumu üzerinde de işlem yapabilir, DVD veya USB'den boot edilerek disklerden birindeki kurulum üzerinde de çalışabilir. /ONLINE anahtarı şu an çalışan sistem üzerinde işlem yapılmasını söylüyor.

Dism'in bunun dışında çok güzel kullanımları var. Örneğin WinSxS klasörümüzün boyutu çok büyüdüyse ve eski  sürümlere ait dosyaları silmek istersek (kesinlikle elle yapılmaması gereken bir işlem) aşağıdaki komut kullanılabilir.

Önce mevcut WinSxS (component store - Windows Side-by-side) boyutunu kontrol edelim:

C:\> dism /online /cleanup-image /analyzecomponentstore

Deployment Image Servicing and Management tool
Version: 10.0.22621.2792

Image Version: 10.0.22631.3880

[===========================99.6%========================= ]

Component Store (WinSxS) information:

Windows Explorer Reported Size of Component Store : 14.29 GB

Actual Size of Component Store : 13.35 GB

    Shared with Windows : 7.30 GB
    Backups and Disabled Features : 6.05 GB
    Cache and Temporary Data :  0 bytes

Date of Last Cleanup : 2024-07-15 12:24:43

Number of Reclaimable Packages : 3
Component Store Cleanup Recommended : Yes

The operation completed successfully.

Eski ve kullanılmayan (superseded) sürümleri silelim

Dism.exe /online /Cleanup-Image /StartComponentCleanup /ResetBase

Bu komut sonrasında da kurulmuş güncellemerin kaldırılması imkansız hale gelir. Görece daha "hafif" bir temizlik için /ResetBase olmadan kullanabiliriz.

Bir service pack ile eski duruma düşmüş dosyaları silmek için (service pack'in kaldırılmasını imkansız hale getirir)

Dism.exe /online /Cleanup-Image /SPSuperseded

dism'in kullanımına benzer olarak Powershell'in de Repair-WindowsImage cmdlet'i var, aşağıdaki gibi kullanımı mümkün:

Repair-WindowsImage -CheckHealth
Repair-WindowsImage -ScanHealth
Repair-WindowsImage -RestoreHealth

Bir sistemde kurulu olan güncellemeleri listelemek için

dism /online /Get-Packages /Format:Table

Şu an açık olan sistemde bunu elde etmenin başka yolları da var. Ama DVD veya USB'den açılmış sistem üzerinde aynısını yapabilmek için

dism /image:D:\ /Get-Packages /Format:Table

Burada /image:D:\ Windows'un bulunduğu sürücüyü göstermeli.

Karşılaşılan sorunlar ile ilgili şu videoya bakılabilir.