2021-07-09

IPv6'yı devre dışı bırakmak

Sadece görsel olarak IP adreslerinin arasında uzun uzun sayılar görmeyi istememekten değil, ayrıca yeni bir adres aralığı ve oluşturulmamış kurallar sebebiyle saldırılara açık kalmamak için de eğer kullanılmıyorsa IPv6'yı devre dışı bırakmak isteyebiliriz.

Linux'ta IPv6'yı devrede mi diye bakmak için 

$ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
    link/ether 02:28:a8:b6:01:1c brd ff:ff:ff:ff:ff:ff
    inet 172.31.15.59/20 brd 172.31.15.255 scope global dynamic eth0
       valid_lft 1840sec preferred_lft 1840sec
    inet6 fe80::28:a8ff:feb6:11c/64 scope link
       valid_lft forever preferred_lft forever

Kullanabiliriz. Kırmızı ile işaretlediğim satır IPv6 adresimizin olduğunu ve IPv6'nın devrede olduğunu gösterir. Ayrıca 

$ cat /proc/sys/net/ipv6/conf/all/disable_ipv6

0

İle yukarıdaki gibi 0 sonucu alıyorsak IPv6 devre dışı değildir. Bunu

$ sudo echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6

ile 1 yapabilir ve IPv6'yı devre dışı bırakabiliriz. 

Ya da

$ sudo sysctl -w net.ipv6.conf.all.disable_ipv6 = 1

ile aynı etkiye sahip olabiliriz. Bu satırlar tüm ağ arayüzlerindeki (interface) IPv6'yı devre dışı bırakır. Bu komutların etkisini belli bir arayüz ile sınırlandırmak istiyorsak all yerine arayüz adını yazmamız gerekir. Örneğin ens33 için

$ sudo sysctl -w net.ipv6.conf.ens33.disable_ipv6 = 1

ya da

$ cat /proc/sys/net/ipv6/conf/ens33/disable_ipv6

yapabiliriz. Bu işlemlerden sonra 

$ sudo sysctl -p 

uygulamak gerekir. Bu komutlar çalışma anında etkili olurlar, ancak sistem tekrar başlatıldığında etkisini kaybeder. Sistem tekrar başlatıldığında bu ayarların geçerli olması için ise /etc/sysctl.conf dosyasına şu satırı eklememiz gerek:

net.ipv6.conf.ens33.disable_ipv6 = 1



2021-07-05

NTFS ve FAT32 dosya sistemlerinde son değişiklik zamanlarındaki farklılıklar

FAT32 dosya sistemine sahip USB belleğimden NTFS'e kopyaladığım dosyalarımda daha sonra değişiklik karşılaştırması yapmak istediğimde hep son değişiklik zamanlarında 1-2 saniyelik farklılıklar görüyordum, dosyaların üzerinde hiçbir değişiklik olmasa bile. Bunun nedeninin dosya sistemleri arasındaki farklılıktan kaynaklanabileceğini düşünüyordum, ayrıntısını hiç incelememiştim.

Yukarıdaki resimde sol yarıda NTFS biriminde, sağ yarıda ise FAT32 biriminde depolanan ve üzerlerinde hiç değişiklik yapılmamış dosyalara ait son değiştirme zamanları arasında 1-2 saniyelik farklılıklar görülüyor.

Bunun sebebi, [1]'de açıklandığı gibi, FAT32 dosya sistemlerinde dosya yazma (en son değiştirme) alanının çözünürlüğünün 2 saniye olmasından kaynaklanıyor.

Konu ayrıca [2]'de de tartışılmış ve aynı bilgi verilmiş.

--- 

[1] https://docs.microsoft.com/en-us/windows/win32/sysinfo/file-times

[2] https://serverfault.com/questions/11304/why-does-file-copy-from-ntfs-to-fat32-change-a-files-modified-date

2021-06-29

7zip ve Linux

Windows bir bilgisayarda, Fat32 ile biçimlendirilmiş USB belleğe sığmayacak 4 GB'tan büyük içeriği 7zip ile daha küçük parçalara bölmek için tar formatını kullandım. dosya.tar.001, dosya.tar.002,... gibi dosyalar oluştu. Daha sonra bunları linux bir makinede açmayı denedim. tar.001 uzantılı ilk dosyayı Ark ile açarak içeriği çıkar dedim. Beklediğim gibi 4 GB'tan büyük bir dosya oluşturdu. Ancak dosya boyutu beklediğim boyutta olmasına rağmen sadece ilk dosya olan dosya.tar.001'in içeriğine sahipti. Diğer içerikleri otomatik olarak almamıştı.

Bunun üzerine

cat dosya.tar.00* > dosya.tar

ile tüm dosyaları tek tar dosyasında birleştirdim. Sonra da ark ile tekrar çıkarttım. Bu sefer sorun yoktu.

2021-06-02

Windows Server + OpenSSH

Windows Server 2019 varsayılan olarak OpenSSH Client kurulu geliyor. Yönetici ayrıcalıklarıyla açılmış bir Powershell konsolunda şu komut ile kontrol edebiliriz:

Get-WindowsCapability -Online -Name 'OpenSSH*'

Buna ilave olarak OpenSSH Server kurulumunu da bir özellik gibi kurabiliriz:

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Kurulduktan sonra sshd hizmetini hemen başlatmak için

Start-Service sshd

kullanabiliriz. Ama Windows Firewall etkinse önce bir kuralımızın olup olmadığını kontrol etmemiz iyi olabilir:

Get-NetFirewallRule -Name *ssh*

Eğer bir kural yoksa yenisini yaratmak için

New-NetFirewallRule -Name SSHSpec -DisplayName SSHSpec -Profile any
     -Protocol TCP
     -LocalPort 1022
     -Direction Inbound
     -Action Allow

Uzaktan bağlandığımızda varsayılan olarak cmd shell gelir. Bunu powershell ile değiştirmek için (ayrıntılar için [2])


New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH"
    -Name DefaultShell
    -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
    -PropertyType String
    -Force

İleri seviye ayarlar sshd_config dosyasında, bu dosya da $env:ProgramData konumunda. Bu dosyadaki birkaç parametreyi hatırlayalım:


DenyUsers             : Bağlanması engellenmek istenen kullanıcılar
AllowUsers            : SSH sunucunun hedef kitlesi
PermitRootLogin       : Windows Server için anlamsız
PermitEmptyPasswords  : Boş parolalar geçerli mi değil mi
PasswordAuthentication: Parola ile bağlanmak mümkün mü, yoksa sadece RSA anahtarıyla mı
PubKeyAuthentication  : RSA anahtarıyla oturum açmayı etkinleştirmek

Eğer bir anahtar çifti yaratmak istiyorsak ssh-keygen ile yapabiliriz. Bu adımdan sonra id_rsa ve id_rsa.pub adında iki dosya oluşacak. pub uzantılı genel (public) anahtarımız. Bunu sunucuda bırakacağız. id_rsa ise bizim özel anahtarımız. Paylaşmamamız ve yanımızda taşımamız gerekiyor.

Öncelikle sunucu tarafında authorized_keys dosyasını oluşturalım ([1]'de sshd hizmetini başlatınca %programdata%\ssh altında bu anahtarları oluşturacağı söylenmiş).

copy id_rsa.pub authorized_keys

Bu dosyanın yetkileri önemli. Sadece SYSTEM ve bizim kullanıcımızın tam yetkileri olmalı, başka yetki olmamalı. Bu amaçla icacls aracını kullanarak önce yetkilerin devralınmasını engelleyelim, daha sonra da administrators grubunu yetkiler listesinden çıkaralım.

icacls authorized_keys /inheritance:r
icacls authorized_keys /remove:g BUILTIN\Administrators

Yine şu sayfada sshd_config dosyasındaki aşağıdaki satırların başına # işareti konularak etkisizleştirilmesi önerilmiş.


# Match Group administrators
#   AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

sshd_config dosyasında yapılan değişikliklerden sonra sshd hizmetinin yeniden başlatılması gerek.

Restart-Service sshd

Düzeltme: ssh-keygen bizim bilgisayarımızda çalıştırılmalı, sunucuda değil. Ayrıca sshd_config dosyasında başına # koyarak etkisizleştirilmek yerine yeni düzene uyup, autorized_keys yerine %programdata%\ssh\administrators_authorized_keys dosyasını kullanmaya başlayabiliriz.

Uzaktan bağlanabilmemiz için bir adım kaldı, o da id_rsa anahtarımızı yerel bilgisayara aktarmak. scp ile uzaktan kopyalayabiliriz.

scp administrator@192.168.x.x:/Users/administrator/.ssh/id_rsa C:\Users\username

Ancak bu dosyanın da yetkileri ile ilgili kesin kurallar var. Benzer şekilde sadece SYSTEM ve kendi kullanıcımız yetkili olmalı.

icacls .\id_rsa /inheritance:r
icacls .\id_rsa /grant username:F
icacls .\id_rsa /grant SYSTEM:F

Bundan sonra artık ssh bağlantısı mümkün.

ssh administrator@192.168.x.x -i .ssh/id_rsa

Hala aşağıdaki gibi hata alıyorsanız

Permission denied (publickey,keyboard-interactive)

sondan bir önceki adımda # işaretiyle etkisizleştirmeniz gereken satırı atlamamış olabilirsiniz. Ya da alternatif olarak sshd_config dosyasında geçen

#StrictModes yes

satırını

StrictModes no

olarak değiştirmek önerilmiş.

---

[1] https://github.com/PowerShell/Win32-OpenSSH/wiki/Install-Win32-OpenSSH

[2] https://github.com/PowerShell/Win32-OpenSSH/wiki/DefaultShell

[3] https://learn.microsoft.com/en-us/powershell/scripting/security/remoting/ssh-remoting-in-powershell?view=powershell-7.6 

2021-04-27

İnternetten indirilen bir dosyanın engelini kaldırma

Alternate data streams (ADS) konusunu daha önce yazmıştım. İnternetten indirilen bir dosya üzerinde bir "Zone.Identifier" ADS akışı olur. Windows'da çoğu tarayıcı (Firefox, Chrome, Edge, Internet Explorer) internetten indirilen dosyalar için bu ADS akışını oluşturur.


Yukarıdaki diyaloğun altındaki "Engellemeyi Kaldır" kutusu işaretlenmeden zip dosyası açılırsa açılan her dosya için Zone.Identifier akışı oluşur. Bu Windows ayıklama arayüzü kullanıldığında geçerlidir. Diğer dosya sıkıştırma uygulamaları için durum farklı olabilir. Örneğin 7zip, çıkartılan (veya ayıklanan, her neyse) dosyalar için Zone.Identifier akışını korumaz. Ayrıca bu akışa sahip bir dosya çalıştırılırken de kaynağına güvenip güvenmediğimize dair emin misiniz sorusu görüntülenir.

Neyse, çevirideki anlam karmaşasından sıyrılıp konuya dönelim. Zip dosyasına sağ tıklayıp engellemeyi kaldırabiliriz. Ama amacımız bunu komut satırından, powershell ile yapmak.

Önce akışı görelim:

Get-Item -Path Sysinternals* -Stream *

Bu şekilde bulunduğumuz klasörde sysinternals ile başlayan tüm dosyaların ADS verilerini görüntülemiş oluruz. Belli bir dosyanın belli bir akışına (ADS'sine) ulaşmak için daha net olarak

Get-Item SysinternalsSuite.zip -Stream Zone.Identifier
PSPath        : Microsoft.PowerShell.Core\FileSystem::D:\Download\SysinternalsSuite.zip:Zone.Identifier
PSParentPath  : Microsoft.PowerShell.Core\FileSystem::D:\Download
PSChildName   : SysinternalsSuite.zip:Zone.Identifier
PSDrive       : D
PSProvider    : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
FileName      : D:\Downloads\SysinternalsSuite.zip
Stream        : Zone.Identifier
Length        : 97 

kullanabiliriz. Zone.Identifier akışını bulduk. Bir de içeriğini görüntüleyelim.

Get-Content SysinternalsSuite.zip:Zone.Identifier
[ZoneTransfer]
ZoneId=3
ReferrerUrl=https://docs.microsoft.com/tr-tr/sysinternals/downloads/sysinternals-suite
HostUrl=https://download.sysinternals.com/files/SysinternalsSuite.zip

Bunu silmek için de

Remove-Item SysinternalsSuite.zip:Zone.Identifier

kullanabiliriz. Hatta bu işi yapan bir cmdlet de var (2023-02-02):

Unblock-File SysinternalsSuite.zip

ADS akışından kurtulduktan sonra powershell ile dosyaları çıkartmak (ayıklamak, genişletmek) için de şöyle bir yol olabilir:

Expand-Archive .\SysinternalsSuite.zip -DestinationPath D:\Downloads\ -Force

Burada -Force parametresi o klasörde var olan eski sürümlerin üzerine yazmayı etkinleştirmek için.

Not: Powershell Invoke-WebRequest cmdlet'ini kullanarak indirince ADS oluşturulmaz. Bu şekilde indirmek için mesela


Invoke-WebRequest -Uri "https://download.sysinternals.com/files/SysinternalsSuite.zip" -OutFile "SysinternalsSuite.zip"

yazabiliriz.

2021-04-14

AWS üzerinde WireGuard VPN sunucu kurulumu

Amazon Web Services üzerinde düşük özelliklere sahip bir sunucu ücretsiz olarak kurulabiliyor. Bir hesap açarak aws.amazon.com adresine girerek bu işlemi yapabiliriz. Bunu yaptıktan sonra bugün için 1 GB RAM'e sahip, 1 CPU ve 8 GB depolamaya sahip bir linux sunucumuz olacak.

Yukarıdaki tabloda da görüldüğü gibi aylık 15 GB kotaya sahip olacağız. Ücretsiz kullanımda bizi sınırlayan tek ölçüt bu olacak.

Free Instance'ımızı oluşturduktan sonra bir linux sunucuyu uzaktan yönetmek için bize tahsis edilmiş bir de özel anahtar dosyamız olacak. *.pem uzantılı bu dosyayı işin sonunda download etmeyi unutmamak gerek. Ayrıca security bölümünden inbound rules'a bir SSH bağlantısı (22/TCP) izni oluşturmamız gerek.

Sunucumuza uzak bağlantıyı aşağıdaki gibi yapabiliriz.

> ssh ubuntu@sunucu_ip_adresi_veya_ismi -i ozel_anahtarimiz.pem

Özel anahtarımız aracılığıyla şifresiz ssh bağlantısı yapabiliriz. Oluşabilecek hatalar pem dosyasının yetkilerinin gereğinden fazla olmasından kaynaklanabilir. Bunun için yetkileri kısmak gerek. Sadece kendi kullanıcımıza yetki verelim.

Şu an için benim elimde Ubuntu 20.04.3 LTS bir sunucu var. İlk yapmak gereken paketleri bir güncellemek

> sudo apt update && sudo apt upgrade

Bir sonraki adım otomatik süreçte oluşturulan ubuntu kullanıcısından kurtulup kendi belirlediğimiz bir kullanıcı ve kendi yarattığımız bir özel anahtarla oturum açmak için. Çok gerekli mi? Değil. Ama ben yapmayı tercih ediyorum. Yeni bir grup ve kullanıcı oluşturalım.

> sudo groupadd metin

> sudo adduser metin

Yeni oluşturduğumuz kullanıcıya ayrıcalıklı yetkiler vermek için bazı grupların üyesi yapalım.

> sudo usermod -aG admin,adm,sudo,ssh metin

Bir de varsayılan grup olayımız var

> sudo usermod -g metin metin

Bu kullanıcı için bir RSA anahtar çifti oluşturmamız gerek. Daha sonra SSH bağlantımızı bu kullanıcı üzerinden yapacağız. Bunu yapmanın birkaç yolu var. Yollardan biri ssh-keygen'i ubuntu kullanıcısıyla çalıştırıp yaratılan dosyaları yeni kullanıcımızın profiline aktarmak. ssh-keygen varsayılan olarak 3072 bitlik bir anahtar çifti oluşturacak ve bunları varsayılan olarak .ssh klasörünün altında id_rsa ve id_rsa.pub dosyalarına yazacak. Ubuntu kullanıcısından yaptığımız bu işlem sonucunda oluşan dosyaları metin kullanıcısının authorized_keys dosyasına aktaracağım.

> sudo cp .ssh/id_rsa.pub /home/metin/.ssh/authorized_keys

Sonrasında ssh bağlantısını kesip özel anahtarımızı yerel bilgisayara aktaralım.

> scp -i ozel_anahtarimiz.pem ubuntu@sunucu_ip_adresi_veya_ismi:/home/ubuntu/.ssh/id_rsa D:\ssh\ozel_anahtarim

Özel anahtarımız pem dosyasının yerine geçecek. Bu dosyanın da yetkilerinin sadece kendi kullanıcımızla kısıtlı olması gerek. OpenSSH bu konuda katı. Bu işlemden sonra yeni kullanıcımız ve yeni anahtarımızla bağlantı yapabiliyor olmamız gerek. Deneyelim:

> ssh -i D:\ssh\ozel_anahtarim metin@sunucu_ip_adresi_veya_ismi

Artık ubuntu kullanıcısı ve ev klasörünün altındaki (/home/ubuntu) dosyalara ihtiyacımız kalmadı. Silebiliriz.

Sonrasında benim yapmayı tercih ettiğim ilk şey bir güvenlik duvarı ve fail2ban kurmak.

> sudo apt install ufw fail2ban

Sunucumuza uzaktan ssh ile bağlandığımız için güvenik duvarını kurduktan sonra etkinleştirmeden önce ilk yapmamız gereken SSH bağlantılarına izin veren bir kural oluşturmak.

> sudo ufw allow ssh

> sudo ufw enable

Artık sadece 22 TCP bağlantısına izin verilen bir sunucumuz var. Ben bununla yetinmiyorum. Böyle bir sunucuyu internete bağlı bırakmak aracınızı kilitleyip herkesin kendi anahtarını deneyerek açmaya çalışacağı bir pazar alanına bırakmak gibi. Sürekli birileri gelip bağlanmayı deneyecek. Bunu nispeten engelleyebilmek için fail2ban çok güzel bir çözüm. Fail2ban'in yapılandırma dosyası /etc/fail2ban/jail.conf adresinde. Ama bu dosyayı doğrudan düzenlemek yerine aynı klasöre jail.local kopyası oluşturup onun üzerinden düzenlemek önerilmiş. jail.local kopyası boş olabilir, ya da şu adreste gösterildiği gibi jail.conf dosyasının satırlarının başına # karakteri getirilerek etkisizleştirilmiş bir kopyası olabilir:

> awk '{ printf "# "; print; }' /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local

Sonuçta bu dosyayı açıp içinde bazı düzenlemeler yapmamız gerek. Bu dosyaya sadece ben, belirsiz birkaç yerden bağlanacağım. Şifreyi en fazla 2 kere yanlış girme ihtimalim üzerinden yapılandıracağım. Aynı IP adresinden 10 dakika içinde 2'den fazla yanlış şifre denemesi olursa bu IP aderesinin engellenmesini istiyorum. Engelleme de süresiz olacak. Ama güvenli bir IP adresi vereceğim; bu adresten gelen bağlantılar engellenmeyecek. Bunu yapabilmek için şu satırları ekliyorum.

[DEFAULT]
ignoreip = 222.222.222.222
bantime = -1
findtime = 600
maxretry = 3

SSH protokolü varsayılan olarak jail.conf dosyasında izleniyor. Bazı kaynaklarda ssh için aşağıdaki gibi satırların eklenmesi önerilmiş ama ben eklemedim. Buna rağmen SSH protokolü izlemede.

[ssh]
enabled     = true
port        = ssh
filter      = sshd
logpath     = /var/log/auth.log

Fail2ban'in durumunu sorgulamak için

> sudo fail2ban-client status

ya da özellikle sshd durumunu öğrenmek için

> sudo fail2ban-client status sshd

yazıp engellenmiş IP adresi var mı, öğrenebiliriz. Engellenen bir IP adresini karalisteden çıkarmak için ise

> sudo fail2ban-client set sshd unbanip xxx.xxx.xxx.xxx

ya da bir IP adresini engellemek için

> sudo fail2ban-client set sshd banip 1xx.1x.2x.2x

Artık VPN kurulumuna başlayabiliriz. VPN kurulumu işin en kolay kısmı. Wolfgang sağolsun, şu videosunda konuyu oldukça basite indirgemiş.

> wget https://git.io/wireguard -O wireguard-install.sh && sudo bash wireguard-install.sh

Cep telefonlarından bağlanabilmek için Wireguard'ı kurup QR kodu okutmak yeterli. Bilgisayardan yapıyorsanız bu işlem sonucunda oluşan /root klasörünün altındaki *.conf dosyasını bilgisayarınıza aktarmanız yeterli. Linux'ta /etc/wireguard/wg0.conf dosyasına, Windows'da ize grafik arayüzden Wireguard uygulamasının için bu verileri aktararak bağlantı oluşturabilirsiniz. Sınırsız kullanıcı oluşturmak mümkün. Her cihaz/kullanıcı için 

> sudo bash wireguard-install.sh

komutunu tekrar çalıştırmak gerek. Sınır olmadığı için bunu yapmaktan kaçınmamak, bir cihazın/kullanıcının verilerini başka bir cihaz/kullanıcı ile paylaşmamak önerildiği için bu kurala uyuyoruz. Linux'ta VPN'i devreye almak için

> sudo wg-quick up wg0

komutunu çalıştırmak gerekli. Wireguard varsayılan olarak UDP 51820 portunu kullanıyor ama değişitirilebilir. Bu port için de güvenlik duvarının üzerinde izin vermek gerek. Hem Ubuntu'nun güvenlik duvarı, hem de Amazon'un Security Rules içinde. Ubuntu için bu

> sudo ufw allow 51820/UDP

ile mümkün.

Wireguard UDP kullandığı için ve UDP de TCP gibi oturumlu olmadığı için çalışıyor mu diye kontrol etmek biraz daha zor. Kontrol etmek için bir yöntem VPN'i devreye aldıktan sonra sunucuya dahili IP adresi üzerinden ping atmak olabilir. Wireguard kendi içinde başka bir IP aralığı kullanıyor. Örneğin 

> ping 10.7.0.1

ile istemcimiz sunucuya ping atabiliyor mu, ya da sunucu üzerinden

> ping 10.7.0.2

gibi bir şekilde sunucu istemciye ping atabiliyor mu, bakabiliriz. Artan cihaz sayısı ile son oktet değişecektir. Ya da sunucu tarafında 51820 portu üzerinden gerçekleşen trafiğe bakabiliriz.

> sudo tcpdump -i eth0 port 51820

Kriptolanmış paketlerin içini görmeye kalkışmadan bu trafiğin varlığının sistemin çalıştığını gösterdiğine kanaat getirmek genel olarak tercih edilen bir yöntem.

2023-08-13 Ek: Wireguard için kernel debug logu aktifleştirmek için

# echo "module wireguard +p" | sudo tee /sys/kernel/debug/dynamic_debug/control

yapılabilir. Bundan sonra da kernel loglarına

# dmesg -wT

ile bakılabilir. İhtiyacımız kalmadığında wireguard kernel loglarını devre dışı bırakmak için

# echo "module wireguard -p" | sudo tee /sys/kernel/debug/dynamic_debug/control

 Bu güzel bilgi de şu adresten alındı.

2021-03-16

Get-WinEvent ve Logon Type

Uzak masaüstü bağlantılarını eventlog'dan süzmek için garip filtereler kullandım durdum. Ta ki şunu bulana kadar:

PS> Get-WinEvent -FilterHashTable @{LogName="Security";Id=4624} | Where-Object {$_.properties[8].value -eq 10}

Buradaki properties olarak geçen 27 öğelik EventProperty nesnesi, her olay için ayrıntılar sekmesinde çıkan parametrize edilmiş olay özellikleri. Bunu aslında log parser zamanlarından biliyordum, ama nedense bu alanların powershell'den de erişebileceğini hiç düşünmemiştim.

Her durumda Logon Type=10 kaydı düşülmüyor. Sunucunun ekranı kilitlenmişse sadece Logon Type=7 (muhtemelen bir Logon Type=3 sonrasında) kaydı olabiliyor.

2023-04-11 ek: Uygulama ve Hizmet Günlükleri (Application and Service Logs) altında Microsoft>Windows>TerminalServices-RemoteConnectionManager/Operational günlüğü daha net bilgiler sunuyor. Bunun için logon audit policy'si etkinleştirilmiş olmalı.

PS> Get-WinEvent -FilterHashTable @{LogName="Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational";Id=1149} | Select-Object TimeCreated, @{N="User";E={$_.properties[0].Value}},@{N="Domain";E={$_.properties[1].Value}},@{N="IP";E={$_.properties[2].Value}}

2023-11-20 ek: Ayrıca "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" altında hem uzakmasaüstü oturum açma hem de kapama olayları sırasıyla 21 ve 23 olayları ile kaydedilir.

PS> Get-WinEvent -FilterHashtable @{Logname="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational";Id=21,23} -Max 4 | select TimeCreated, Id, @{N="UserName";E={$_.Properties[0].Value}},@{N="SessionID";E={$_.Properties[1].Value}},@{N="IPAddress";E={$_.Properties[2].Value}} | ft *