terça-feira, 25 de junho de 2013

MySQL: Aumentando a segurança e configurando acesso remoto

Postado por DoctorRu (Will)

MySQL
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)

0 comentários :

Postar um comentário