电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

MySQL 權限控制細節分析

瀏覽:29日期:2023-10-04 13:05:00

今天周天,早上懶了一會兒,起的有點兒晚,中午沒事兒干,重新看了看MySQL里面的權限控制模塊,再次回頭看,還是有很多收獲的細節,這里記錄一下,方便自己后續查看。 關于權限部分的內容,之前3月11號的文章中有寫過一些,今天的內容,我們使用一個一個的細節知識點來撰寫(本文中所使用的MySQL版本是5.7.16),在寫這些知識點之前,我們首先介紹一下MySQL的權限控制粒度、然后了解一下MySQL中客戶端發起請求的時候,服務端所做的核實工作,先來看權限控制粒度:

1、全局層級

全局權限使用于給一個給定服務器中的所有數據庫,這些權限存儲在mysql.user表中,使用grant all on *.*的方法和revoke all on *.*的方法授予或者回收權限。

2、數據庫層級

數據庫權限適用于一個給定數據庫中的所有目標,包含表對象和存儲過程,這些權限存儲在mysql.db表中,使用grant all on db_name.*或者對應的revoke方法可以授予和回收數據庫權限

3、表層級

表權限適用于一個給定表中的所有列,這些權限存儲在mysql的tables_priv表中,一般使用grant all on db_name.tbl_name和對應的revoke語句來授予或者撤銷權限。

4、列層級的權限

列層級的權限適用于一個給定表中的指定列,這些權限存儲在mysql.columns_priv的表中,由于這個權限不常用,這里給出它的授權方法示例,如下:

首先我們創建一個用戶,擁有yeyztest.test1這個表的select權限:

mysql:mysql 19:35:38>>show grants for dba_yeyz@’192.168.18.%’ ;+------------------------------------------------------------------------------+| Grants for dba_yeyz@192.168.18.% |+------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO ’dba_yeyz’@’192.168.18.%’ || GRANT SELECT ON `yeyztest`.`test1` TO ’dba_yeyz’@’192.168.18.%’|+------------------------------------------------------------------------------+2 rows in set (0.00 sec)

然后我們多test1中的一個字段id進行update操作,結果如下:

mysql> select * from test1;+---------------+| id |+---------------+| 22 || 3333333333333 |+---------------+2 rows in set (0.00 sec)mysql> update test1 set id=2 where id=22;ERROR 1142 (42000): UPDATE command denied to user ’dba_yeyz’@’192.168.18.**’ for table ’test1’

當然,我們是不能進行update的,這個時候,我們使用root賬號給這個dba_yeyz的賬號一個id列的權限,然后再看它的結果:

mysql:mysql 19:38:38>>show grants for dba_yeyz@’192.168.18.%’ ;+------------------------------------------------------------------------------+| Grants for dba_yeyz@192.168.18.% |+------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO ’dba_yeyz’@’192.168.18.%’ || GRANT SELECT ON `yeyztest`.`test1` TO ’dba_yeyz’@’192.168.18.%’ || GRANT SELECT, UPDATE (id) ON `yeyztest`.`test1` TO ’dba_yeyz’@’192.168.18.%’ |+------------------------------------------------------------------------------+3 rows in set (0.00 sec)

這里需要注意給字段添加權限的語句,也就是:

grant update (id) on yeyztest.test1 to XXXXXX

也就是在權限后面跟上字段的名稱。

這個時候,我們查詢一下columns_priv的表,可以看到里面的記錄是:

mysql:mysql 19:39:46>>select * from columns_priv;+--------------+----------+----------+------------+-------------+---------------------+-------------+| Host | Db | User | Table_name | Column_name | Timestamp | Column_priv |+--------------+----------+----------+------------+-------------+---------------------+-------------+| 192.168.18.% | yeyztest | dba_yeyz | test1 | id | 0000-00-00 00:00:00 | Update |+--------------+----------+----------+------------+-------------+---------------------+-------------+1 row in set (0.00 sec)

再次用dba_yeyz進行update操作,可以看到結果:

mysql> update test1 set id=2 where id=22;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> select *from test1;+---------------+| id |+---------------+| 2 || 3333333333333 |+---------------+2 rows in set (0.00 sec)

將id=22的列成功改成了id=2。

5、子程序層級

create routine、alter routine、execute和grant權限適用于已經存儲的子程序,這些權限可以被授予為全局層級和數據庫層級,可以被存儲在mysql.procs_priv中。

客戶端發起請求的時候,MySQL服務器核實請求時候的流程圖如下:

MySQL 權限控制細節分析

我將今天看到的一些細節的知識點一個一個羅列出來,希望對大家有點兒幫助:

1、在MySQL5.7.16版本中,mysql系統庫中已經沒有host表了,跟權限控制相關的表只有5個,分別是user、db、table_priv、proc_priv、column_priv。

2、mysql.user表的主鍵是用user和host聯合起來組成的,且看表結構:

mysql--dba_admin@127.0.0.1:mysql 19:44:56>>show create table mysql.userG*************************** 1. row *************************** Table: userCreate Table: CREATE TABLE `user` ( `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT ’’, `User` char(32) COLLATE utf8_bin NOT NULL DEFAULT ’’,---------------權限字段(29個)-------------- `Select_priv` enum(’N’,’Y’) CHARACTER SET utf8 NOT NULL DEFAULT ’N’, ......此處省略---------------安全字段(4個)--------------- `ssl_type` enum(’’,’ANY’,’X509’,’SPECIFIED’) CHARACTER SET utf8 NOT NULL DEFAULT ’’, `ssl_cipher` blob NOT NULL, `x509_issuer` blob NOT NULL, `x509_subject` blob NOT NULL,---------------資源控制字段(4個)-------------- `max_questions` int(11) unsigned NOT NULL DEFAULT ’0’, `max_updates` int(11) unsigned NOT NULL DEFAULT ’0’, `max_connections` int(11) unsigned NOT NULL DEFAULT ’0’, `max_user_connections` int(11) unsigned NOT NULL DEFAULT ’0’,--------------插件字段(1個)--------------- `plugin` char(64) COLLATE utf8_bin NOT NULL DEFAULT ’mysql_native_password’,--------------密碼字段(5個)-------------- `authentication_string` text COLLATE utf8_bin, `password_expired` enum(’N’,’Y’) CHARACTER SET utf8 NOT NULL DEFAULT ’N’, `password_last_changed` timestamp NULL DEFAULT NULL, `password_lifetime` smallint(5) unsigned DEFAULT NULL, `account_locked` enum(’N’,’Y’) CHARACTER SET utf8 NOT NULL DEFAULT ’N’, PRIMARY KEY (`Host`,`User`) -------------聯合主鍵,host在前-----------) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=’Users and global privileges’1 row in set (0.00 sec)

3、tables_priv表中只有以下權限,也就是關于表的權限:

select、insert、update、delete、drop、create、alter、grant、references、index、create view、show view、trigger;

columns_priv表中的權限只有下面四個:select、insert、update,references

4、修改一個用戶的密碼,一般有以下幾種方式:

set password for user@host = password(’newpassword’);update mysql.user set authentication_string=password(’pwd’) where user=’username’ and host=’hostname’;alter user user@host identified by ’newpassword’;mysqladmin -u username -h hostname -p password 'new password';

最好的方式是alter user的方法,事實上,在新的版本8.0中,set password的方法已經不能使用了,所以建議使用alter user的方法設置新的密碼。

除此之外,還有一種方法,不太常用,就是使用grant的方法覆蓋掉之前的密碼,這里我們簡單實驗一般,看看效果:

mysql:mysql 20:01:05>>GRANT SELECT ON `yeyztest`.`test` TO ’dba_yeyz’@’192.168.18.%’ identified by ’111111’;Query OK, 0 rows affected, 1 warning (0.00 sec)mysql:mysql 20:01:29>>select user,host,concat(user,’@’,’’’,host,’’’),authentication_string from mysql.user;+------------------+----------------+-----------------------------------+-------------------------------------------+| user | host | concat(user,’@’,’’’,host,’’’) | authentication_string |+------------------+----------------+-----------------------------------+-------------------------------------------+| dba_yeyz | 192.168.18.% | dba_yeyz@’192.168.18.%’ | *FD571203974BA9AFE270FE62151AE967ECA5E0AA |+------------------+----------------+-----------------------------------+-------------------------------------------+11 rows in set (0.00 sec)mysql:mysql 20:01:31>>GRANT SELECT ON `yeyztest`.`test` TO ’dba_yeyz’@’192.168.18.%’ identified by ’123456’;Query OK, 0 rows affected, 1 warning (0.00 sec)mysql:mysql 20:01:57>>select user,host,concat(user,’@’,’’’,host,’’’),authentication_string from mysql.user;+------------------+----------------+-----------------------------------+-------------------------------------------+| user | host | concat(user,’@’,’’’,host,’’’) | authentication_string |+------------------+----------------+-----------------------------------+-------------------------------------------+| dba_yeyz | 192.168.18.% | dba_yeyz@’192.168.18.%’ | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |+------------------+----------------+-----------------------------------+-------------------------------------------+1 rows in set (0.00 sec)

上面的測試可以看到,當我們使用grant的方法給一個指定的用戶重新設置密碼的時候,之前的老密碼會被覆蓋,所以這個操作在線上應該慎用,在每次grant的時候看看有沒有已經存在的賬號,確認沒有之后,再進行grant操作

5、如果我們不慎忘記了mysql的root密碼,可以重新啟動mysql服務,加上--skip-grant-tables這個參數來啟動mysql服務,這樣就可以直接免除了在權限表里面的匹配工作,直接登陸進mysql服務中,從而修改root賬號的密碼。

6、如果使用update或者insert記錄到mysql.user表中的方法創建賬戶或者修改密碼,在執行完語句之后,必須使用flush privileges的操作刷新權限表,否則該操作無法產生效果。

7、有幾個權限會影響mysqladmin工具的執行,分別是

reload權限:影響flush操作

shutdown權限:影響shutdown操作

process權限:影響processlist操作

super權限:影響kill操作

8、之前提到了mysql.user表中的資源控制的字段,分別是

max_questions每小時最大請求數、max_updates每小時最大更新數、max_connections每小時最大連接數、max_user_connections單個用戶可同時建立的最大連接數。

如果我們想給一個用戶設置這個參數,可以使用如下的SQL來進行設置:

mysql:mysql 20:01:58>>GRANT SELECT ON `yeyztest`.`test` TO ’dba_yeyz’@’192.168.18.%’ with max_queries_per_hour 1000;Query OK, 0 rows affected, 1 warning (0.00 sec)mysql:mysql 20:13:13>>select user,host,max_questions from mysql.user where user=’dba_yeyz’; +----------+--------------+---------------+| user | host | max_questions |+----------+--------------+---------------+| dba_yeyz | 192.168.18.% | 1000 |+----------+--------------+---------------+1 row in set (0.00 sec)

注意到,這里的grant語句中使用了with這個選項,with后面可以跟的選項有5個,分別是:

grant option:被授權的用戶可以將這些權限賦予別的用戶

max_queries_per_hour count:每個小時可以執行count次查詢;

max_updates_per_hour count:每個小時可以執行count次更新;

max_connections_per_hour count:每個小時可以建立count個連接;

max_user_connections count:設置單個用戶可以同時建立count個連接

9、設置全局變量:

SET GLOBAL default_password_lifetime = 180;

SET GLOBAL default_password_lifetime = 0;

可以設置密碼的生命周期為6個月,6個月之后失效,如果設置為0,則一直有效。

當然,還可以在創建用戶的時候就指定密碼的修改周期或者禁用密碼的修改周期:

CREATE USER ’jeffrey’@’localhost’ PASSWORD EXPIRE INTERVAL 90 DAY;ALTER USER ’jeffrey’@’localhost’ PASSWORD EXPIRE INTERVAL 90 DAY;CREATE USER ’jeffrey’@’localhost’ PASSWORD EXPIRE NEVER;ALTER USER ’jeffrey’@’localhost’ PASSWORD EXPIRE NEVER;

10、有時候我們似乎已經刪除了賬號密碼,但是卻還可以通過賬號密碼進行訪問,這個時候,需要檢查一個設置,就是看看user表中是否有空記錄:

select user,host from mysql.user where user=’’;

很有可能是你設置了user為空的記錄,這樣導致所有的用戶都可以直接登陸。如果有,最好直接干掉它,因為它違背了安全的宗旨。

以上就是MySQL 權限控制細節分析的詳細內容,更多關于MySQL 權限控制的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 磨煤机配件-高铬辊套-高铬衬板-立磨辊套-盐山县宏润电力设备有限公司 | 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 【中联邦】增稠剂_增稠粉_水性增稠剂_涂料增稠剂_工业增稠剂生产厂家 | 骁龙云呼电销防封号系统-axb电销平台-外呼稳定『免费试用』 | 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | 亮化工程,亮化设计,城市亮化工程,亮化资质合作,长沙亮化照明,杰奥思【官网】 | 万家财经_财经新闻_在线财经资讯网 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰]-不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰] | UV固化机_UVLED光固化机_UV干燥机生产厂家-上海冠顶公司专业生产UV固化机设备 | 太阳能发电系统-太阳能逆变器,控制器-河北沐天太阳能科技首页 | 钛板_钛管_钛棒_钛盘管-无锡市盛钛科技有限公司| 圆周直径尺-小孔内视镜-纤维研磨刷-东莞市高腾达精密工具 | FAG轴承,苏州FAG轴承,德国FAG轴承-恩梯必传动设备(苏州)有限公司 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 石家庄救护车出租_重症转院_跨省跨境医疗转送_活动赛事医疗保障_康复出院_放弃治疗_腾康26年医疗护送转诊团队 | 福建珂朗雅装饰材料有限公司「官方网站」 | 铝单板_铝窗花_铝单板厂家_氟碳包柱铝单板批发价格-佛山科阳金属 | 塑钢件_塑钢门窗配件_塑钢配件厂家-文安县启泰金属制品有限公司 深圳南财多媒体有限公司介绍 | 汕头市盛大文化传播有限公司,www.11400.cc | 丹尼克尔拧紧枪_自动送钉机_智能电批_柔性振动盘_螺丝供料器品牌 | 一技任务网_有一技之长,就来技术任务网| 氢氧化钾厂家直销批发-济南金昊化工有限公司 | 大行程影像测量仪-探针型影像测量仪-增强型影像测量仪|首丰百科 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 铝扣板-铝方通-铝格栅-铝条扣板-铝单板幕墙-佳得利吊顶天花厂家 elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 破碎机锤头_合金耐磨锤头_郑州宇耐机械工程技术有限公司 | 纯化水设备-EDI-制药-实验室-二级反渗透-高纯水|超纯水设备 | 环球电气之家-中国专业电气电子产品行业服务网站! | 压力喷雾干燥机,喷雾干燥设备,柱塞隔膜泵-无锡市闻华干燥设备有限公司 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛婚外情取证-青岛王军侦探事务所 | 重庆中专|职高|技校招生-重庆中专招生网 | 粉末冶金-粉末冶金齿轮-粉末冶金零件厂家-东莞市正朗精密金属零件有限公司 | 耐火浇注料价格-高强高铝-刚玉碳化硅耐磨浇注料厂家【直销】 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 湖州织里童装_女童男童中大童装_款式多尺码全_织里儿童网【官网】-嘉兴嘉乐网络科技有限公司 | 手表腕表维修保养鉴定售后服务中心网点 - 名表维修保养 | 扒渣机厂家_扒渣机价格_矿用扒渣机_铣挖机_撬毛台车_襄阳永力通扒渣机公司 | 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | 集装箱标准养护室-集装箱移动式养护室-广州璟业试验仪器有限公司 | 杭州荣奥家具有限公司-浙江办公家具,杭州办公家具厂 |