天天看點

我的MYSQL學習心得(十三) 權限管理

這一篇《我的mysql學習心得(十三)》将會講解mysql的使用者管理

在mysql資料庫中,有mysql_install_db腳本初始化權限表,存儲權限的表有:

1、user表

2、db表

3、host表

4、table_priv表

5、columns_priv表

6、proc_priv表

mysql存取控制包含2個階段:

階段1:伺服器檢查你是否允許連接配接。

階段2:假定你能連接配接,伺服器檢查你發出的每個請求。看你是否有足夠的權限實施它。例如,如果你從資料庫中一個表精選(select)行或從資料庫抛棄一個表,伺服器确定你對表有select權限或對資料庫有drop權限。

伺服器在存取控制的兩個階段使用在mysql的資料庫中的user、db和host表,在這些授權表中字段如下:

表名稱

user

db

host

範圍字段

password

權限字段

select_priv

insert_priv

update_priv

delete_priv

index_priv

alter_priv

create_priv

drop_priv

grant_priv

reload_priv

shutdown_priv

process_priv

file_priv

對存取控制的第二階段(請求證明),如果請求涉及表,伺服器可以另外參考tables_priv和columns_priv表。這些表的字段如下:

tables_priv

columns_priv

table_name

column_name

table_priv

column_priv

其他字段

timestamp

grantor

每個授權表包含範圍字段和權限字段。

user表主要分為:使用者列、權限列、安全列、資源控制列

host表主要分為:使用者列、權限列

這裡美中不足的是mysql.user 沒有一個列是儲存使用者建立時間的

有時候排查使用者問題的時候,比如某個客戶在某個時間說連接配接不上資料庫,我們在user表裡隻能查到是否存在那個使用者 但是不知道這個使用者的建立時間,也就是說客戶說的那個時間究竟使用者是否已經建立我們是不知道的

帳戶管理

mysql提供許多語句用來管理使用者帳号,這些語句可以用來包括登入和退出mysql伺服器、建立使用者、删除使用者、密碼管理、權限管理

mysql資料庫的安全性,需要通過帳戶管理來保證

登入和退出mysql

mysql指令的常用參數

-h:主機名或ip,預設是localhost,最好指定-h參數

-u:使用者名

-p:密碼,注意:該參數後面的字元串和-p不能有空格

-p:端口号,預設為3306

資料庫名:可以在指令最後指定資料庫名

-e:執行sql語句,如果指定該參數,将在登入後執行-e後面的指令或sql語句并退出

我的MYSQL學習心得(十三) 權限管理

 指令執行完之後傳回book表的結構,查詢傳回之後會自動退出mysql

使用者

建立普通使用者

使用者名部分為“jeffrey”,主機名預設為“%”(即對所有主機開放權限)

如果指定使用者登入不需要密碼,則可以省略identified by部分

對于使用插件認證連接配接的使用者,伺服器調用指定名稱的插件,用戶端需要提供驗證方法所需要的憑據。

如果建立使用者時或者連接配接伺服器時,伺服器找不到對應的插件,将傳回一個錯誤

identified with文法

identified with隻能在mysql5.5.7及以上版本使用。

identified with和identified by是互斥的,是以對一個帳戶來說隻能使用一個驗證方法。

create user語句的操作會被記錄到伺服器日志檔案或者操作曆史檔案中

例如 ~/.mysql_history。這意味着對這些檔案有讀取權限的人,都可以讀取到新添加使用者的明文密碼

我的MYSQL學習心得(十三) 權限管理

一個辦法就是建立使用者的時候使用password關鍵字

先查出你的密碼的哈希值,然後在建立使用者的時候輸入哈希值

那麼在日志裡面就隻能看到哈希值

我的MYSQL學習心得(十三) 權限管理
我的MYSQL學習心得(十三) 權限管理

使用grant語句建立新使用者

grant user語句可以用來建立帳戶,通過該語句可以在user表中添加一條新記錄

比起create user語句建立的新使用者,還需要使用grant語句賦予使用者權限

使用grant語句建立新使用者時必須有grant權限。

文法

使用grant語句建立一個新使用者testuser,密碼為testpwd,并授予使用者對所有資料表的select和update權限

執行結果顯示執行成功,使用select語句查詢使用者testuser的權限

我的MYSQL學習心得(十三) 權限管理

 查詢結果顯示select和update權限字段均為y

注意:user表中的user和host字段區分大小寫,在查詢的時候要指定正确的使用者名或主機名

直接操作mysql使用者表

不管是create user還是grant user,在建立使用者時,實際上都是在user表中添加一條新記錄。

使用insert語句向mysql.user表insert一條記錄來建立一個新使用者

插入的時候必須要有insert權限

使用insert建立一個新使用者,其使用者名稱為customer1,主機名為localhost,密碼為customer1

我的MYSQL學習心得(十三) 權限管理

語句執行失敗,檢視警告資訊如下:

我的MYSQL學習心得(十三) 權限管理

因為ssl_cipher這個字段在user表中沒有定義預設值,是以在這裡提示錯誤資訊。

影響insert語句的執行,使用select語句檢視user表中的記錄

我的MYSQL學習心得(十三) 權限管理

可以看到,插入失敗

删除普通使用者

使用drop user語句删除使用者,也可以直接通過delete從mysql.user表中删除對應的記錄來删除使用者

drop user語句用于删除一個或多個mysql帳戶。要使用drop user,必須擁有mysql資料庫的全局

create user 權限或delete權限。

删除testuser這個使用者

我的MYSQL學習心得(十三) 權限管理
我的MYSQL學習心得(十三) 權限管理

 可以發現testuser這個使用者已經删除了

使用delete語句删除使用者

root使用者修改自己的密碼

修改root密碼的方式有多種

1、使用mysqladmin指令在指令行指定新密碼

2、修改mysql資料庫的user表

password(”)函數用來加密使用者密碼。執行update之後需要執行flush privileges語句重新加載使用者權限

3、使用set語句修改root使用者的密碼

set password語句可以用來重新設定其他使用者的登入密碼或者自己使用的帳戶密碼

新密碼必須用password函數加密

使用root使用者登入到mysql之後執行下面語句

執行之後需要使用執行flush privileges語句或者重新開機mysql重新加載使用者權限

root使用者修改普通使用者密碼

1、使用set語句修改普通使用者的密碼

2、使用update語句修改普通使用者的密碼

執行完畢之後需要使用flush privileges語句或者重新開機mysql重新加載使用者權限

3、使用grant語句修改普通使用者密碼

使用下面語句把testuser使用者的密碼改為123456

注意:使用grant語句和mysqladmin設定密碼,他們均會加密密碼,這種情況下,不需要使用password()函數

普通使用者修改密碼

使用set語句修改自己的密碼

比如修改testuser這個使用者的密碼,需要使用testuser這個使用者登入到mysql,然後執行

root使用者密碼丢失的解決辦法

使用–skip-grant-tables選項啟動mysql服務

使用–skip-grant-tables選項啟動mysql時,伺服器将不加載權限判斷,任何使用者都能通路資料庫

linux下

使用mysqld_safe來啟動mysql服務,也可以使用/etc/init.d/mysql指令來啟動mysql

或者

啟動mysql服務後,就可以使用root使用者登入了

windows下

詳細可以看一下這篇文章

<a href="http://www.cnblogs.com/mysqlzouqi/p/3539912.html" target="_blank">windows mysql提示:1045 access denied for user ‘root’@’localhost’ using password yes</a>

權限管理

mysql中的各種權限

對于grant和revoke語句,priv_type可以被指定為以下任何一種:

權限

意義

all [privileges]

設定除grant option之外的所有簡單權限

alter

允許使用alter table

alter routine

更改或取消已存儲的子程式

create

允許使用create table

create routine

建立已存儲的子程式

create temporary tables

允許使用create temporary table

create user

允許使用create user, drop user, rename user和revoke all privileges。

create view

允許使用create view

delete

允許使用delete

drop

允許使用drop table

execute

允許使用者運作已存儲的子程式

file

允許使用select…into outfile和load data infile

index

允許使用create index和drop index

insert

允許使用insert

lock tables

允許對您擁有select權限的表使用lock tables

process

允許使用show full processlist

references

未被實施

reload

允許使用flush

replication client

允許使用者詢問從屬伺服器或主伺服器的位址

replication slave

用于複制型從屬伺服器(從主伺服器中讀取二進制日志事件)

select

允許使用select

show databases

show databases顯示所有資料庫

show view

允許使用show create view

shutdown

允許使用mysqladmin shutdown

super

允許使用change master, kill, purge master logs和set global語句,mysqladmin debug指令;允許您連接配接(一次),即使已達到max_connections。

update

允許使用update

usage

“無權限”的同義詞

grant option

允許授予權限

當從舊版本的mysql更新時,要使用execute, create view, show view, create user, create routine和alter routine權限

授權

授權就是為某個使用者授予權限

授予的權限可以分為多個層級:

·         全局層級

全局權限适用于一個給定伺服器中的所有資料庫。這些權限存儲在mysql.user表中。grant all on *.*和revoke all on *.*隻授予和撤銷全局權限。

·         資料庫層級

資料庫權限适用于一個給定資料庫中的所有目标。這些權限存儲在mysql.db和mysql.host表中。grant all ondb_name.*和revoke all on db_name.*隻授予和撤銷資料庫權限。

·         表層級

表權限适用于一個給定表中的所有列。這些權限存儲在mysql.talbes_priv表中。grant all on db_name.tbl_name和revoke all on db_name.tbl_name隻授予和撤銷表權限。

·         列層級

列權限适用于一個給定表中的單一列。這些權限存儲在mysql.columns_priv表中。當使用revoke時,您必須指定與被授權列相同的列。

·         子程式層級

create routine, alter routine, execute和grant權限适用于已存儲的子程式。這些權限可以被授予為全局層級和資料庫層級。而且,除了create routine外,這些權限可以被授予為子程式層級,并存儲在mysql.procs_priv表中。

當後續目标是一個表、一個已存儲的函數或一個已存儲的過程時,object_type子句應被指定為table、function或procedure。當從舊版本的mysql更新時,要使用本子句,您必須更新您的授權表

使用grant語句建立一個新使用者grantuser,密碼為“grantpwd”

使用者對所有的資料有查詢、插入權限,并授予grant權限

我的MYSQL學習心得(十三) 權限管理

查詢顯示grantuser被建立成功,并賦予了select、insert、grant權限,其相應字段值為y

被授予grant權限的使用者可以登入mysql并建立其他使用者帳戶,在這裡是grantuser的使用者

收回權限

收回權限就是取消已經賦予使用者的某些權限。收回使用者不必要的權限可以在一定程度上保證系統的安全性。

使用revoke收回權限之後,使用者帳戶的記錄将從db、host、tables_priv、columns_priv表中删除,但是使用者帳号記錄依然

在user表中儲存。

使用revoke語句,必須擁有mysql資料庫的全局create權限或update權限

使用revoke語句取消使用者grantuser的insert權限

我的MYSQL學習心得(十三) 權限管理

可以看到grantuser使用者的insert權限已經被收回了

注意:當從舊版本的mysql更新時,如果要使用execute、create view、show view、create user、create routine、alter routine 權限,必須先更新授權表

檢視權限

show grant語句可以顯示使用者的權限資訊

使用show grant語句查詢使用者grantuser的權限資訊

我的MYSQL學習心得(十三) 權限管理

 傳回結果顯示了user表中的帳戶資訊;接下來以為grant select on關鍵字開頭,表示使用者被授予了select權限;

*.*表示select權限作用于所有資料庫的所有資料表;

identified by 後面的為使用者加密後的密碼

在這裡,隻是定義了個别的使用者權限,grant可以顯示更加詳細的權限資訊,包括全局級的和非全局級的權限

如果表層級或者列層級的權限被授予使用者的話,他們也能在結果中顯示出來。

檢視mysql裡面匿名使用者

如果有匿名使用者,那麼用戶端就可以不用密碼登入mysql資料庫,這樣就會存在安全隐患

檢查匿名使用者的方法

我的MYSQL學習心得(十三) 權限管理

如果查找到user字段值為空的那條記錄,說明存在匿名使用者,需要把這條記錄删除

如果用匿名使用者登入mysql就可以看到使用者名是空的

我的MYSQL學習心得(十三) 權限管理

删除語句

總結

本文簡單的闡述了mysql的使用者管理和權限方面的内容,希望對大家有幫助

如果大家想更深入學習mysql通路控制方面的知識

核心就是兩個圖

1、用戶端連接配接請求認證階段

我的MYSQL學習心得(十三) 權限管理

2、用戶端操作請求認證階段

我的MYSQL學習心得(十三) 權限管理