Evitando qualquer tentativa de login no mysql externo

3

Como evitar logins externos no meu banco de dados Mysql?

Ou seja, como ter certeza de que a única maneira de manipular meu banco de dados é fazer login na minha máquina com SSH e trabalhar como root / sudoer.

Minha máquina é o servidor Ubuntu operado e eu já deletei o PHPmyadmin para que as pessoas não pudessem tentar fazer o login da porta 80 ou 443 quando estou em HTTPS, mas acho que as pessoas ainda podem tentar entrar com software como workbench MySQL ou software similar, e eu gostaria de evitar isso também e bloquear meu banco de dados para que somente o usuário root / sudoer do sistema operacional possa acessar o banco de dados via mysql -u root -p .

Para esclarecer, eu gostaria que outros usuários do DB não pudessem fazer o login do meu sistema ou de fora, com suas senhas --- eu sou o único que usa esta máquina, mas mesmo que haja outros usuários de máquina além do root sudoer, eu ainda quero que eles não consigam se autenticar no Mysql, e eu não quero que ninguém faça o login de fora da máquina também - em outras palavras, eu não quero que nenhum outro humano além de mim, manipule o banco de dados.

Eu suponho que eu deveria bloquear algumas portas extras além de 3306. Isso está correto?

Eu poderia remover qualquer porta dessas listas em /etc/csf/csf.conf :

# Allow incoming TCP ports
TCP_IN = "20,21,22,25,53,80,110,143,443,465,587,993,995,9000"

# Allow outgoing TCP ports
TCP_OUT = "20,21,22,25,53,80,110,113,443,587,993,995,9000"

Nota: Eu já passei pela porta 9000 para o PHP-FPM.

    
por Arcticooling 16.11.2017 / 06:00

3 respostas

3

A maneira correta de bloquear o acesso externo ao MySQL é com a diretiva bind-address em /etc/mysql.cnf , conforme descrito por margarida . Você não pode impedir que alguém com uma conta MySQL válida efetue login localmente (mas note que uma conta UNIX não implica uma conta MySQL; elas são distintas uma da outra).

Vou responder a outra parte da sua pergunta:

I assume I should lock some extra ports besides 3306. Is that correct?

# Allow incoming TCP ports
TCP_IN = "20,21,22,25,53,80,110,143,443,465,587,993,995,9000"

No momento em que seu arquivo csf.conf define seu firewall para permitir tantos serviços, não vale a pena usar.

  • 20 - Dados de FTP (por que você está permitindo FTP pela Internet?)
  • 21 - Comando FTP (idem)
  • 22 - SSH (isso é bom, mas garanta que suas contas estejam bem protegidas; considere desativar todos os logins sem certificado)
  • 25 - Entrada de SMTP (você está realmente executando um servidor de email de entrada?)
  • 53 - DNS (você está realmente executando o DNS público?)
  • 80 - HTTP (você está executando um servidor da Web?)
  • 110 - POP3 (protocolo obsoleto; se você estiver executando um servidor de e-mail, considere o IMAPS no 993)
  • 143 - IMAP (inseguro; use o IMAPS no 993 em vez disso)
  • 443 - HTTPS (você está executando um servidor da Web?)
  • 465 - SMTPS (você está realmente executando um servidor de correio público?)
  • 587 - SMTP-MSA (idem)
  • 993 - IMAPS (somente se você estiver recebendo mensagens de e-mail neste servidor para leitura)
  • 995 POP3S (seguro, mas ainda obsoleto)
  • 9000 - quem sabe

Se você não oferecer um serviço, não o permita. POP3, IMAP e POP3S devem ser todos desativados em favor do IMAPS (se houver). Não ofereça SMTP * a menos que você esteja realmente executando um servidor de e-mail que precisa receber e-mails da Internet. Não execute o FTP. Use SSH para transferência de arquivos.

Se você quiser usar o MySQL Workbench em um sistema diferente, você ainda pode ter o MySQL configurado para permitir apenas conexões locais executando um encaminhador em ssh . Eu faço isso por alguns dos meus servidores:

ssh -nf -L localhost:3306:localhost:3306 ADDRESS_OF_REMOTE_SYSTEM sleep 60
# Using Workbench, now connect to MySQL seemingly on the local machine
    
por 18.11.2017 / 21:45
7

Apenas deixe que mysqld ouça apenas o loopback

por exemplo, em /etc/mysql/my.cnf adicionar ou alterar a seguinte configuração

bind-address 127.0.0.1

Dessa forma, apenas os programas executados localmente podem se conectar ao banco de dados mysql

    
por 16.11.2017 / 06:13
1

roaima certamente tem a resposta autoritativa aqui até agora, então eu gostaria apenas de adicionar um conjunto muito simples de coisas que você pode não estar ciente de rodar o MySQL na linha de comando via ssh:

  1. desabilite o login root e, se possível, desabilite o login por senha e exija chaves, mas isso não é tão crítico e nem sempre é conveniente, mas deixar o root habilitado para ssh assim que você tiver a configuração do sistema deve ser evitado tanto quanto é prático, e se você não tem um motivo real para precisar, não faça isso. Dica: use nomes de usuário aleatórios complicados, isso é apenas mais uma barreira para adivinhar.

  2. Isso é algo que eu acho que a maioria das pessoas não tem conhecimento: quando você digita algo no shell ssh, que é armazenado no histórico do shell, e pode ser recuperado executando apenas o histórico, então se você use senhas mysql na linha de comando como parte da emissão de comandos ou conexão com o mysql, elas estarão no histórico. Existe uma maneira absurdamente fácil de evitar esse problema: coloque um espaço antes de todos os comandos do mysql que você digitar na linha de comando. É isso aí. O espaço faz com que o shell ignore o comando em termos de adicioná-lo ao seu histórico.

  3. Em seguida, execute: history -c para limpar o histórico do shell. Isso é válido por pelo menos Bash, eu não sei para todos os outros.

Estas são coisas muito simples que não custam a você nenhum esforço, e que eliminam dois pontos fracos comuns, o histórico do shell, e um nome de usuário trivialmente fácil de adivinhar para o ssh.

    
por 18.11.2017 / 22:09