Windows SSH Uzaktan Giriş
Categories:
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
-
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.
-
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
-
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 sshdkomutunu girin. Hizmetin her başlatıldığında otomatik olarak başlamasını istiyorsanız,sc config sshd start= autokomutunu girin.
-
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
-
IP Adresini alın:
- SSH hizmeti etkinleştirilmiş Windows bilgisayara başka bir makineden bağlanmak için IP adresini bilmeniz gerekir. Komut istemine
ipconfigkomutunu girerek bilgisayarınızın IP adresini görebilirsiniz.
- SSH hizmeti etkinleştirilmiş Windows bilgisayara başka bir makineden bağlanmak için IP adresini bilmeniz gerekir. Komut istemine
-
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_adresinizformatını kullanın. Buradakullanıcıadı, Windows hesabınızın adı veip_adresiniz, daha önce bulduğunuz IP adresidir.
- Başka bir bilgisayarda veya mobil cihazda SSH istemcisi (örneğin: PuTTY, Termius vb.) kullanarak Windows PC’nize bağlanmayı deneyin.
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