Windows SSH-Fernzugriff
Categories:
Die Einrichtung von SSH-Fernzugriff unter Windows erfolgt normalerweise mithilfe der OpenSSH-Funktion von Windows. Im Folgenden sind die detaillierten Schritte aufgeführt:
Überprüfen und Installieren von OpenSSH
-
Überprüfen, ob OpenSSH installiert ist:
- Öffnen Sie „Einstellungen“ > „Apps“ > „Apps und Features“ > „Optionale Features verwalten“.
- Suchen Sie in der Liste der installierten Funktionen nach „OpenSSH-Server“. Wenn dieser vorhanden ist, bedeutet dies, dass er bereits installiert wurde.
-
OpenSSH installieren:
- Wenn Sie den OpenSSH-Server nicht finden, können Sie auf der Seite „Optionale Features verwalten“ auf „Feature hinzufügen“ klicken und in der Liste nach „OpenSSH-Server“ suchen und anschließend auf „Installieren“ klicken.
Starten und Konfigurieren des OpenSSH-Dienstes
-
OpenSSH-Dienst starten:
- Starten Sie nach der Installation die Eingabeaufforderung mit Administratorrechten.
- Geben Sie
net start sshdein, um den OpenSSH-Dienst zu starten. Wenn der Dienst beim Systemstart automatisch gestartet werden soll, geben Siesc config sshd start= autoein.
-
Firewall konfigurieren:
- Stellen Sie sicher, dass die Windows-Firewall SSH-Verbindungen zulässt. Öffnen Sie dazu „Systemsteuerung“ > „System und Sicherheit“ > „Windows Defender Firewall“ > „Erweiterte Einstellungen“, erstellen Sie eine neue eingehende Regel und erlauben Sie Verbindungen für TCP-Port 22.
IP-Adresse abrufen und Verbindung testen
-
IP-Adresse abrufen:
- Um von einem anderen Gerät aus eine Verbindung zu dem Windows-PC herzustellen, auf dem der SSH-Dienst aktiviert wurde, benötigen Sie dessen IP-Adresse. Sie können die IP-Adresse des lokalen PCs über die Eingabeaufforderung mit dem Befehl
ipconfigabrufen.
- Um von einem anderen Gerät aus eine Verbindung zu dem Windows-PC herzustellen, auf dem der SSH-Dienst aktiviert wurde, benötigen Sie dessen IP-Adresse. Sie können die IP-Adresse des lokalen PCs über die Eingabeaufforderung mit dem Befehl
-
Verbindung testen:
- Verwenden Sie auf einem anderen PC oder mobilen Gerät einen SSH-Client (z. B. PuTTY, Termius usw.), um eine Verbindung zu Ihrem Windows-PC herzustellen, und verwenden Sie das Format
ssh benutzername@ihre_ip-adresse. Dabei istbenutzernameder Windows-Benutzername, mit dem Sie sich anmelden möchten, undihre_ip-adressedie zuvor ermittelte IP-Adresse.
- Verwenden Sie auf einem anderen PC oder mobilen Gerät einen SSH-Client (z. B. PuTTY, Termius usw.), um eine Verbindung zu Ihrem Windows-PC herzustellen, und verwenden Sie das Format
Konfiguration ändern
Achten Sie darauf, die Verwendung von Passwortanmeldungen zu vermeiden. Dies ist ein absolutes No-Go. Verwenden Sie unbedingt die Anmeldung per Public-Key. Wir müssen die Einstellungen ändern, um die Passwortanmeldung zu deaktivieren und die Public-Key-Anmeldung zu erlauben.
Die Änderung dieser Konfigurationsdatei ist nicht einfach, da besondere Berechtigungen erforderlich sind und außerdem sichergestellt werden muss, dass die Berechtigungen für das Verzeichnis und die Datei auf bestimmte Werte gesetzt sind. Hier wird empfohlen, ein Skript für die Änderung zu verwenden.
# Überprüfen der Administratorrechte
$elevated = [bool]([System.Security.Principal.WindowsPrincipal]::new(
[System.Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))
if (-not $elevated) {
Write-Error "Bitte führen Sie dieses Skript mit Administratorrechten aus"
exit 1
}
# 1. Überprüfen und Installieren des OpenSSH-Servers
Write-Host "Überprüfe den Installationsstatus des OpenSSH-Servers..."
$capability = Get-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
if ($capability.State -ne 'Installed') {
Write-Host "Installiere den OpenSSH-Server..."
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 | Out-Null
}
# 2. Starten und Konfigurieren des SSH-Dienstes für den automatischen Start beim Systemstart
Write-Host "Konfiguriere den SSH-Dienst..."
$service = Get-Service sshd -ErrorAction SilentlyContinue
if (-not $service) {
Write-Error "OpenSSH-Dienst konnte nicht installiert werden"
exit 1
}
if ($service.Status -ne 'Running') {
Start-Service sshd
}
Set-Service sshd -StartupType Automatic
# 3. Konfigurationsdatei ändern
$configPath = "C:\ProgramData\ssh\sshd_config"
if (Test-Path $configPath) {
Write-Host "Erstelle eine Sicherung der ursprünglichen Konfigurationsdatei..."
Copy-Item $configPath "$configPath.bak" -Force
} else {
Write-Error "Konfigurationsdatei nicht gefunden: $configPath"
exit 1
}
Write-Host "Ändere die SSH-Konfiguration..."
$config = Get-Content -Path $configPath -Raw
# Public-Key-Authentifizierung aktivieren und Passwortanmeldung deaktivieren
$config = $config -replace '^#?PubkeyAuthentication .*$','PubkeyAuthentication yes' `
-replace '^#?PasswordAuthentication .*$','PasswordAuthentication no'
# Stellen Sie sicher, dass die erforderlichen Konfigurationen enthalten sind
if ($config -notmatch 'PubkeyAuthentication') {
$config += "`nPubkeyAuthentication yes"
}
if ($config -notmatch 'PasswordAuthentication') {
$config += "`nPasswordAuthentication no"
}
# Konfiguration in die Datei schreiben
$config | Set-Content -Path $configPath -Encoding UTF8
Überprüfung der Berechtigungen für die authorized_keys-Datei
# normaler Benutzer
$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"
# Administrator
$adminAuth = "C:\ProgramData\ssh\administrators_authorized_keys"
icacls $adminAuth /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
Firewall-Regeln einrichten
# SSH-Port freigeben
New-NetFirewallRule -DisplayName "OpenSSH Server (sshd)" -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
Public-Key hinzufügen
Normaler Benutzer
# normaler Benutzer
$userProfile = $env:USERPROFILE
$sshDir = Join-Path $userProfile ".ssh"
$authorizedKeysPath = Join-Path $sshDir "authorized_keys"
$PublicKeyPath = "D:\public_keys\id_rsa.pub"
# .ssh-Verzeichnis erstellen
if (-not (Test-Path $sshDir)) {
New-Item -ItemType Directory -Path $sshDir | Out-Null
}
# .ssh-Verzeichnisberechtigungen festlegen
$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
# Public-Key hinzufügen
if (Test-Path $PublicKeyPath) {
$pubKey = Get-Content -Path $PublicKeyPath -Raw
if ($pubKey) {
# Stellen Sie sicher, dass der Public-Key am Ende einen Zeilenumbruch hat
if (-not $pubKey.EndsWith("`n")) {
$pubKey += "`n"
}
# Public-Key anhängen
Add-Content -Path $authorizedKeysPath -Value $pubKey -Encoding UTF8
# Dateiberechtigungen festlegen
$acl = Get-Acl $authorizedKeysPath
$acl.SetSecurityDescriptorRule(
(New-Object System.Security.AccessControl.FileSystemAccessRule(
$currentUser, "FullControl", "None", "None", "Allow"
))
)
Set-Acl $authorizedKeysPath $acl
}
} else {
Write-Error "Public-Key-Datei existiert nicht: $PublicKeyPath"
exit 1
}
# SSH-Dienst neu starten
Write-Host "Starte den SSH-Dienst neu..."
Restart-Service sshd
Administrator
# Administrator
$adminSshDir = "C:\ProgramData\ssh"
$adminAuthKeysPath = Join-Path $adminSshDir "administrators_authorized_keys"
$adminPublicKeyPath = "D:\public_keys\id_rsa.pub"
# Administrator-SSH-Verzeichnis erstellen
if (-not (Test-Path $adminSshDir)) {
New-Item -ItemType Directory -Path $adminSshDir | Out-Null
}
# Administrator-SSH-Verzeichnisberechtigungen festlegen
$adminAcl = Get-Acl $adminSshDir
$adminRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
"Administrators", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
)
$adminAcl.AddAccessRule($adminRule)
Set-Acl $adminSshDir $adminAcl
# Administrator-Public-Key hinzufügen
if (Test-Path $adminPublicKeyPath) {
$adminPubKey = Get-Content -Path $adminPublicKeyPath -Raw
if ($adminPubKey) {
# Stellen Sie sicher, dass der Public-Key am Ende einen Zeilenumbruch hat
if (-not $adminPubKey.EndsWith("`n")) {
$adminPubKey += "`n"
}
# Public-Key anhängen
Add-Content -Path $adminAuthKeysPath -Value $adminPubKey -Encoding UTF8
# Dateiberechtigungen festlegen
$adminAcl = Get-Acl $adminAuthKeysPath
$adminAcl.SetSecurityDescriptorRule(
(New-Object System.Security.AccessControl.FileSystemAccessRule(
"Administrators", "FullControl", "None", "None", "Allow"
))
)
Set-Acl $adminAuthKeysPath $adminAcl
}
} else {
Write-Error "Administrator-Public-Key-Datei existiert nicht: $adminPublicKeyPath"
exit 1
}
# SSH-Dienst neu starten
Write-Host "Starte den SSH-Dienst neu..."
Restart-Service sshd