MySQL é um sistema de banco de dados relacional multiplataforma totalmente em rede e um sistema de gerenciamento de banco de dados distribuído com uma arquitetura cliente/servidor. MySQL é um sistema de banco de dados relacional multiplataforma totalmente em rede e um sistema de gerenciamento de banco de dados distribuído com uma arquitetura cliente/servidor. Possui as vantagens de funções poderosas, fácil uso, gerenciamento conveniente, alta velocidade de execução, forte segurança e confiabilidade. Os usuários podem usar várias linguagens para escrever programas para acessar o banco de dados MySQL, especialmente quando combinado com PHP, é um. combinação dourada e é amplamente utilizada.
Como o MySQL é um banco de dados multiplataforma, sua configuração padrão deve ser considerada aplicável em diversas situações, portanto, reforços adicionais de segurança devem ser realizados em nosso próprio ambiente de utilização. Como administrador do sistema MySQL, somos responsáveis por manter a segurança e integridade dos dados do sistema de banco de dados MySQL.
A configuração de segurança do banco de dados MySQL deve partir de dois aspectos, segurança interna do sistema e segurança externa da rede. Além disso, também apresentaremos brevemente alguns problemas e dicas aos quais prestar atenção ao programar.
Segurança interna do sistema
Primeiro, vamos apresentar brevemente a estrutura de diretórios do banco de dados MySQL. Após a instalação do MySQL, o diretório de dados e o banco de dados serão inicializados após a execução do script mysql_db_install. Se usarmos o pacote de código-fonte do MySQL para instalar e o diretório de instalação for /usr/local/mysql, então o diretório de dados geralmente será /usr/local/mysql/var. Um sistema de banco de dados consiste em uma série de bancos de dados, cada um contendo uma série de tabelas de banco de dados. MySQL usa o nome do banco de dados para criar um diretório de banco de dados no diretório de dados. Cada tabela de banco de dados usa o nome da tabela de banco de dados como nome de arquivo e três arquivos com as extensões MYD, MYI e frm são colocados no diretório de banco de dados.
A tabela de autorização do MySQL fornece controle de permissão flexível para acesso ao banco de dados, mas se o usuário local tiver permissões de leitura para o arquivo da biblioteca, o invasor só precisará empacotar e copiar o diretório do banco de dados e, em seguida, copiá-lo para seu próprio diretório de dados. bancos de dados. Portanto, a segurança do host onde o MySQL está localizado é a questão mais importante. Se o host não for seguro e controlado por invasores, a segurança do MySQL não poderá ser discutida. A segunda é a segurança do diretório de dados e dos arquivos de dados, que é a questão das configurações de permissão.
A julgar por algumas versões binárias antigas do site principal do MySQL, o atributo do diretório de dados na versão 3.21.xx é 775, o que é muito perigoso. Qualquer usuário local pode ler o diretório de dados, portanto o arquivo de banco de dados é muito inseguro. O atributo do diretório de dados na versão 3.22.xx é 770. Este atributo também é um tanto perigoso. Os usuários locais no mesmo grupo podem ler e gravar, portanto os arquivos de dados não são seguros. O atributo do diretório de dados na versão 3.23.xx é 700, que é melhor. Somente o usuário que inicia o banco de dados pode ler e gravar o arquivo do banco de dados, garantindo a segurança dos arquivos de dados locais.
Se o usuário que inicia o banco de dados MySQL for mysql, os seguintes diretórios e arquivos são seguros. Preste atenção ao diretório de dados e aos seguintes atributos:
shell>ls -l /usr/local/mysql
total 40
drwxrwxr-x 2 root root 4096 27 de fevereiro 20:07 bin
drwxrwxr-x 3 root root 4096 27 de fevereiro 20:07 incluir
drwxrwxr-x 2 root root 4096 27 de fevereiro 20:07 informações
drwxrwxr-x 3 root root 4096 27 de fevereiro 20:07 lib
drwxrwxr-x 2 root root 4096 27 de fevereiro 20:07 libexec
drwxrwxr-x 3 root root 4096 27 de fevereiro 20:07 homem
drwxrwxr-x 6 root root 4096 27 de fevereiro 20:07 mysql-test
drwxrwxr-x 3 root root 4096 27 de fevereiro 20:07 compartilhar
drwxrwxr-x 7 root root 4096 27 de fevereiro 20:07 sql-bench
drwx ------ 4 mysql mysql 4096 27 de fevereiro 20:07 var
shell>ls -l /usr/local/mysql/var
total 8
drwx ------ 2 mysql mysql 4096 27 de fevereiro 20:08 mysql
drwx ------ 2 mysql mysql 4096 27 de fevereiro 20:08 teste
shell>ls -l /usr/local/mysql/var/mysql
total 104
-rw------- 1 mysql mysql 0 27 de fevereiro 20:08 colunas_priv.MYD
-rw------- 1 mysql mysql 1024 27 de fevereiro 20:08 colunas_priv.MYI
-rw------- 1 mysql mysql 8778 27 de fevereiro 20:08 colunas_priv.frm
-rw------- 1 mysql mysql 302 27 de fevereiro 20:08 db.MYD
-rw------- 1 mysql mysql 3072 27 de fevereiro 20:08 db.MYI
-rw------- 1 mysql mysql 8982 27 de fevereiro 20:08 db.frm
-rw------- 1 mysql mysql 0 27 de fevereiro 20:08 func.MYD
-rw------- 1 mysql mysql 1024 27 de fevereiro 20:08 func.MYI
-rw------- 1 mysql mysql 8641 27 de fevereiro 20:08 func.frm
-rw------- 1 mysql mysql 0 27 de fevereiro 20:08 host.MYD
-rw------- 1 mysql mysql 1024 27 de fevereiro 20:08 host.MYI
-rw------- 1 mysql mysql 8958 27 de fevereiro 20:08 host.frm
-rw------- 1 mysql mysql 0 27 de fevereiro 20:08 tabelas_priv.MYD
-rw------- 1 mysql mysql 1024 27 de fevereiro 20:08 tabelas_priv.MYI
-rw------- 1 mysql mysql 8877 27 de fevereiro 20:08 tabelas_priv.frm
-rw------- 1 mysql mysql 428 27 de fevereiro 20:08 user.MYD
-rw------- 1 mysql mysql 2048 27 de fevereiro 20:08 user.MYI
-rw------- 1 mysql mysql 9148 27 de fevereiro 20:08 user.frm
Se os proprietários e atributos desses arquivos não forem assim, use os dois comandos a seguir para corrigi-los:
shell>chown -R mysql.mysql /usr/local/mysql/var
shell>chmod -R go-rwx /usr/local/mysql/var
Usar o usuário root para iniciar serviços remotos sempre foi um tabu de segurança, porque se houver um problema com o programa de serviço, é muito provável que um invasor remoto obtenha controle total do host. O MySQL fez pequenas alterações desde a versão 3.23.15. Por padrão, o serviço deve ser iniciado pelo usuário mysql após a instalação e o usuário root não tem permissão para iniciar. Se você precisar usar o usuário root para iniciar, deverá adicionar o parâmetro --user=root (./safe_mysqld --user=root &). Como existem instruções SQL de LOAD DATA INFILE e SELECT... INTO OUTFILE no MySQL, se o usuário root iniciar o servidor MySQL, então o usuário do banco de dados terá a permissão de gravação do usuário root. No entanto, o MySQL ainda tem algumas restrições. Por exemplo, LOAD DATA INFILE só pode ler arquivos legíveis globalmente e SELECT... INTO OUTFILE não pode sobrescrever arquivos existentes.
Os arquivos de log locais não podem ser ignorados, incluindo os logs do shell e os próprios logs do MySQL. Por conveniência ao efetuar login localmente ou fazer backup do banco de dados, alguns usuários às vezes incluem diretamente a senha do banco de dados nos parâmetros da linha de comando, como:
shell>/usr/local/mysql/bin/mysqldump -uroot -ptest teste>test.sql
shell>/usr/local/mysql/bin/mysql -uroot -ptest
Esses comandos serão registrados no arquivo de histórico pelo shell. Por exemplo, o bash gravará o arquivo .bash_history no diretório do usuário. Se esses arquivos forem lidos acidentalmente, a senha do banco de dados será vazada. Os comandos SQL executados após o login do usuário no banco de dados também serão registrados pelo MySQL no arquivo .mysql_history no diretório do usuário. Se o usuário do banco de dados alterar a senha do banco de dados usando instruções SQL, ela também vazará através do arquivo .mysql_history. Portanto, não devemos adicionar a senha diretamente após -p durante o login e backup do shell, mas inserir a senha do banco de dados após o prompt.
Além disso, não devemos permitir que esses dois arquivos registrem nossas operações, apenas por precaução.
shell>rm.bash_history.mysql_history
shell>ln -s /dev/null.bash_history
shell>ln -s /dev/null.mysql_history
Esses dois comandos vinculam esses dois arquivos a /dev/null, portanto nossas operações não serão gravadas nesses dois arquivos.
Segurança de rede externa
Após a instalação do banco de dados MySQL, a tabela de usuários na plataforma Unix fica assim:
mysql> usar mysql;
Banco de dados alterado
mysql> selecione Host,Usuário,Senha,Select_priv,Grant_priv do usuário;
+-----------+------+----------+------------+----- -------+
| Anfitrião | Usuário | Senha |
+-----------+------+----------+------------+----- -------+
|
|
|
|
+-----------+------+----------+------------+----- -------+
4 linhas em conjunto (0,00 seg)
A tabela de usuários na plataforma Windows é semelhante a esta:
mysql> usar mysql;
Banco de dados alterado
mysql> selecione Host,Usuário,Senha,Select_priv,Grant_priv do usuário;
+-----------+------+----------+------------+----- -------+
| Anfitrião | Usuário | Senha |
+-----------+------+----------+------------+----- -------+
|
| % | raiz |
|
|
+-----------+------+----------+------------+----- -------+
4 linhas em conjunto (0,00 seg)
Vejamos primeiro a tabela de usuários na plataforma Unix. Entre eles, redhat é apenas o nome da minha máquina de teste, então, na verdade, o MySQL na plataforma Unix só permite que esta máquina se conecte ao banco de dados por padrão. No entanto, a senha padrão do usuário root está vazia, portanto a prioridade máxima é adicionar uma senha ao usuário root. Existem três maneiras de adicionar uma senha a um usuário de banco de dados:
1) Use o comando mysqladmin no prompt do shell para alterar a senha do usuário root:
shell>mysqladmin -uroot teste de senha
Desta forma, a senha do usuário root do banco de dados MySQL é alterada para test. (o teste é apenas um exemplo, a senha que realmente usamos não deve usar uma senha fraca tão fácil de adivinhar)
2) Use definir senha para modificar a senha:
mysql> definir senha para root@localhost=password('test' );
Neste momento, a senha do usuário root é alterada para teste.
3) Modifique diretamente a senha do usuário root da tabela de usuários:
mysql> usar mysql;
mysql> atualizar conjunto de usuário senha=senha('teste') onde usuário='root';
mysql> privilégios de liberação;
Desta forma, a senha do usuário root do banco de dados MySQL também foi alterada para teste. O último comando, liberar privilégios, significa atualizar à força a tabela de autorização de memória, caso contrário, a senha no cache ainda será usada. Neste momento, usuários ilegais também podem fazer login com o usuário root e uma senha vazia até o servidor MySQL. é reiniciado.
Também vemos o usuário anônimo cujo usuário está vazio. Embora não tenha permissões na plataforma Unix, devemos excluí-lo por motivos de segurança:
mysql> excluir do usuário onde usuário='';