Windows SSH Uzaktan Giriş

Windows’ta SSH uzaktan erişimi açmak genellikle Windows’un OpenSSH özelliğinin kullanılmasını gerektirir. Aşağıda ayrıntılı adımlar açıklanmıştır:

OpenSSH Kontrolü ve Kurulumu

  1. OpenSSH’in kurulup kurulmadığını kontrol edin:

    • “Ayarlar” > “Uygulamalar” > “Uygulamalar ve Özellikler” > “İsteğe Bağlı Özellikleri Yönet” bölümüne gidin.
    • Kurulu listesinde “OpenSSH Sunucusu” bulun. Eğer mevcutsa, OpenSSH’in kurulduğu anlamına gelir.
  2. OpenSSH’i kurun:

    • OpenSSH Sunucusu bulunamazsa, “İsteğe Bağlı Özellikleri Yönet” sayfasında “Özellik Ekle"ye tıklayın ve listede “OpenSSH Sunucusu"nu bulun, ardından “Kur"u tıklayın.

OpenSSH Hizmetini Başlatma ve Ayarlama

  1. OpenSSH hizmetini başlatın:

    • Kurulum tamamlandıktan sonra, komut istemini yönetici olarak çalıştırın.
    • OpenSSH hizmetini başlatmak için net start sshd komutunu girin. Hizmetin her başlatıldığında otomatik olarak başlamasını istiyorsanız, sc config sshd start= auto komutunu girin.
  2. Güvenlik Duvarı Ayarları:

    • Windows Güvenlik Duvarı’nın SSH bağlantılarına izin verdiğinden emin olun. “Kontrol Paneli” > “Sistem ve Güvenlik” > “Windows Defender Güvenlik Duvarı” > “Gelişmiş Ayarlar” bölümüne giderek yeni bir gelen kuralı oluşturun ve TCP portu 22’ye izin verin.

IP Adresini Alma ve Bağlantı Testi

  1. IP Adresini alın:

    • SSH hizmeti etkinleştirilmiş Windows bilgisayara başka bir makineden bağlanmak için IP adresini bilmeniz gerekir. Komut istemine ipconfig komutunu girerek bilgisayarınızın IP adresini görebilirsiniz.
  2. Bağlantı Testi:

    • Başka bir bilgisayarda veya mobil cihazda SSH istemcisi (örneğin: PuTTY, Termius vb.) kullanarak Windows PC’nize bağlanmayı deneyin. ssh kullanıcıadı@ip_adresiniz formatını kullanın. Burada kullanıcıadı, Windows hesabınızın adı ve ip_adresiniz, daha önce bulduğunuz IP adresidir.

Yapılandırmayı Değiştirme

Şifreyle giriş yapmaktan kaçının, bu kesinlikle bir tuzağa düşme. Ortak anahtar ile giriş yapmanız gerekir, ayarları değiştirerek şifre girişini devre dışı bırakmalı ve ortak anahtar girişine izin vermeliyiz.

Bu yapılandırma dosyasını değiştirmek zordur, özel izinler gerektirir ve aynı zamanda belirli bir izin değerine sahip olmalıdır. Burada betik kullanarak değiştirmenizi öneririm.

# Yönetici izinlerini kontrol edin
$elevated = [bool]([System.Security.Principal.WindowsPrincipal]::new(
    [System.Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))

if (-not $elevated) {
    Write-Error "Lütfen bu betiği yönetici olarak çalıştırın"
    exit 1
}

# 1. OpenSSH Sunucusu kurulumunu kontrol edin
Write-Host "OpenSSH Sunucusu kurulum durumu kontrol ediliyor..."
$capability = Get-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

if ($capability.State -ne 'Installed') {
    Write-Host "OpenSSH Sunucusu kuruluyor..."
    Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 | Out-Null
}

# 2. SSH hizmetini başlatın ve otomatik başlatmayı ayarlayın
Write-Host "SSH hizmeti yapılandırılıyor..."
$service = Get-Service sshd -ErrorAction SilentlyContinue
if (-not $service) {
    Write-Error "OpenSSH hizmeti kurulumu başarısız"
    exit 1
}

if ($service.Status -ne 'Running') {
    Start-Service sshd
}
Set-Service sshd -StartupType Automatic

# 3. Yapılandırma dosyasını değiştirin
$configPath = "C:\ProgramData\ssh\sshd_config"
if (Test-Path $configPath) {
    Write-Host "Orijinal yapılandırma dosyası yedekleniyor..."
    Copy-Item $configPath "$configPath.bak" -Force
} else {
    Write-Error "Yapılandırma dosyası bulunamadı: $configPath"
    exit 1
}

Write-Host "SSH yapılandırması düzenleniyor..."
$config = Get-Content -Path $configPath -Raw

# Ortak anahtar kimlik doğrulamasını etkinleştirin ve şifre girişini devre dışı bırakın
$config = $config -replace '^#?PubkeyAuthentication .*$','PubkeyAuthentication yes' `
                  -replace '^#?PasswordAuthentication .*$','PasswordAuthentication no'

# Gerekli yapılandırmaların mevcut olduğundan emin olun
if ($config -notmatch 'PubkeyAuthentication') {
    $config += "`nPubkeyAuthentication yes"
}
if ($config -notmatch 'PasswordAuthentication') {
    $config += "`nPasswordAuthentication no"
}

# Yapılandırma dosyasına geri yazın
$config | Set-Content -Path $configPath -Encoding UTF8

authorized_keys Dosya İzinlerini Onaylayın

# normal kullanıcı
$authKeys = "$env:USERPROFILE\.ssh\authorized_keys"
icacls $authKeys /inheritance:r /grant "$($env:USERNAME):F" /grant "SYSTEM:F"
icacls "$env:USERPROFILE\.ssh" /inheritance:r /grant "$($env:USERNAME):F" /grant "SYSTEM:F"

# yönetici
$adminAuth = "C:\ProgramData\ssh\administrators_authorized_keys"
icacls $adminAuth /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"

Güvenlik Duvarı Kurallarını Ayarlama

# SSH portuna izin verin
New-NetFirewallRule -DisplayName "OpenSSH Server (sshd)" -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

Ortak Anahtar Ekleme

Normal Kullanıcı

# normal kullanıcı
$userProfile = $env:USERPROFILE
$sshDir = Join-Path $userProfile ".ssh"
$authorizedKeysPath = Join-Path $sshDir "authorized_keys"
$PublicKeyPath = "D:\public_keys\id_rsa.pub"

# .ssh dizinini oluşturun
if (-not (Test-Path $sshDir)) {
    New-Item -ItemType Directory -Path $sshDir | Out-Null
}

# .ssh dizini izinlerini ayarlayın
$currentUser = "$env:USERDOMAIN\$env:USERNAME"
$acl = Get-Acl $sshDir
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    $currentUser, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
)
$acl.AddAccessRule($rule)
Set-Acl $sshDir $acl

# Ortak anahtarı ekleyin
if (Test-Path $PublicKeyPath) {
    $pubKey = Get-Content -Path $PublicKeyPath -Raw
    if ($pubKey) {
        # Ortak anahtarın sonunda satır sonu olduğundan emin olun
        if (-not $pubKey.EndsWith("`n")) {
            $pubKey += "`n"
        }

        # Ortak anahtarı ekleyin
        Add-Content -Path $authorizedKeysPath -Value $pubKey -Encoding UTF8

        # Dosya izinlerini ayarlayın
        $acl = Get-Acl $authorizedKeysPath
        $acl.SetSecurityDescriptorRule(
            (New-Object System.Security.AccessControl.FileSystemAccessRule(
                $currentUser, "FullControl", "None", "None", "Allow"
            ))
        )
        Set-Acl $authorizedKeysPath $acl
    }
} else {
    Write-Error "Ortak anahtar dosyası bulunamadı: $PublicKeyPath"
    exit 1
}

# SSH hizmetini yeniden başlatın
Write-Host "SSH hizmeti yeniden başlatılıyor..."
Restart-Service sshd

Yönetici Kullanıcı

# yönetici
$adminSshDir = "C:\ProgramData\ssh"
$adminAuthKeysPath = Join-Path $adminSshDir "administrators_authorized_keys"
$adminPublicKeyPath = "D:\public_keys\id_rsa.pub"

# Yönetici SSH dizinini oluşturun
if (-not (Test-Path $adminSshDir)) {
    New-Item -ItemType Directory -Path $adminSshDir | Out-Null
}

# Yönetici SSH dizini izinlerini ayarlayın
$adminAcl = Get-Acl $adminSshDir
$adminRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    "Administrators", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
)
$adminAcl.AddAccessRule($adminRule)
Set-Acl $adminSshDir $adminAcl

# Yönetici ortak anahtarını ekleyin
if (Test-Path $adminPublicKeyPath) {
    $adminPubKey = Get-Content -Path $adminPublicKeyPath -Raw
    if ($adminPubKey) {
        # Ortak anahtarın sonunda satır sonu olduğundan emin olun
        if (-not $adminPubKey.EndsWith("`n")) {
            $adminPubKey += "`n"
        }

        # Ortak anahtarı ekleyin
        Add-Content -Path $adminAuthKeysPath -Value $adminPubKey -Encoding UTF8

        # Dosya izinlerini ayarlayın
        $adminAcl = Get-Acl $adminAuthKeysPath
        $adminAcl.SetSecurityDescriptorRule(
            (New-Object System.Security.AccessControl.FileSystemAccessRule(
                "Administrators", "FullControl", "None", "None", "Allow"
            ))
        )
        Set-Acl $adminAuthKeysPath $adminAcl
    }
} else {
    Write-Error "Yönetici ortak anahtar dosyası bulunamadı: $adminPublicKeyPath"
    exit 1
}

# SSH hizmetini yeniden başlatın
Write-Host "SSH hizmeti yeniden başlatılıyor..."
Restart-Service sshd