项目进行时-安全整改-docker中的mysql升级
背景项目即将上线使用,上线前的安全扫描测试是必不可少的一道程序,安全等保厂家入场测试。携带的安全设备是一个跟pad模样的设备,使用网线接入设备所在局域网,输入扫描设备的IP地址。然后等待大约半个小时,扫描报告结果直接出具了,使用U盘拷贝了出来。接下来进行安全整改。项目目前是在内网访问,不具备互联网接入条件,整体的处理思路需要基于内网离线升级安装操作。环境CentOS Linux release 7
背景
项目即将上线使用,上线前的安全扫描测试是必不可少的一道程序,安全等保厂家入场测试。携带的安全设备是一个跟pad模样的设备,使用网线接入设备所在局域网,输入扫描设备的IP地址。然后等待大约半个小时,扫描报告结果直接出具了,使用U盘拷贝了出来。接下来进行安全整改。项目目前是在内网访问,不具备互联网接入条件,整体的处理思路需要基于内网离线升级安装操作。
环境
CentOS Linux release 7.9.2009 (Core)
docker 19.03.9
Mysql 5.7.28
个人PC windows 10
漏洞概述
漏洞主要是针对操作系统和数据库的漏洞扫描结果,数据库是
漏洞概述
漏洞详情
评定标准
本次修复对象,中级及以上漏洞
处理构思
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、查看本机镜像
3.5.3、导入镜像
载入镜像
docker load --input mysql5.7.34.tar
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
使用命令启动数据库
使用数据库工具连接
用户赋权访问数据库
分别给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、验证
登陆数据库工具验证
更多推荐
所有评论(0)