
Я ищу возможность вклиент mysqlтолько для проверки того, относится ли --ssl-mode=REQUIRED
директива к данному--host
гарантировано на 100%, без потенциальной порчи имени пользователя, пароля и имени базы данныхв открытом виде через Интернет. Запуск этого режима с аргументом типа: --ssl--check-handshake-only-then-disconnect-and-report
.
Это касается сценария, когда в отношении вашего веб-хостинга:
- нет надлежащей/доступной/надежной документации о доступности SSL на сервере,
- и/или отсутствие или затрудненный доступ к серверу MySQL и его конфигурационной информации.
После проведенных мною исследований я думаю, что естьнет возможности для 100% безопасного тестового запуска SSL/TLS-рукопожатиякоторыйочевидно, что это безопасно, так как это работает без указания имени пользователя, пароля, имени базы данных.
Документация для--ssl-mode=ОБЯЗАТЕЛЬНОотвечает на этот вопрос очень просто и кратко:
ОБЯЗАТЕЛЬНО: Установите зашифрованное соединение, если сервер поддерживает зашифрованные соединения. Попытка подключения не удается, если зашифрованное соединение не может быть установлено.
Нужно просто довериться клиенту MySQL (он же «оболочка»), что он действительно работает в таком порядке:
- убедитесь, что это
--ssl-mode=REQUIRED
работает в данной ситуации, в противном случае произойдет преждевременный выход с явным сообщением об ошибке. - Только после успешного установления связи и согласования шифрования клиент отправляет указанные имя пользователя, пароль и имя базы данных.
- И что ни один новый разработчик никогда не внесет ошибку именно в это условие проверки...
Этого может быть достаточно для опытных/обычных пользователей, которые знают и доверяют своему клиенту и настройкам MySQL.
Но не является оптимальным вариантом для новых пользователей или скептиков, которым действительно нужна возможность 100%-ной проверки без риска.
По-настоящему «безопасный режим тестирования соединения/рукопожатия», который, очевидно, безопасен, поскольку работает без предоставления каких-либо конкретных учетных данных, был бы весьма обнадеживающим.
- Прежде чем я зарегистрируюсь наhttps://bugs.mysql.comи отправьте запрос на функцию там
- Я спрашиваю, может ли быть такая возможность, о которой я не знаю.
решение1
Если вы просто хотите проверить, выдает ли клиент ошибку, когда не удается установить SSL, то быстрый и грязный способ — объединить эти два способа:
- просто подключитесь с помощью поддельного имени пользователя и пароля
- заставить клиента отказать в ssl-рукопожатии с плохим шифром, например
--ssl-cipher SEED-SHA
Вы всегда должны видеть ошибку "SSL failure", а не "bad password". Попробуйте включить --ssl-mode=REQUIRED
и выключить, чтобы проверить, выдает ли он ошибку или возвращается к открытому тексту.
Если вы хотите проверить, поддерживает ли сервер SSL (и в какой степени), то лучше подойдет что-то вроде nmap. Убедитесь, что у вас обновленная версия nmap, затем используйте что-то вроде этого, чтобы проверить статус SSL, например:
nmap --script ssl-enum-ciphers MyServerName -p 3306
И если ничего другого не поможет, вы всегда можете проверить, что соединения не отправляют учетные данные до SSL, с помощью захвата пакетов / Wireshark, хотя это требует обучения.
Как вы упомянули, это просто, если вы можете работать с тем, кто контролирует сервер, с такими опциями, как:
- использовать аутентификацию на основе сертификатов, чтобы никакие секреты не передавались
- требуется SSL на стороне сервера (который должен быть востребован, если он имеет выход в Интернет)
- управляйте соединениями с помощью VPN или SSH перед подключением к MySql
но это не всегда возможно
Результаты nmap
- Кажется, это подходящий инструмент для работы!
nmap --script ssl-enum-ciphers customerid-mysql.services.mywebhost.com -p 3306
Starting Nmap 7.93 ( https://nmap.org ) at 2022-12-16 01:39 CET
Nmap scan report for customerid-mysql.services.mywebhost.com (XXX.XX.X.XX)
Host is up (0.016s latency).
rDNS record for XXX.XX.X.XX: web20.mywebhost.com
PORT STATE SERVICE
3306/tcp open mysql
| ssl-enum-ciphers:
| TLSv1.2:
| ciphers:
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 (dh 2048) - A
| TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (dh 2048) - A
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 (dh 2048) - A
| TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (dh 2048) - A
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 4096) - A
| TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 4096) - A
| TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 4096) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 4096) - A
| TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 4096) - A
| TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 4096) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| Key exchange (dh 2048) of lower strength than certificate key
| Key exchange (secp256r1) of lower strength than certificate key
|_ least strength: A
Nmap done: 1 IP address (1 host up) scanned in 3.23 seconds
Результаты в mysql
сочетании с --ssl-cipher
и--ssl-mode
$ mysql --ssl-cipher SEED-SHA -h customerID-mysql.services.mywebhost.com -u fakeUser -p --ssl-mode=DISABLED
Enter password:
ERROR 1045 (28000): Access denied for user 'fakeUser'@'XX.XXX.XX.XX' (using password: YES)
- ❌ Сервер принимает открытый текст.
- ✅ Но мы испортили только фиктивные данные.
- ✅ Вреда не нанесено. Установлен максимальный риск.
$ mysql --ssl-cipher SEED-SHA -h customerID-mysql.services.mywebhost.com -u fakeUser -p --ssl-mode=REQUIRED
Enter password:
ERROR 2026 (HY000): SSL connection error: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
- ✅ Сервер завершает работу из-за плохого шифра.
- ℹ️ Из теории мы знаем, что это срабатывает до отправки учетных данных.
- ✅ Так что это достаточно хороший предварительный тест для тех, у кого есть необходимые знания.
$ mysql --ssl-cipher SEED-SHA -h customerID-mysql.services.mywebhost.com -u fakeUser -p --ssl-mode=PREFERRED
Enter password:
ERROR 2026 (HY000): SSL connection error: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
- ✅ Кроме того, когда мы искушаем сервер с помощью PREFERRED, но предоставляем плохой шифр, сервер выбирает безопасный выбор и завершает работу.
- ✅ Ощущение жуткое. Также я не понимаю, почему --ssl-cipher SEED-SHA является плохим шифром и при каких условиях это тестируется.
$ mysql -h customerID-mysql.services.mywebhost.com -u fakeUser -p --ssl-mode=REQUIRED
Enter password:
ERROR 1045 (28000): Access denied for user 'fakeUser'@'77.119.77.94' (using password: YES)
- ❓ Не уверен, как это интерпретировать:
- ❌ Хотя я ТРЕБОВАЛ, чтобы протокол продолжал работать (по крайней мере, отправлял имя пользователя, которое, к счастью, пока только «fakeUser»).
- ❓Но был ли отправлен пароль в этом запросе?