MySQL帐户安全初始化

               2.10.2 MySQL帐户安全初始化

  创建包含权限表的mysql数据库(注:数据库名),实质上是MySQL(注:数据库管理系统名)安装流程序的一部分。该权限表的生成方法在不同的平台,各有不同,如下所述:

* 在Windows平台。MySQL的发布版本已经包含了预先初始化好的权限表。

*   在类Unix平台。使用mysql_install_db 脚本程序填充权限表。当然,也存在一些安装方法,会自动运行该脚本。到底是要手动还是自动,在2.10.1小节:“在类Unix系统上,安装MySQL之后的后续处理”有详细说明。

  通过前面“在类Unix系统上,安装MySQL之后的后续处理”小节的操作,你已经生成了一个名为“mysql”数据库,其中包含有一个名为“user”的数据表。mysql.user就是这里要说明的权限表。mysql.user中定义了MySQL(注:数据库管理系统名)的初始用户及这些用户的访问权限,大体的设置如下:

* 部分以root为用户名的帐户,是超级帐户。这种帐户拥有所有的操作权限。root用户的初始密码为空,所以很不安全。

+在Windows平台上。root帐户默认情况下被创建为只可以主可以通过本同主机连接。连接可以通过本同主机名“localhost”,也可以通过IP地址127.0.0.1,IPv6 地址为 ::1.如果在安装MySQL时用户选择了充许远程机器以root帐户访问的选项的话,Windows安装程序将会创建另一个允许任何主机名远程连接的root帐户。

+在类Unix平台上。所有的root账户都允许本地主机连接。这类连接可以用指定主机名为“localhost”来建立,也可以指定P地址为127.0.0.1,IPv6 地址为 ::1 来连接,或者是真实主机名或真实IP地址的连接.

对于一个主机IP为127.0.0.1的连接,一般解释为使用localhost帐户。然则如果用户设置了“--skip-name-resolve”(注:关闭域名反向解析)选项,该连接则会失败。因些“127.0.0.1帐户”只会在打开域名反向解析时才有用。“::1账户”是用于IPv6环境下的连接的。

 *  部分帐户是匿名帐户。匿名帐户的用户名及密码都为空,所以任何人都可以连接到MySQL服务器。

+  在Windows平台上。有一个匿名帐户允许从本地主机连接。可以指定主机主名为“localhost”来建立这类连接。
+  在类Unix平台上。各个匿名帐户都允许从本地连接。可以指定主机主名“localhost”来建立这类连接到某个匿名帐户的连接。你也可以用一些真实的主机名及IP地址去连接其它匿名帐户。

    用下面的SELECT语句,可以显示mysql.user表,并检查当中有什么帐户,其密码是否为空:
mysql> SELECT User, Host, Password FROM mysql.user;

(注,也可以这样执行该语句:sudo ./bin/mysql -e "SELECT User, Host, Password FROM mysql.user" mysql)

执行上面语句后,会显示与下面类似的内容:
+------+--------------------+----------+
| User | Host               | Password |
+------+--------------------+----------+
| root | localhost          |          |
| root | myhost.example.com |          |
| root | 127.0.0.1          |          |
| root | ::1                |          |
|      | localhost          |          |
|      | myhost.example.com |          |
+------+--------------------+----------+

(输出结果1.0)

上面的输出表明,权限表中有数个root帐户及匿名帐户,全部帐户的密码都为空。输出会因为平台的不同而有所差异,但空密码帐户的出现本身,就意味着你的安装的MySQL不受保护,除非你进行下面的操作:

* 你应该为各个root帐户分配密码

*如果你想防止客户端用无密码匿名帐户连接服务器的话,你也应该为匿名帐户分配密码或者干脆把匿名帐户删了.

另外,所有帐户都可以访问以"test"为名及名字以"test_"开头的数据库(注,下面称:测试用数据库)。包括那些没有任何特殊权限的帐户也是如此。好比如默认的匿名帐户就是就没有特殊权限的了.mysql数据库中的db表(mysql.db)的各行数据,包含了所有帐户访问测试用数据库的权限设置.这样方便了测试,但不利于生产环境下的务服运行。作为管理员,如果你想数据库服务只接受权限假定明确的访问的话,那么你就需要把mysql.db表中的这些数据行删除掉(注:这里说的是,删除的是数据行)

  下面将会描述如何为MySQL的初始帐户设置密码。先说明root帐户的设置,然后再说匿名帐户。这里的内容覆盖:如何删除匿名用户;是否应该从根本上禁止匿名访问;如何删除对测试数据库的自由访问。我们会在例子中演示如何替换新密码及替换主机名。你可以在前面“输出结果1.0”中找一个需要被替换的名字。如“输出结果1.0”所示,host_name 域的记录 myhost.example.com 就是一个可被替换的名字。
  更多关于密码设置的内容,可以参看6.3.5小节“帐户密码设置”。如果你忘记了root帐户密码,那么请参看B.5.4.1小节:“如何重设root帐户密码”。


  你可能为了免除测试及额外组件安装时重复输入密码,而推迟密码的设置。但是必须要确定在服务上线到生产环境前设置好密码!新增帐户请参看6.3.2小节:“新增帐户”


设置root帐户密码

设置root帐户密码有多种方法,下面主要宣示其中的三种:

* 使用SET PASSWORD语句

* 使用UPDATE PASSWORD语句

*   使用命令行客户端工具:mysqladmin


  使用SET PASSWORD设置。以root帐户连接到服务器,并为每个mysql.user表中的root帐户提交一个SET PASSWORD语句。一定要注意,例用PASSWORD()函数为密码加密!

在Windows平台,操作如下:
shell> mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR 'root'@'::1' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR 'root'@'%' = PASSWORD('newpwd');

如果mysql.user表中没有root帐户的主机名值为“%”的话,那么并不需要运行上面的最后一个语句。

在类Unix平台,操作如下:

shell> mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR 'root'@'::1' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR 'root'@'host_name' = PASSWORD('newpwd');

 
  使用SET PASSWORD设置。你也可以使用单条UPDATE语句来给所有root帐户设置密码。具体方法如下所示:
shell> mysql -u root
mysql> UPDATE mysql.user SET Password = PASSWORD('newpwd')
    ->     WHERE User = 'root';
mysql> FLUSH PRIVILEGES;
FLUSH 语句主要用来重新读入权限表。否则对密码的修改不会即时发效,直到服务器重启。

  使用客户端工具mysqladmin设置。具体操作如下:
shell> mysqladmin -u root password "newpwd"
shell> mysqladmin -u root -h host_name password "newpwd"

     上述命令在Windows平台 及类 Unix平台都可以使用。括住密码用的双引号并非必需,但为了防止空格等字符在命令解释程序中被转义,最好还是加上。对于'root'@'127.0.0.1' 及 'root'@'::1'这两个帐户,使mysqladmin设置密码,是不会生效的。应采用前面介绍的SET PASSWORD设置方法。
  在设置根用户密码后,但凡你用root帐户连接服务器,你都要输入正确的密码。例如你用mysqladmin关闭服务器时。如下所示:
shell> mysqladmin -u root -p shutdown
Enter password: (输入密码)


设置匿名帐户密码

  这里假设你已经设置的root帐户密码。所以命令中要带“-p”选项,以便指定密码。具体操作与root帐户的密码设置相似,都可以使用SET PASSWORD语句及UPDATE句,当然不要忘记使用PASSWORD()对密码加密。如下所示:

    用SET PASSWORD设置在 Windows平台的操作:
shell> mysql -u root -p
Enter password: (输入密码)
mysql> SET PASSWORD FOR ''@'localhost' = PASSWORD('newpwd');
  
    用SET PASSWORD设置在 类Unix平台的操作:

shell> mysql -u root -p
Enter password: (输入密码)
mysql> SET PASSWORD FOR ''@'localhost' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR ''@'host_name' = PASSWORD('newpwd');

  用UPDATE所有平台都一样:
shell> mysql -u root -p
Enter password: (输入密码)
mysql> UPDATE mysql.user SET Password = PASSWORD('newpwd')
    ->     WHERE User = '';
mysql> FLUSH PRIVILEGES;

   运行UPDATE后记得调用FLUSH语句,重新读入权限表 .


删除匿名帐户
  如果你选择删除匿名帐户而不是为它们设置密码,那么如以进行如下操作。

在Windows平台上:
shell> mysql -u root -p
Enter password: (enter root password here)
mysql> DROP USER ''@'localhost';

在类Unix平台上:
shell> mysql -u root -p
Enter password: (enter root password here)
mysql> DROP USER ''@'localhost';
mysql> DROP USER ''@'host_name';

测试数据库安全性

    在默认情况下,mysql.db表设置的权限信息允许任何用户访问以“test_”开头的数据库,这包括测试数据库的用户及其它数据库的用户,要知道生产环境下的非测试数据库也有可能是以“test_”开头的。(mysql.db表中的数据有一名为“User”的列,其值为空,这是为了在访问权限检查时匹配任何用户名而设的)。这意味首任何帐户都可以使用这些以“test_”开头的 数据库。甚于是那么原本没有任何权限的帐户也是如此。如果你想删除这个任何帐户都可以访问测试数据库的设置,可以使用如下命:”
shell> mysql -u root -p
Enter password: (enter root password here)
mysql> DELETE FROM mysql.db WHERE Db LIKE 'test%';
mysql> FLUSH PRIVILEGES;
再次提醒,需要调用FLUSH 语句.

  通过上面的设置,只有那些拥有全局数据库权限及显式指定对测试数据权有使用权限的帐户可以访问测试数据库。如果你想删除测试数据库,那么你可以用下面语句:
mysql> DROP DATABASE test;

请注意:

    在Windows平台上,你可以在MySQL的安装程序上执行本节所讨论的流程(可参看2.3.3小节:“在Windows平台上使用安装包来安装MySQL ”)。在所有平台的MySQL发布版本中,都包含有mysql_secure_installation这个命令行工具,用来实现MySQL安全安装流程自动化。可视化管理工具MySQL Workbench在所有平台上都可用,其提供了帐户管理功能(可参看第26章“MySQL Workbench”)。






你可能感兴趣的:(MySQL帐户安全初始化)