精华内容
下载资源
问答
  • MySql安全

    2018-08-08 17:59:34
    MySQL安全 Mysql配置文件:linux系统下是my.conf,windows环境下是my.ini; 数据库整体安全需求:机密性、完整性、可用性; 1、操作系统级别安全配置 1.1不要将数据库放在系统分区 Windows系统: 直接检查是否...

    MySQL安全

    Mysql配置文件:linux系统下是my.conf,windows环境下是my.ini;

    数据库整体安全需求:机密性、完整性、可用性;

    1、操作系统级别安全配置

    1.1不要将数据库放在系统分区

    Windows系统:

    直接检查是否将数据库放置在C盘。

    Linux系统:

    在终端连接上mysql数据库,执行如下命令:

    show variables where variable_name = 'datadir';

    然后返回shell命令行:

    df -h <datadir>

    其中datadir是上一条命令的返回值。

    上述命令的返回值不应是/、/var、/usr

     

    1.2使用专用的最小权限账号运行mysql数据库进程

    Windows系统:

    直接打开任务管理器,查看运行mysql进程的操作系统账号,不能为administrator账号。

    Linux系统:

    Shell命令行运行如下命令:

    ps -ef | grep mysql

    查看mysql服务的运行账号是否为root或其他高权限账号,如果是的,则需要创建一个非管理员专用账号来运行mysql服务。

     

    1.3禁止使用mysql命令行历史记录( . mysql_history)

    Linux系统:

    执行如下命令:

    find / -name ".mysql_history"

    查看是否存在mysql的历史命令记录文件,如果存在,则需要进行如下加固:

    (1)删除.mysql_history文件;

    (2)设置环境变量MYSQL_HISTFILE为/dev/null,并添加到shell的初始化脚本中,创建mysql_history到/dev/null的链接:

    ln -s /dev/null $HOME/.mysql_history

    查看历史命令方法:

    history

    命令行历史记录: /root/.bash_history

    mysql数据库操作历史记录:/root/.mysql_history

     

    1.4 确保MYSQL_PWD环境变量未设置敏感信息

    Linux系统下使用如下命令:

    grep MYSQL_PWD /proc/*/environ

    查看MYSQL_PWD环境变量是否设置了敏感信息。

    确认那个配置文件或脚本设置了MYSQL_PWD环境变量。

     

    2、安装

    2.1使用数据库专用服务器

    使用专用的服务器安装mysql服务可以减少mysql服务的攻击面,尽量卸载或删除操作系统上的不必要的应用或服务,减少其他应用的安装可能给mysql的运行带来的安全风险。

    2.2 不要复用数据库账号

    运行mysql服务的操作系统账号不要用来运行其他应用或服务,这样可以避免其他应用或服务器被攻击给mysql服务带来影响。

    2.3 历史命令行密码设置为不可见

    使用如下命令:

    mysql -u admin -p password

    连接mysql数据库服务,退出后查看历史命令,确认password是否为明文。

    建议使用如下命令方式登录:

    (1)先输入mysql -u admin -p

    (2)根据命令行提示输入密码;

    而不要在一整条命令中输入密码。

    另外要控制mysql配置文件访问权限。

     

    3、文件权限控制

    3.1 控制数据目录的访问权限

    数据目录是mysql数据库存放的位置,在mysql命令行界面下执行如下命令:

    show variables where variable_name = 'datadir';

    在终端命令行下执行如下命令:

    ll <datadir>

    如果存在问题,linux环境下在终端执行如下命令进行加固:

    chmod 700 <datadir>

    chown mysql:mysql <datadir>

     

    3.2 控制二进制日志文件的权限

    mysql的运行会产生很多日志,例如二进制日志、错误日志、慢查询日志等等,Mysql命令行下执行如下命令:

    show variables like 'log_bin_basename';

    ll <log_bin_basename>.*

    根据输出确认日志文件的权限设置是否存在问题。

    对于每个日志文件,修改其权限和属组如下:

    chmod 660 <log file>

    chown mysql:mysql <log file>

     

    3.3 控制错误日志文件的权限

    Mysql命令行下执行如下命令:

    show variables like 'log_error';

    在终端命令行执行如下命令:

    ll <log_error>.*

    对于每个日志文件,修改其权限和属组如下:

    chmod 660 <log file>

    chown mysql:mysql <log file>

     

    3.4控制慢查询日志文件的权限

    Mysql命令行下执行如下命令:

    show variables like 'slow_query_log_file';

    在终端命令行执行如下命令:

    ll <slow_query_log_file>

    对于每个日志文件,修改其权限和属组如下:

    chmod 660 <log file>

    chown mysql:mysql <log file>

     

    3.5控制通用日志文件的权限

    Mysql命令行下执行如下命令:

    show variables like 'general_log_file';

    对于每个日志文件,修改其权限和属组如下:

    chmod 660 <log file>

    chown mysql:mysql <log file>

     

    3.6控制审计日志文件的权限

    Mysql命令行下执行如下命令:

    show global variables where variable_name =  'audit_log_file';

    对于每个日志文件,修改其权限和属组如下:

    chmod 660 <audit_log_file>

    chown mysql:mysql <audit_log_file>

     

    4、通用安全

    4.1安装最新的补丁

    在mysql命令行下查询MySQL的版本:

    SHOW VARIABLES WHERE Variable_name LIKE "version";

    或者 select version();

    确认是否由需要安装的补丁包,如果有请安装。

     

    4.2 删除test数据库

    Mysql数据库默认安装好后,存在一个名为test的数据库,如果存在,请执行如下命令删除:

    drop database “test”

     

    4.3 确保读取本地文件的参数设置为失效

    Mysql命令行下,使用如下命令:

    SHOW VARIABLES WHERE Variable_name = 'local_infile';

    查看结果是否为OFF。

    如果该命令为ON,则数据库用户可以通过LOAD DATA INFILE 或者 SELECT local_file 读取到数据库所在操作系统本地的文件,在这种情况下,需要在mysql配置文件中新增一行:

    Local-infile=0

    然后重启数据库服务。

     

    5、权限配置

    5.1控制可以访问所有数据库的账号

    Mysql数据库下的user表和db表中存放着可以授予数据库用户的权限,确保只有管理员账号才能访问所有数据库。

    使用如下sql语句:

    SELECT user, host FROM mysql.user

    WHERE (Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y')

    OR (Delete_priv = 'Y')  OR (Create_priv = 'Y')  OR (Drop_priv = 'Y');

    SELECT user, host FROM mysql.db WHERE db = 'mysql'

    AND ((Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y')

    OR (Delete_priv = 'Y') OR (Create_priv = 'Y') OR (Drop_priv = 'Y'));

    确保返回结果只能是数据库管理员账号。

     

    5.2限制非管理员用户的权限

    Mysql.user表中的权限列有:

    file_priv:表示是否允许用户读取数据库所在主机的本地文件;

    Process:表示是否允许用户查询所有用户的命令执行信息;

    Super_priv:表示用户是否有设置全局变量、管理员调试等高级别权限;

    Shutdown_priv:表示用户是否可以关闭数据库;

    Create_user_priv:表示用户是否可以创建或删除其他用户;

    Grant_priv:表示用户是否可以修改其他用户的权限;

    应确保只有数据库管理员才有上述权限,使用如下sql语句查看拥有各个权限的数据库账号:

    select user, host from mysql.user where File_priv = 'Y';

    select user, host from mysql.user where Process_priv = 'Y';

    select user, host from mysql.user where Process_priv = 'Y';

    SELECT user, host FROM mysql.user WHERE Shutdown_priv = 'Y';

    SELECT user, host FROM mysql.user WHERE Create_user_priv = 'Y';

    SELECT user, host FROM mysql.user WHERE Grant_priv = 'Y';

    SELECT user, host FROM mysql.db WHERE Grant_priv = 'Y';

    确保查询结果中不存在非管理员用户。

    如果存在非管理员用户,使用如下命令进行权限回收:

    REVOKE FILE ON *.* FROM '<user>';

    REVOKE PROCESS ON *.* FROM '<user>';

    REVOKE SUPER ON *.* FROM '<user>';

    REVOKE SHUTDOWN ON *.* FROM '<user>';

    REVOKE CREATE USER ON *.* FROM '<user>';

    REVOKE GRANT OPTION ON *.* FROM <user>;

    其中user为上述查询到的非管理员用户。

     

    5.3合理控制DML/DDL操作授权

    创建用户并授权语句:

    grant select,insert,update,delete on base.* to base@localhost Identified by "123456";

    DML/DDL语句包括创建或修改数据库结构的权限,例如insert、update、delete、create、drop和alter语句,在任何数据库中都要控制用户的此类权限,确保只授权给有业务需求的非管理员用户。Mysql命令行下执行如下命令:

    SELECT User,Host,Db FROM mysql.db WHERE Select_priv='Y'

    OR Insert_priv='Y' OR Update_priv='Y' OR Delete_priv='Y' OR Create_priv='Y'

    OR Drop_priv='Y' OR Alter_priv='Y';

    上述查询到的用户只能对特地的数据库才有相关的权限,使用如下命令进行相关权限的回收:

    REVOKE SELECT ON <host>.<database> FROM <user>;

    REVOKE INSERT ON <host>.<database> FROM <user>;

    REVOKE UPDATE ON <host>.<database> FROM <user>;

    REVOKE DELETE ON <host>.<database> FROM <user>;

    REVOKE CREATE ON <host>.<database> FROM <user>;

    REVOKE DROP ON <host>.<database> FROM <user>;

    REVOKE ALTER ON <host>.<database> FROM <user>;

    其中<user>为查询到的未授权的用户,host为相关主机,database为相关数据库。

     

    6、审计和日志

    6.1开启错误日志审计功能

    错误日志包括数据库运行和停止过程中的一系列活动信息,有助于分析数据库运行过程中的一些异常活动,一般情况下需要开启错误日志记录功能,使用如下命令查询:

    SHOW variables LIKE 'log_error';

    确保返回结果为非空,如果为空,需要在mysql数据库配置文件中增加相关配置。

     

    6.2确保日志存放在非系统区域

    日志文件随着数据库的运行会不断增加,如果存放在系统区域,则会影响系统的正常运行,使用如下命令进行查询:

    SELECT @@global.log_bin_basename;

    确保返回结果不是如下路径:/、/var、/usr

     

    6.3关闭原始日志功能

    原始日志选项会决定一些敏感信息是否会被明文写进日志中,例如查询日志、慢查询日志、二进制日志,确保数据库配置文件中存在如下配置项:

    Log-raw = OFF

     

    7、认证

    7.1 Old_passwords环境变量设置

    Old_passwords决定了使用PASSWORD()函数和IDENTIFIED BY 、CREATE USER 、GRANT 等语句是时的hash算法:

    0 - authenticate with the mysql_native_password plugin

    1 - authenticate with the mysql_old_password plugin

    2 - authenticate with the sha256_password plugin

    设置为mysql_old_password代表弱hash算法,可以快速通过密码字典进行暴力破解。使用如下命令查询相关值:

    SHOW VARIABLES WHERE Variable_name = 'old_passwords';

    确保返回值不为1。

     

    7.2 密码保存

    确保密码没有明文保存在全局配置文件中。

     

    7.3 确保所有用户都要求使用非空密码登录

    执行如下语句查询是否有用户不需要密码即可登录:

    SELECT User, Password,host

    FROM mysql.user

    WHERE (plugin IN('mysql_native_password', 'mysql_old_password')

    AND (LENGTH(Password) = 0

    OR Password IS NULL))

    OR (plugin='sha256_password' AND LENGTH(authentication_string) = 0);

     

    7.5不存在空账号

    使用如下命令查询是否存在空账号:

    SELECT user,host FROM mysql.user WHERE user = '';

     

    8、网络设置

    如果mysql数据库服务器与应用是跨信任域部署的,则需要考虑在数据库服务器与应用服务器之间建立ssl通道进行数据传输。

     

    9、定期备份数据库

    任何系统都有可能发生灾难。服务器、MySQL也会崩溃,也有可能遭受入侵,数据有可能被删除,所以数据库一定要定期备份。

    导入数据库

    /usr/bin/mysql -h*** -uroot -p changzhou_random < /app/backupsql/tb_place.sql

    备份数据库

    /usr/bin/mysqldump -h*** -uroot -p changzhou_random>/app/backupsql/changzhou_random_20171024.sql

    /usr/bin/mysqldump -h*** -uroot -p hunan_randomnew>/home/www/backupsql/hunan_randomnew_20180131.sql

    按条件备份数据表

    mysqldump -h*** -uroot -p hunan_randomnew tb_taiji_company --where=" id between 10001 and 20000">D:\phpStudy\company2.sql

    展开全文
  • MySQL安全

    2017-09-23 09:20:45
    任何想要在连接到公网的计算机上使用MySQL的人都应该阅读本节,以避免最常见的安全错误。 在讨论安全性时,有必要考虑完全保护整个服务器主机,而不仅仅是MySQL服务器,以防止所有类型的攻击:窃听,更改,重放和...

    1. 安全准则

    任何想要在连接到公网的计算机上使用MySQL的人都应该阅读本节,以避免最常见的安全错误。

    在讨论安全性时,有必要考虑完全保护整个服务器主机,而不仅仅是MySQL服务器,以防止所有类型的攻击:窃听,更改,重放和拒绝服务。我们并不涵盖可用性和容错的所有方面。


    MySQL使用基于访问控制列表(ACL)的安全策略管理所有的连接、查询以及用户尝试执行的其它操作。MySQL还支持客户端和服务器之间的SSL加密连接。这里讨论的许多概念并不仅仅是针对MySQL的,而是几乎适用于所有应用程序的。


    运行MySQL时,请遵循以下准则:

    ● 不要给除了root账号以外的任何人访问mysql.user表的权限!这是至关重要的。


    ● 了解MySQL访问权限系统的工作原理。使用grant和revoke语句来控制对MySQL的访问。不要授予比必要更多的权限。决不授予所有主机的访问权限。

    检查清单:

            ■ 运行mysql -u root. 如果不需要密码即可连接成功,那么任何人都可以以root账号的身份连接到你的MySQL服务器;

            ■ 使用show grants语句来检查所有账号的权限。然后使用revoke语句删除那些不必要的访问权限;


    ● 不要在你的数据库中存储明文密码。因为如果你的计算机遭到入侵,那么入侵者可以获取完整的密码列表并使用它们。相反,使用SHA2()或其它单向散列函数并存储散列值。


    要防止使用彩虹表进行密码恢复,请勿直接在普通密码上使用这些函数;而是应该选择一些字符串作为salt,并使用hash ( hash ( password ) + salt)的值。


    ● 不要从字典中选择密码。因为存在破解密码的特殊程序。即使像"xfish98"这样的密码也很糟糕。更好的是"duag98",它包含的也是单词"fish",但在标准键盘上取了"fish"中每个字母左侧的那个字母。另一种方法是使用句子中每个单词的首字母提取的密码(例如,"Four score and seven years ago"的密码是"Fsasya")。这样的密码很容易记住和键入,但对于不知道句子的人却很难猜出。而且,你还可以用数字取代数字单词,以获得短语"4 score and 7 years ago",从而产生密码"4sa7ya",这更难以猜测。


    ● 投资于防火墙。这可以保护你免受来自各种软件所有类型漏洞中至少50%的伤害。将MySQL放在防火墙后面或放在非军事区域(DMZ)中。

    检查清单:

            ■ 尝试使用nmap等工具从Internet上扫描你的端口。MySQL的默认端口为3306。这个端口不应该能够被不受信任的主机所访问,即不受信任的主机应不能访问此端口。检查你的MySQL端口是否打开的一个简单方法是,尝试从一些远程计算机上执行以下命令,其中server_host是运行MySQL服务器的主机的主机名或IP地址

    如果telnet挂起或连接被拒绝,那么说明端口被限制了,这就是期望的结果。如果连接成功并收到一些垃圾字符,则说明端口是打开的,那么此时你应该在防火墙或路由器上关闭该端口,除非你真的有一个很好的理由保持打开。


    ● 访问MySQL的应用程序不应该信任用户输入的任何数据,应该使用适当的防御性编程技术编写这些应用程序。


    ● 不要在互联网上传输普通的(未加密的)数据。所有有时间和能力拦截它的人都可能获取到这些信息,并将其用于自己的目的。相反,我们应该使用加密的协议,如SSL或SSH。MySQL支持内部SSL连接。另一种技术是使用SSH端口转发来创建用于通信的加密(和压缩)隧道。


    ● 学习使用tcpdump和strings实用工具。在大多数情况下,你可以通过以下命令来检查MySQL数据流是否未加密:


    如果你没有看到明文数据,这并不总是意味着信息是加密的。如果你需要高安全性,请咨询安全专家。



    2. 保证密码安全

    密码出现在MySQL内的几个上下文中。下面的部分提供了指导原则,使终端用户和管理员能够确保这些密码的安全,避免暴露它们。还有一个关于MySQL如何在内部使用密码散列的讨论。


    2.1 终端用户密码安全指南

    MySQL用户应该使用以下准则来保证密码安全。


    当你运行客户端程序连接到MySQL服务器时,以一种将其暴露给其他用户的方式来指定密码是不明智的。这里列出了在运行客户端程序时可以用来指定密码的方法,以及每种方法的风险评估。简而言之,最安全的方法是让客户端程序提示输入密码,或者在恰当保护的选项文件中指定密码。


          ● 在命令行上使用-pyour_pass」或「--password=your_pass」选项。例如:

            

    这种方法很方便,但不安全。在某些系统中,系统状态程序可以看到你的密码,比如其他用户可以调用ps,以显示命令行。在初始化序列期间,MySQL客户端通常会用零覆盖命令行中的密码参数。但是,仍然有一段短暂的时间间隔,值是可见的。此外,在某些系统上,这种覆盖策略是无效的,密码对于ps仍旧可见。


    如果你的操作环境设置为在终端窗口的标题栏中显示当前命令,那么只要命令正在运行,密码仍然可见,即使命令已经在窗口内容区域中滚动了。


          ● 在命令行上使用「-p」或「--password」选项,而不指定密码值。在这种情况下,客户端程序会以交互的方式请求密码:

    *表示输入密码的位置。当你输入密码时,密码不会显示出来。


    输入密码比在命令行上指定密码更安全,因为它对其他用户不可见。但是,输入密码的方法仅适用于以交互方式运行的程序。如果你想从非交互运行的脚本中调用客户端,则无法从键盘输入密码。在某些系统上,你甚至可能会发现脚本的第一行被读取并错误地解释为密码。


          ● 将你的密码存储在选项文件中。例如,在Unix上,你可以在主目录中的.my.cnf文件的[client]部分列出密码:

    为了保证密码的安全,除了你以外,任何人都不能访问这个文件。为了确保这一点,请将文件访问模式设置为400或600。例如:

    要在命令行上指定包含密码的特定选项文件,请使用「--defaults-file=file_name」选项,其中file_name是文件的完整路径名。例如:


          ● 将你的密码存储在「MYSQL_PWD」环境变量中。


    这种指定MySQL密码的方法是非常不安全的,不应该被使用。某些版本的ps包含了显示运行进程环境的选项。在某些系统上,如果你设置了「MYSQL_PWD」,那么你的密码就会被暴露给运行ps的任何其他用户。即使在没有这种版本的ps的系统上,假设没有其他用户可以检查进程环境的方法也是不明智的。


    在Unix上,MySQL客户端会将执行过的语句写入一个历史文件。默认情况下,此文件名为「.mysql_history」,并在你的主目录中创建。例如create user, grant和set password之类的SQL语句中的密码是以纯文本的形式写入的,因此如果你使用了这些语句,则它们将被记录在历史文件中。为了保证这个文件的安全,请使用与「.my.cnf」文件相同的访问限制模式。


    如果你的命令解释器被配置为维护历史记录,则用于保存命令的任何文件都将包含在命令行中输入的MySQL密码。例如,bash使用「~/.bash_history」。任何此类文件都应该具有限制性访问模式。


    2.2 管理员密码安全指南

    数据库管理员应使用以下准则来保证密码安全。


    MySQL在mysql.user表中存储账号密码。不应向任何非管理账号授予访问该表的权限。


    有权修改插件目录(plugin_dir系统变量的值)或指定插件目录位置的my.cnf文件的用户可以替换插件,并修改插件提供的功能,包括验证插件。


    应该保护可能写入密码的日志文件等文件。


    2.3 密码和日志

    在create user, grant, set password以及调用password()函数的SQL语句中密码以纯文本的形式写入。如果这些语句被MySQL服务器记录,那么有权访问日志的任何人都可以看到密码。这适用于一般查询日志,慢查询日志和二进制日志。


    审核日志插件生成的审核日志文件的内容未加密。为了安全起见,这个文件应该被写入一个只有MySQL服务器和有合法理由查看日志的用户才可以访问的目录中。


    为了防范日志文件被曝光,请将它们放在只有MySQL服务器和数据库管理员才有权访问的目录中。如果服务器将日志记录到「mysql」库表中,则只将这些表的访问权限授予数据库管理员。


    复制slave将master的密码存储在「master.info」文件中。限制此文件只能由数据库管理员访问。


    使用受限访问模式来保护包含日志表或包含密码的日志文件的数据库备份。



    3. 保护MySQL免受攻击

    当连接到MySQL服务器时,你应该使用密码。密码不会在连接上以明文的形式传输。在MySQL4.1.1中,客户端连接序列中的密码处理经过升级,变得非常安全。如果你仍然使用的是4.1.1之前的密码,则加密算法不如新算法那样强大。通过一些努力,聪明的攻击者可以嗅探客户端和服务器之间的流量,从而破解密码。


    其它所有信息都以纯文本的形式传输,任何能够查看连接的人都可以阅读。如果客户端和服务器之间的连接通过了一个不受信任的网络,并且你为此感到担忧,那么你可以使用压缩协议使流量更加难以解密。你还可以使用MySQL的内部SSL支持,使连接更加安全。或者,使用SSH在MySQL服务器和MySQL客户端之间建立加密的TCP/IP连接。


    要确保MySQL系统安全,你务必仔细考虑以下建议:

    ● 要求所有MySQL账号都要有密码。客户端程序不一定知道运行它的人的身份。对于客户端/服务器应用程序,用户可以为客户端程序指定任何用户名,这很常见。例如,如果other_user没有密码,那么任何人都可以通过调用mysql -u other_user db_name以其他人的身份连接到服务器。如果所有的账号都有密码,那么使用其他用户的账号进行连接就会变得更加困难。


    ● 确保唯一对数据库目录具有读或写权限的Unix账号是用于运行mysqld的账号。


    ● 不要以Unix root用户的身份运行MySQL服务器。这是非常危险的,因为这将使得任何具有「file」权限的账号都能够使MySQL服务器以Unix root用户的身份创建文件(例如,~root/.bashrc文件)。为了防止这种情况,mysqld拒绝以root身份运行,除非使用「--user=root」选项显式指明。


    mysqld应该作为一个普通的、非特权用户来运行。你可以创建一个单独的Unix账号,名为mysql,该账号专门用于管理MySQL,从而使一切更加安全。要以不同的Unix用户启动mysqld,请在my.cnf选项文件的组[mysqld]中添加一个用户选项,例如:


    无论你是手动还是使用mysqld_safe或mysql.server启动服务器,该选项都将使得服务器以指定的用户身份启动。


    以Unix用户而非root用户运行mysqld,并不意味着你需要修改mysql.user表中的root账号。MySQL账号的用户名与Unix账号的用户名没有任何关系。


    ● 不要将「file」权限授予非管理用户。具有此权限的任何用户都可以以mysqld进程的有效用户ID的身份在文件系统的任何位置写入文件。这包括服务器的数据目录,其中含有实现权限表的文件。为了使「file」权限操作更安全,select ... into outfile生成的文件不会覆盖现有的文件。


    「file」权限也可以用来读取全局可读或者是MySQL服务器(mysqld进程的有效用户ID)具有读权限的所有文件。使用此权限,你可以将任何文件读入数据库表。这可能会被滥用,例如,使用「load data」将/etc/passwd加载到表中,然后使用select语句进行显示。


    为了限制可以读取和写入文件的位置,请将系统变量「secure_file_priv」设置为特定的目录。


    ● 不要将「process」或「super」权限授予非管理用户。「mysqladmin processlist」和「show processlist」的输出显示了当前正在执行的所有语句的文本,所以能够查看服务器进程列表的任何用户都可以看到其他用户发起的语句,如update user set password=password('not_secure');


    mysqld为拥有「super」权限的用户保留了一个额外的连接,这样即使所有正常的连接都在使用中,MySQL的root账号也可以登录并检查服务器的活动。


    「super」权限可以终止客户端连接,通过更改系统变量的值来改变服务器的运行,以及控制服务器的复制。


    ● 不允许使用到库表的符号链接。如果你以root身份运行mysqld,这一点尤为重要,因为这会导致任何对服务器数据目录具有写权限的人都可以删除系统中的任何文件。可以使用--skip-symbolic-links选项禁用此功能。


    ● 存储过程和视图应该参照第20.6节 "存储过程和视图的访问控制"给出的安全准则来编写。


    ● 如果你不信任你的DNS,则应在权限表中使用IP地址而不是主机名。无论如何,在使用含有通配符的主机名创建权限表条目时,你都应该非常小心。


    ● 如果要限制单个账号的连接数量,可以通过设置系统变量「max_user_connections」来实现。grant语句还支持资源控制选项,以限制账号允许使用的服务器资源。


    ● 如果插件目录对于服务器来说是可写的,那么用户可以使用select ... into dumpfile将可执行代码写入目录中的文件。为了防止这种情况,你可以设置「plugin_dir」目录,使其仅对服务器开放读权限,或者将「--secure-file-priv」设置为可以安全地进行select写入的目录。



    4. 以普通用户运行MySQL

    在Linux上,对于使用MySQL仓库、RPM软件包或Debian软件包执行的安装,MySQL服务器mysqld应以本地用户「mysql」的身份启动。以其他操作系统用户的身份启动服务器不受init脚本的支持,其作为安装的一部分被包含在系统中


    在Unix上(或使用tar或tar.gz包执行安装的Linux上),MySQL服务器可以由任何用户启动和运行。但是出于安全考虑,你应该避免以Unix root身份运行服务器。要将mysqld更改为以普通的非特权用户user_name的身份运行,你必须执行以下操作:

    ① 如果服务器正在运行,请使用「mysqladmin shutdown」停止服务器。

    ② 更改数据库目录和文件,以便user_name对其具有读权限和写权限(你可能需要使用Unix root用户身份执行此操作):


    如果不执行此操作,服务器将无法访问数据库或表,当它以user_name运行时。

    如果MySQL数据目录中的目录或文件是符号链接,则chown -R可能不会跟随符号链接。这时,你需要查看这些链接,手动更改它们指向的目录和文件。

    ③ 以user_name用户身份启动服务器。另一种方法是以Unix root用户运行mysqld,同时使用「--user=user_name」选项。这样的话,mysqld首先启动,然后在接受任何连接之前切换为user_name用户。

    ④ 要在系统启动时自动以特定的用户运行MySQL服务器,请在/etc/my.cnf选项文件或数据目录中的my.cnf选项文件的[mysqld]组中添加一个用户选项,例如:



    如果你的Unix机器本身不安全,你应该为权限表中的「root」账号分配密码。否则,在该机器上具有登录账号的任何用户都可以使用--user=root选项运行mysql客户端并执行任何操作。无论什么时候,你都应该主动为MySQL账号分配密码,特别是当主机上存在其他Unix账号时,更应如此。


    5. load data local的安全问题

    「load data」语句可以加载位于服务器主机上的文件;如果指定了「local」关键字,则可以加载位于客户主机上的文件。


    「local」版的「load data」有两个潜在的安全问题:

    ● 从客户主机到服务器主机的文件传输由MySQL服务器发起。理论上,服务器可以命令客户端程序传输服务器指定的任何文件,而不是由客户端程序在「load data」语句中指定的文件。所以,攻击者可以使用一个虚假的服务器冒充MySQL,或者直接在MySQL服务器外部添加补丁,以达到访问客户主机文件的目的。这样的服务器可以访问客户主机上客户端用户有权访问的任何文件。更糟糕的是,除了「load data local」,实际上服务器可以对任何的语句响应一个文件传输请求,所以一个更根本的问题是客户端不应该连接到不受信任的服务器。


    ● 在Web环境中,客户端程序是从Web服务器进行连接的。用户可以使用「load data local」读取Web服务器有权访问的任何文件(假设用户可以对SQL Server运行任何语句)。在这种环境中,相对于MySQL服务器,客户端是Web服务器,而不是连接到Web服务器的用户运行的远程程序。


    为了避免出现「load data」问题,客户端应避免使用「local」。为避免连接到不受信任的服务器,客户端可以使用「--ssl-verify-server-cert」选项和相应的CA证书来建立安全的连接并验证服务器身份。


    为了使管理员和应用程序能够管理本地数据加载功能,「local」配置如下:

    ● 在服务器端:

    ■「local_infile」系统变量控制服务器端的「local」功能。根据「local_infile」设置的不同,服务器拒绝或允许由已开启「local」的客户端发起的本地数据加载。「local_infile」默认开启。

    ■ 要显式地使服务器拒绝或允许「load data local」语句(不管客户端程序和库在构建时或运行时如何配置),请在启动mysqld的同时禁用或启用「local_infile」。「local_infile」也可以在运行时设置。

    ● 在客户端:

    ■「enabled_local_infile」CMake选项控制MySQL客户端库「local」功能的静态编译。没有显式指定的客户端,根据MySQL构建时指定的「enabled_local_infile」设置,禁用或启用「local」功能。

    MySQL二进制发布版中的客户端库在编译时默认启用了「enabled_local_infile」。如果从源码编译MySQL,则根据没有显式指定的客户端是否应该禁用或启用「local」功能,将「enabled_local_infile」配置为禁用或启用。

    ■ 使用C API的客户端程序可以通过调用mysql_options()禁用或启用「mysql_opt_local_infile」选项,显式地控制数据加载。

    ■ 对于mysql客户端,默认禁用本地数据加载。要显式地禁用或启用它,请使用「--local-infile=0」或「--local-infile[=1]」选项。

    ■ 对于mysqlimport客户端,默认禁用本地数据加载。要显式地禁用或启用它,请使用「--local=0」或「--local=[1]」选项。

    ■ 如果你是在Perl脚本或读取选项文件[client]组的其它程序中使用「load data local」,则可以向该组添加「local-infile」选项。为了防止不理解该选项的程序出现问题,请使用「loose-」前缀:



    在所有情况中,客户端成功使用「ocal」加载操作也要求服务器允许它。


    如果服务器或客户端禁用了「local」功能,那么尝试发起「load data local」语句的客户端将收到以下错误消息:



    6. 客户端编程安全指南

    访问MySQL的应用程序不应该信任用户输入的任何数据,他们可以通过在Web表单,URL或你构建的任何应用程序中输入特殊的或转义的字符序列来尝试欺骗你的代码。确保你的应用程序在用户输入类似「; drop database mysql;」的语句时仍然是安全的。这是一个极端的例子,但如果你不为此做准备,黑客使用类似技术将引发极大的安全漏洞和数据丢失。


    一个常见的错误是只保护字符串数据值。记得要检查数值型数据。如果应用程序在用户输入「234」时生成诸如「select * from table where id = 234」的查询,则用户可以输入「234 or 1 = 1」,使应用程序生成查询「select * from table where id = 234 or 1 = 1」。结果,服务器检索表中的每一行。这会暴露所有数据行,并导致服务器负载过大。防止此类攻击的最简单的方法是在数值常量周围使用单引号:select * from table where id = '234'。如果用户输入额外的信息,它们都将称为字符串的一部分。在数值上下文中,MySQL会自动将此字符串转换为数字,并自动剥离末尾的非数字字符,类似于「atoi」或「atof」函数。


    有时人们认为,如果一个数据库只包含公开可用的数据,那么它就不需要被保护。这是不正确的。即使允许显示数据库中的任何数据行,你仍然应该防止拒绝服务攻击(例如,那些基于上一段中的技术导致服务器资源浪费的攻击)。否则,你的服务器就无法对合法用户作出响应。


    检查清单:

    ● 启用严格的SQL模式,以告知服务器对其接受的数据值进行更严格的限制。参见第5.1.8节 "服务器SQL模式"。

    ● 尝试在所有Web表单中输入单引号和双引号。如果你遇到任何类型的MySQL错误,请立即调查问题。

    ● 尝试通过向其中添加%22("),%23(#)和%27(')来修改动态URL。

    ● 尝试使用前面示例中所示的字符,将动态URL中的数据类型从数值类型修改为字符类型。你的应用程序应该对这些和类似的攻击是安全的。

    ● 尝试在数值字段中输入字符、空格和特殊符号,而不是数字。你的应用程序应该在将字段值传递给MySQL之前删除这些非法字符,或者直接生成一条错误提示。将未经检查的值传递给MySQL是非常危险的!

    ● 在将数据传递给MySQL之前检查数据的大小。

    ● 应用程序连接数据库的账号不应是管理账号。不要给你的应用程序任何不需要的访问权限。

    许多应用程序编程接口提供了转义数据值中特殊字符的方法。如果使用得当,这将防止应用程序用户输入导致应用程序生成与你打算的效果不同的语句的值:

    ● MySQL C API:使用mysql_real_escape_string() API调用。

    ● MySQL++:对查询流使用escape和quote修饰符。

    其它编程接口可能具有类似的功能。

    展开全文
  • Mysql安全

    千次阅读 2008-02-03 21:54:00
    当你连接一个MySQL服务器时,你通常应该使用一个口令。口令不以明文在连接上传输。所有其它信息作为能被任何人读懂的文本被传输。如果你担心这个,你可使用压缩协议... 为了使一个MySQL系统安全,强烈要求你考虑下

     

    当你连接一个MySQL服务器时,你通常应该使用一个口令。口令不以明文在连接上传输。所有其它信息作为能被任何人读懂的文本被传输。如果你担心这个,你可使用压缩协议(MySQL3.22和以上版本)使事情变得更难。甚至为了使一切更安全,你 应该安装SSH。用它,你能在一个MySQL服务器与一个MySQL客户之间得到一个加密的TCP/IP连接。

     

    为了使一个MySQL系统安全,强烈要求你考虑下列建议:

     

    对所有MySQL用户使用口令。记住,如果other_user没有口令,任何人能 简单地用mysql -u other_user db_name作为任何其它的人登录。对客户机/服务器应用程序,客户可以指定任何用户名是常见的做法。在你运行它以前,你可以通过编辑 mysql_install_db脚本改变所有用户的口令,或仅仅MySQL root的口令,象这样:

     

    shell> mysql -u root mysql

    mysql> UPDATE user SET Password=PASSWORD('new_password')

    WHERE user='root';

    mysql> FLUSH PRIVILEGES;
     

     
    不要作为Unix的root用户运行MySQL守护进程。mysqld能以任何用户运行,你 也可以创造一个新的Unix用户mysql使一切更安全。如果你作为其它Unix用户运行mysqld,你不需要改变在user表中的root用户名,因 为MySQL用户名与Unix 用户名没关系。你可以作为其它Unix用户编辑mysql.server启动脚本mysqld。通常这用su命令完成。对于更多的细节,见18.8 怎样作为一个一般用户运行MySQL。

     

    如果你把一个Unix root用户口令放在mysql.server脚本中,确保这个脚本只能对root是可读的。 检查那个运行mysqld的Unix用户是唯一的在数据库目录下有读/写权限的用户。

    不要把process权限给所有用户。mysqladmin processlist的输出显示出当前执行的查询正文,如果另外的用户发出一个UPDATE user SET password=PASSWORD('not_secure')查询,被允许执行那个命令的任何用户可能看得到。mysqld为有process权限的 用户保留一个额外的连接, 以便一个MySQL root用户能登录并检查,即使所有的正常连接在使用。不要把file权限给所有的用户。

    有这权限的任何用户能在拥有mysqld守护进程权限的文件系统那里写一个文件!为了使这更安全一些,用SELECT ... INTO OUTFILE生成的所有文件对每个人是可读的,并且你不能覆盖已经存在的文件。

     

    file权限也可以被用来读取任何作为运行服务器的Unix用户可存取的文件。这可能被滥用,例如,通过使用LOAD DATA装载“/etc/passwd”进一个数据库表,然后它能用SELECT被读入。

     

    如果你不信任你的DNS,你应该在授权表中使用IP数字而不是主机名。原则上讲,--secure选项对mysqld应该使主机名更安全。在任何情况下,你应该非常小心地使用包含通配符的主机名。

     

    展开全文
  • mysql安全

    2006-12-22 17:58:00
  • Mysql安全措施

    千次阅读 2017-02-20 21:30:58
    root权限一定要只允许本机登陆,并且MySQL安全目录权限一定要只允许本地,root用户一定要密钥认证登陆系统(这涉及到系统安全的优化)而且MySQL的安装目录权限一定要合理设置,并且mysql用户不可登陆,只作为启动用...
  • mysql安全

    千次阅读 2018-03-29 22:08:45
    mysql安全性 权限 a. 数据库用户访问权限,操作权限 b. 删除无用的用户及test用户 c. local infile命令限制 d. ip白名单 e. 防火墙,系统用户权限 备份 定时备份数据库...
  • Mysql 安全管理

    2016-01-11 10:41:10
    服务器层面1、修改mysql启动的端口号 ...Mysql安全配置 Do not ever give anyone (except MySQL root accounts) access to the user table in the mysql database。 Do not grant more privileges than neces
  • LANMP安全配置之MySQL安全配置

    千次阅读 2019-05-28 23:37:05
    所以这周继续学习一下MySQL安全配置 还是参考《PHP Web安全开发实战》一书,再做一些补充 0x01 密码设置 安装成功后第一件事就是改root默认密码,然后设置复杂密码 5.5以前,rpm包安装完MySQL后,root用户密码...
  • mysql安全参数设置

    2016-03-03 17:34:10
    mysql安全参数设置
  • MySQL安全性管理

    千次阅读 2018-05-28 16:11:14
    课程名称MySQL数据库技术实验成绩 实验名称实验九:MySQL安全性管理学号 姓名 班级 日期 实验目的:1. 掌握数据库用户账号的建立与删除方法;2. 掌握数据库用户权限的授予方法。实验平台:MySQL+SQLyog;实验...
  • 腾讯云Mysql安全运维

    2020-06-08 12:35:38
    腾讯云运维知多少系列 1、腾讯云如何限制MYSQL的访问 腾讯云如何限制MYSQL的访问,我的策略是使用腾讯云的安全组,我们...2、配置Mysql安全组 配置好入站的规则例如: 10.0.0.0/8 这代表10网段的都可以访问; 10.192.0.
  • mysql 安全和日志 备份

    千次阅读 2018-08-02 20:06:43
    一,mysql 安全机制管理 1.权限表 mysql 数据库中得表说明 mysql.user 用户字段:Host,User,Password 权限字段:_priv结尾的字段 安全字段:ssl x509字段 资源控制字段:max_开头的字段 mysql.db ...
  • mysql安全修改mysql数据库名几种方法

    万次阅读 2016-04-29 15:53:46
    mysql安全修改mysql数据库名几种方法 在mysql中修改数据表或数据库名我们都使用么rename函数来执行,但有时不稳定导致表丢失了,下面整理了一些安全修改数据库名的几种方法,希望对各位有帮助。 ...
  • MySql安全配置

    千次阅读 2019-08-12 17:25:07
    文章目录操作系统级配置...安全说明 在linux /UNIX上,mysql客户机将交互式执行的语句记录到一个历史文件中。默认情况下,该文件在用户的主目录中名为.mysql_history。大多数在mysql客户机应用程序中运行的交互...
  • mysql安全模式
  • mysql 安全策略

    2018-09-12 19:16:23
    MySQL被运用于越来越多的业务中,在关键业务中对数据安全性的要求也更高,如何保证MySQL的数据安全。 数据安全如果只靠MySQL应用层面显然是不够的,是需要在多个层面来保护的,包括网络、系统、逻辑应用层、数据库...
  • [深入浅出]MySQL安全规范 一、Mysql服务器安全规范 1. 禁止应用直连DB,一般通过代理访问. 2. 禁止DB公网访问。 3. 禁止生产和办公互通,需生产环境和办公环境隔离。 4. Linux系统初始化安全选项: 1)、一些...
  • 这篇文章主要介绍了MySQL安全配置向导mysql_secure_installation各项配置的含义,并依据经验给予一了一些建议,需要的朋友可以参考下。 安装完mysql-server 会提示可以运行mysql_secure_installation。运行mysql_...
  • MySQL安全连接

    2017-07-01 22:04:32
    MySQL可以使用OpenSSL或yaSSL进行编译,这两者都基于OpenSSL API实现安全连接: MySQL企业版二进制发行版是使用OpenSSL编译的。使用MySQL企业版的yaSSL是不可能的。 MySQL社区版二进制发行版是使用yaSSL...
  • MySQL数据库一贯以高性能、高可性和易用性著称,它已经成为世界上最流行的开源数据库。...但有的企业在安装MySQL时用的是默认选项,由此造成其数据不安全,且服务器也面临被入侵的风险,并有可能在短时间内出现...
  • MYSQL安全配置

    千次阅读 2018-07-26 20:31:56
    mysql中存在4个控制权限的表,分别为 1. mysql.USER表 2. mysql.DB表 3. mysql.TABLES_PRIV表 4. mysql.COLUMNS_PRIV表 要注意的是,Mysql中有一个数据库”information_schema“,似乎里面保存的也是一些权限信息...
  • Mysql安全加固

    千次阅读 2018-08-28 23:04:16
    3.改变默认mysql管理员帐号 4.关于密码的管理 5.使用独立用户运行msyql 6.禁止远程连接数据库 7.限制连接用户的数量 8.用户目录权限限制 9.命令历史记录保护 10.禁止MySQL对本地文件存取 11.MySQL服务器权限控制 12....
  • MySQL安全启动

    千次阅读 2017-05-18 13:26:43
    1、停止正在运行的MySQL...2、以安全模式启动MySQL 【Linux】运行 /usr/local/mysql/bin/mysqld_safe –skip-grant-tables & 【Windows】在命令行下运行 X:/MySQL/bin/mysqld-nt.exe –skip-grant-tables 3、完成
  • mysql安全加强

    2017-05-02 10:29:12
    即便如此,你仍然需要添加额外的安全层来保护你的MySQL数据库不受攻击,毕竟任何经营网上在线业务的人都不想冒数据库受到损坏的风险。接下来,我们将介绍一些实用的办法,你可以利用这些办法来保护MySQL数据库,以
  • mysql安全测试

    千次阅读 2016-11-24 14:56:42
    本文主要描述mysql安全测试过程,会不断的及时更新
  • MYSQL安全创建profile

    万次阅读 2019-01-07 13:32:10
    mysql中创建profile: 1、通过命令打开profile功能: set profiling=1; 2、使用select * from user \G;查看用户 3、查询消耗 4、查看某条指定命令的消耗 5、设置profile表的条数: 通过命令:set profiling_...
  • mysql性能调优与架构设计》-- 基础篇 -- Mysql 安全管理 mysql 访问控制实现原理 -- 访问控制,有这么一个图描述 访问控制模块 对用户的校验流程! ![图片说明]...
  • MySQL安全配置

    千次阅读 2015-06-08 10:10:52
    访问 MySQL 数据库必须首先访问数据库的某个权限、即以某个权限模式用户的身份登录,大部分的安全管理主要通过模式用户的权限来实现。 MySQL 的相关权限信息主要存放在 grant tables 的系统表中,即 mysql....
  • MySQL安全你不知道的事

    万次阅读 多人点赞 2020-11-30 11:35:49
    总结 安全存在于系统的方方面面,涉及安全的都是大事,今天主要聊的是MySQL安全的那些事,主要包括MySQL服务器安全,数据库安全以及数据安全,聊完之后发现安全的东西还蛮多,这些能够让我们对MySQL安全有更加深刻...
  • mysql安全配置性能优化 http://www.linuxnote.org/mysql-security-configuration-performance-optimization.html mysql安全设置及性能优化配置全攻略,注意在不熟悉的情况下更改设置前最好进行备份,以免出错. 1...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,167
精华内容 14,866
关键字:

mysql安全

mysql 订阅