Вопрос или проблема
У меня есть приложение, работающее на облачном сервере (Windows Server 2019). Мое приложение использует аутентификацию с ключевой парой для загрузки файла на FTP-сайт поставщика через SFTP.
Всё это работает идеально в моей среде разработки, которая представляет собой рабочую станцию Windows 2010 в моей домашней офисной сети. Но это не работает во время аутентификации с ключевой парой, когда работает с моего облачного сервера.
Я убедился, что файлы ключевой пары абсолютно одинаковы в обоих местах. Поставщик не делает никаких белых списков IP-адресов и говорит мне, что они не делают ничего, что могло бы блокировать коммуникации с моего облачного сервера. Похоже, что это что-то в брандмауэре моего облачного сервера блокирует это общение.
Я попросил моего облачного интернет-провайдера о помощи, но они не отвечают, поэтому, похоже, мне нужно самому найти решение. Есть ли журналы событий Windows, которые помогут мне увидеть, что блокирует это общение?
Grawity спросил, какие библиотеки я использую. Моё приложение – это приложение Visual FoxPro 9 SP2. Я использую библиотеку Chilkat Chilkat_9_5_0.SFtp
для выполнения этой операции. Я не получаю ошибок в соединении, независимо от того, делаю ли я это из разработки или с моего облачного сервера. Библиотека Chilkat создает журнал, когда я пытаюсь пройти аутентификацию. Вот журнал из разработки (успешно):
ChilkatLog:
AuthenticatePk_sftp(609ms):
DllDate: Jun 28 2024
ChilkatVersion: 9.5.0.99
UnlockPrefix: MYUNLOCKCODE
UnlockStatus: 2
Architecture: Little Endian; 32-bit
Language: ActiveX
VerboseLogging: 1
sshServerVersion: SSH-2.0-OpenSSH_8.4
hostname: destinationurl.com
port: 22
serverVersion: SSH-2.0-OpenSSH_8.4
login: myuserid
idleTimeoutMs: 15000
sshAuthenticatePk2(609ms):
keyFingerprint: ssh-ed25519 cb:2c:32:52:18:b0:7c:58:e9:05:08:3c:a9:91:00:2a
requestUserAuthService(187ms):
sendServiceRequest:
svcName: ssh-userauth
SentServiceReq: ssh-userauth
--sendServiceRequest
ssh-userauth service accepted.
--requestUserAuthService
Using an Ed25519 key.
dbPkBlob_qp: [=00=00=00=0Bssh-ed25519=00=00=00 =E2=12lWP~=A0o=93=C8=FB=16U=FD,=F6=FD=0E=8B=95=F8=9B=0D=A8=DE=CA=97=01=C8=10=16=DA]
Sent public-key request.
OK to proceed with publickey authentication.
hashSignPkAuth:
Success.
--hashSignPkAuth
Sent public-key request with signature.
Public-key authentication succeeded.
--sshAuthenticatePk2
Success.
--AuthenticatePk_sftp
--ChilkatLog
А вот журнал с облачного сервера (не успешно):
ChilkatLog:
AuthenticatePk_sftp(125ms):
DllDate: Jun 28 2024
ChilkatVersion: 9.5.0.99
UnlockPrefix: MYUNLOCKCODE
UnlockStatus: 2
Architecture: Little Endian; 32-bit
Language: ActiveX
VerboseLogging: 1
sshServerVersion: SSH-2.0-OpenSSH_8.4
hostname: destinationurl.com
port: 22
serverVersion: SSH-2.0-OpenSSH_8.4
login: myuserid
idleTimeoutMs: 15000
sshAuthenticatePk2(125ms):
keyFingerprint: ssh-ed25519 cb:2c:32:52:18:b0:7c:58:e9:05:08:3c:a9:91:00:2a
requestUserAuthService(47ms):
sendServiceRequest:
svcName: ssh-userauth
SentServiceReq: ssh-userauth
--sendServiceRequest
ssh-userauth service accepted.
--requestUserAuthService
Using an Ed25519 key.
dbPkBlob_qp: [=00=00=00=0Bssh-ed25519=00=00=00 =E2=12lWP~=A0o=93=C8=FB=16U=FD,=F6=FD=0E=8B=95=F8=9B=0D=A8=DE=CA=97=01=C8=10=16=DA]
Sent public-key request.
AuthList: publickey,keyboard-interactive
Proceeding with publickey authentication...
hashSignPkAuth:
Success.
--hashSignPkAuth
Sent public-key request with signature.
hostKeyAlg: 4
Authentication failed or partial success. (4)
PartialSuccess4: 0
When partial success is 0, it means you are not using the correct private key that corresponds to the public key installed in the SSH user account.
Also, to force Chilkat to continue with password authentication even if the public-key authentication fails, set UncommonOptions = "PubkeyOrPassword".
AuthList: publickey,keyboard-interactive
Publickey authentication failed..
--sshAuthenticatePk2
Failed.
--AuthenticatePk_sftp
--ChilkatLog
Ответ или решение
Вопрос о настройках брандмауэра Windows Server 2019, которые могут блокировать аутентификацию по паре ключей, предполагает комплексный анализ серверной конфигурации и сетевых настроек. Ваша ситуация с неудачным подключением из облачного сервера по сравнению с успешным подключением из локальной рабочей станции подсказывает, что проблема может быть связана с серверной инфраструктурой, и среди возможных причин можно выделить настройки брандмауэра и сетевых политик.
Теория
Брандмауэр Windows может блокировать сетевой трафик по определённым портам или протоколам, что часто происходит по умолчанию для обеспечения безопасности сервера. SFTP использует протокол SSH и по умолчанию работает на порту 22. Если этот порт не открыт или если есть правила, блокирующие исходящие или входящие соединения по этому протоколу, это может стать причиной проблемы.
Пример
Произошел случай, когда клиент не мог подключиться к внешнему SFTP ресурсу из-за того, что на их сервере, хотя и были загружены корректные пары ключей, брандмауэр блокировал исходящий трафик на порт 22. После настройки брандмауэра для разрешения такого трафика, проблема была решена.
Применение
Следуя этой логике, давайте разберем шаги, которые вы могли бы предпринять для диагностики и решения вашей проблемы:
-
Проверка журнала событий Windows
Windows Server предоставляет журнал событий, который может содержать информацию о блокированных соединениях, проблемах с аутентификацией и других сетевых аномалиях. Для этого откройте средство просмотра событий (Event Viewer), найдите раздел системных и сетевых журналов, и проверьте, не появляются ли там сообщения об отказе в сетевом доступе. -
Конфигурация брандмауэра
Чтобы убедиться, что брандмауэр не блокирует ваш трафик:- Перейдите в панель «Настройка брандмауэра Windows Defender с расширенной безопасностью».
- В разделе «Правила для входящих подключений» и «Правила для исходящих подключений» найдите или создайте правило для разрешения трафика по порту 22. Обратите особое внимание на тип протокола — должен быть TCP.
- Убедитесь, что для правила выбрано действие «Разрешить».
-
Диагностика с использованием PowerShell
Вы можете использовать PowerShell для проверки открытых портов:Test-NetConnection -ComputerName destinationurl.com -Port 22
Если тест показывает, что порт недоступен, это подтверждает, что в проблеме участвует сетевой фильтр на уровне вашего сервера или сети провайдера.
-
Консоль управления межсетевым экраном
Убедитесь, что ваш сервер не участвует в корректировке сетевых конфигураций на уровне межсетевого экрана, которые могут быть настроены вашим облачным провайдером. Рекомендуется проконсультироваться с их технической поддержкой, предоставить все имеющиеся логи и явно указать на вашу проблему. -
Проверка SSH и SFTP настроек
Поскольку в логах указано, что аутентификация частично не удалась, убедитесь, что используемые ключи соответствуют тем, которые ожидает сервер. Эта проблема могла бы также указывать на то, что доступ к локальному хранилищу ключей ограничен. -
Настройка Chilkat
Учитывая, что вы используете библиотеку Chilkat, убедитесь, что все параметры аутентификации и соединения настроены идентично тем, которые успешно используются на рабочей станции. Проверьте, нет ли различных переменных окружения между облачным сервером и локальной машиной, которые могут влиять на поведение библиотеки.
В заключение, если проблема сохраняется и внутренняя диагностика не дала результата, требуется дальнейшая консультация со специалистами безопасности вашего облачного провайдера и, возможно, привлечение внешней технической поддержки для глубинного анализа серверных и сетевых настроек. Любое изменение настроек должно быть осуществлено с тщательной проверкой, чтобы избежать потенциальных уязвимостей или нарушения рабочего процесса.