如何在 Linux VPS 上保护 MySQL 和 MariaDB 数据库

news2024/10/27 11:08:29

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

简介

有许多在 Linux 和类 Unix 系统上可用的 SQL 数据库语言实现。MySQL 和 MariaDB 是在服务器环境中部署关系型数据库的两个流行选项。

然而,像大多数软件一样,如果配置不正确,这些工具可能成为安全隐患。本教程将指导您完成一些基本步骤,以确保您的 MariaDB 或 MySQL 数据库安全,并确保它们不会成为您的 VPS 的后门。

为了简单和说明的目的,我们将在 Ubuntu 12.04 VPS 实例上使用 MySQL 服务器。然而,这些技术也适用于其他 Linux 发行版,并且也可以用于 MariaDB。

初始设置

在安装过程中,MySQL 会要求您设置 root 密码。

sudo apt-get install mysql-server

您随时可以在以后设置 root 密码,但没有理由跳过此步骤,因此您应该从一开始就保护好管理员帐户。

安装完成后,我们应该运行一些包含的脚本。首先,我们将使用 “mysql_install_db” 脚本为我们的数据库创建一个目录布局。

sudo mysql_install_db

接下来,运行名为 “mysql_secure_installation” 的脚本。这将引导我们完成一些程序,以删除一些在生产环境中使用的危险默认设置。

sudo mysql_secure_installation

安全注意事项

保护 MySQL(以及几乎任何其他系统)的总体主题是只有在绝对必要时才授予访问权限。您的数据安全有时取决于方便和安全之间的平衡。

在本指南中,我们将倾向于安全一侧,尽管您对数据库软件的具体使用可能会导致您从这些选项中进行选择。

通过 My.cnf 文件实现安全

MySQL 的主要配置文件是一个名为 “my.cnf” 的文件,它位于 Ubuntu 的 “/etc/mysql/” 目录和其他一些 VPS 的 “/etc/” 目录中。

我们将更改此文件中的一些设置以锁定我们的 MySQL 实例。

以 root 权限打开文件。如果您在不同的系统上按照本教程操作,请根据需要更改目录路径:

sudo nano /etc/mysql/my.cnf

我们应该检查的第一个设置是 “[mysqld]” 部分中的 “bind-address” 设置。此设置应设置为您的本地回环网络设备,即 “127.0.0.1”。

bind-address = 127.0.0.1

这确保了 MySQL 除了本地机器外不接受任何连接。

如果您需要从另一台机器访问此数据库,请考虑通过 SSH 进行连接,以在本地进行数据库查询和管理,并通过 ssh 隧道发送结果。

我们将要修补的下一个漏洞是允许从 MySQL 中访问底层文件系统的功能。这可能会带来严重的安全问题,除非绝对需要,否则应该关闭。

在文件的相同部分,我们将添加一个指令来禁用此功能以加载本地文件:

local-infile=0

这将禁止没有文件级别权限的用户从文件系统加载文件。

如果我们有足够的空间,并且不是在操作大型数据库,记录额外信息可以帮助我们监视可疑活动。

记录太多可能会导致性能下降,因此这是您需要仔细权衡的事情。

您可以在我们一直在添加的同一个 “[mysqld]” 部分内设置日志变量。

log=/var/log/mysql-logfile

确保 MySQL 日志、错误日志和 mysql 日志目录不是全局可读的:

sudo ls -l /var/log/mysql*

从内部保护 MySQL

在使用 MySQL 时,有许多步骤可以提高安全性。

我们将在本节中将命令输入到 MySQL 提示界面中,因此我们需要登录。

mysql -u root -p

您将被要求输入您之前设置的 root 密码。

保护密码和主机关联

首先,确保 MySQL 中没有没有密码或主机关联的用户:

SELECT User,Host,Password FROM mysql.user;

如您所见,在我们的示例设置中,用户 “demo-user” 没有密码,并且无论他在哪个主机上都是有效的。这是非常不安全的。

我们可以使用以下命令为用户设置密码。将 “newPassWord” 更改为您希望分配的密码。

UPDATE mysql.user SET Password=PASSWORD('<span class="highlight">newPassWord</span>') WHERE User="<span class="highlight">demo-user</span>";

如果我们再次检查用户表,我们将看到演示用户现在有了密码:

SELECT User,Host,Password FROM mysql.user;

如果我们的表中包含任何空白用户(在这一点上不应该有,因为我们运行了 “mysql_secure_installation”,但我们仍将介绍这一点),我们应该将它们删除。

要做到这一点,我们可以使用以下调用从访问表中删除空白用户:

DELETE FROM mysql.user WHERE User="";

在修改用户表后,我们需要输入以下命令以实施新的权限:

FLUSH PRIVILEGES;

实施特定于应用程序的用户

与在 Linux 中作为独立用户运行进程的做法类似,MySQL 也受益于相同类型的隔离。

使用 MySQL 的每个应用程序应该有自己的用户,该用户只具有有限的权限,并且只能访问它需要运行的数据库。

当我们配置新应用程序使用 MySQL 时,我们应该创建该应用程序所需的数据库:

create database <span class="highlight">testDB</span>;

接下来,我们应该创建一个用户来管理该数据库,并仅分配它所需的权限。这将根据应用程序而异,有些用途需要比其他用途更开放的权限。

要创建新用户,请使用以下命令:

CREATE USER '<span class="highlight">demo-user</span>'@'localhost' IDENTIFIED BY '<span class="highlight">password</span>';

我们可以使用以下命令为新表授予新用户权限。有关特定权限的更多信息,请参阅 如何在 MySQL 中创建新用户并授予权限 教程:

GRANT <span class="highlight">SELECT,UPDATE,DELETE</span> ON <span class="highlight">testDB</span>.* TO '<span class="highlight">demo-user</span>'@'localhost';

例如,如果以后需要从帐户中撤销更新权限,可以使用以下命令:

REVOKE <span class="highlight">UPDATE</span> ON <span class="highlight">testDB</span>.* FROM '<span class="highlight">demo-user</span>'@'localhost';

如果我们需要在某个数据库上拥有所有权限,我们可以使用以下命令指定:

GRANT ALL ON <span class="highlight">testDB</span>.* TO '<span class="highlight">demo-user</span>'@'localhost';

要显示用户的当前权限,我们首先必须使用 “flush privileges” 命令实施我们指定的权限。然后,我们可以查询用户拥有的授权:

FLUSH PRIVILEGES;
show grants for '<span class="highlight">demo-user</span>'@'localhost';

完成更改后,始终刷新权限。

更改根用户

您可能想要采取的另一个步骤是更改根登录名。如果攻击者试图访问根 MySQL 登录,他们将需要执行找到用户名的额外步骤。

可以使用以下命令更改根登录名:

rename user 'root'@'localhost' to '<span class="highlight">newAdminUser</span>'@'localhost';

我们可以使用与我们一直在使用的用于用户数据库的相同查询来查看更改:

select user,host,password from mysql.user;

同样,我们必须刷新权限以使这些更改生效:

FLUSH PRIVILEGES;

请记住,从现在开始,当您希望执行管理任务时,您将需要以新创建的用户名登录到 MySQL:

mysql -u <span class="highlight">newAdminUser</span> -p

结论

尽管这绝不是 MySQL 和 MariaDB 安全实践的详尽清单,但它应该为您提供了一个很好的介绍,让您了解在保护数据库时需要做出的决策类型。

有关配置和安全性的更多信息可以在 MySQL 和 MariaDB 网站以及它们各自的 man 页面中找到。您选择使用的应用程序也可能提供安全建议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSH的物流运输货运车辆管理系统源码

基于经典的ssh&#xff08;Spring Spring MVC Hibernate&#xff09;框架与SaaS&#xff08;软件即服务&#xff09;模式&#xff0c;我们为运输企业与物流公司打造了一款开源且易用的车辆管理系统。 该系统主要包含以下核心模块&#xff1a; 档案管理 财务管理 借款管理 保…

研究生论文学习记录

文献检索 检索论文的网站 知网&#xff1a;找论文&#xff0c;寻找创新点paperswithcode &#xff1a;这个网站可以直接找到源代码 直接再谷歌学术搜索 格式&#xff1a;”期刊名称“ 关键词 在谷歌学术搜索特定期刊的关键词相关论文&#xff0c;可以使用以下几种方法&#…

【最全基础知识2】机器视觉系统硬件组成之工业相机镜头篇--51camera

机器视觉系统中,工业镜头作为必备的器件之一,须和工业相机搭配。工业镜头是机器视觉系统中不可或缺的重要组成部分,其质量和性能直接影响到整个系统的成像质量和检测精度。 目录 一、基本功能和作用 二、分类 1、按成像方式分 2、按焦距分 3、按接口类型分 4、按应用…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-22

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-22 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-22目录1. PoisonedRAG: Knowledge corruption attacks to retrieval-augmented generation of large language models摘要创新点…

【数据结构】双指针算法:理论与实战

双指针&#xff08;Two Pointers&#xff09;是一种经典的算法思想&#xff0c;广泛应用于数组、链表等数据结构的处理。该方法通过设置两个指针&#xff0c;在某种规则下移动指针来实现高效的计算与查找。这种算法相比传统的嵌套循环能显著优化时间复杂度&#xff0c;通常能够…

python读取学术论文PDF文件内容

目录 1、PyPDF22、pdfplumber3、PyMuPDF4、pdfminer总结 1、PyPDF2 PyPDF2 是一个常用的库&#xff0c;可以用来读取、合并、分割和修改PDF文件。读取pdf内容&#xff1a; import PyPDF2# 打开PDF文件 with open(ELLK-Net_An_Efficient_Lightweight_Large_Kernel_Network_for…

ThriveX 现代化博客管理系统

ThriveX 现代化博客管理系统 &#x1f389; &#x1f525; 首先最重要的事情放第一 开源不易&#xff0c;麻烦占用 10 秒钟的时间帮忙点个免费的 Star&#xff0c;再此万分感谢&#xff01; 下面开始进入主题↓↓↓ &#x1f308; 项目介绍&#xff1a; Thrive 是一个简而不…

行为设计模式 -责任链模式- JAVA

责任链设计模式 一 .简介二. 案例2.1 抽象处理者(Handler)角色2.2 具体处理者(ConcreteHandler)角色2.3 测试 三. 结论3.1 优缺点3.2 示例3.3 要点 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神…

xxl-job java.sql.SQLException: interrupt问题排查

近期生产环境固定凌晨报错&#xff0c;提示 ConnectionManager [Thread-23069] getWriteConnection db:***,pattern: error, jdbcUrl: jdbc:mysql://***:3306/***?connectTimeout3000&socketTimeout180000&autoReconnecttrue&zeroDateTimeBehaviorCONVERT_TO_NUL…

面试域——岗位职责以及工作流程

摘要 介绍互联网岗位的职责以及开发流程。在岗位职责方面&#xff0c;详细阐述了产品经理、前端开发工程师、后端开发工程师、测试工程师、运维工程师等的具体工作内容。产品经理负责需求收集、产品规划等&#xff1b;前端专注界面开发与交互&#xff1b;后端涉及系统架构与业…

本地缓存库分析(一):golang-lru

文章目录 本地缓存概览golang-lru标准lrulru的操作PutGet 2q&#xff1a;冷热分离lruPutGet expirable_lru&#xff1a;支持过期时间的lruPutGet过期 总结 本地缓存概览 在业务中&#xff0c;一般会将极高频访问的数据缓存到本地。以减少网络IO的开销&#xff0c;下游服务的压…

【OpenAI】第五节(图像生成)利用 OpenAI 的 DALL·E 实现自动化图像生成:从文本到图像的完整教程

引言 OpenAI 推出的 DALLE 工具因其能够生成令人惊叹的艺术作品而备受瞩目。DALLE 不仅能够生成静态图像&#xff0c;还能根据用户的需求进行风格化处理&#xff0c;创造出独特的艺术作品。通过 OpenAI 的 API&#xff0c;你可以轻松将 DALLE 的强大功能集成到你的 Python 程序…

基于SSM的智慧篮球馆预约系统

前言 近些年&#xff0c;随着中国经济发展&#xff0c;人民的生活质量逐渐提高&#xff0c;对网络的依赖性越来越高&#xff0c;通过网络处理的事务越来越多。随着智慧篮球馆预约的常态化&#xff0c;如果依然采用传统的管理方式&#xff0c;将会为工作人员带来庞大的工作量&a…

Linux中C/C++程序编译过程与动静态链接库概述

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

qt QMainWindow详解

一、概述 QMainWindow继承自QWidget&#xff0c;并提供了一个预定义的布局&#xff0c;将窗口分成了菜单栏、工具栏、状态栏和中央部件区域。这些区域共同构成了一个功能丰富的主窗口&#xff0c;使得应用程序的开发更加简单和高效。 二、QMainWindow的常用组件及功能 菜单栏&…

【Java网络编程】从套接字(Socket)概念到UDP与TCP套接字编程

目录 网络编程 1.socket套接字 2.udp数据报套接字编程 DatagramSocket API DatagramPacket API Java基于UDP实现客户端-服务器代码实例 3.tcp流套接字编程 ServerSocket API Socket API TCP中的长短连接 Java基于TCP客户端-服务器代码实例 网络编程 1.socket套接字 S…

云对象存储进阶

《使用Minio搭建文件服务器》一文对minio作了简单的介绍&#xff0c;本文为进阶学习。 1.对象存储产品介绍 目前市场上流行各种对象存储服务&#xff0c;诸如以下&#xff1a; Amazon S3&#xff1a;亚马逊提供的服务&#xff0c; 是市场上最成熟的产品&#xff0c;拥有最大的…

ATom:2016-2018 年沿飞行轨迹的 CAM-chem/CESM2 模型输出

目录 简介 摘要 代码 引用 网址推荐 知识星球 机器学习 ATom: CAM-chem/CESM2 Model Outputs Along Flight Tracks, 2016-2018 ATom&#xff1a;2016-2018 年沿飞行轨迹的 CAM-chem/CESM2 模型输出 简介 该数据集包含沿 ATom 飞行轨迹的 CAM-chem&#xff08;带化学的…

[ARM-2D 专题]5 MDK编译器一个旧版本-Ofast优化bug的问题及解决办法

最近开始大量基于ARM-2D开发应用项目&#xff0c;为了达到最佳性能&#xff0c;我们使用了编译器的许多特殊技能&#xff0c;其中就包含了-Ofast优化&#xff0c;很不幸&#xff0c;一不小心踩坑了。 案发情况如下&#xff1a; 使用的MDK版本5.36&#xff0c;编译器6.16 优化选…

在GeoTools中的Shapefile属性表读取效率之Shp与Dbf对比

目录 前言 一、POI测试数据简介 1、选用的POI数据 2、关于数据的属性数据 二、属性数据读取的两种方式实现 1、基于DbaseFileReader的读取 2、基于SimpleFeatureSource的读取 三、实际运行对比 1、内存和CPU占用情况 2、运行耗时情况 四、总结 前言 众所周知&#x…