MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Como proteger seu banco de dados MySQL ou MariaDB da injeção de SQL:parte um

A segurança é um dos elementos mais importantes do ambiente de banco de dados projetado adequadamente. Existem vários vetores de ataque usados ​​com injeção de SQL sendo provavelmente o mais popular. Você pode projetar camadas de defesa no código do aplicativo, mas o que você pode fazer na camada de banco de dados? Hoje gostaríamos de mostrar como você pode implementar facilmente o firewall SQL em cima do MySQL usando ProxySQL. Na segunda parte deste blog, explicaremos como você pode criar uma lista de permissões de consultas que têm permissão para acessar o banco de dados.

Primeiro, queremos implantar o ProxySQL. A maneira mais fácil de fazer isso é usar o ClusterControl. Com alguns cliques, você pode implantá-lo em seu cluster.

Defina onde implantá-lo, você pode escolher o host existente no cluster ou apenas anote qualquer IP ou nome de host. Defina credenciais para usuários administrativos e de monitoramento.

Então você pode criar um novo usuário no banco de dados para ser usado com ProxySQL ou você pode importar um dos existentes. Você também precisa definir os nós do banco de dados que deseja incluir no ProxySQL. Responda se você usa transações implícitas ou não e está tudo pronto para implantar o ProxySQL. Em alguns minutos, um ProxySQL com configuração preparada com base em sua entrada está pronto para uso.

Dado que nosso problema é a segurança, queremos poder dizer ao ProxySQL como lidar com consultas inadequadas. Vamos dar uma olhada nas regras de consulta, o mecanismo central que governa como o ProxySQL trata o tráfego que passa por ele. A lista de regras de consulta pode ter esta aparência:

Eles estão sendo aplicados a partir do ID mais baixo.

Vamos tentar criar uma regra de consulta que permita apenas consultas SELECT para um determinado usuário:

Estamos adicionando uma regra de consulta no início da lista de regras. Vamos combinar qualquer coisa que não seja SELECTs (observe que Negar Match Pattern está habilitado). A regra de consulta será usada somente quando o nome de usuário for ‘devuser’. Se todas as condições forem atendidas, o usuário verá o erro como no campo “Error Msg”.

[email protected]:~# mysql -u devuser -h 10.0.0.144 -P6033 -ppass

mysql: [Warning] Using a password on the command line interface can be insecure.

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 3024

Server version: 5.5.30 (ProxySQL)



Copyright (c) 2009-2019 Percona LLC and/or its affiliates

Copyright (c) 2000, 2019, 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> create schema myschema;

ERROR 1148 (42000): The query is not allowed

mysql> SELECT 1;

+---+

| 1 |

+---+

| 1 |

+---+

1 row in set (0.01 sec)



mysql> SELECT * FROM sbtest.sbtest1 LIMIT 1\G

*************************** 1. row ***************************

 id: 1

  k: 503019

  c: 18034632456-32298647298-82351096178-60420120042-90070228681-93395382793-96740777141-18710455882-88896678134-41810932745

pad: 43683718329-48150560094-43449649167-51455516141-06448225399

1 row in set (0.00 sec)

Outro exemplo, desta vez tentaremos evitar acidentes relacionados à situação do Bobby Tables.

Com esta regra de consulta em vigor, sua tabela 'students' não ser descartado por Bobby:

mysql> use school;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A



Database changed

mysql> INSERT INTO students VALUES (1, 'Robert');DROP TABLE students;--

Query OK, 1 row affected (0.01 sec)



ERROR 1148 (42000): Only superuser can execute DROP TABLE;

Como você pode ver, Bobby não conseguiu remover nossa tabela de 'alunos'. Ele foi apenas bem inserido na mesa.