龙空技术网

关于MYSQL数据库安全的一些建议

深蓝云海云灾备 1318

前言:

目前姐妹们对“mysql匿名登录”都比较重视,你们都需要分析一些“mysql匿名登录”的相关资讯。那么小编也在网络上网罗了一些关于“mysql匿名登录””的相关文章,希望我们能喜欢,大家快快来了解一下吧!

关于MYSQL数据库安全的一些建议安全建议

1、 用IPTABLE 或者TCP WRAP的方式,限制可连接的客户端IP。

2、 删除默认空密码账号,匿名账号及TEST SCHEMA。

3、 禁止使用弱密码。

4、 不在数据库中存储明文密码,或者个人敏感信息。

5、 不建议使用简单MD5加密match函数,建议在使用加密函数时,要加上(salt)干扰串。

6、 默认不授予PROCESS、FIlE、SUPER等权限。

7、 不使用系统ROOT账号运行mysqld进程。

8、 默认关闭监听公网IP,只允许本match地网络连接。

9、 不允许普通账号读写其他账号的数据库。

10、有过创建账号指定明文密码时,及时清除历史记录。

密码策略

因为mysql本身没有抗穷举的帐号锁定机制,所以对于mysql自身的登录帐号,尤其是root帐号,需要遵循”密码强度策略”设置高强度的密码,确保攻击者从穷举帐号攻击无法获得账户密码。

(一)授权管理

1. MySQL 提供的权限

授予MySQL帐户的权限决定了帐户可以执行哪些操作。MySQL权限在其应用的上下文和不同操作级别上有所不同:

1、 Administrative privileges:用户能够管理MySQL Server的操作。这些权限是全局的,因为它们不是特定于特定某个数据库的。

2、 Database privileges:适用于数据库及其中的所有对象。可以为特定数据库或全局授予这些权限,以便它们适用于所有数据库。

3、 Privileges for database objects: 数据库对象(如表,索引,视图和存储例程)的权限可以针对数据库中的特定对象,数据库中给定类型的所有对象(例如数据库中的所有表)或全局的所有对象所有数据库中给定类型的对象。

2. 授权建议

在生产操作过程中禁止赋予任何用户拥有ALL PRIVILEGES的权限,而且也必须要限制用户可操作的数据库,下面是几种常见的授权方式:

1、一般授权

mysql> GRANT INSERT,DELETE,SELECT,UPDATE ON dbname.* TO 'user'@'192.168.0.x';

2、加上临时表,修改权限

mysql> GRANT INSERT,DELETE,SELECT,UPDATE,CREATE,ALTER,CREATE TEMPORARY TABLES ON dbname.* TO 'user'@'192.168.0.x';

3、加上视图、存储过程、触发器等权限。

mysql> GRANT INSERT,DELETE,SELECT,UPDATE,TRIGGER,CREATE VIEW,SHOW VIEW,ALTER ROUTINE,CREATE ROUTINE,EXECUTE ON dbname.

4、系统权限

mysql> GRANT ALL ON dbname.* TO 'user'@'192.168.0.x';

3. 权限机制

MySQL权限系统确保所有用户只能执行允许的操作。作为用户,当连接到MySQL服务器时,身份认证是由将要连接的主机和指定的用户名决定。当你在连接后发出请求时,系统将根据你的身份和将要执行的操作授予权限 。

MySQL访问控制涉及两个阶段:

阶段1:服务器根据你的身份接受或拒绝连接,以及是否通过提供正确的密码验证您的身份。

阶段2:假设你可以连接,服务器将检查你发出的每个语句,以确保是否有足够的权限执行。例如,如果您尝试从数据库中的表中选择行或从数据库中删除表,则服务器将验证您是否具有 SELECT表和 DROP数据库表的权限。

下面是连接阶段(阶段1)的验证步骤:

1. 获取客户端的IP和主机名。

2. acl_check_host函数验证user表中是否存在相应的ip或host,如果不存在直接报错。

3. 获取用户名和密码。

4. check_user函数验证用户名和密码(不输入用户名默认为root),如果系统表中不存在匹配的报错返回。

5. 获取用户的权限列表,验证用户的相关属性是否合法,例如,连接数是否超过上限,连接是否超时,操作是否超过限制等信息,如果不合法,则报错返回。

(二)网络安全

数据库所在的DMZ的网络拓朴的安全配置也是在进行安全评估的时候需要考虑的一个方面,对防御内网扫描、网络攻击有一定帮助。以下是一些网络安全建议:

1. MySQL提供的权限

MySQL的访问IP限制,主机层在Linux下可以通过iptables来现在允许访问mysql端口的IP地址。

注意:如果mysql的默认端口3306被修改了,则iptables规则也需要相应的修改。

1、 只允许指定的IP进行访问

iptables -A INPUT -p tcp -s xxxx.xxxx.xxxx.xxxx/24 --dport 3306 -j ACCEPT

iptables -A INPUT -p tcp -s xxxx.xxxx.xxxx.xxxx/24 --dport 3306 -j ACCEPT

iptables -P INPUT DROP

2. 修改MySQL的默认端口

可以修改配置文件my.cnf来实现,对mysql端口的修改可以从一定程度上防止端口扫描工具的扫描。

#vi /etc/my.cnf

[mysqld]

port = 3306 //修改为未占用的非知名端口

3. 限制连接用户的数量

数据库的某用户多次远程连接,会导致性能的下降和影响其他用户的操作,有必要对其进行限制。可以通过限制单个账户允许的连接数量来实现,设置my.cnf 文件的mysqld中的max_user_connections变量来完成。GRANT语句也可以支持资源控制选项来限制服务器对一个账户允许的使用范围。

#vi /etc/my.cnf

[mysqld]

max_user_connections 2

(三)账号管理

1. 添加用户账号

通过两种方式创建MySQL账号:

• 通过使用创建帐户并建立其权限的帐户管理语句,例如 CREATE USER和 GRANT。这些语句导致服务器对底层授权表进行适当修改。

• 通过直接操作授权表,如操作MySQL授权表INSERT、UPDATE或 DELETE。

首选方法是使用帐户管理语句,因为它们比直接操作授权表更简洁。以下示例显示如何使用 mysql客户端程序使用CREATE USER和GRANT语句来设置新帐户:

1、mysql> CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass';

2、mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'localhost' WITH GRANT OPTION;

3、mysql> CREATE USER 'finley'@'%' IDENTIFIED BY 'some_pass';

4、mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'%' WITH GRANT OPTION;

5、mysql> CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin_pass';

6、mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';

7、mysql> CREATE USER 'dummy'@'localhost';

上述语句创建账户的属性:

• 两个帐户的用户名finley和密码为some_pass。两者都是具有完全权限的超级用户帐户。该 'finley'@'localhost'帐户只能在从本地主机连接时使用。该 'finley'@'%'帐户使用 '%'通配符作为主机部分,因此可用于从任何主机连接。

• 'admin'@'localhost'帐户的密码为admin_pass。该帐户只能由admin本地主机连接使用。它被授予 RELOAD和 PROCESS管理权限。这些权限允许 admin用户执行mysqladmin reload, mysqladmin refresh 和 mysqladmin flush-xxx commands 以及mysqladmin processlist,但没有权限访问任何数据库。

• 'dummy'@'localhost'帐户没有密码(这是不安全的,不推荐)。此帐户只能用于从本地主机连接。没有授权。假设您将使用GRANT语句向帐户授予特定权限

查看账户的权限,使用SHOW GRANTS:

mysql> SHOW GRANTS FOR 'admin'@'localhost';

+-----------------------------------------------------+

| Grants for admin@localhost |

+-----------------------------------------------------+

| GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost' |

+-----------------------------------------------------+

查看账户的非特权属性,使用SHOW CREATE USER:

mysql> SHOW CREATE USER 'admin'@'localhost'\G

*************************** 1. row ***************************

CREATE USER for admin@localhost: CREATE USER 'admin'@'localhost'

IDENTIFIED WITH 'mysql_native_password'

AS '*67ACDEBDAB923990001F0FFB017EB8ED41861105'

REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK

以下示例创建三个账户并授权访问特定数据库的权限:

mysql> CREATE USER 'custom'@'localhost' IDENTIFIED BY 'obscure';

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.* TO 'custom'@'localhost';

mysql> CREATE USER 'custom'@'host47.example.com' IDENTIFIED BY 'obscure';

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO 'custom'@'host47.example.com';

mysql> CREATE USER 'custom'@'%.example.com' IDENTIFIED BY 'obscure';

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO 'custom'@'%.example.com';

上述语句创建账户的属性:

• 第一个帐户可以访问 bankaccount数据库,但只能从本地主机访问。

• 第二个帐户可以访问expenses 数据库,但只能从主机访问 host47.example.com。

• 第三个帐户可以customer 从example.com 域中的任何主机访问数据库。由于使用%帐户名称的主机部分中的通配符,该帐户可以访问域中所有主机。

2. 删除用户账号

删除用户账号使用DROP USER 语句。

mysql> DROP USER 'jeffrey'@'localhost';

回收用户账号权限使用REVOKE ... FROM USER:

mysql> REVOKE USAGE ON *.* FROM admin;

直接操作授权表删除用户账号:

mysql> DELETE FROM mysql.user WHERE host='xxx' AND USER='admin';

3. 账号管理原则

• 数据库安装初始化完后,要删除匿名账号

• 匿名账号只有连接权限

• information_schema和test库比较特殊,匿名账号可以访问部分资源

账户权限

MySQL 中存在4个控制权限的表,分别为:

• MYSQL.USER

• MYSQL.DB

• MYSQL.TABLES_PRIV

• MYSQL.COLUMNS_PRIV

在客户进行数据库连接、登录的时候,mysql权限表的验证过程:

先从user表中的Host、User、Password三个字段中判断连接IP、用户名、密码是否存在,如果密码存在并且正确则通过验证。

通过身份认证后,进行权限分配,按照USER表、DB表、TABLES_PRIV表、COLUMNS_PRIV表的顺序进行验证。

即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db,tables_priv,columns_priv 如果全局权限表user对应的权限为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限。如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。逐级下降。

Mysql的账户权限优先级顺序是:user->db->tables_priv->columns_pri

这些表的作用本质上是一样的,区别就在于它们的作用域范围不同,从user到columns_pri逐级作用域范围降低,因此控制粒度也增大,它们的配置遵循”就近原则”,即以优先级最低的那个为准。权限配置也应该按照这个顺序来有规划地进行。

4.MySQL数据库账号常用权限分配建议:

权限

权限级别

权限说明

最佳安全实践: 网站使用账户是否给予

CREATE

数据库、表或索引

创建数据库、表或索引权限

建议给与,安装WEB系统时需要创建表

DROP

数据库或表

删除数据库或表权限

建议给与

GRANT OPTION

数据库、表或保存的程序

赋予权限选项

不建议给与

REFERENCES

数据库或表

不建议给与

ALTER

更改表,比如添加字段、索引等

建议给与

DELETE

删除数据权限

建议给与

INDEX

索引权限

建议给与

INSERT

插入权限

建议给与

SELECT

查询权限

建议给与

UPDATE

更新权限

建议给与

CREATE VIEW

视图

创建视图权限

建议给与

SHOW VIEW

视图

查看视图权限

建议给与

ALTER ROUTINE

存储过程

更改存储过程权限

不建议给与

CREATE ROUTINE

存储过程

创建存储过程权限

不建议给与

EXECUTE

存储过程

执行存储过程权限

不建议给与

FILE

服务器主机上的文件访问

文件访问权限

不建议给与,防止因为注入导致的隐私文件泄漏

CREATE TEMPORARY TABLES

服务器管理

创建临时表权限

不建议给与,防止借助临时表发动的二次注入

LOCK TABLES

服务器管理

锁表权限

不建议给与

CREATE USER

服务器管理

创建用户权限

不建议给与

PROCESS

服务器管理

查看进程权限

不建议给与

RELOAD

服务器管理

执行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的权限

不建议给与

REPLICATION CLIENT

服务器管理

复制权限

不建议给与

REPLICATION SLAVE

服务器管理

复制权限

不建议给与

SHOW DATABASES

服务器管理

查看数据库列表权限

不建议给与

SHUTDOWN

服务器管理

关闭数据库权限

不建议给与

SUPER

服务器管理

执行kill线程权限

不建议给与

文章版权由深蓝云海所有,任何转载的媒体必须经深蓝云海授权并同意!请尊重原创、尊重劳动。

标签: #mysql匿名登录