MySQL sobre TLS no Ubuntu Top 10.Top 10

MySQL sobre TLS no Ubuntu Top 10.Top 10
Tradicionalmente, seu servidor de banco de dados e seu front -end costumavam estar na mesma rede isolada. Isso permitiu que o front -end conversasse com o banco de dados sobre um canal não criptografado sem muita preocupação com a segurança. Tudo isso mudou nos últimos anos com a ascensão de nuvens e sistemas distribuídos. Seus aplicativos não estão mais restritos em uma única rede isolada. Agora, mais do que nunca, a comunicação entre o front -end e o banco de dados precisa ser criptografada e protegida.Você pode conseguir isso usando uma VPN para virtualizar uma rede isolada. O front -end e o banco de dados podem fazer parte desta VPN e a comunicação entre eles será garantida. Ou você pode usar o TLS, para criptografar os dados que estão sendo enviados para e para o banco de dados, da mesma maneira que os sites garantem sua comunicação com os navegadores usando HTTPS. Estaremos instalando o MySQL e configurando -o de modo que consultas e fluxo de dados via TLS.

Instalando o MySQL Server

O guia está assumindo que você tem um servidor reservado para o uso do MySQL com um endereço IP estático acessível, talvez na nuvem ou em algum lugar da sua rede local. Os seguintes comandos, nesta subseção, devem ser executados no shell do servidor. Vamos instalar e configurar rapidamente o MySQL no Ubuntu.

$ sudo apt update
$ sudo apt install mysql-server
$ sudo mysql_secure_installation

O último comando executará um script para alterar alguns dos padrões inseguros do MySQL. Primeiro seria um aviso para instalar um plugin de validação de senha. Isso verificaria se a nova senha que você está definindo para usuários é forte o suficiente ou não. Você pode optar por não participar deste plugin, se quiser. Depois disso, você será solicitado a definir senha do usuário root mysql. Vá em frente e defina uma senha de usuário raiz forte.

Pressione Y | y para sim, qualquer outra chave para não: n
Defina a senha para root aqui.
Nova Senha:
Re-introduza a nova palavra-passe:

Depois disso, você pode dizer muito sim Para todos os outros prompts neste script, como o script remove o usuário do teste, remove o banco de dados de teste, desativa o login de raiz remoto e finalmente recarrega sua tabela de privilégio. Uma vez feito isso, como não permitimos o login de raiz remoto, vamos criar um banco de dados e um novo usuário que possa acessar esse banco de dados remotamente sem realmente precisar SSH (ou login) no UNIX/Linux Shell do servidor. Mas antes de fazer isso, vamos verificar se nossa construção do MySQL tem TLS embutido ou não.

Verificação se o TLS estiver disponível

O TLS está disponível no MySQL apenas se o MySQL for compilado para que ele. Não há módulo dinâmico para carregar. Portanto, se você não tiver certeza de que seu pacote MySQL possui ou não o TLS, pode verificar isso em execução:

$ sudo mysql
mysql> mostra variável 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.00 seg)

Se diz que as variáveis Have_openssl e tem_ssl têm valores definidos como DESABILITADO Então você tem SSL e está pronto para ir (você só precisa habilitá -lo, lendo mais). Se os valores forem definidos como NÃO, Então você tem que obter uma versão diferente do MySQL do seu gerenciador de pacotes ou em outro lugar.

mysql> saída

Configurando MySQL

Por padrão, o MySQL Server ouve apenas na interface loopback, ou seja, no endereço 'localhost' ou '127.0.0.1 ', para conexões remotas, queremos que ele ouça no IP estático público também. Para fazer isso, abra o arquivo, /etc/mysql/meu.CNF e anexar as seguintes linhas seguintes no final.

..
[MySqld]
requim_secure_transport = ON
Address de ligação =

Aqui, você substitui o com o IP real do seu servidor. Se você estiver em dúvida sobre qual IP usar, pode usar 0.0.0.0 Para ouvir em todas as interfaces. Agora reinicie o servidor, para que a nova configuração ocorra.

$ sudo serviço mysql reiniciar

Criando usuário remoto

Nota: Se você deseja usar o banco de dados na produção, é provável que o cliente que se conecte a este banco de dados - seu front -end - terá um IP estático. Se for esse o caso, substitua o símbolo '%' porcentagem pelo IP do cliente apropriado. '%' é apenas um curinga, que significa 'qualquer valor'. Estaremos configurando nosso MyUser para que ele possa fazer login a partir de qualquer endereço IP (por exemplo, a mudança de endereço IP da sua conexão de banda larga doméstica) que é, sem dúvida, insegura.

$ sudo mysql
mysql> criar banco de dados mydatabase;
mysql> criar usuário 'myuser'@'%' identificado por 'senha' requer ssl;
mysql> conceda tudo no mydatabase.* Para 'myuser'@'%';

Substituir 'senha' com uma senha forte e temos um usuário nomeado MyUser que tem acesso completo ao banco de dados mydatabase.

Permitindo TLS (também conhecido como 'SSL')

Enquanto você está registrado no shell MySQL como o usuário do MySQL Root, você pode verificar o status da conexão digitando \ s:

mysql> \ s
--------------
MySql Ver 14.14 distribuição 5.7.24, para Linux (x86_64) usando o Wrapper Editline
Id de conexão: 5
Banco de dados atual:
Usuário atual: root@localhost
SSL: não em uso
Pager atual: stdout
Usando outfile: "
Usando delimitador :;
Versão do servidor: 5.7.24-0buntu0.18.04.1 (Ubuntu)
Versão do protocolo: 10
Conexão: localhost via soquete Unix
..

Preste atenção às linhas destacadas sobre conexão e SSL. Embora esse estado seja bom para um login local do usuário root, quando loginmos sobre TLS como o MyUser O tipo de conexão será sobre TCP/IP, não um soquete bruto e uma cifra SSL estará em uso. Há um comando simples para realizar isso. Mas primeiro vamos sair do nosso prompt de mysql.

mysql> saída

Agora execute,

$ sudo mysql_sssl_rsa_setup --uid = mysql
$ sudo serviço mysql reiniciar


Uma vez feito isso, você pode olhar para o tem_ssl variável de novo.

$ sudo mysql
MySQL> mostra variáveis ​​como '%ssl%';
+---------------+-----------------+
| Variable_name | Valor |
+---------------+-----------------+
| tem_openssl | Sim |
| tem_ssl | Sim |
| ssl_ca | ca.PEM |
| ssl_capath | |
| SSL_CERT | servidor-cert.PEM |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | chave servidor.PEM |
+---------------+-----------------+
9 linhas no set (0.01 seg)

Faça login de um cliente MySQL separado

Existem novos parâmetros indicando que o certificado TLS e a chave estão em vigor e o TLS está ativado. Agora você pode sair desta máquina, abrir um cliente MySQL no seu computador local, se você não tiver um (e estiver usando o Debian ou o Ubuntu), obtenha um cliente MySQL Shell:

$ sudo apt install mysql-client
$ mysql -u myuser -p -h

Substitua o MyUser e Com seu nome de usuário e servidor real, insira a senha escolhida e você deve estar conectado ao banco de dados. Verifique a conexão:

mysql> \ s
--------------
MySql Ver 14.14 distribuição 5.7.24, para Linux (x86_64) usando o Wrapper Editline
Id de conexão: 5
Banco de dados atual:
Usuário atual: remote_user@yourlocalip
SSL: cifra em uso é dhe-rsa-aes256-sha
Pager atual: stdout
Usando outfile: "
Usando delimitador :;
Versão do servidor: 5.7.24-0buntu0.18.04.1 (Ubuntu)
Versão do protocolo: 10
Conexão: via TCP/IP
Servidor caractereset: latin1
DB CaracterSet: Latin1
CLIENTE CATERIAÇÃO: UTF8
Conn. CaracterSet: UTF8
Porta TCP: 3306
Tempo de atividade: 13 min 52 seg
Tópicos: 2 Perguntas: 32 Consultas lentas: 0 abre: 107 Tabelas de descarga: 1
Tabelas abertas: 100 consultas por segundo AVG: 0.038
--------------

Você pode ver que agora está usando o RSA para criptografar seu tráfego e a conexão é com um IP específico sobre TCP/IP. Agora, sua conexão com este banco de dados MySQL é seguro.

Conclusão

Esta é a maneira mais simples de proteger suas conexões remotas MySQL com TLS. Lembre -se de que isso não é o mesmo que proteger um cliente phpmyadmin sobre TLS. Isso é TLS e HTTP combinados e exige que você proteja a interface da web. A conexão entre o phpmyadmin, que renderiza sua interface da web, e o banco de dados ainda pode não ser criptografado, o que é bom, desde que estejam no mesmo servidor.

Você pode aprender mais sobre a conexão TLS, CAS subjacente, certificados e gerenciamento de chaves nos documentos oficiais do MySQL.