Windows SSH удаленный доступ
Categories:
Включение удаленного доступа по SSH в Windows обычно требует использования функции OpenSSH Windows. Ниже приведены подробные шаги:
Проверка и установка OpenSSH
-
Проверка установленного OpenSSH:
- Откройте «Настройки» > «Приложения» > «Приложения и функции» > «Управление дополнительными функциями».
- В списке установленных функций найдите «OpenSSH-сервер». Если он присутствует, значит он уже установлен.
-
Установка OpenSSH:
- Если вы не нашли OpenSSH-сервер, вы можете перейти на страницу «Управление дополнительными функциями», нажать «Добавить функцию» и в списке найти «OpenSSH-сервер», затем нажать «Установить».
Запуск и настройка службы OpenSSH
-
Запуск службы OpenSSH:
- После установки откройте командную строку (от имени администратора).
- Введите
net start sshd, чтобы запустить службу OpenSSH. Чтобы служба автоматически запускалась при каждой загрузке системы, введитеsc config sshd start= auto.
-
Настройка брандмауэра:
- Убедитесь, что брандмауэр Windows разрешает подключения SSH. Это можно сделать через «Панель управления» > «Система и безопасность» > «Брандмауэр Защитника Windows» > «Расширенные настройки», затем создайте новое правило для входящих подключений, разрешающее подключения по TCP-порту 22.
Получение IP-адреса и тестирование подключения
-
Получение IP-адреса:
- Чтобы подключиться к компьютеру Windows с другой машины, на которой включен SSH, вам нужно знать его IP-адрес. IP-адрес можно посмотреть в командной строке с помощью команды
ipconfig.
- Чтобы подключиться к компьютеру Windows с другой машины, на которой включен SSH, вам нужно знать его IP-адрес. IP-адрес можно посмотреть в командной строке с помощью команды
-
Тестирование подключения:
- На другом компьютере или мобильном устройстве используйте SSH-клиент (например: PuTTY, Termius и т.д.), чтобы попытаться подключиться к вашему компьютеру Windows, используя формат
ssh имя_пользователя@IP_адрес. Здесьимя_пользователя— это имя учетной записи Windows, к которой вы хотите войти, аIP_адрес— это IP-адрес, который вы получили ранее.
- На другом компьютере или мобильном устройстве используйте SSH-клиент (например: PuTTY, Termius и т.д.), чтобы попытаться подключиться к вашему компьютеру Windows, используя формат
Изменение конфигурации
Важно избегать входа по паролю — это абсолютно запрещено. Обязательно используйте для входа открытый ключ. Нам нужно изменить настройки, отключить вход по паролю и разрешить вход по открытому ключу.
Этот файл конфигурации неудобно редактировать, для этого требуются специальные права, а также необходимо обеспечить определенные права доступа к папке и файлу. Рекомендуется использовать скрипт для внесения изменений.
# Проверка прав администратора
$elevated = [bool]([System.Security.Principal.WindowsPrincipal]::new(
[System.Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))
if (-not $elevated) {
Write-Error "Запустите этот скрипт от имени администратора"
exit 1
}
# 1. Проверка и установка OpenSSH-сервера
Write-Host "Проверка установки OpenSSH-сервера..."
$capability = Get-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
if ($capability.State -ne 'Installed') {
Write-Host "Установка OpenSSH-сервера..."
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 | Out-Null
}
# 2. Запуск и настройка автоматического запуска службы SSH
Write-Host "Настройка службы SSH..."
$service = Get-Service sshd -ErrorAction SilentlyContinue
if (-not $service) {
Write-Error "Установка службы OpenSSH не удалась"
exit 1
}
if ($service.Status -ne 'Running') {
Start-Service sshd
}
Set-Service sshd -StartupType Automatic
# 3. Изменение конфигурационного файла
$configPath = "C:\ProgramData\ssh\sshd_config"
if (Test-Path $configPath) {
Write-Host "Резервное копирование исходного конфигурационного файла..."
Copy-Item $configPath "$configPath.bak" -Force
} else {
Write-Error "Конфигурационный файл не найден: $configPath"
exit 1
}
Write-Host "Изменение конфигурации SSH..."
$config = Get-Content -Path $configPath -Raw
# Включение аутентификации по открытому ключу и отключение входа по паролю
$config = $config -replace '^#?PubkeyAuthentication .*$','PubkeyAuthentication yes' `
-replace '^#?PasswordAuthentication .*$','PasswordAuthentication no'
# Обеспечение наличия необходимых настроек
if ($config -notmatch 'PubkeyAuthentication') {
$config += "`nPubkeyAuthentication yes"
}
if ($config -notmatch 'PasswordAuthentication') {
$config += "`nPasswordAuthentication no"
}
# Запись конфигурации обратно в файл
$config | Set-Content -Path $configPath -Encoding UTF8
Подтверждение прав доступа к файлу authorized_keys
# обычный пользователь
$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"
# администратор
$adminAuth = "C:\ProgramData\ssh\administrators_authorized_keys"
icacls $adminAuth /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
Настройка правил брандмауэра
# Разрешение порта SSH
New-NetFirewallRule -DisplayName "OpenSSH Server (sshd)" -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
Добавление открытого ключа
Обычный пользователь
# обычный пользователь
$userProfile = $env:USERPROFILE
$sshDir = Join-Path $userProfile ".ssh"
$authorizedKeysPath = Join-Path $sshDir "authorized_keys"
$PublicKeyPath = "D:\public_keys\id_rsa.pub"
# Создание каталога .ssh
if (-not (Test-Path $sshDir)) {
New-Item -ItemType Directory -Path $sshDir | Out-Null
}
# Установка прав доступа к каталогу .ssh
$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
# Добавление открытого ключа
if (Test-Path $PublicKeyPath) {
$pubKey = Get-Content -Path $PublicKeyPath -Raw
if ($pubKey) {
# Обеспечение наличия символа переноса строки в конце открытого ключа
if (-not $pubKey.EndsWith("`n")) {
$pubKey += "`n"
}
# Добавление открытого ключа
Add-Content -Path $authorizedKeysPath -Value $pubKey -Encoding UTF8
# Установка прав доступа к файлу
$acl = Get-Acl $authorizedKeysPath
$acl.SetSecurityDescriptorRule(
(New-Object System.Security.AccessControl.FileSystemAccessRule(
$currentUser, "FullControl", "None", "None", "Allow"
))
)
Set-Acl $authorizedKeysPath $acl
}
} else {
Write-Error "Файл открытого ключа не существует: $PublicKeyPath"
exit 1
}
# Перезапуск службы SSH
Write-Host "Перезапуск службы SSH..."
Restart-Service sshd
Администратор
# администратор
$adminSshDir = "C:\ProgramData\ssh"
$adminAuthKeysPath = Join-Path $adminSshDir "administrators_authorized_keys"
$adminPublicKeyPath = "D:\public_keys\id_rsa.pub"
# Создание каталога SSH для администратора
if (-not (Test-Path $adminSshDir)) {
New-Item -ItemType Directory -Path $adminSshDir | Out-Null
}
# Установка прав доступа к каталогу SSH администратора
$adminAcl = Get-Acl $adminSshDir
$adminRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
"Administrators", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
)
$adminAcl.AddAccessRule($adminRule)
Set-Acl $adminSshDir $adminAcl
# Добавление открытого ключа администратора
if (Test-Path $adminPublicKeyPath) {
$adminPubKey = Get-Content -Path $adminPublicKeyPath -Raw
if ($adminPubKey) {
# Обеспечение наличия символа переноса строки в конце открытого ключа
if (-not $adminPubKey.EndsWith("`n")) {
$adminPubKey += "`n"
}
# Добавление открытого ключа
Add-Content -Path $adminAuthKeysPath -Value $adminPubKey -Encoding UTF8
# Установка прав доступа к файлу
$adminAcl = Get-Acl $adminAuthKeysPath
$adminAcl.SetSecurityDescriptorRule(
(New-Object System.Security.AccessControl.FileSystemAccessRule(
"Administrators", "FullControl", "None", "None", "Allow"
))
)
Set-Acl $adminAuthKeysPath $adminAcl
}
} else {
Write-Error "Файл открытого ключа администратора не существует: $adminPublicKeyPath"
exit 1
}
# Перезапуск службы SSH
Write-Host "Перезапуск службы SSH..."
Restart-Service sshd