Guia para a criptografia MySQL em configurações de criptografia obrigatória e de trânsito

Guia para a criptografia MySQL em configurações de criptografia obrigatória e de trânsito
Por padrão, a transmissão de dados MySQL entre o cliente e o servidor ocorre sem criptografia. A transmissão de dados não criptografada é aceitável apenas quando o cliente e o servidor estão dentro da mesma rede que garante a segurança. No entanto, os dados estão em risco potencial se ambas as partes estiverem em uma rede separada. A falta de criptografia introduz um risco grave de interceptação de dados por ataque de homem-na parte média (MITM).

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%';
+---------------+-----------------+
| Variable_name | Valor |
+---------------+-----------------+
| tem_openssl | Desativado |
| tem_ssl | Desativado |
| ssl_ca | |
| ssl_capath | |
| SSL_CERT | |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | |
+---------------+-----------------+
9 linhas no set (0.53 seg)

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:

  • Usar SSL_CERT e ssl_key Para definir o caminho para o certificado e a chave privada do servidor.
  • Use o SSL_CA variável para definir o caminho para o certificado da CA no lado do servidor.

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:

  • Configurar o MySQL que exige que o cliente acesse o banco de dados apenas por meio de uma conexão criptografada.
  • Invoque os programas clientes para precisar de uma conexão criptografada, mesmo que o MySQL permitir, mas não exige necessariamente um.
  • Configurar contas de usuário específicas para acessar o banco de dados apenas em um canal criptografado.

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.

  • DESABILITADO: O valor estabeleceu uma conexão insegura.
  • PREFERIDO: O modo é semelhante a quando nenhuma opção de modo -SSL é especificada. Ele estabelece criptografia apenas se o servidor suportar de outra forma, ele voltará à conexão não criptografada padrão.
  • OBRIGATÓRIO: O valor garante uma comunicação criptografada se o servidor estiver ativado para suportar um. O cliente falha na tentativa de conexão se o MySQL não suportar TLS/SSL.
  • Verifique_ca: o valor funciona semelhante a OBRIGATÓRIO, Mas, além disso, também verifica o certificado CA do servidor. O cliente não se conecta em caso de nenhum certificado de correspondência válido.
  • Verify_Identity: igual a Verifique_ca, Mas para uma versão 1 OpenSSL.0.2+, os clientes também podem verificar o nome do host que eles usam para se conectar contra a identidade no certificado do servidor. A conexão quebra no caso de uma incompatibilidade.

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:

  • Especifique o certificado CA com a opção de -SSL -CA com -SSL -Mode = verify_ca.
  • Ativar verificação de identidade do nome do host usando -SSL -Mode = Verify_IDentity
  • Um valor -SSL-mode diferente de Verify_Identity ou Verify_Ca com -SSL-CA gerará um aviso declarando a não verificação do certificado do servidor.

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.