Esse tutorial foi escrito para o Linux Ubuntu, se o seu sistema é outro então adapte este tutorial
conforme sua necessidade, sempre verificando o path dos arquivos
mencionados e criando uma cópia de segurança além de anotar as
permissões dos mesmos antes de começar as alterações.
Por padrão é possível logar-se localmente em um servidor MySQL como usuário anônimo sem a necessidade de autenticação, apesar do acesso ficar restrito as bases
test e
information_schema, uma mente criativa pode através de script coletar dados da máquina e armazenar estes dados dentro da base
test para futura consulta sem chamar a atenção.
Os parâmetros mais utilizados para conexão com o servidor são:
-u nome do usuário
-p requisição de senha
-h host / ip
-P porta de conexão (padrão 3306)
-D base de dados
Observação: Apesar de apontarem para o mesmo local, no servidor,
localhost e
127.0.0.1 são vistos
como
coisas diferentes, então um usuário que tem acesso a localhost não necessariamente conseguirá logar em 127.0.0.1, ou seja, dentro da base
mysql na tabela
user localhost é uma coisa e 127.0.0.1 é outra, ja no arquivo
my.conf usa-se apenas
127.0.0.1 quando se fala de acesso local.
Tornando o MySQL um pouco mais seguro
Para solucionar a questão do login temos três possíveis soluções.
- Criar uma senha para o usuário anônimo
- Remover o usuário anônimo (identificado como '' na tabela user)
- Deletar a base test
Optei por criar uma senha forte para o usuário anônimo ao invés de deletá-lo ou de deletar a base test pois ambos podem ser úteis no futuro, assim você não precisa se dar o trabalho de criar uma nova conta ou tabela caso precise de algo corriqueiro e dificilmente alguém tentará crackear a senha de usuário com privilégios restritos apenas para salvar dados na base, mas se a senha for nula essa técnica pode ser válida.
Conecte-se como root no servidor através do ip 127.0.0.1 ou localhost
$ mysql -u root -p -h 127.0.0.1 -D mysql
Altere a senha do usuário anônimo que é identificado como ''@'localhost' substituindo o respectivo texto pela nova senha.
mysql>SET PASSWORD FOR ''@'localhost' = password('nova senha');
Query OK, 0 rows affected (0.00 sec)
Para testar basta sair do servidor e se conectar como anônimo informando a nova senha, lembre-se de utilizar o parâmetro
-p
mysql>exit
Bye
$ mysql -p -h 127.0.0.1
Password:
Para evitar logins remotos (ip's externos), procure a seguinte linha no arquivo
/etc/mysql/my.conf (este é o path relativo para distro ubuntu, caso não encontre o arquivo procure-o através do comando
locate ou
find)
skip-networking
Ao encontrá-la, descomente-a retirando o
# da frente do comando, caso essa linha não exista, crie-a.
Certifique-se de que no mesmo arquivo a linha abaixo contém o IP local 127.0.0.1 ao invés de 0.0.0.0 assim apenas conexões locais serão aceitas
bind-address = 127.0.0.1
Pronto! Menos uma questão de segurança para se preocupar.
Se você pretende habilitar acesso remoto, siga as instruções abaixo, caso contrário "por hoje é só pessoal!"
Habilitando acesso remoto
Atenção: Aqui será feito exatamente o contrário de parte do que fizemos acima! Pois vamos liberar o acesso remoto ao invés de bloqueá-lo, porém de uma forma segura.
O primeiro passo é garantir a algum usuário permissão para conectar ao servidor e especificar quais serão seus privilégios, abaixo a lista dos possíveis privilégios:
ALL/ALL PRIVILEGES – Simboliza todos os privilégios abaixo;
ALTER – Permite alterar a estrutura de tabelas;
ALTER ROUTINE – Permite alterar e excluir stored procedures/functions;
CREATE – Permite criar base de dados e tabelas;
CREATE ROUTINE – Permite criar stored procedures/functions;
CREATE TEMPORARY TABLES – Permite a criação de tabelas temporárias em expressões SQL que utilizam esse recurso;
CREATE USER – Permite criar e gerenciar usuários;
CREATE VIEW – Permite criar visões;
DELETE – Permite excluir informações;
DROP – Permite excluir estruturas (bases e tabelas);
EVENT – Permite criar event schedulers;
EXECUTE – Permite executar stored procedures;
FILE – Permite ler e escrever arquivos no sistema;
GRANT – Permite cadastrar seus privilégios para outros usuários;
INDEX – Permite o gerenciamento de índices;
INSERT – Permite inserir informações em tabelas;
LOCK TABLES – Permite bloquear tabelas;
PROCESS – Permite visualizar e finalizar processos do MySQL;
RELOAD – Permite recarregar bases de dados;
REPLICATION CLIENT – Permite solicitar replicação;
REPLICATION SLAVE – Permite replicar suas informações;
SELECT – Permite consultas;
SHOW DATABASES – Permite visualizar todas as estruturas das bases existentes;
SHOW VIEW – Permite visualizar os códigos de criação de visões;
SHUTDOWN – Permite desligar o servidor MySQL;
SUPER – Permite configurar os dados do servidor MASTER (em caso de replicação);
TRIGGER – Permite criar e gerenciar triggers;
UPDATE – Permite alterar informações em tabelas;
USAGE – Permite utilizar comandos básicos.
Vamos criar uma usuária chamada
amanda (sugiro a criação de um usuário específico para acesso remoto, uma das vantagens é a identificação nos arquivos de log) e ja definir seus privilégios, isso será feito através do comando
GRANT,
a sintaxe do mesmo é:
GRANT <privilégios> ON <base>.<tabela> TO '<usuario>'@'<dominio>' IDENTIFIED BY '<senha>'
Sendo que
*.* – Aplica-se a todas as bases!
<base>.* – Aplica-se a todas as tabelas da base determinada
<base>.<tabela> – Aplica-se a uma determinada tabela
Criando a usuária
amanda e atribuindo seus privilégios:
$ mysql -u root -p -D mysql
mysql> GRANT SELECT,INSERT,DELETE,UPDATE ON test.* TO 'amanda'@'%'
IDENTIFIED BY 'senha da amanda';
Nota: O uso de ' %' define que a usuária poderá se logar tanto localmente quanto remotamente.
Observação: O Comando
GRANT cria
um novo usuário e atribui privilégios a cada vez que é utilizado, se você estiver realizando alguns testes nesta parte, recomendo que ao terminar de um
select na tabela
user para verificar se não foi criada mais de uma entrada para o mesmo usuário com hosts diferentes, para revogar privilégios utilize o comando
REVOKE
Para habilitar conexões remotas ao seu servidor MySQL vamos considerar o cenário do diagrama abaixo, o IP
200.220.4.113 é apenas para fim ilustrativo,
substitua-o por seu IP externo! para descobrir seu IP externo visite o site
ifconfig.me ou o
Ip Chicken.
Vamos começar com o mínimo de alterações e caso isso não seja o suficiente partiremos para outra etapa, assim restringimos as mudanças ao que for realmente necessário.
Primeiro o arquivo
my.conf (o oposto do que fizemos no início deste tutorial) vamos comentar a linha
skip-networking (caso essa linha não exista não é necessário cria-la) e alterar o
bind-adress para 0.0.0.0, ao comentar a linha skip-networking estamos habilitando as conexões via tcp/ip, ja o bind-adress como 0.0.0.0 permite conexões de qualquer faixa de ip.
#skip-networking
bind-address = 0.0.0.0
Se ao tentar um login remoto ocorrer o erro:
$ mysql -u amanda -p -h 200.220.4.113 -P 3306
ERROR 1042 (HY000): Can't get hostname for your address
Procure a linha abaixo no arquivo
my.conf, caso exista certifique-se de que ela não está comentada com
#, caso não exista, crie-a.
skip-name-resolve
Se depois disso você receber time-out
$ mysql -u amanda -p -h 200.220.4.113 -P 3306
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on '200.220.4.113' (110)
Talvez seu
firewall esteja bloqueando a conexão, se for este o caso adicione a seguinte regra ao firewall:
$ sudo ufw allow 3306/tcp
Para verificar se a regra foi adicionada corretamente
$ sudo ufw status
Status: active
To Action From
-- ------ ----
3306/tcp ALLOW Anywhere
3306/tcp ALLOW Anywhere (v6)
Se tudo estiver correto você conseguirá logar remotamente:
$ mysql -u yourusername -p -h 200.220.4.113 -P 3306 # Use seu IP externo!
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Copyright (c) 2000, 2013, Oracle and/or its affiliates.
All rights reserved.
Oracle is a registered trademark of Oracle Corporation
and/or its affiliates.
Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear
the current input statement.
mysql>
É isto!
Observação: Se ainda assim não conseguir conectar remotamente e você utilizar um roteador, será preciso redirecionar a porta do roteador para sua máquina, porém devido a imensa diversidade de modelos de roteadores não irei incluir isto neste tutorial, mas você encontrará informações sobre como fazer o "foward" de portas de diversos modelos no site
Port Foward
Para remover a usuária amanda que foi criada apenas como teste:
$ mysql -u root -p -D mysql
mysql> DELETE FROM user WHERE user='amanda';
Para bloquear novamente o acesso no firewall mude a regra de
allow para
deny:
$ sudo ufw deny 3306/tcp
Interrompendo o inicio automático do servidor MySQL
Geralmente após instalado o servidor passa a ser iniciado como um serviço no boot do sistema, se você o utiliza apenas eventualmente quando está em produção e não como servidor permanente local, como medida de segurança adicional recomendo iniciar o servidor apenas quando você for trabalhar com o mesmo. O cancelamento do início automático pode ser feito de duas maneiras.
A Primeira é criando um arquivo override com a instrução "
manual", a vantagem deste metódo é que você não precisa alterar o arquivo de inicialização do MySQL, (caso queira voltar a inicializar o servidor automaticamente no boot basta remover o arquivo mysql.override.)
Criando o arquivo
mysql.override
$ sudo touch /etc/init/mysql.override
$ echo "manual" | sudo tee /etc/init/mysql.override
A outra opção é como
root comentar a seguinte linha no arquivo
/etc/init/myql.init
#start on runlevel [2345]
A partir dai para iniciar manualmente o servidor:
$ sudo initctl start mysql
Para interromper o servidor:
$ sudo initctl stop mysql
Como alternativa também é possível iniciar ou parar o servidor através do comando
service mysql <start / stop>
Dúvidas? Deixe um comentário!
Trilha sonora deste post:
Emma Hewitt - Colours (Jerome Isma-Ae Remix)