MySQL必知必會 第28章 安全管理 讀書筆記

2021-10-02 08:55:49 字數 4304 閱讀 7807

資料庫伺服器通常包含關鍵的資料,確保這些資料的安全和完整需要利用訪問控制。本章將學習mysql的訪問控制和使用者管理。

1 訪問控制

mysql伺服器的安全基礎是:使用者應該對他們需要的資料具有適當的訪問權,既不能多也不能少。換句話說,使用者不能對過多的資料具有過多的訪問權。

考慮以下內容:

①多數使用者只需要對錶進行讀和寫,但少數使用者甚至需要能建立和刪除表;

②某些使用者需要讀表,但可能不需要更新表;

③你可能想允許使用者新增資料,但不允許他們刪除資料;

④某些使用者(管理員)可能需要處理使用者賬號的許可權,但多數使用者不需要;

⑤你可能想讓使用者通過儲存過程訪問資料,但不允許他們直接訪問資料;

⑥你可能根據使用者登入的地點限制對某些功能的訪問。

這些都只是例子,但有助於說明乙個重要的事實,即你需要給使用者提供他們所需的訪問權,且僅提供他們所需的訪問權。這就是所謂的訪問控制,管理訪問控制需要建立和管理使用者賬號。

使用mysql administrator:mysql administrator提供了乙個圖形使用者介面,可用來管理使用者及賬號許可權。mysql administrator在內部利用本章介紹的語句,使你能互動地、方便地管理訪問控制。

為了執行資料庫操作,需要登入mysql。

mysql建立乙個名為root的使用者賬號,它對整個mysql伺服器具有完全的控制。你可能已經在本書各章的學習中使用root進行過登入,在對非現實的資料庫試驗mysql時,這樣做很好。

不過在現實世界的日常工作時,決不能使用root

應該建立一系列的賬號,有的用於管理,有的供使用者使用,有的供開發人員使用。

防止無意的錯誤:訪問控制的目的不僅僅是防止使用者的惡意企圖。資料夢魘更為常見的是無意識錯誤的結果,如錯打mysql語句,在不合適的資料庫中操作或其他一些使用者錯誤。通過保證使用者不能執行他們不應該執行的語句,訪問控制有助於避免這些情況的發生。

不要使用root:應該嚴肅對待root登入的使用。僅在絕對需要時使用它(或許在你不能登入其他管理賬號時使用),不應該在日常的mysql操作中使用root。

2 管理使用者

mysql使用者賬號和資訊儲存在名為mysql的mysql資料庫中。

一般不需要直接訪問mysql資料庫和表,但有時需要直接訪問。

需要直接訪問它的時機之一是在需要獲得所有使用者賬號列表時。為此,可使用以下**:

use mysql;

select user from user;

mysql資料庫有乙個名為user的表,它包含所有使用者賬號。user表有乙個名為user的列,它儲存使用者登入名。

新安裝的伺服器可能只有乙個使用者,過去建立的伺服器可能具有很多使用者。

用多個客戶機進行試驗:試驗對使用者賬號和許可權進行更改的最好辦法是開啟多個資料庫客戶機,乙個作為管理登入,其他作為被測試的使用者登入。

(1)建立使用者賬號

為了建立乙個新使用者賬號,使用create user語句,如下所示:

create user ben identified by 'p@$$word';
create user建立乙個新使用者賬號。在建立使用者賬號時不一定需要口令,不過這個例子用identified by 'p@$$word』給出了乙個口令。

如果你再次列出使用者賬號,將會在輸出中看到新賬號。

指定雜湊口令:identified by指令的口令為純文字,mysql將在儲存到user表之前對其進行加密。為了作為雜湊值指定口令,使用identified by password。

使用grant或insert:

grant語句也可以建立使用者賬號。

但一般來說create user是最清楚和最簡單的句子。

也可以通過直接插入行到user表來增加使用者。不過為安全起見,一般不建議這樣做。

mysql用來儲存使用者賬號資訊的表極為重要,對它們的任何毀壞都可能嚴重傷害到mysql伺服器。因此,相對於直接處理來說,最好是用標記和函式來處理這些表。

為重新命令乙個使用者賬號,使用rename user語句,如下:

rename user ben to bforta;
drop user bforta;
mysql5以來,drop user刪除使用者賬號和所有相關的賬號許可權。

mysql5以前,drop user只能用來刪除使用者賬號,不能刪除相關的許可權。

如果使用舊版本的mysql,需要先用revoke刪除與賬號相關的許可權,然後再用drop user刪除賬號。

(3)設定訪問許可權

在建立使用者賬號後,必須接著分配訪問許可權。

新建立的使用者賬號沒有訪問許可權。它們能登入mysql,但不能看到資料,不能執行任何資料庫操作。

為看到賦予使用者賬號的許可權,使用show grants for,如下:

輸出結果顯示使用者bforta有乙個許可權usage on .。usage表示根本沒有任何許可權,所以此結果表示在任意資料庫和任意表上任何東西沒有許可權。

使用者定義為user@host,mysql的許可權用使用者名稱和主機名結合定義。如果不指定主機名,則使用預設的主機名%,授予使用者訪問許可權而不管主機名。

為設定許可權,使用grant語句。grant要求你至少給出以下資訊:

①要授予的許可權

②被授予訪問許可權的資料庫或表

③使用者名稱

下面例子給出grant的用法:

grant select on crashcourse.* to bforta;
此grant允許使用者在crashcourse.*(crashcourse資料庫的所有表)上使用select。通過只授予select訪問許可權,使用者bforta對crashcourse資料庫中的所有資料具有唯讀訪問許可權。

show grants反映這個更改:

每個grant新增(或更新)使用者的乙個許可權。mysql讀取所有授權,並根據它們確定許可權。

grant的反操作為revoke,用它來撤銷特定的許可權。下面舉個例子:

revoke select on crashcourse.* from bforta;
這條revoke語句取消剛賦予使用者bforta的select訪問許可權。被撤銷的訪問許可權必須存在,否則會出錯。

grant和revoke可在幾個層次上控制訪問許可權:

①整個伺服器,使用grant all和revoke all;

②整個資料庫,使用on database.*;

③特定的表,使用on database.table;

④特定的列;

⑤特定的儲存過程。

使用remote和revoke,你能對使用者可以就你的寶貴資料做什麼事情和不能做什麼事情具有完全的控制。

未來的授權:在使用grant和revoke時,使用者賬號必須存在,但對所涉及的物件沒有這個要求。這允許管理員在建立資料庫和表之前設計和實現安全措施。

這樣做的***是,當某個資料庫或表被刪除時(用drop語句),相關的訪問許可權仍然存在。如果將來重新建立該資料庫或表,這些許可權仍然起作用。

簡化多次授權:可通過列出各許可權並用逗號分隔。將多條grant語句串在一起,如下所示:

grant select,insert on crashcourse.* to bforta;
(4)更改口令

為了更改使用者口令,可使用set password語句。新口令必須如下加密:

set password for bforta = password('n3w p@$$word');
set password更新使用者口令。新口令必須傳遞到passwoed()函式進行加密。

set password還可以用來設定你自己的口令:

set password = password('n3w p@$$word');
在不指定使用者名稱時,set password更新當前登入使用者的命令。

小結本章學習了通過賦予使用者特殊的許可權進行訪問控制和保護mysql伺服器。

《MYSQL必知必會》第1 9章

資料庫基礎 資料庫 儲存有組織的資料的容器 表 某種特定型別資料的結構化清單 列 表中的乙個字段資料型別 所容許的資料的型別 行 表中的乙個記錄 主鍵 一列,其值能夠唯一區分表中每個行 sql是結構化查詢語言 structured query language 的縮寫 mysql 簡介 mysql是...

mysql必知必會 mysql必知必會(四)

十四 理解子查詢 1 通過子查詢過濾 這本書在所有的章節都關連到了資料庫表,訂單資料是儲存在兩個表中,orders表儲存著 訂單號碼 顧客id和訂單日期。個人的訂單列表關連著orderitems表,訂單表沒有儲存顧客資訊,它只是儲存著顧客id,這實際的顧客資訊是儲存在customers表中。現在假設...

《MySQL必知必會》第24章 有bug

有時候,需要在檢索出來的行中前進或後退一行或多行,這就是游標,游標是乙個儲存在mysql伺服器上的資料庫查詢,不是一條select語句,而是被該語句檢索出來的結果集 游標主要用於互動式應用,使用者可以滾動螢幕上的資料進行瀏覽或更改 mysql游標只能用於儲存過程 和函式 使用步驟為 1 宣告 定義 ...