Estou tentando entender o funcionamento do SSL ao tentar me conectar a um servidor MySQL (via mysql-connector-python). Tenho MySQL (v5.7) e tenho 2 usuários. Um (root) é o usuário padrão e o outro usuário (ssl_user) tem a opção REQUIRE SSL habilitada. Se eu tentar me conectar ao ssl_user com a seguinte configuração, recebo um erro dizendo que ssl_user não tem acesso.
mysql_conf = {
'host': '127.0.0.1',
'port': '3306',
'user': 'root',
'password': '',
'ssl_disabled': True #Default value is False
}
conn = mysql.connector.connect(**mysql_conf)
Consigo me conectar ao MySQL se alterar o valor como 'ssl_disabled': False para o usuário específico.
Estou me conectando ao servidor mysql por meio do meu aplicativo flask. O que exatamente acontece ao me conectar por meio deste usuário criado com Require SSL? isso significa que a conexão deste usuário está criptografada? em caso afirmativo, onde acontece a criptografia?
Não consigo entender qual é exatamente a diferença entre conexão via 'ssl_disabled': False e conexão fornecendo certificados SSL?
O conector Python prefere usar SSL por padrão ou, se você definir
ssl_disabled=False
.Infelizmente, isso é um duplo negativo. Significa que você não desabilitou o SSL, portanto ele está habilitado. Teria ficado mais claro se eles tivessem seguido a convenção de outros clientes MySQL que usam
ssl-mode
, definido como 'DISABLED', 'PREFERRED', 'REQUIRED', 'VERIFY_CA', 'VERIFY_IDENTITY'.Os usuários do MySQL, por padrão, podem se conectar via TCP com uma conexão SSL criptografada ou uma conexão não criptografada. Ao definir seu usuário com
REQUIRE SSL
, o usuário não poderá se conectar se o SSL não estiver ativado.A criptografia acontece na biblioteca cliente MySQL, que o conector Python chama. É aí que o protocolo MySQL é implementado. Muitos outros clientes usam a mesma biblioteca cliente MySQL, como clientes Ruby, PHP, Perl ou C++.
Posso testar um usuário semelhante ao seu com o cliente de linha de comando MySQL, que também usa a mesma biblioteca cliente.
Criei meu usuário:
Então, em outra janela, tentei conectar-me a partir de um prompt do shell:
Isso é o esperado. Se o usuário estiver definido para exigir SSL e o cliente tentar se conectar com o SSL desativado, esse usuário não poderá se conectar.
O status informa que a sessão atual está usando SSL, nomeando a cifra em uso. Se eu não estivesse conectado via SSL, diria "Não em uso" para a cifra SSL.
Os certificados são opcionais. Os certificados são para autenticação segura. Você pode usar uma conexão SSL para criptografar os pacotes, sem usar certificados. Existem opções separadas na instrução MySQL CREATE USER para exigir que um usuário seja autenticado com um certificado, mas a maioria das pessoas não se preocupa com isso. Trabalhei em uma empresa onde usamos certificados em vez de senhas para usuários do MySQL. Isso era muito seguro, mas exigia que a empresa tivesse sua própria autoridade de certificação (CA) para criar um certificado exclusivo para cada usuário do MySQL (eles usavam certificados para muitas coisas dentro da empresa, não apenas para o MySQL).