项目进行时-安全整改-docker中的mysql升级

背景

项目即将上线使用,上线前的安全扫描测试是必不可少的一道程序,安全等保厂家入场测试。携带的安全设备是一个跟pad模样的设备,使用网线接入设备所在局域网,输入扫描设备的IP地址。然后等待大约半个小时,扫描报告结果直接出具了,使用U盘拷贝了出来。接下来进行安全整改。项目目前是在内网访问,不具备互联网接入条件,整体的处理思路需要基于内网离线升级安装操作。

环境

CentOS Linux release 7.9.2009 (Core)
docker 19.03.9
Mysql 5.7.28
个人PC windows 10

漏洞概述

漏洞主要是针对操作系统和数据库的漏洞扫描结果,数据库是

漏洞概述

项目进行时-安全整改-docker中的mysql升级_第1张图片

漏洞详情

项目进行时-安全整改-docker中的mysql升级_第2张图片

评定标准

项目进行时-安全整改-docker中的mysql升级_第3张图片
本次修复对象,中级及以上漏洞

处理构思

1、确认使用批量操作执行

批量执行的缘由:搭建的集群环境,多台服务器漏洞一样,服务器预安装的为shell和python2,所以本次脚本使用以上两种。

2、下载当前的稳定版本

在本机上下载mysql5.7.34

2、备份数据库

备份除4个mysql数据库自带库以外的其他数据库,将对应的账号信息填写至文件中,拷贝到服务器上,运行即可,建议使用win10的WSL中的ubuntu系统中进行操作。(win10之前的操作为在本机安装一台虚拟机,在虚拟机centos7操作系统中运)

#!/user/bin/python
# -*- coding=utf8 -*-
#
# Copyright : Copyright 2021 Inc
# File      : backupmysql.py
# Introduce :
# 前提:需要安装mysqldump客户端,MySQLdb
# 创建备份文件夹,将文件拷贝至文件夹内,执行
# CentOS Linux release 7.9.2009 (Core)
# Version   : V1.0.1
# Author    : shalter
# Time      : 2021-09-16
import os
# python 3.5以上版本使用
#import pymysql
# python 3.4以下版本使用
import MySQLdb

#数据库信息
mysql_host = ''
mysql_user = ''
mysql_pass = ''
mysql_port = ''
mysql_char = ''
mysql_dir = os.getcwd()

# 打开数据库连接-python2.7
conn = MySQLdb.connect(host=mysql_host,port=mysql_port,user=mysql_user,passwd=mysql_pass,charset=mysql_char)
# 打开数据库连接>python3.4
#conn = pymysql.connect(host=mysql_host,port=mysql_port,user=mysql_user,passwd=mysql_pass,charset=mysql_char)
# 使用cursor()方法创建一个游标对象cursor
cursor = conn.cursor()
# 查询数据库
sql_db = "show databases;"
# 执行查询
cursor.execute(sql_db)
#声明数据库列表
db_list = []
#循环数据库
for i in cursor.fetchall():
    db_list.append(i[0])
# 显示查询的数据库的数量
print('共查询到: ', cursor.rowcount-4, '个数据库。')
# 打印查询到的数据库
##print(db_list)
# 系统数据库列表
sys_db_list = ['information_schema','mysql','performance_schema','sys']
# 除去系统自带的数据库
db_list_p = list(set(db_list) - set(sys_db_list))
print(db_list_p)
for db_name in db_list_p:
    cmd_bak = 'mysqldump -h ' + mysql_host + ' -P ' + str(mysql_port) + ' -u ' + mysql_user + ' -p' + mysql_pass + ' ' + db_name + ' > ' + mysql_dir + '/' + db_name + '.sql'
    os.system(cmd_bak)
# 关闭游标对象cursor
cursor.close()
#关闭数据库连接
conn.close()

执行后会按数据库名称格式生成sql文件,db_name.sql,压缩备份

3、升级数据库

3.1、下载mysql5.7.34版本

本机编写docker-compose.yaml文件,安装mysql,docker-compose.yaml文件内容如下:

version: "2"
services:
  mysql-db:
    restart: always
    container_name: mysql5.7.34
    image: mysql/mysql-server:5.7
    ports:
      - "3307:3306"
    environment:
      - MYSQL_USER=user
      - MYSQL_PASSWORD=user_passwd
      - MYSQL_ROOT_PASSWORD=root_Passwd
      - MYSQL_DATABASE=db_name
    volumes:
      - /data/docker/mysql/data:/data
      - /data/docker/mysql/my.cnf:/etc/mysql/my.cnf
      - /data/docker/mysql/var/lib/mysql:/var/lib/mysql
      - /data/docker/mysqlBackup:/data/mysqlBackup

3.2、运行数据库

切换到该文件所在目录,运行

$docker-compose up -d

3.3、使用工具连接数据库验证

使用数据库工具连接,确保下载打开的没有问题

3.4、数据库镜像打包

# 查看镜像
$docker images
# 打包镜像
$docker save -o mysql5.7.34.tar mysql/mysql-server

操作完毕会在本级目录下生成一个mysql5.7.34.tar的压缩包。
使用xshell自带sftp工具将数据库拷贝至本机。

3.5、将打包镜像拷贝至升级服务器

3.5.1、上传镜像

查看安装镜像包
在这里插入图片描述

3.5.2、查看本机镜像

项目进行时-安全整改-docker中的mysql升级_第4张图片

3.5.3、导入镜像

载入镜像

docker load --input mysql5.7.34.tar

项目进行时-安全整改-docker中的mysql升级_第5张图片

3.5.4、查看导入

$docker images

在这里插入图片描述

3.5.5、启动数据库

创建文件夹

#!/bin/bash
mkdir -p /data/docker/mysql/data
mkdir -p /data/docker/mysql/var/lib/mysql
mkdir -p /data/docker/mysqlBackup

使用命令启动数据库
项目进行时-安全整改-docker中的mysql升级_第6张图片

使用数据库工具连接
项目进行时-安全整改-docker中的mysql升级_第7张图片
项目进行时-安全整改-docker中的mysql升级_第8张图片

用户赋权访问数据库
分别给db_name数据库赋权

# 给用户赋所有权限
mysql> grant all privileges on db_name.* to "user"@"%" identified by "user_pass";

# 刷新权限
mysql> flush privileges;  

4、还原数据库

4.1、拷贝数据库文件

将压缩备份的数据库拷贝至服务器目录

4.2 、执行还原

运行python脚本还原数据库

#!/user/bin/python
# -*- coding=utf8 -*-
#
# Copyright : Copyright 2021 Inc
# File      : backupmysql.py
# Introduce :
# 前提:需要安装mysqldump客户端
# 创建备份文件夹,将文件拷贝至文件夹内,执行
# CentOS Linux release 7.9.2009 (Core)
# Version   : V1.0.1
# Author    : shalter
# Time      : 2021-09-16
import os
import sys
import MySQLdb
#数据库信息
mysql_host = ''
mysql_user = ''
mysql_pass = ''
mysql_port = ''
mysql_char = ''
mysql_dir = os.getcwd()

# 打开数据库连接-python2.7
conn = MySQLdb.connect(host=mysql_host,port=mysql_port,user=mysql_user,passwd=mysql_pass,charset=mysql_char)
# 打开数据库连接>python3.4
#conn = pymysql.connect(host=mysql_host,port=mysql_port,user=mysql_user,passwd=mysql_pass,charset=mysql_char)
# 使用cursor()方法创建一个游标对象cursor
cursor = conn.cursor()
# 查询数据库
sql_db = "show databases;"
# 执行查询
cursor.execute(sql_db)
#声明数据库列表
db_list = []
#循环数据库
for i in cursor.fetchall():
    db_list.append(i[0])
# 显示查询的数据库的数量
print('共查询到: ', cursor.rowcount-4, '个数据库。')
# 打印查询到的数据库
##print(db_list)
# 系统数据库列表
sys_db_list = ['information_schema','mysql','performance_schema','sys']
# 除去系统自带的数据库
db_list_p = list(set(db_list) - set(sys_db_list))
# 打印除系统以外的数据库
print(db_list_p)
for db_name in db_list_p:
    del_db_sql = 'drop database ' + db_name + ';'
    print(del_db_sql)
    # 删除现有的数据库
    #cursor.execute(del_db_sql)
    #os.system(del_db_sql)
    #cmd_bak = 'mysqldump -h ' + mysql_host + ' -P ' + str(mysql_port) + ' -u ' + mysql_user + ' -p' + mysql_pass + ' ' + db_name + ' > ' + mysql_dir + '/' + db_name + '.sql'
    #os.system(cmd_bak)
for root,dirs,files in os.walk(mysql_dir,topdown=True):
  for name in files:
    #print(name)
    if name[-3:] == "sql":
      #print(name)  
      print("===========创建: " + name[:-4] + " 数据库============")
      create_db = 'mysqladmin -u ' + mysql_user + ' -p' + mysql_pass + ' create ' + name[:-4]
      print(create_db)
      print("===========还原:"+ name[:-4] + "数据库============")
      recever_db = 'mysql -u ' + mysql_user + ' -P ' + str(mysql_port) + ' -p ' + mysql_pass + ' ' +  name[:-4] + ' < ' + mysql_dir + '/' + name
      print(recever_db)

# 关闭游标对象cursor
cursor.close()
#关闭数据库连接
conn.close()

4.3、验证

登陆数据库工具验证

你可能感兴趣的:(服务器环境搭建,docker,mysql,数据库)