2.06.2021

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:

PS> Get-WindowsCapability -Online -Name 'OpenSSH*'

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

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

Kurulduktan sonra sshd hizmetini hemen başlatmak için

PS> Start-Service sshd

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

PS> Get-NetFirewallRule -Name *ssh*

Eğer bir kural yoksa yenisini yaratmak için

PS> 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

PS>   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ı

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.

PS> 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.

PS> icacls authorized_keys /inheritance:r

PS> 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.

PS> Restart-Service sshd

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

PS> 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ı.

PS> icacls .\id_rsa /inheritance:r

PS> icacls .\id_rsa /grant username:F

PS> icacls .\id_rsa /grant SYSTEM:F

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

PS> 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ş.