• mysql用户管理


    MySQL用户名和操作系统用户名完全不相关,甚至最大长度可能不同。例如, Unix用户名限制为8个字符。 MySQL用户名最大可达16字符长。

    MySQL 的加密密码使用自己的算法。该加密算法不同于Unix登录过程使用的算法。MySQL密码加密与PASSWORD()SQL函数的方法相同。Unix密码 加密与ENCRYPT()SQL函数的方法相同。从版本4.1 起,MySQL使用更强的鉴定方法,同以前的版本相比可以在连接过程中提供更好的密码保护。即使TCP/IP包被截取或mysql数据库被捕获也很安全 (在前面的版本中,即使密码以加密形式保存到user表中,仍可以通过加密密码值来连接MySQL服务器)。

    查看用户账号信息:SELECT * FROM mysql.user;

    使初始mysql账号安全

    MySQL安装过程包括设置含有授权表的MySQL数据库(这里只讲在unix中的情况): 在Unix中,用mysql_install_db程序来安装 授权表。可以通过一些安装方法来运行该程序。否则你需要手动执行。授权表定义了初始MySQL用户账户和访问权限。

    注:确定是否要初始化授权表的一个方法是寻找数据目录下的mysql目录(数据目录名通常为data或var,位于MySQL安装目录下)。应保证MySQL数据库目录有文件user.MYD。否则,执行mysql_install_db脚本。运行并重启服务器后,执行该命令来测试初始权限:shell> mysql -u root test

    创建了两个root 账户。这些账户为超用户账户,可以执行任何操作。初始root账户的密码为空,因此任何人可以用root账户不用任何密码来连接MySQL服务器,并具有所有权限。在Unix中,两个root账户均用于从本机连接。必须从本机进行连接,一个账户主机名应指定为localhost,另一个账户为实际的主机名或IP号。

    创建了两个匿名用户账户,每个账户的用户名均为空。匿名账户没有密码,因此任何人可以使用匿名账户来连接MySQL服务器。在Unix中,两个匿名账户均用于从本机连接。必须从本机进行连接,一个账户主机名应指定为localhost,另一个账户为实际的主机名或IP号。两个账户具有test数据库或其它以test开始的数据库的所有权限。

    以上可以看出,如果我们对这些初始账号不做任何动作的话,那我们的mysql数据库是很危险的。我们可以做的就是,修改root密码,删除匿名账号或修改匿名账号密码。

    为root账户指定密码:

    方法一:使用SET PASSWORD语句

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

    方法二:使用mysqladmin为root账户指定密码

    shell> mysqladmin -u root password "newpwd"
    shell> mysqladmin -u root -h host_name password "newpwd"

    我使用的该方法,在修改h为hostname时报一下错误信息:'Host '*.*.corp' is not allowed to connect to this MySQL server',查看了网上的解决方法,执行以下授权语句,然后再登出mysql服务器,执行以上语句,成功。

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
    FLUSH PRIVILEGES;

    方法三:使用UPDATE直接修改user表

    shell> mysql -u root
    mysql> UPDATE mysql.user SET Password = PASSWORD('newpwd')   WHERE User = 'root';
    mysql> FLUSH PRIVILEGES;

    修改匿名账号密码:

    方法一:

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

    查看是否生效,可以查看select host,user,password from mysql.user;

    方法二:

    shell> mysql -u root
    mysql> UPDATE mysql.user SET Password = PASSWORD('newpwd') WHERE User = '';
    mysql> FLUSH PRIVILEGES;

    在user表中直接使用UPDATE更新密码后,必须让服务器用FLUSH PRIVILEGES重新读授权表。否则,重新启动服务器前,不会使用更改。

    删除匿名账号:

    shell> mysql -u root
    mysql> DELETE FROM mysql.user WHERE User = '';
    mysql> FLUSH PRIVILEGES;

    添加账号

    1. 使用GRANT语句
    2. 直接操作MySQL授权表
    3. 使用MySQL账户管理功能的第三方程序。phpMyAdmin即是一个程序
    方法一:
    shell> mysql --user=root -p
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
      -> IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
    ->     IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
    mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
    mysql> GRANT USAGE ON *.* TO 'dummy'@'localhost';
       其中两个账户有相同的用户名monty和密码some_pass。两个账户均为超级用户账户,
    具有完全的权限可以做任何事情。一个账户 ('monty'@'localhost')只用于从本机连接时。另一个账户('monty'@'%')可用于从其它主机连接。
    请注意monty的两个账户必须能从任何主机以monty连接。没有localhost账户,当monty从本机连接时,mysql_install_db创建的localhost的匿名用户账户将占先。结果是,monty将被视为匿名用户。
    原因是匿名用户账户的Host列值比'monty'@'%'账户更具体,这样在user表排序顺序中排在前面。
    一个账户有用户名admin,没有密码。该账户只用于从本机连接。授予了RELOAD和PROCESS管理权限。这些权限允许admin用户执行mysqladmin reloadmysqladmin refreshmysqladmin flush-xxx命令,
    以及mysqladmin processlist。未授予访问数据库的权限。你可以通过GRANT语句添加此类权限。
    一个账户有用户名dummy,没有密码。该账户只用于从本机连接。未授予权限。通过GRANT语句中的USAGE权限,你可以创建账户而不授予任何权限。它可以将所有全局权限设为'N'。假定你将在以后将具体权限授予该账户。

    方法二:
    直接用INSERT语句创建相同的账户,然后使用FLUSH PRIVILEGES告诉服务器重载授权表
    shell> mysql --user=root mysql
    mysql> INSERT INTO user
    ->     VALUES('localhost','monty',PASSWORD('some_pass'),
    ->     'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
    mysql> INSERT INTO user
        ->     VALUES('%','monty',PASSWORD('some_pass'),
        ->     'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
    mysql> INSERT INTO user SET Host='localhost',User='admin',
        ->     Reload_priv='Y', Process_priv='Y';
    mysql> INSERT INTO user (Host,User,Password)
        ->     VALUES('localhost','dummy','');
    mysql> FLUSH PRIVILEGES;
    当你用INSERT创建账户时使用FLUSH PRIVILEGES的原因是告诉服务器重读授权表。否则,只有重启服务器后更改方会被注意到。使用 GRANT,则不需要使用FLUSH PRIVILEGES。
    用INSERT使用PASSWORD()函数是为了加密密码。GRANT语句为你加密密码,因此不需要PASSWORD()。
    'Y'值启用账户权限。对于admin账户,还可以使用更加可读的INSERT扩充的语法(使用SET)。INSERT user表时,没有指定的列默认值为'N'。
    请注意要设置超级用户账户,只需要创建一个权限列设置为'Y'的user表条目。user表权限为全局权限,因此其它 授权表不再需要条目。(这句话其实我没怎么懂,理解的童鞋是否能分享下?)

    举例:
    例子创建3个账户,允许它们访问专用数据库。每个账户的用户名为custom,密码为obscure。
    shell> mysql --user=root mysql
    mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.* TO 'custom'@'localhost' IDENTIFIED BY 'obscure';
    mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO 'custom'@'whitehouse.gov' IDENTIFIED BY 'obscure'; 
    mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO 'custom'@'server.domain' IDENTIFIED BY 'obscure';
    这3个账户可以用于:第1个账户可以访问bankaccount数据库,但只能从本机访问。第2个账户可以访问expenses数据库,但只能从主机whitehouse.gov访问。   第3个账户可以访问customer数据库,但只能从主机server.domain访问。


    如果你想要让某个用户从给定域的所有机器访问(例如,mydomain.com),你可以在账户名的主机部分使用含‘%’通配符的GRANT语句:
    mysql> GRANT ... ON *.* TO 'myname'@'%.mydomain.com' IDENTIFIED BY 'mypass';  


    删除用户账号

    1.drop user mysql1 --删除mysql1用户账号
    2.drop user mysql1@localhost
    删除用于从其他主机连接的账号mysql1,其实也可以这样写drop user 'mysql1'@'%'
    删除用于从本地连接mysql服务器的账号mysql1.
    3.revoke all privileges on *.* from mysql1@localhost
    取消从本地连接mysql服务器账号mysql1的除登录外的所有权限,注意grant在给一个新用户授权的同时可以创建用户表登录项(在mysql.user表中添加一条记录),但revoke只能是取消相应权限,
    而不会从用户登录表中删除该用户。
    4.delete from mysql.user where host='localhost' and user='mysql1';
    flush privileges;
    直接从mysql.user表中删除。


     



     
  • 相关阅读:
    【转载】以太网帧类型速查表
    oracle 无法解析指定的连接标识符
    最近观影有感~
    myeclipse 8.5 安装svn插件
    Symbian S60 设备配置 IMAP
    VS 2008 自动缩进修改
    RGB YUV [转]
    NoteExpress 无法访问国外数据库
    小s坐月子
    2011124 code
  • 原文地址:https://www.cnblogs.com/shihuai355/p/3963225.html
Copyright © 2020-2023  润新知