Para superar esse risco, o MySQL suporta criptografia em trânsito entre o cliente e o servidor via protocolo TLS/SSL. O artigo se concentra na geração manual de certificados SSL e arquivos de chaves no MySQL para configurar o SSL. Posteriormente, o artigo também se concentra em ativar os requisitos de criptografia obrigatória de clientes.
Começando
Versões MySQL 5.7.28+ fornece uma ferramenta útil conhecida como mysql_ssl_rsa_setup, que depende de binários OpenSSL para gerar automaticamente os certificados e chaves SSL necessários para suportar uma conexão segura.
Portanto, antes de começar, verifique o status de conexão SSL padrão do servidor MySQL. Digite o seguinte comando para verificar o valor da sessão SSL:
MySQL> mostram variáveis globais como '%ssl%';A saída acima mostra que o MySQL não suporta criptografia em trânsito para a sessão atual.
Use OpenSSL para criar certificado SSL e chaves
Para fornecer criptografia em trânsito, o MySQL requer certificados X509 do lado do cliente e do servidor assinados pela autoridade de certificação para validar a propriedade do domínio. Geraremos certificados autoassinados, bem como certificados de servidor e do lado do cliente via Utilitário de linha de comando OpenSSL. É uma ferramenta de biblioteca OpenSSL que gera chaves privadas, cria solicitações de certificado x509, assina como CA e as verifica.
Antes de começar, crie um diretório para armazenar todos os arquivos:
ubuntu@ubuntu: ~ $ mkdir/var/lib/mysql/transit
ubuntu@ubuntu: ~ $ cd/var/lib/mysql/trânsito
O seguinte conjunto de comandos gerará vários avisos que devem ter respostas não vazias.
Chave da autoridade de certificado e geração de certificação
Criar um certificado autoassinado requer um certificado de autoridade de certificado (CA) por meio de um arquivo de chave privado. Use o comando OpenSSL para gerar chave privada RSA 2048 bits para a CA.
ubuntu@ubuntu: ~ $ openssl genrsa 2048> Ca-key.PEM
Use a tecla acima com um comando OpenSSL Req para gerar um certificado para sua própria CA com expiração de 3000 dias.
ubuntu@ubuntu: ~ $ openssl req -New -x509 -Nodes -Days 3000 -Key Ca -Key.PEM -OUT CA.PEM
Os comandos acima criam novos arquivos Ca-key.PEM e CA.PEM para se auto-indexar os certificados x509 do servidor e cliente MySQL.
Gerar o certificado de chave privada e autoassinada para o MySQL Server
Use o OpenSSL para gerar a chave de chave RSA do MySQL Server e a solicitação de assinatura de certificado (RSE):
ubuntu@ubuntu: ~ $ openssl genrsa 2048> key servidor.PEM
ubuntu@ubuntu: ~ $ openssl req -new -key server -key.PEM -out server -req.PEM
Agora, remova a senha da chave do servidor:
ubuntu@ubuntu: ~ $ openssl rsa -in servidor -chave.Pem -out servidor -chave.PEM
Gere o certificado autoassinado do MySQL Server a partir da solicitação de certificado usando a chave privada da CA e o certificado.
ubuntu@ubuntu: ~ $ openSSL x509 -req -in server -req.PEM -Daier 3600 -ca CA.PEM -Cakey Ca -key.PEM -set_serial 01 -Out Server -Cert.PEM
Agora, a configuração SSL para MySQL não requer CSR.
Gerar a chave do cliente e o certificado autoassinado
Da mesma forma, gerar a solicitação de chave e certificado para o cliente.
ubuntu@ubuntu: ~ $ openssl req -NewKey RSA: 2048 -Days 3600 -Nodes -Keyout Chave cliente.PEM -OUT Client -Req.PEM
Remova a senha da chave e gere um certificado de cliente a partir da solicitação de certificado usando os arquivos CA.
ubuntu@ubuntu: ~.PEM -out Client -key.PEM
ubuntu@ubuntu: ~ $ OpenSSL x509 -req -in client -req.PEM -Daier 365000 -ca CA.PEM -Cakey Ca -key.PEM -set_serial 01 -Cert de cliente.PEM
O servidor aceitará apenas conexões remotas dos clientes com esses arquivos.
Por fim, verifique o cliente e os certificados do lado do servidor contra o certificado da CA.
ubuntu@ubuntu: ~ $ openssl verify -cafile ca.PEM Server-Cert.PEM Client-Cert.PEM
servidor-cert.PEM: OK
cliente-cert.PEM: OK
O valor OK indica que os certificados foram gerados corretamente e estão prontos para usar.
Configurando o MySQL Server
Para ativar o serviço TLS/SSL para o servidor MySQL, é necessário definir várias variáveis do sistema dentro do arquivo de configuração principal do MySQL mysqld.conf, como:
Use seu editor favorito para editar o arquivo de configuração localizado dentro /etc/mysql/mysql.conf.d diretório.
ubuntu@ubuntu: ~ $ vim/etc/mysql/mysql.conf.d/mysqld.CNF
[MySqld]
ssl_ca =/var/lib/mysql/new_certs/ca.PEM
ssl_cert =/var/lib/mysql/new_certs/server-cert.PEM
ssl_key =/var/lib/mysql/new_certs/servidor-chave.PEM
Por fim, altere as chaves SSL e a propriedade do certificado e as permissões.
ubuntu@ubuntu: ~ $ chown -r mysql: mysql/var/lib/mysql/new_certs/
ubuntu@ubuntu: ~ $ chmod 600 chave de cliente.Pem servidor-chave.PEM Ca-key.PEM
Reinicie o banco de dados para carregar mudanças recentes.
ubuntu@ubuntu: ~ sudo serviço mysql reiniciar
Faça login no servidor após reiniciar e verificar o status atual da sessão MySQL SSL.
Configuração do lado do cliente
O estabelecimento de uma conexão remota segura do cliente exige a transferência dos arquivos de certificado OpenSSL do lado do cliente acima acima. Crie um novo diretório e use o utilitário SCP para transferência de arquivos seguros.
ubuntu@ubuntu: ~ $ mkdir ~/client-cert
ubuntu@ubuntu: ~ $ scp user@[ip_address]:/var/lib/mysql/transit/ca cert.Pem ~/Client-Cert/
ubuntu@ubuntu: ~ $ scp user@[ip_address]:/var/lib/mysql/transit/client-cert.Pem ~/Client-Cert/
ubuntu@ubuntu: ~ $ scp user@[ip_address]:/var/lib/mysql/transit/cliente-chave.Pem ~/Client-Cert/
Ao estabelecer uma conexão remota criptografada, o cliente agora exige adicionar opções do lado do cliente que verifiquem as chaves e certificados do lado do cliente. As opções incluídas são semelhantes às variáveis do sistema do servidor, mas o -SSL-key e -ssl-cert Opções identificam caminhos para a chave privada do cliente e certificado. Use o -SSL-CA opção para adicionar o caminho ao certificado da CA. Este arquivo deve ser o mesmo que o certificado CA do lado do servidor.
Use o comando abaixo com todas as opções necessárias para estabelecer uma conexão remota segura com o MySQL Database Server.
ubuntu@ubuntu: ~ $ mysql -u usuário -p -h--SSL-CA = ~/Client-Cert/CA.PEM--SSL-CERT = ~/Client-Cert/Client-Cert.PEM--SSL-key = Under ~/Client-Cert/Chave-Cliente.PEM
Configurar conexões criptografadas obrigatórias
Para alguns servidores MySQL, não é necessário apenas para o cliente se conectar com o servidor por meio de uma conexão criptografada, mas é obrigatório. O MySQL permite que o administrador do servidor configure conexões criptografadas obrigatórias. É possível colocando três níveis diferentes de controle:
Vamos detalhar cada um deles:
requim_secure_transport
Para garantir os clientes usando uma conexão criptografada, ative o requim_secure_transport variável no arquivo de configuração do MySQL localizado em/etc/mysql/mysql.CNF.diretório D:
ubuntu@ubuntu: ~ sudo vim/etc/mysql/mysql.conf.d/mysqld.CNF
[MySqld]
requim_secure_transport = ON
A variável do sistema acima garante que o cliente use transporte seguro para se conectar com o servidor, e o servidor permite apenas conexões TCP via SSL. Portanto, o servidor rejeita qualquer solicitação de conexão do cliente sem um transporte seguro e retorna uma saída de erro de er_secure_transport_required para o programa do cliente.
Além disso, a configuração do servidor acima também desativa a conexão remota do cliente com o servidor com um -Modo SSL = desativado corda.
Invocando o programa do cliente
Esse nível de controle permite invocar o programa do cliente para configurar a comunicação criptografada segura, independentemente das configurações do servidor. Ou seja, mesmo que o servidor não esteja configurado para estabelecer um transporte SSL/TLS, é capaz de manter uma conexão segura com o desejo do cliente.
É possível pelo uso de um -modo SSL Opção disponível em MySQL 5.7.11 junto com seus vários valores. É útil especificar o estado de segurança desejado da conexão do cliente com o servidor. Os valores da opção são aplicados com base no nível crescente de rigidez.
No entanto, é importante observar que a verificação do nome do host não funciona para certificados autoassinados. Isso inclui certificados gerados automaticamente pelo servidor ou criados manualmente através da ferramenta MySQL_SSL_RSA_SETUP.
Além da criptografia padrão, o MySQL permite que o cliente inclua configurações adicionais de segurança, fornecendo um certificado de CA, o mesmo que o servidor, e ativando o nome do host Name Identity Verification. Essas configurações permitem que ambas as partes confiem em uma entidade comum, e o cliente pode verificar se está se conectando ao host certo.
Agora entendemos como o modo acima interage com as opções de certificado da CA:
Configure contas de usuário
Para ativar a comunicação criptografada pelo cliente, configure uma conta de usuário específica para acessar o servidor MySQL em SSL. Crie uma conta de usuário Criar usuário com o Exigir declaração da cláusula. Ou use o Alterar o usuário Declaração para adicionar a cláusula de requisição. Esse controle encerra as tentativas de conexão do cliente para o servidor se não suportar uma conexão criptografada.
A cláusula de requisição é útil para executar uma configuração relacionada à criptografia que aplique requisitos de segurança estritos. Permite especificar um ou mais de um tls_option valor.
Vamos entrar nos detalhes das opções de comando necessárias dos clientes configurados com vários valores requisitos:
NENHUM: não requer uma conexão SSL
SSL: O servidor permite apenas a conexão criptografada de contas habilitadas para SSL.
X509: exige que o cliente apresente a chave privada e o certificado. Este valor não requer a necessidade de mostrar o certificado, sujeito e emissor da CA.
A cláusula especifica as características de criptografia necessárias de modo que não há necessidade de incluir a opção SSL.
mysql> criar 'usuário'@'localhost' requer x509;Agora, o cliente precisa especificar opções -SSL -key e -SSl -Cert para se conectar, enquanto -SSL -CA não é necessário (isso também se aplica ao emissor e assunto valores).
ubuntu@ubuntu: ~ $ mysql -u usuário -p -h--SSL-CERT = Cert Client.PEM--SSL-key = Chave do cliente.PEM
Emissor: A conta criada com a declaração de emissor requisito exige que o cliente especifique as opções -SSL -key e -SSl -Cert com um certificado válido emitido pelo CA 'emissor'. Crie a conta de usuário da seguinte forma:
mysql> Criar usuário 'usuário'@'localhost' requer emissor '/c = se/st = Stockholm/L = Stockholm/o = mysql/cn = ca/emailaddress = [email protected] ';Se o certificado for válido com um emissor diferente, a tentativa de conexão falhará.
ASSUNTO: exigir que o cliente apresente o certificado com um assunto valor fornecido ao criar sua conta. Uma conexão com um certificado válido, mas um resultado diferente nas terminações de conexão.
mysql> criar usuário 'usuário'@'localhost' requer assunto '/c = se/st = Estocolm/L = Estocolm/o = MySQL Demo Client Certificate/CN = client/emailAddress = [email protected] ';CIFRA: A conta criada com a declaração exige que o cliente inclua o método cifra usado para criptografar a comunicação. É necessário garantir que as cifras e os comprimentos das chaves sejam suficientemente fortes.
mysql> criar 'usuário'@'localhost' exige cifra 'edh-rsa-de-cbc3-sha';Conclusão
O artigo ilustra como garantir a comunicação entre o MySQL Server e os clientes, ativando o protocolo SSL. Aprendemos a criar um certificado manual autoassinado à medida que confiamos no host na rede. Também aplicamos criptografia em trânsito para comunicação do MySQL Server fora da rede e aprendemos maneiras de configurar o servidor para requisitos obrigatórios de criptografia.