MySQL使用者管理

2021-05-23 08:40:08 字數 4931 閱讀 6707

mysql管理員應該知道如何設定mysql使用者賬號,指出哪個使用者可以連線伺服器,從**連線,連線後能做什麼。mysql 3.22.11開始引入兩條語句使得這項工作更容易做:grant語句建立mysql使用者並指定其許可權,而revoke語句刪除許可權。兩條語句扮演了mysql資料庫的前端角色,並提供與直接操作這些表的內容不同的另一種方法。create和revoke語句影響4個表:

授權表內容

user

能連線伺服器的使用者以及他們擁有的任何全域性許可權

db資料庫級許可權

tables_priv

表級許可權

columns_priv

列級許可權

還有第5個授權表(host),但它不受grant和revoke的影響。

當你對乙個使用者發出一條grant語句時,在user表中為該使用者建立一條記錄。如果語句指定任何全域性許可權(管理許可權或適用於所有資料庫的許可權),這些也記錄在user表中。如果你指定資料庫、表和列級許可權,他們被分別記錄在db、tables_priv和columns_priv表中。

用grant和revoke比直接修改授權表更容易些,然而,建議你閱讀一下《mysql安全性指南》。這些表異常重要,而且作為一名管理員,你應該理解它們如何超越grant和revoke語句的功能水平。

在下面的章節中,我們將介紹如何設定mysql使用者賬號並授權。我們也涉及如何撤權和從授權表中刪除使用者。

你可能也想考慮使用mysqlaccess和mysql_setpermission指令碼,它是mysql分發的一部分,它們是perl指令碼,提供grant語句的另一種選擇設定使用者賬號。mysql_setpermission需要安裝dbi支援。

1 建立使用者並授權

grant語句的語法看上去像這樣:

grant privileges (columns)

on what

to user identified by "password"

with grant option

要使用該語句,你需要填寫下列部分:

下面就討論一些例子。

1.1 誰能連線,從那兒連線?

你可以允許乙個使用者從特定的或一系列主機連線。有乙個極端,如果你知道降職從乙個主機連線,你可以將許可權侷限於單個主機:

grant all on samp_db.* to boris@localhost identified by "ruby"

grant all on samp_db.* to [email protected] identified by "quartz"

(samp_db.*意思是"samp_db資料庫的所有表)另乙個極端是,你可能有乙個經常旅行並需要能從世界各地的主機連線的使用者max。在這種情況下,你可以允許他無論從**連線:

grant all on samp_db.* to max@% identified by "diamond"

"%"字元起萬用字元作用,與like模式匹配的含義相同。在上述語句中,它意味著"任何主機"。所以max和max@%等價。這是建立使用者最簡單的方法,但也是最不安全的。

取其中,你可以允許乙個使用者從乙個受限的主機集合訪問。例如,要允許mary從snake.net域的任何主機連線,用乙個%.snake.net主機指定符:

grant all on samp_db.* to [email protected] identified by "quartz";

grant all on samp_db.* to [email protected] identified by "ruby"

grant all on samp_db.* to [email protected].% identified by "quartz"

grant all on samp_db.* to [email protected]/17 identified by "ruby"

第乙個例子指出使用者能從其連線的特定主機,第二個指定對於c類子網192.168.128的ip模式,而第三條語句中,192.168.128.0/17指定乙個17位網路號並匹配具有192.168.128頭17位的ip位址。 

如果mysql抱怨你指定的使用者值,你可能需要使用引號(只將使用者名稱和主機名部分分開加引號)。

grant all on samp_db.president to "my friend"@"boa.snake.net"

1.2 使用者應該有什麼級別的許可權和它們應該適用於什麼?

你可以授權不同級別的許可權,全域性許可權是最強大的,因為它們適用於任何資料庫。要使ethel成為可做任何事情的超級使用者,包括能授權給其它使用者,發出下列語句:

grant all on *.* to ethel@localhost identified by "coffee" with grant option

on子句中的*.*意味著"所有資料庫、所有表"。從安全考慮,我們指定ethel只能從本地連線。限制乙個超級使用者可以連線的主機通常是明智的,因為它限制了試圖破解口令的主機。

有些許可權(file、process、reload和shutdown)是管理許可權並且只能用"on *.*"全域性許可權指定符授權。如果你願意,你可以授權這些許可權,而不授權資料庫許可權。例如,下列語句設定乙個flush使用者,他只能發出flush語句。這可能在你需要執行諸如清空日誌等的管理指令碼中會有用:

grant reload on *.* to flushl@localhost identified by "flushpass"

一般地,你想授權管理許可權,吝嗇點,因為擁有它們的使用者可以影響你的伺服器的操作。

資料庫級許可權適用於乙個特定資料庫中的所有表,它們可通過使用on db_name.*子句授予:

grant all on samp_db to [email protected] indetified by "rock"

grant select on samp_db to ro_user@% indetified by "rock"

第一條語句向bill授權samp_db資料庫中所有表的許可權,第二條建立乙個嚴格限制訪問的使用者ro_user(唯讀使用者),只能訪問samp_db資料庫中的所有表,但只有讀取,即使用者只能發出select語句。

你可以列出一系列同時授予的各個許可權。例如,如果你想讓使用者能讀取並能修改現有資料庫的內容,但不能建立新錶或刪除表,如下授予這些許可權:

grant select,insert,delete,update on samp_db to [email protected] indetified by "rock"

對於更精緻的訪問控制,你可以在各個表上授權,或甚至在表的每個列上。當你想向使用者隱藏乙個表的部分時,或你想讓乙個使用者只能修改特定的列時,列特定許可權非常有用。如:

grant select on samp_db.member to bill@localhost indetified by "rock"

grant update (expiration) on samp_db. member to bill@localhost

第一條語句授予對整個member表的讀許可權並設定了乙個口令,第二條語句增加了update許可權,當只對expiration列。沒必要再指定口令,因為第一條語句已經指定了。

如果你想對多個列授予許可權,指定乙個用逗號分開的列表。例如,對assistant使用者增加member表的位址欄位的update許可權,使用如下語句,新許可權將加到使用者已有的許可權中:

grant update (street,city,state,zip) on samp_db to assistant@localhost

通常,你不想授予任何比使用者確實需要的許可權寬的許可權。然而,當你想讓使用者能建立乙個臨時表以儲存中間結果,但你又不想讓他們在乙個包含他們不應修改內容的資料庫中這樣做時,發生了要授予在乙個資料庫上的相對寬鬆的許可權。你可以通過建立乙個分開的資料庫(如tmp)並授予開資料庫上的所有許可權來進行。例如,如果你想讓來自mars.net域中主機的任何使用者使用tmp資料庫,你可以發出這樣的grant語句:

grant all on tmp.* to ""@mars.net

在你做完之後,使用者可以建立並用tmp.tbl_name形式引用tmp中的表(在使用者指定符中的""建立乙個匿名使用者,任何使用者均匹配空白使用者名稱)。

1.3 使用者應該被允許管理許可權嗎?

你可以允許乙個資料庫的擁有者通過授予資料庫上的所有擁有者許可權來控制資料庫的訪問,在授權時,指定with grant option。例如:如果你想讓alicia能從big.corp.com域的任何主機連線並具有sales資料庫中所有表的管理員許可權,你可以用如下grant語句:

在效果上with grant option子句允許你把訪問授權的權利授予另乙個使用者。要注意,擁有grant許可權的兩個使用者可以彼此授權。如果你只給予了第乙個使用者select許可權,而另乙個使用者有grant加上select許可權,那麼第二個使用者可以是第乙個使用者更"強大"。

2 撤權並刪除使用者

要取消乙個使用者的許可權,使用revoke語句。revoke的語法非常類似於grant語句,除了to用from取代並且沒有indetifed by和with grant option子句:

revoke privileges (columns) on what from user

user部分必須匹配原來grant語句的你想撤權的使用者的user部分。privileges部分不需匹配,你可以用grant語句授權,然後用revoke語句只撤銷部分許可權。

revoke語句只刪除許可權,而不刪除使用者。即使你撤銷了所有許可權,在user表中的使用者記錄依然保留,這意味著使用者仍然可以連線伺服器。要完全刪除乙個使用者,你必須用一條delete語句明確從user表中刪除使用者記錄:

%mysql -u root mysql

mysql>delete from user

->where user="user_name" and host="host_name";

mysql>flush privileges;

delete語句刪除使用者記錄,而flush語句告訴伺服器過載授權表。(當你使用grant和revoke語句時,表自動過載,而你直接修改授權表時不是。)

mysql 使用者管理 MySQL使用者管理

一 mysql使用者管理的必要性 如果我們只能使用root使用者,這樣安全隱患,這時,我們需要使用mysql的使用者管理技術.一次獲得 分配許可權user db tables priv columns priv 許可權範圍一次遞減,全域性許可權覆蓋區域性許可權。換句話說user表中的每個許可權都代表...

mysql授權 使用者管理 MySQL使用者管理 授權

建立使用者 命令 create user username host identified by password 說明 username 建立的使用者名稱 host 使用者可以在哪個主機上登入,任意主機選擇 password 使用者的密碼 例 create user arvin identifie...

mysql使用者管理

1.新建使用者。登入mysql mysql u root p 密碼 建立使用者 mysql insert into mysql.user host,user,password values localhost phplamp password 1234 重新整理系統許可權表 mysql flush ...