주어진 --host에 대해 --ssl-mode=REQUIRED를 사용하여 mysql 쉘이 사용자 이름, 비밀번호, 데이터베이스 이름을 먼저 제공하지 않고도 실제로 작동하는지 테스트합니까?

주어진 --host에 대해 --ssl-mode=REQUIRED를 사용하여 mysql 쉘이 사용자 이름, 비밀번호, 데이터베이스 이름을 먼저 제공하지 않고도 실제로 작동하는지 테스트합니까?

나는 그 안에서 가능성을 찾고 있다.MySQL 클라이언트--ssl-mode=REQUIRED주어진 지시문 이 맞는지 여부만 테스트합니다.--host 사용자 이름, 비밀번호 및 데이터베이스 이름을 잠재적으로 손상시키지 않고 100% 보장됩니다.인터넷을 통해 일반 텍스트로. 다음과 같은 인수를 사용하여 해당 모드를 실행합니다 --ssl--check-handshake-only-then-disconnect-and-report.

이는 웹호스트와 관련하여 다음과 같은 시나리오에 대한 것입니다.

  • 서버의 SSL 가용성에 대한 적절한/사용 가능/신뢰할 수 있는 문서가 없습니다.
  • 및/또는 mysql 서버 및 해당 구성 정보에 대한 복잡한 액세스가 없거나 복잡한 액세스만 가능합니다.

지금까지 조사한 결과 다음과 같은 것이 있다고 생각합니다.100% 위험 없는 SSL/TLS 핸드셰이크 테스트 실행 가능성 없음이는사용자 이름, 비밀번호, 데이터베이스 이름을 제공하지 않고도 작동하므로 위험이 없습니다..

에 대한 문서--ssl-모드=필수이 문제를 매우 간단하고 간략하게 설명합니다.

필수: 서버가 암호화된 연결을 지원하는 경우 암호화된 연결을 설정합니다. 암호화된 연결을 설정할 수 없으면 연결 시도가 실패합니다.

실제로는 다음 순서로 작동하는 mysql 클라이언트(일명 "쉘")를 신뢰해야 합니다.

  1. --ssl-mode=REQUIRED주어진 상황에서 작동하는지 확인하세요 . 그렇지 않으면 명시적인 오류 메시지와 함께 조기에 종료됩니다.
  2. 핸드셰이크와 암호화 협상이 제대로 진행된 경우에만 클라이언트는 제공된 사용자 이름, 비밀번호, 데이터베이스 이름을 제출합니다.
  3. 그리고 새로운 개발자는 그 조건 확인에서 정확히 버그를 도입하지 않을 것입니다...
  • 이는 mysql 클라이언트와 설정을 알고 신뢰하는 정통하고 일상적인 사용자에게는 충분할 수 있습니다.

  • 그러나 100% 위험 없는 검사 가능성이 정말로 필요한 신규 사용자나 회의론자에게는 차선책입니다.

구체적인 자격 증명을 제출하지 않고도 작동하기 때문에 확실히 위험이 없는 진정한 "위험 없는 연결/핸드셰이크 테스트 모드"는 매우 안심할 수 있습니다.

  • 에 등록하기 전에https://bugs.mysql.com거기에 기능 요청을 제출하세요.
  • 제가 모르는 가능성이 있는지 여기에 물어봅니다.

답변1

SSL을 설정할 수 없을 때 클라이언트에서 오류가 발생하는지 테스트하려는 경우 빠르고 지저분한 방법은 다음 두 가지를 결합하는 것입니다.

  • 가짜 사용자 이름과 비밀번호로 연결하세요
  • 클라이언트가 다음과 같은 잘못된 암호로 SSL 핸드셰이크를 실패하도록 강제합니다.--ssl-cipher SEED-SHA

"잘못된 비밀번호"가 아닌 "SSL 실패"에 대한 오류가 항상 표시되어야 합니다. --ssl-mode=REQUIRED오류가 발생하는지 아니면 일반 텍스트로 돌아가는지 확인하려면 켜기와 끄기를 시도해 보세요 .


서버가 SSL을 어느 정도 지원하는지 확인하려면 nmap과 같은 것이 더 나을 것입니다. nmap의 업데이트된 버전이 있는지 확인한 후 다음과 같은 방법을 사용하여 SSL 상태를 확인하세요.

nmap --script ssl-enum-ciphers MyServerName -p 3306

그리고 다른 것이 없다면 학습 곡선이 있지만 패킷 캡처/wireshark를 사용하여 SSL 이전에 연결이 자격 증명을 보내지 않는지 항상 확인할 수 있습니다.


언급한 것처럼 다음과 같은 옵션을 사용하여 서버를 제어하는 ​​사람과 작업할 수 있다면 이는 간단합니다.

  • 인증서 기반 인증을 사용하므로 비밀이 전송되지 않습니다.
  • 서버 측에 SSL이 필요합니다(인터넷 연결인 경우 요구되어야 함).
  • MySql에 연결하기 전에 VPN 또는 SSH를 통한 연결 제어

하지만 항상 가능한 것은 아니다


결과 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)
  • ❓ 이것을 어떻게 해석해야 할지 잘 모르겠습니다:
  • ❌ REQUIRED에도 불구하고 프로토콜은 계속됩니다(적어도 사용자 이름을 제출하는데 다행히도 아직 'fakeUser'일 뿐입니다.
  • ❓그런데 이 요청에도 비밀번호가 전송되었나요?

관련 정보