Last Updated on 27/12/2023
Esse tutorial irá mostrar como habilitar o acesso remoto no MySQL, de modo que ele aceite conexões a partir de uma rede ao invés de somente conexões locais.
O Problema
Um MySQL recém instalado possui o acesso remoto desabiitado por padrão por motivos de segurança, entretanto, o acesso pode ser habilitado em apenas alguns passos.
É importante mencionar que a solução a seguir foi testada no CentOS 7.2, mas é bem provável que também funciona em outras versões e/ou distribuições do Linux.
Iremos diretamente para a solução para fazer com que seu MySQL fique disponível para ser acessado remotamente, mas você irá encontrar uma explicação detalhada no final deste tutorial.
A Solução em Três Passos
Eis o que iremos fazer:
- Associar o MySQL à uma interface de rede externa
- Abrir a porta do MySQL no firewall
- Conceder acesso remoto a um usuário do MySQL
1 – Associar o MySQL à uma interface de rede externa
Localize seu arquivo my.cnf
executando o comando abaixo:
locate my.cnf
O qual deverá exibir algo como:
/etc/my.cnf /etc/my.cnf.d /etc/my.cnf.d/mysql-clients.cnf
Então, edite o arquivo que acabamos de encontrar:
sudo vi /etc/my.cnf
Localize a seção [mysqld]
no arquivo, a qual deve se parecer com o seguinte:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock ...
Realize as seguintes modificações:
- Se o parâmetro
bind-address
existir, comente-o adicionando um#
à sua frente. - Se o parâmetro
skip-networking
existir, também comente-o adicionando um#
à sua frente.
Exemplo:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock #bind-address=127.0.0.1 #skip-networking
Grave as alterações e feche o arquivo. Em seguida, reinicie o MySQL:
service mysqld restart
2 – Abrir a porta do MySQL no firewall
A porta padrão do MySQL é a 3306, porém, se você estiver utilizando uma instalação do MySQL em uma porta diferente, substituia o valor 3306 por sua respectiva porta nos próximos passos.
Se o seu sistema operacional for o CentOS 7 ou posterior, é possível que você consiga controlar suas regras de firewall através dos comandos firewall-cmd
, porém, caso este comando falhe com erros do tipo command not found
, pule diretamente para o comando iptables
.
A primeira coisa que precisamos fazer aqui é descobrir quais são suas zonas de firewall ativas, o qual pode ser feito pelo comando a seguir:
firewall-cmd --get-active-zones
Que por sua vez, poderá exibir uma simples zona “public” ou uma lista como public e dmz. Execute o comando abaixo para cada zona exibida na tela, substituindo os valores <zone>
e <mysql_port>
por sua configuração atual:
firewall-cmd --zone=<zone> --add-port=<mysql_port>/tcp --permanent
Exemplo:
firewall-cmd --zone=public --add-port=3306/tcp --permanent
Então, recarregue as configurações do firewall:
firewall-cmd --reload
Conforme mencionado anteriormente, caso estes passos não funcionem devido a erros de command not found
, abra a porta utilizando o comando abaixo, substituindo os valores <interface>
e <mysql_port>
por sua configuração atual:
iptables -I INPUT -i <interface> -p tcp --destination-port <mysql_port> -j ACCEPT
Exemplo:
iptables -I INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT
3 – Conceder acesso remoto a um usuário do MySQL
Faça o login em seu MySQL:
mysql -u root -p
Opcionalmente, crie um usuário para conceder acesso remoto a ele, ou simplesmente pule este passo e utilize um usuário existente:
CREATE USER 'foouser'@'%' IDENTIFIED BY 'barpassword';
Conceda a este usuário os privilégios de acesso a schemas e tabelas que você desejar, ou simplesmente conceda acesso a tudo (fortemente não recomendado para ambientes de produção, neste caso, selecione apenas os privilégios necessários):
GRANT ALL PRIVILEGES ON *.* TO 'foouser'@'%';
Isso é tudo.
A Explicação
Sobre a associação do MySQL à uma interface de rede externa
Nós precisávamos associar o MySQL ao localhost e à uma interface de rede ao mesmo tempo, mas de acordo com a documentação oficial, o MySQL pode ser associado à apenas um endereço simultaneamente, tal endereço podendo uma das seguintes opções (tradução logo abaixo):
If the address is *, the server accepts TCP/IP connections on all server host IPv6 and IPv4 interfaces if the server host supports IPv6, or accepts TCP/IP connections on all IPv4 addresses otherwise. Use this address to permit both IPv4 and IPv6 connections on all server interfaces. This value is the default.
If the address is 0.0.0.0, the server accepts TCP/IP connections on all server host IPv4 interfaces.
If the address is ::, the server accepts TCP/IP connections on all server host IPv4 and IPv6 interfaces.
If the address is an IPv4-mapped address, the server accepts TCP/IP connections for that address, in either IPv4 or IPv6 format. For example, if the server is bound to ::ffff:127.0.0.1, clients can connect using –host=127.0.0.1 or –host=::ffff:127.0.0.1.
If the address is a “regular” IPv4 or IPv6 address (such as 127.0.0.1 or ::1), the server accepts TCP/IP connections only for that IPv4 or IPv6 address.
Traduzido livremente para o português:
Se o endereço for *, o servidor aceitará conexões TCP/IP em todas as interfaces IPv6 e IPv4 caso o servidor suporte IPv6, ou aceitará conexões TCP/IP em todos os endereços IPv4 do host caso contrário. Use este valor para permitir ambas as conexões IPv4 e IPv6 em todas as interfaces do servidor. Este é o valor padrão.
Se o endereço for 0.0.0.0, o servidor aceitará conexões TCP/IP em todas as interfaces IPv4 do host.
Se o endereço for ::, o servidor aceitará conexões TCP/IP em todas as interfaces IPv6 e IPv4 do host.
Se o endereço for um endereço mapeado IPv4, o servidor aceitará conexões TCP/IP para tal endereço tanto no formato IPv4 quanto em IPv6. Por exemplo, se o servidor for associado a ::ffff:127.0.0.1, os clientes podem se conectar utilizando –host=127.0.0.1 ou –host=::ffff:127.0.0.1.
Se o endereço for um endereço IPv4 ou IPv6 “comum” (como 127.0.0.1 ou ::1), o servidor aceitará conexões TCP/IP somente para tal endereço IPv4 ou IPv6.
Dadas as definições acima, se associarmos nosso MySQL diretamente à uma de nossas interfaces de rede como a 192.160.0.10, o MySQL começará a recusar conexões localhost! Então a melhor escolha é utilizar a palavra-chave “*” ou simplesmente desabilitar este parâmetro para que seu valor padrão seja utilizado para aceitar conexões tanto do localhost quanto das interfaces de rede. Não se preocupe, quaisquer brechas de segurança estão cobertas através das regras de Firewall e privilégios do usuário do MySQL.
Sobre a abertura da porta do MySQL no firewall
As versões mais recentes do CentOS possuem o Firewalld instalado por padrão, neste caso, devemos optar por lidar com as configurações de firewall através dos comandos firewall-cmd
, caso contrário, o bom e velho iptables
fará a função.
Espero que ajude. Até mais!
Mano, me ajudou muito, sério mesmo muito obrigado