1,密码复杂化。
    登录密码尽量包含特殊字符、大小写组合,保持长度。
    修改密码:

    1. $ mysql> use mysql;
    2. $ mysql> update user set authentication_string=password("test") where user='root';
    3. $ mysql> flush privileges;
    4. $ exit;

    2,使用内网登录,不启用公网。
    若无特殊需要,禁止远程连接 MySQL。编辑 my.cnf 在 [mysqld] 添加:

    1. skip-networking
    2. # 指定IP链接
    3. bind-address=192.168.1.100

    远程管理可使用 phpMyAdmin。

    3,删除默认数据库和账号。

    1. $ mysql> drop database test;
    2. $ mysql> use mysql;
    3. $ mysql> delete from db;
    4. $ mysql> delete from user where not(host="localhost" and user="root");
    5. $ mysql> flush privileges;
    6. $ exit;

    4, 更改默认root账号名称。

    1. $ mysql> use mysql;
    2. $ mysql> update mysql.user set user="admin" where user="root";
    3. $ mysql> flush privileges;

    5,降低用户的数据库特权。
    有些应用程序是通过一个特定数据库表的用户名和口令连接到MySQL的,安全人员不应当给予这个用户完全的访问权。
    如果攻击者获得了这个拥有完全访问权的用户,他也就拥有了所有的数据库。
    查看一个用户许可的方法是在 MySQL 控制台中使用命令 SHOW GRANT:

    1. $ mysql> SHOW GRANTS FOR 'user'@'localhost';

    为定义用户的访问权,使用 GRANT 命令。在下面的例子中,user1 仅能从 lh1010 数据库的 billing 表中选择:

    1. $ mysql> GRANT SELECT ON billing.lh1010 TO 'user1'@'localhost';
    2. $ mysql> FLUSH PRIVILEGES;
    3. # 可以查询lh1010库中的表
    4. $ mysql> GRANT SELECT ON lh1010.* TO 'user1'@'localhost';

    如此一来,user1 用户就无法改变数据库中这个表和其它表的任何数据。
    另一方面,如果你要从一个用户移除访问权,就应使用一个与 GRANT 命令类似的 REVOKE 命令:

    1. $ mysql> REVOKE SELECT ON billing.lh1010 FROM 'user1'@'localhost';
    2. $ mysql> FLUSH PRIVILEGES;

    GRANT 权限具体可查看:https://www.cnblogs.com/yunfeioliver/p/7887676.html

    6,本地文件安全。
    禁用 LOCAL INFILE 命令,在 MySQL 配置文件中的 [mysqld] 部分增加下面的参数:

    1. set-variable=local-infile=0

    这有助于防止非授权用户访问本地文件。在PHP应用程序中发现有新的SQL注入漏洞时,这样做尤其重要。
    此外,在某些情况下,LOCAL INFILE 命令可被用于访问操作系统上的其它文件(如 /etc/passwd ):

    1. mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1
    2. # 或者
    3. mysql> SELECT load_file("/etc/passwd")

    7,定期备份数据。
    任何系统都有可能发生灾难。服务器、MySQL也会崩溃,也有可能遭受入侵,数据有可能被删除。只有为最糟糕的情况做好了充分的准备,才能够在事后快速地从灾难中恢复。企业最好把备份过程作为服务器的一项日常工作。

    新增定时任务,自动备份数据脚本示例:

    1. time=us_songmics_dev_$(date '+%Y-%m-%d-%H-%M-%S')
    2. ###################数据库配置信息#######################
    3. user=root
    4. passwd='password'
    5. dbname=us_songmics_dev
    6. mysql_back_path=/home/data
    7. ##################执行备份#############################
    8. mysqldump -u$user -p$passwd $dbname > $mysql_back_path/$time.sql

    参考信息:
    http://www.yunweipai.com/5994.html
    https://www.cnblogs.com/allenhu320/p/11547424.html
    https://www.jb51.net/article/40710.htm
    https://www.cnblogs.com/guixia621/p/7365517.html