3.08.2022

zsh

 Linux kabuğu (shell) olarak zsh'i denemek istedim. Fedora kullandığım makineye şu satırla kurulum yaptım:

$ sudo dnf install zsh util-linux-user

util-linux-user paketi, varsayılan kabuğu zsh olarak kullanmamızı sağlayacak chsh'e sahip.

Şu aşamada açtığımız ilk terminal hala varsayılan kabuğu (çoğu durumda bash) kullanıyor olacaktır. zsh'e geçmek için ya terminalde zsh yazıp elle giriş yapmamız lazım, ya da terminal'i açar açmaz zsh'in gelmesi için chsh'i kullanmamız lazım:

$ chsh -s $(which zsh)

Bunu sudo/root ile çalıştırmaya falan gerek yok. Sadece kendi kabuğumuzu değiştiriyoruz. Dolayısıyla mevcut kullanıcının parolasını girmemizi isteyecek. Bundan sonra bir kez oturumu kapatıp tekrar açmak gerek.

chsh kullanmayan başka bir yöntem ise usermod'u kullanmak:

$ sudo usermod -s $(which zsh) $(whoami)

Bir sonraki oturum açılışında artık varsayılan kabuğumuz zsh olacak. İlk açılışta da bir yapılandırma ekranı bizi karşılayacak.

zsh, aynı bash gibi profilin altında .zshrc adındaki bir yapılandırma dosyasına ihtiyaç duyar. Bu ekran, bu yapılandırma dosyasının olmaması durumunda çıkıyor. zsh'i yanlışlıkla çalıştıranlar ve henüz bir .zshrc dosyası oluşturmadan çıkmak isteyenler için (q) seçeneği makul. Eğer boş bir yapılandırma dosyası oluşturup devam etmesini istiyorsak (0)ı, ya da tam gaz yapılandırmaya geçmek için (1)i seçmemiz gerek. Bu durumda sıradaki ekranımız şöyle olacak:

Ben bu ekranda (1)e basarak komut geçmişi ile ilgili varsayılan ayarları kabul ediyorum, (2)ye basarak komut tamamlama sistemi ile ilgili varsayılanları kabul ediyorum, ve (4)e basarak da (1), (2), (3) ve (5)'i (s)ye basarak ayarlıyorum. Her ekrandan da (0)a basarak ayarlarımı hatırlamasını ve nihayetinde yukarıdaki ekrana döndüğümde de (0) seçeneği için açıklama "boş bir .zshrc dosyası oluşturup çıkmak" yerine "ayarları kaydederek çık"a dönüştüğünde bu seçenek ile ayarları kaydedip çıkmayı seçiyorum.

İşler bittiğinde yukarıdaki gibi bir ekran ile karşılaşıyorum. Aslında prompt'ta sadece değişen $ karakterinin yerine % karakterinin gelmiş olmasının dışında bir fark gözükmüyor.

Bu arada yukarıda yazan birkaç açıklamaya vurgu yapalım; bu çalışan karşılama ekranını tekrar çalıştırmak için

$ autoload -Uz zsh-newuser-install
$ zsh-newuser-install -f

yazabiliriz. Ayrıca .zshrc yapılandırma dosyasında 

# Lines configured by zsh-newuser-install
# End of lines configured by zsh-newuser-install

satırları arasına müdahale etmemiz, yapaacğımız değişiklikleri bu satırlar dışına eklememiz önerilmiş.

Bu noktada sade bir zsh'ımız oldu. Biraz daha renklendirmek için oh-my-zsh kurmayı tercih ediyorum. curl kullanarak

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

ya da git clone ile

$ git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh

ilgili dosyaları aldıktan sonra profil klasörümüzün altında .oh-my-zsh gizli klasörü oluşacak. oh-my-zsh bize hazır bazı temalar getirecek. Curl yöntemini seçtiysek .zshrc dosyasına varsayılan tema da girilmiş olacak. git clone yaptıysak bu işi el ile yapmamız gerekecek. Mevcut temalara göz atmak için projenin github sayfasına bakabiliriz. Bir tema seçtikten sonra .zshrc dosyasına 

ZSH_THEME="robbyrussell"

gibi bir tema adı yazmak, temamızı her açtığımızda rastgele değişecek şekilde belirlemek için

ZSH_THEME="random"

ya da belli birkaç temanın içinden rastgele seçmek için

ZSH_THEME_RANDOM_CANDIDATES=( "robbyrussell" "agnoster" )

yapılabiliyor.

zsh'i güzel yapan şeylerden biri de eklentileri. Çok kullanılan 2 güzel eklenti Fedora'nın depolarında mevcut. Kurmak için

$ sudo dnf install zsh-autosuggestions zsh-syntax-highlighting

yazmak yeterli. Kurulum sonrası bu iki eklentiyi yapılandırmamıza dahil etmek için yine .zshrc dosyasını açıp son satıra şu satırları eklemek gerek:

# plugins
source /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh
source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

Bu eklentilere ek olarak zsh-Z, fsf de kullanılabilir.

Oh-my-zsh ile gelen plugin'ler de faydalı olabilir.Herhangi bir plugin'i etkinleştirmek için .zshrc dosyasına

plugins=(rails git ruby)

gibi isimlerini yazmak gerek.

Görselliğe seviye atlatacak powerlevel10k temasını yüklemek için ise

$ git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k
$ echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc

yazabiliriz. En son satırdaki echo ile source'u .zshrc'ye ilave etmek yerine aşağıdakini de yapabiliriz

ZSH_THEME="powerlevel10k/powerlevel10k"

Niye 2 kere powerlevel10k yazdık? Çünkü profil klasörümüzün içinde powerline10k klasörünün içindeki powerlevel10k dosyasını göstermeye çalışıyoruz.

Powerlevel10k'in github sayfasında özel bir fonta ihtiyaç duymadığı, ama ek karakterlere sahip bir font ailesinin avantajlarını kullanabileceği yazılmış. Dolayısıyla şu fontlardan birini kullanmak isteyebiliriz:

Nerd Fonts,  

Source Code Pro,  

Font Awesome

Powerline

Powerlevel10k'yı etkinleştirdikten sonraki ilk açılışta aşağıdaki gibi bir ekran ile karşılaşacağız.

Görülebileceği gibi seçili fontlar ile bazı karakterleri göstermeyi deniyor ve bunların uygun şekilde gözüküp gözükmediği konusunda kullanıcıdan bir geri dönüş bekliyor. Diamond için hadi neyse, ama bir sonraki ekrandaki asma kilit sembolü için Fedora'nın varsayılan sabit genişlikli fontu monospace yeterli olmadı. Şu sayfada anlatıldığı gibi powerlevel10k-media reposundaki fontları indirdim.

$ cd $HOME/Downloads
$ wget https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf
$ wget https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf
$ wget https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf
$ wget https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf

Kurmak için Gnome fonts uygulaması ile açtıktan sonra sağ üst köşedeki Kur düğmesine bastım. Kurultuktan sonra bu düğme pasif hale geldi.


powerlevel10k'i tekrar yapılandırmak istersek

$ p10k configure

çalıştırmak gerek.

2.06.2022

Linux'ta Forticlient ile VPN ve internet

 Linux'ta fortisslvpn ile VPN yapaken internete bağlanamıyordum.

$ ip r

ile route tablomu incelediğimde 

default dev ppp0 proto static scope link metric 50

gibi fazladan bir satır gördüm. Bu, herşeyi VPN sanal arayüzüne göndermesini söylüyor. Windows'da forticlient böyle çalışmıyor; trafiğin sadece gereken kısmı VPN tüneline gidiyor, diğer kısmı varsayılan ağ geçidimize yönlendiriliyor. Linux'ta da aynısını yapalım, bu satırı silelim:

$ sudo ip route del default dev ppp0

4.05.2022

Manjaro'da düşük güç kipine giriş ve çıkış kayıtları

Hibernate ve suspend durumlarına ait kayıtları incelemek için bulduğum yöntemler şunlar:

$ journalctl -u systemd-hibernate.service --output=short-iso

$ journalctl -t systemd-sleep --output=short-iso

 Ayrıca beklenmeyen kapanmalarla ilgili şu bilgiler de faydalı olabilir.

12.04.2022

Eventlog ve provider listeleri

Türkçesi olay günlüğü ve sağlayıcı/tedarikçi listeleri. Windows işletim sistemlerinde oluşan olayları arka planda kaydeden bir olay günlüğü mekanizması vardır. Vista öncesi sistemlerde standart olarak Sistem (System), Güvenlik (Security) ve Uygulama (Application) gibi olay günlüklerine daha sonra Uygulama ve Hizmet Günlükleri (Application and Service Logs) altındaki diğer günlükler eklendi.

Powershell'in olay günlükleri ile ilgili ilk cmdlet'i Get-EventLog idi. Bu cmdlet, standart olay günlükleriyle çalışmakta yeterliydi. Örneğin bir makinedeki olay günlüklerinin listesini alabilmek için:

> Get-EventLog -List 

kullanabiliriz. Vista öncesi sistemlerde olay günlüklerine kayıt düşen bileşenlere kaynak (source) denirdi. Sisteme yeni kurulan bir sürücü, yeni bir yazılım, istediği olay günlüğüne kendi uygun gördüğü kaynak ismiyle kayıt düşerdi. Örnek olarak aşağıdaki olay kaydına bakalım:

Bir hizmetin durumu hakkında bizi bilgilendiren bu olay kaydını Sistem olay günlüğüne yazan kaynağın adı "Service Control Manager". Alışkanlıklar daha sonra biraz değişiti. Vista ile birlikte "Uygulama ve Hizmet Günlükleri"ni okumak için hem Get-Eventlog'dan başka bir cmdlet'e ihtiyaç duyuldu, hem de Kaynak (Source) teriminin yerine Sağlayıcı (Provider) geldi.

Yeni cmdlet Get-WinEvent oldu. Vista sonrası sistemlerde var olan yeni logların listesini alabilmek için de önceki örneğe eşdeğer olarak

> Get-WinEvent -ListLog *

geldi. Bu şekilde hiçbir ölçüt belirtmeden sadece * kullanara sorgularsak çok uzun bir liste ile karşılaşabilriz. Bunun yerine örneğin içinde powershell geçen olay günlükleri için

> Get-WinEvent -ListLog *powershell*

yazabiliriz.

Get-EventLog'da olmayan, ama Get-WinEvent ile gelen -ListProvider parametresi de bir önceki paragrafa konu sağlayıcıların listesini alabilmek için:

> Get-WinEvent -ListProvider *

Bu komut da benzer şekilde uzun bir liste verecek. Onun yerine örneğin içinde içinde sadece Sysmon geçen sağlayıcıları görebilmek için

> Get-WinEvent -ListProvider *sysmon*

yazabiliriz.

Get-Eventlog cmdlet'i için benzer bir -ListProvider parametresi yoktu. Bunun yerine kullanılabilecek yöntem şu olabilirdi:

> Get-WmiObject -Class Win32_NTEventLOgFile | Select-Object FileName, Sources

Bu şekilde her olay günlüğüne kaydedilmiş sağlayıcı (ya da kaynakları) ayrı ayrı görebiliriz.




11.03.2022

Powershell'de alias aramak

Get-Alias komutunun varsayılan araması bir alias'ın hangi cmdlet'e karşılık geldiğini bulmaya yönelik. Örneğin

PS> Get-Alias sls

CommandType     Name                           Version    Source
-----------     ----                           -------    ------
Alias           sls -> Select-String

Bazen ihtiyacım tam tersi oluyor; yani select-string'in alias'ı nedir, bunu bilmek istiyorum. Ama Get-Alias'ın böyle bir araması hata ile sonuçlanıyor:

PS> Get-Alias Select-String

Get-Alias : This command cannot find a matching alias because an alias with the name 'select-string' does not exist.
At line:1 char:1

Get-Alias komutunun ne gibi bir çıktı ürettiğini görmek için Get-Member (gm) cmdlet'ini kullanarak çıktı alanlarını inceledim.

PS> Get-Alias sls | gm

HelpUri             : https://go.microsoft.com/fwlink/?LinkID=113388
ResolvedCommandName : Select-String
DisplayName         : sls -> Select-String
ReferencedCommand   : Select-String
ResolvedCommand     : Select-String
Definition          : Select-String
Options             : None
Description         :
OutputType          : {Microsoft.PowerShell.Commands.MatchInfo, System.Boolean}
Name                : sls
CommandType         : Alias
Source              :
Version             :
Visibility          : Public
ModuleName          :
Module              :
RemotingCapability  : PowerShell
Parameters          : {[InputObject, System.Management.Automation.ParameterMetadata], [Pattern, System.Management.Automation.ParameterMetadata], [
                      Path, System.Management.Automation.ParameterMetadata], [LiteralPath, System.Management.Automation.ParameterMetadata]...}
ParameterSets       :

Yukarıdaki alanların içinde kırmızı ile belirttiğim Definition aradığım alan. Get-Alias'ın parametrelerinin içinde de böyle bir bölüm vardı. Bunu kullanarak:

PS> Get-Alias -Definition Select-String

CommandType     Name                          Version    Source
-----------     ----                          -------    ------
Alias           group -> Group-Object

sonuca ulaştım.

Dosyaların içinde geçen bir kelimeyi saymak

Sıkça olarak anahtar kelime araması yapmak için powershell Select-String'i (sls) kullanıyorum:

PS> sls anahtar_kelime D:\logs\*.log

Bu şekilde çok sayıda dosyanın içinde geçen anahtar_kelime satırı listeleniyor, powershell penceresinde satırlar akıp gidiyor. Bazı durumlarda anahtar kelimenin geçtiği satırdan çok hangi dosyada kaç kere geçtiği, veya en çok hangi dosyada geçtiği önem kazanır. Bu durumlarda Group-Object ile sayım yapıyorum:

PS> sls anahtar_kelime D:\logs\*.log | group path

Bu sonucu biraz güzelleştirmek için verileri count alanına göre sıralamak ve bir tablo şeklinde görüntülemek faydalı oluyor:

PS> sls anahtar_kelime D:\logs\*.log | group path | sort count -desc |ft * -Autosize

Her durumda powershell!

10.03.2022

Windows oturum açma geçmişi

Bir kullanıcı bir Windows bilgisayarda oturum açtığında 4624 olay kaydı oluşur. Ancak ağ üzerinden bağlanma, uzak masaüstü bağlantısı ve kilitli bilgisayarı açmak da dahil olmak üzere birçok durumda yine 4624 olayı kaydedilir. Oturum açma çeşitleri (Logon Type) olarak şu tabloya bakılabilir:


Logon Type Logon Title Description
0 System Sadece "System" hesabı için kullanılır.
2 Interactive Gerçek oturum açma olayı.
3 Network Ağ üzerinden oturum açma. Örneğin bir paylaşıma erişme.
4 Batch Batch logon type is used by batch servers, where processes may be executing on behalf of a user without their direct intervention.
5 Service Service Control Manager tarafından başlatılan bir hizmete ait kayıt.
7 Unlock Kilitli bilgisayarın kilidinin açılmasına ait kayıt.
8 NetworkCleartext Bir kullanıcı ağ üzerinden oturum açmış, ama parola hash olarak değil, açık şekilde gönderilmiş.
9 NewCredentials Oturum açılırken üretilen token tekrar kullanıldı ama yeni oturum açma bilgileri (kullanıcı adı ve parola) belirtti.
10 RemoteInteractive Uzak masaüstü ile bağlantı kuruldu.
11 CachedInteractive Oturum açma sırasında parolayı doğrulamak için etki alanı sunucusuna (DC) danışılmadı, yerel kayıt bilgileri (cache) kullanıldı.
12 CachedRemoteInteractive RemoteInteractive ile aynı, iç izleme için denmiş (?)
13 CachedUnlock Sanıyorum kilit açarken DC'ye danışmadan yerel kayıt bilgilerinin (cache) kullanılması durumu.

Etki alanı olmayan bir bilgisayara yapılan oturum açmaları arıyorsak 2 veya 7'ye bakmalıyız. Etki alanına üye bir bilgisayar için ise 2, 11 ve 13 olabilir.

Get-WinEvent ile şu şekilde yapılan bir sorgu ile olay gövdesindeki bütün bilgileri görmek yüksek olasılıkla mümkün olmayacaktır:

PS> Get-WinEvent -Filterhashtable @{LogName="Security";Id=4624}

TimeCreated                      Id LevelDisplayName Message
-----------                      -- ---------------- -------
2022-03-10 20:49:38            4624 Bilgi            Bir hesapta başarılı bir şekilde oturum açıldı....

Bunun yerine hem oturum açma tipini hesaba katıp, hem de EventProperty nesnesi ile daha güzel bir çıktı üretmek mümkün. 4624 olayı için EventProperty üyeleri şöyle:

0 : Subject User SID
1 : Subject Username
2 : Subject Domain Name
3 : Subject Logon Id
4 : Target User SID
5 : Target Username
6 : Target Domain Name
7 : Target Logon Id
8 : Logon Type
9 : Logon Process Name
10: Authentication Package Name
11: Workstation Name
12: Logon GUID
13: Transmitted Services
14: LmPackageName
15: Keylength
16: ProcessId
17: ProcessName
18: IP Address
19: IP Port
20: Impersonation Level
21: Restricted Admin Mode
22: Target Outbound Username
23: Target Outbound Domain Name
24: Virtual Account
25: Target Linked Logon Id
26: Elevated Token

4771 Pre-Authentication failed hatasının EventProperty nesnesi içindeki 4 numaralı üye Status için şu ayrıntılar verilmiş:

StatusKerberos RFC tanımı Açıklama
0x1 Client's entry in database has expired  
0x2 Server's entry in database has expired  
0x3 Requested protocol version # not supported  
0x4 Client's key encrypted in old master key  
0x5 Server's key encrypted in old master key  
0x6 Client not found in Kerberos database Bad user name, or new computer/user account has not replicated to DC yet
0x7 Server not found in Kerberos database New computer account has not replicated yet or computer is pre-w2k
0x8 Multiple principal entries in database  
0x9 The client or server has a null key administrator should reset the password on the account
0xA Ticket not eligible for postdating  
0xB Requested start time is later than end time  
0xC KDC policy rejects request Workstation restriction
0xD KDC cannot accommodate requested option  
0xE KDC has no support for encryption type  
0xF KDC has no support for checksum type  
0x10 KDC has no support for padata type  
0x11 KDC has no support for transited type
0x12 Clients credentials have been revoked Hesap devre dışı, süresi dolmuş, kilitlenmiş veya oturum açma saatleri dışında.
0x13 Credentials for server have been revoked  
0x14 TGT has been revoked  
0x15 Client not yet valid - try again later  
0x16 Server not yet valid - try again later  
0x17 Password has expired Parolanın süresi dolmuş
0x18 Pre-authentication information was invalid Genellikle yanlış parola
0x19 Additional pre-authentication required*  
0x1F Integrity check on decrypted field failed  
0x20 Ticket expired Frequently logged by computer accounts
0x21 Ticket not yet valid  
0x21 Ticket not yet valid  
0x22 Request is a replay  
0x23 The ticket isn't for us  
0x24 Ticket and authenticator don't match  
0x25 Clock skew too great Workstation’s clock too far out of sync with the DC’s
0x26 Incorrect net address IP address change?
0x27 Protocol version mismatch  
0x28 Invalid msg type  
0x29 Message stream modified  
0x2A Message out of order  
0x2C Specified version of key is not available  
0x2D Service key not available  
0x2E Mutual authentication failed may be a memory allocation failure
0x2F Incorrect message direction  
0x30 Alternative authentication method required*  
0x31 Incorrect sequence number in message  
0x32 Inappropriate type of checksum in message  
0x3C Generic error (description in e-text)  
0x3D Field is too long for this implementation  

Bunları kullanarak daha şekilli bir çıktı için şöyle bir komut mümkün:

PS> Get-WinEvent -FilterHashtable @{LogName="Security";Id=4624} | 

Where-Object {$_.properties[8].Value -eq 2} |

Select-Object TimeCreated, Id, @{Name="Username";Expression={$_.properties[5].Value}}, @{Name="LogonProcName";Expression={$_.properties[9].Value}}, @{Name="AuthPkgName";Expression={$_.properties[10].Value}}, @{Name="IPAddress";Expression={$_.properties[18].Value}}

Bunun sonucunda çıktı şöyle olur:

TimeCreated           Id Username LogonProcName AuthPkgName IPAddress
-----------           -- -------- ------------- ----------- ---------
2022-03-10 19:53:21 4624 user1    Advapi        Negotiate   -
2022-03-10 19:53:21 4624 user2    Advapi        Negotiate   -
2022-03-10 19:53:21 4624 user2    Advapi        Negotiate   -
2022-03-10 19:53:14 4624 user4    User32        Negotiate   127.0.0.1
2022-03-10 19:53:14 4624 user5    User32        Negotiate   127.0.0.1

Oturum kapatma olayı 4634, oturum açma hatası (yanlış parola/kullanıcı adı) 4625 olayları ile sorgulanabilir. Oturum kapatma için EventProperties nesnesinde 5 alan vardır. 4625'te ise 4624'tekine benzer sayı ve nitelikte alanlar vardır.