1、MySQL的链接创建与权限

  写这些的目的一是记录下工做这几年所学,算是成长脚印吧。二是复习一遍,也给本身当笔记看,通篇观点都属于我的理解较多。读者观看的时候也须要本身判断下是否正确,另外,记下一段我很是喜欢的话:年少轻狂的我一样有对将来的迷茫,对生活的愤懑,对社会的厌恶,对世道的鄙夷......在阅尽沧桑的饱览岁月的人看来,这些也许很幼稚,但这不正是青春的特质吗?青春既然不可以被挽留,也不可以被拒绝,那就用本身的方式去挥霍或者,珍惜。python

  1、链接创建前mysql

    一、链接方式sql

    二、服务器、客户端域名链接shell

    三、重要参数数据库

  2、权限缓存

 

 

1、链接创建前安全

  一、链接方式服务器

首先介绍链接方式,mysql能够提供来自网络的tcp/ip链接和只服务本机localhost的Unix域套接字链接,若是服务器不监听来自网络的链接,远程客户端链接会报错,服务器不会收到任何消息。
 
Tcp/ip:用于跟mysql实例不在同一台机器上的客户端和本机127.0.0.1链接;注意防火墙的设置,防火墙是否放过mysql的进程,是否屏蔽了mysql的3306端口。
Unix域套接字:它不是一种网络协议,只用于客户端和mysql实例在同一台机器上,用localhost访问。

<1>skip_networking
告诉mysql不要监听网络,服务只限于本机localhost访问,127.0.0.1也不能访问。若是不须要其余主机链接,最好把这变量打开,防止穷举密码攻击。
<2> bind-address 只监听某个特定地址的链接,这个参数是指定哪些服务器监听哪些ip的请求,其余ip就算有权限也链接不上。为了数据的安全,能够考虑让MySQL只守候在127.0.0.1上,这样从Internet上就没法直接访问数据库了。

 

  二、服务器、客户端域名链接网络

 

  

1)服务端
  只要你安装启动了mysql服务,就能够经过mysql服务器主机名称或ip链接。可是客户端给mysql服务器传递以前,主机名称必定要转换成ip,若是此主机名称不是公共网络上的主机名称,必须在hosts表里填写主机名和其ip对应关系,
不然没法链接。
  Mysql服务器本机命令行客户端:Shell>./mysql –hhost –uuser –ppwd
  分别在C:\Windows\System32\drivers\etc\hosts和/etc/hosts中添加:ip  hostname,而后分别从新链接,都可正常链接。
【1】resolveip工具
   对hostname和ip的转换工具。位于/usr/local/mysql/bin/2)客户端域名链接受权
  此域名对应mysql库的user表中的host字段,是用来控制对客户端的链接权限的。
  mysql> INSERT INTO `user` VALUES ('ip', 'user', password("pwd"),  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N', 'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N', '', '', '', '', '0', '0', '0', '0', '', null);//域名受权
  mysql> INSERT INTO `user` VALUES ('ip', 'user', password("pwd"),  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N', 'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N', '', '', '', '', '0', '0', '0', '0', '', null);//ip段受权,在此ip段的客户端均可以经过hanmm这个帐号链接mysql服务。
  or
  grant 权限 on 数据库对象 to 用户@'host' identified by 'pwd'
   Host cache
   选项就能禁用主机缓存。想要清除主机缓存,能够提交 FLUSH HOSTS 语句或者运行 mysqladmin flush-hosts.

<1>skip-name-resolve 
  skip-name-resolve能大大加快用户得到链接的速度,特别是在网络状况较差的状况下。MySQL在收到链接请求的时候,会根据请求包中得到的ip来反向追查请求者的主机名。而后再根据返回的主机名又一次去获取ip。若是两次得到的ip相同,那么链接就成功创建了。在DNS不稳定或者局域网内主机过多的状况下,一次成功的链接将会耗费不少没必要要的时间。假如MySQL服务器的ip地址是广域网的,最好不要设置skip-name-resolve。
  When a new thread connects to mysqld, mysqld will spawn a new thread to handle the request. This thread will first check if the hostname is in the host cache. If not the thread will call gethostbyaddr_r() and gethostbyname_r() to resolve the hostname.
  当一个新的链接请求产生,mysql会启动一个新线程去处理此请求,该线程首先会检查域名缓存里是否有此域名,若是缓存里不存在,则调用gethostbyaddr_r()和gethostbyname_r()处理此域名。
  If the operating system doesn't support the above thread-safe calls, the thread will lock a mutex and call gethostbyaddr() and gethostbyname() instead. Note that in this case no other thread can resolve other hostnames that is not in the hostname cache until the first thread is ready.
若是操做系统对这两个函数不提供线程安全的调用(我理解是每一个线程隔离并行),则此线程对操做系统该资源加锁,而后调用方法,直到它处理完释放此资源锁,别的线程才能调用。
  You can disable DNS host lookup by starting mysqld with --skip-name-resolve. In this case you can however only use IP names in the MySQL privilege tables.
你能够在启动时加--skip-name-resolve这个参数,避免DNS host查找过程,这样你使用ip地址而不能使用域名链接访问mysql。
  If you have a very slow DNS and many hosts, you can get more performance by either disabling DNS lookop with --skip-name-resolve or by increasing the HOST_CACHE_SIZE define (default: 128) and recompile mysqld.
  若是DNS服务很慢且有不少域名,想要提升性能,你可选择加参数--skip-name-resolve启动,或者增大域名缓存空间大小。
容许域名解析的时候 localhost=127.0.0.1,禁止域名解析以后localhost与127.0.0.1并非同一个主机。因此在禁止域名解析以后,须要从新设置用户权限,不能再使用 localhost ,使用 % 任意主机或者IP地址如127.0.0.1 。

  You can disable the hostname cache with --skip-host-cache. You can clear the hostname cache with FLUSH HOSTS or mysqladmin flush-hosts.

  If you don't want to allow connections over TCP/IP, you can do this by starting mysqld with --skip-networking.

<2>host_cache_size
  5.6.26默认279。The host_cache_size value, introduced in MySQL 5.6.5, is ignored by the server. The host_cache table only holds 128 entries.
<3>skip-grant-tables
  若是忘记管理员密码,在启动mysql时不启动grant-tables受权表。mysqld_safe --skip-grant-tables &
  而后修改管理员密码:
  mysql>update user set password=password('yournewpasswordhere') where user='root';
  mysql>flush privileges;
  mysql>exit;
  重启mysql。

 

  三、重要参数多线程

<1>socket
    默认值是/tmp/mysql.sock,此文件删除掉会致使socket链接失败。
    Unix平台:用于本地客户端链接的套接字文件。默认为/var/lib/mysql/mysql.sock。
    Windows:用于本地客户端链接的命名管道名。默认为mysql。
<2>max_connections
    mysql是多线程的,能够同时接收客户端的多个链接(connection)请求。max_connections是整个mysql容许的最大并发链接数(实际值比该值多1,预留给系统管理员),影响整个mysql应用的并发处理能力。
只要服务器监听了网络tcp链接,无论用户名密码对不对,有没有权限,客户端发起链接请求,无论三七二十一,先检查当前链接数是否已达到上限,达到链接上线拒绝链接。通常来讲,只要mysql主机性能容许,应该将
该参数设置的尽可能大一点,通常1000
-5000左右是一个比较合适的参考值。 <3>max_user_connections 每一个用户容许的最大链接数。该参数针对单个用户的链接限制。 在通常状况下咱们不多使用这个限制,只有在一些专门提供mysql数据存储服务或者提供虚拟主机的应用中可能用到。 <4>connect_timeout 链接超时 检测方法 telnet ip 3306.链接超时时间,客户端发送tcp第一次握手,我要请求了;服务器端收到请求,检查链接未达到上限,返回赞成,计时开始;客户端发送真正的(如select)请求,再到服务器端,
这段时间超过connet_timeout,就断开了。默认值10,通常不要动。【在数据量大的状况下,因为网络等缘由,若是connect_timeout设置太低,极有可能链接超时。这个值最低好像是2,许容许设置成0,设置成0其实就是
全部链接都链接不上了。】 权限1
---链接权限认证: Usage,链接(登录)权限。创建一个用户,默认授予这个权限。该权限只能用于数据库登录,不能作任何操做。客户端链接时,传递给服务器端的信息:客户端的hostname或者IP地址、数据库
服务器的IP地址或域名、数据库服务的端口号、数据库账号名称、数据库账号对应的密码。服务器端检查mysql库的user表是否存在user和password对应用户,host是否符合对应host,用户是否有Usage权限。经过身份认证
链接才能创建,不然拒绝链接。客户端链接成功后取得该连接的全部权限,在该链接生命周期内权限不会变,即便在别处更改了权限,也不会影响。例如:该用户没有delete权限,在链接后,管理员赋予它delete权限,但是得等
到此链接断开,下一次链接成功后才能得到delete权限。 例如:
192.168.1.1服务器上安装启动mysql服务。 mysql> INSERT INTO `user` VALUES ('192.168.1.1', 'user', password("pwd"), 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', '', '', '', '', '0', '0', '0', '0', '', null); User表里host字段是链接客户端的ip,和mysql服务器主机ip没有关系,为哪一个客户端赋链接权限,就是哪一个客户端主机的ip。 <5>Aborted_connects 用户名密码不对或没权限或链接超时(connect_timeout),被丢弃的链接数。 <6>max_connect_errors 最大链接失败数,max_connect_errors默认值为10,若是受信账号错误链接次数达到10则自动堵塞,须要flush hosts来解除。若是你获得象这样的一个错误: Host ’hostname’ is blocked because of many connection errors. Unblock with ’mysqladmin flush-hosts’ 在max_connect_errors次失败请求后,mysqld认定出错了(像来自一个黑客的攻击),而且阻止该站点进一步的链接,直到某人执行命令mysqladmin flush-hosts或者有reload权限的用户登陆后,执行mysql>flush hosts。 mysql认为是恶意链接,会强制阻止此客户端链接。当此客户端有一次链接成功后,针对此客户端的max_connect_errors会清零。---这个参数没验证出来。 <7>thread_stack 每一个链接线程被建立的时候,MySQL 给他分配的内存大小。 当 MySQL 建立一个新的链接线程的时候,是须要给他分配必定大小的内存堆栈空间,以便存放 客户端的请求 Query 以及自身的各类状态和处理信息。不过通常来讲若是不是对 MySQL 的链接线 程处理机制十分熟悉的话,不该该轻易调整该参数的大小,使用系统的默认值(192KB)基本上 能够全部的普通应用环境。若是该值设置过小,会影响 MySQL 链接线程可以处理客户端请求的 Query 内容的大小,以及用户建立的 Procedures 和 Functions 等 <8>back_log 短期内获得大量链接请求,而且超过max_connections,mysql暂时中止回答新请求以前, 容许被存在堆栈中的请求数量。操做系统的TCP/ip链接的侦听队列大小对这个队列大小有限制, 高于操做系统限制是无效的。

 

 

2、权限

1、Usage权限
  链接登录。新增的用户默认赋予这个权限,且此usage权限不能被收回。
2、管理grant权限   拥有grant option,就能够将本身拥有的权限授予其余用户(仅限于本身已经拥有的权限)   mysql> grant Grant option on db.* to db@localhost;   mysql> grant select on db.* to db@localhost;   mysql>grant select *.* to ‘user’@’192.168.1.%’ identified by ‘pwd’;
3、管理权限process   经过这个权限,用户能够执行SHOW PROCESSLIST和KILL命令。默认状况下,每一个用户均可以执行SHOW PROCESSLIST命令,可是只能查询本用户的进程。kill命令杀死服务器线程。你老是能显示或杀死你本身的线程,
可是你须要PROCESS权限来显示或杀死其余用户和SUPER权限启动的线程。 mysqld为有process权限的用户保留一个额外的链接, 以便一个MySQL root用户能登陆并检查,即便全部的正常链接在使用。因此当链接数达到最大时,普通链接创建不了的时候,拥有process权限的用户仍是能够链接的。 shell
>./mysqladmin –uroot –proot restart mysql>kill 3;//杀死id=3的进程。

4、管理权限file   拥有file权限才能够执行 select ..into outfile和load data infile…操做,可是不要把file, process, super权限授予管理员之外的帐号,这样存在严重的安全隐患。   管理权限(如 super, process, file等)不可以指定某个数据库,on后面必须跟*.*。   mysql> grant file on *.* to db@localhost;   mysql> load data infile ‘/home/mysql/db.txt’ into table db;
5、管理权限super   这个权限容许用户终止任何查询;修改全局变量的SET语句;使用CHANGE MASTER,PURGE MASTER LOGS。修改存储过程须要super权限():   mysql> grant super on *.* to 'ld'@'ip';   mysql> purge master logs before ‘mysql-bin.000006′;   管理权限(如 super, process, file等)不可以指定某个数据库,on后面必须跟*.*
6、管理权限Shutdown   shell>./mysqladmin –hip –uld –pld shutdown
7、管理权限replication slave   拥有此权限能够查看从服务器,从主服务器读取二进制日志。   mysql> grant replication slave on *.* to 1d@localhost;   mysql> show slave hosts;   mysql>show binlog events;
8、 replication client   此权限能够查询master server、slave server状态。   mysql> grant Replication client on *.* to ld@localhost;   或:mysql> grant super on *.* to ld@localhost;   mysql> show master status;
9、Reload权限   必须拥有reload权限,才能够执行   flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload命令。    MySQL的FLUSH句法,用于清除或者从新加载内部缓存。而使用flush语句,你必须有reload权限。 (1)flush hosts   清空hostname cache,hostname cache与链接时skip-name-resolve有关。   Flush logs: 关闭当前的二进制日志文件并建立一个新文件,新的二进制日志文件的名字在当前的二进制文件的编号上加1。 (2)flush logs   关闭当前的二进制日志文件并建立一个新文件,新的二进制日志文件的名字在当前的二进制文件的编号上加1。 (3)flush privileges   这个也是常用的,每当从新赋权后,为了以防万一,让新权限当即生效,通常都执行一把,目地是从数据库受权表中从新装载权限到缓存中。 (4)flush tables   关闭全部打开的表,同时该操做将会清空查询缓存中的内容。
(
5)flush tables with read lock   关闭全部打开的表,同时对于全部数据库中的表都加一个读锁,直到显示地执行unlock tables,该操做经常用于数据备份的时候。 (6)flush STATUS   重置大多数状态变量到0。 (7)flush MASTER    删除全部的二进制日志索引文件中的二进制日志文件,重置二进制日志文件的索引文件为空,建立一个新的二进制日志文件,不过这个已经不推荐使用,改为reset master 了。
(
8)flush QUERY CACHE   重整查询缓存,消除其中的碎片,提升性能,可是并不影响查询缓存中现有的数据,这点和Flush table 和Reset Query Cache(将会清空查询缓存的内容)不同的。 (9)flush slave   相似于重置复制吧,让从数据库忘记主数据库的复制位置,同时也会删除已经下载下来的relay log,与Master同样,已经不推荐使用,改为Reset Slave了。这个也颇有用的。   通常来说,Flush操做都会记录在二进制日志文件中,可是FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、FLUSH TABLES WITH READ LOCK不会记录,所以上述操做若是记录在二进制日志文件中话,
会对从数据库形成影响。注意:Reset操做其实扮演的是一个Flush操做的加强版的角色。
(10) references   有了REFERENCES权限,用户就能够将其它表的一个字段做为某一个表的外键约束。 11lock tables   必须拥有lock tables权限,才可使用lock tables   mysql> grant lock tables on ld.* to p1@localhost;   mysql> lock tables a1 read;   mysql> unlock tables;。 12、show view   必须拥有show view权限,才能执行show create view。   mysql> grant show view on ld.* to ld@localhost;   mysql> show create view v_shop; 13、show database   经过show database只能看到你拥有的某些权限的数据库,除非你拥有全局SHOW DATABASES权限。   对于ld@localhost用户来讲,没有对mysql数据库的权限,因此以此身份登录查询时,没法看到mysql数据库:   mysql> show databases; <1>skip_show_database   防止不具备SHOW DATABASES权限的人们使用SHOW DATABASES语句。若是你担忧用户可以看见属于其它用户的数据库,这样设置能够提升安全性。其效果取决于SHOW DATABASES权限:若是变量值为ON,只容许具备SHOW DATABASES权限的人们使用SHOW DATABASES 语句,而且该语句将显示全部数据库名。若是值为OFF,容许全部用户执行SHOW DATABASES,但只显示用户具备SHOW DATABASES或其它权限的数据库的名称。 14. excute   查看并执行存在的Functions,Procedures的权限。   mysql> grant execute on ld.* to 'ld'@'192.168.1.1' identified by 'ld';   查看并执行存储过程的权限。例如:执行完这句ld用户就能够查看到ld库中的存储过程名字,但打开啥也没有,也能执行,可是不能修改。   mysql> call pro_shop1(0001,@a);   mysql> select @a; 15、alter routine权限   必须具备alter routine的权限,才可使用{alter |drop} {procedure|function}   mysql> grant alter routine on ld.* to 'ld'@'%' identified by 'ld';   mysql> drop procedure pro_shop; 16、create routine   建立存储过程或函数。   mysql> grant create routine on zz4.* to 'ld'@'%' identified by 'ld';//赋予权限   mysql> revoke create routine on zz4.* from 'ld'@'%' identified by 'ld';//收回权限   只赋予create routine权限后,修改存储过程,报错   mysql> grant select on ld.* from 'ld'@'192.168.1.1' identified by 'ld';   mysql> grant select routine on ld.* from '*'@'192.168.1.1' identified by 'ld'; 17. create temporary tables   (注意这里是tables,不是table)   必须有create temporary tables的权限,才可使用create temporary tables.   mysql> grant create temporary tables on ld.* to ‘ld′@’localhost’;   [mysql@mydev ~]$ mysql -h localhost -u ld -p ld   mysql> create temporary table tt1(id int); 18. create view   必须有create view的权限,才可使用create view   mysql> grant create view on ld.* to ‘ld′@’localhost’;   mysql> create view v_shop as select price from shop; 19. create user   要使用CREATE USER,必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。   mysql> grant create user on *.* to ‘ld′@’localhost’;   或:mysql> grant insert on *.* to ld@localhost; 20. index   必须拥有index权限,才能执行[create |drop] index 21、create权限   数据库、表或索引.   必须有create的权限,才可使用create table   mysql> grant create on ld.* to ‘ld′@’localhost’; 22、insert权限 23、drop权限 24、delete权限 25、alter 修改表结构、数据库属性、存储过程。 26、update权限、 27、Select权限 查找数据库、表或索引。 mysql> select * from cat; 另外,链接后,查询只显示有权限的库和表和字段,新建的用户默认有Usage权限,和test库的访问权限,能够对它查询,修改,删除等。
权限补充:

【1】proxy user              

Mysql假装用户,自从MySQL 5.5 发布第一个版本以来,就在GRANT权限列表里面新增长了一条记录: PROXY。 不要觉得这个是之前的MySQL Proxy 哦。其实这个是用来给用户作马甲用的。

假装用户方法:

步骤1:

mysql> select version();//确保版本是5.5以上

步骤2:

mysql> select * from mysql.plugin; //检查是否已经加载test_plugin_server插件,默认5.5和5.6版本的mysql,都没有安装。

 
 

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

 
 

| name               | dl                   |

 
 

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

 
 

| test_plugin_server | auth_test_plugin.dll |

 
 

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

 
 

步骤3:

 
 

//若是没有安装插件,执行这句安装;

 
 

mysql> install plugin test_plugin_server soname 'auth_test_plugin.dll';

 
 

步骤4:

 
 

mysql> create user 'pp_ext'@'%' identified with test_plugin_server as 'pp';

 
 

步骤5:

 
 

mysql> grant proxy on 'pp'@'%' to 'pp_ext'@'%';

 
 

步骤6:

 
 

mysql> flush privileges;

 
 

步骤7:

 
 

退出,用用户名pp_ext密码:pp登录。

 
 

报错:

 
 

1251-Client does not support authentication protocol requested by server;consider upgrading MySQL client

 
 

@@proxy_user 这个只读变量为NULL。没有假装成功。得升级客户端版本。我用的是navicat.

 
 

 

 
 

更新完客户端后,查看一下假装用户的权限

 
 

Mysql>show grants for ‘pp’@’%’;

 
 

操做更正经常使用户没什么区别。

 
 

<1> proxy_user 

 
 

【2】Mysqlaccess命令

 
 

用户权限检查程序

 
 

【3】mysql_setpermission

 
 

 用于管理用户权限信息的交互式perl脚本。

相关文章
相关标签/搜索