1. 程式人生 > 其它 >mysql 必知必會整理—安全管理[十七]

mysql 必知必會整理—安全管理[十七]

前言

簡單介紹一下安全管理。

正文

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

換句話說,使用者不能對過多的資料具有過多的訪問權。

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

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

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

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

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

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

這些都只是例子,但有助於說明一個重要的事實,即你需要給使用者提供他們所需的訪問權,且僅提供他們所需的訪問權。

這就是所謂的訪問控制,管理訪問控制需要建立和管理使用者賬號。

防止無意的錯誤 重要的是注意到,訪問控制的目的不僅僅是防止使用者的惡意企圖。

資料夢魘更為常見的是無意識錯誤的結果,如錯打MySQL語句,在不合適的資料庫中操作或其他一些使用者錯誤。

通過保證使用者不能執行他們不應該執行的語句,訪問控制有助於避免這些情況的發生
不要使用root 應該嚴肅對待root登入的使用。僅在絕對需要時使用它(或許在你不能登入其他管理賬號時使用)。

不應該在日常的MySQL操作中使用root。

MySQL使用者賬號和資訊儲存在名為mysql的MySQL資料庫中。一般不需要直接訪問mysql資料庫和表(你稍後會明白這一點),但有時需要直接訪問。需要直接訪問它的時機之一是在需要獲得所有使用者賬號列表
時。為此,可使用以下程式碼:

use mysql;
SELECT USER FROM user;

mysql資料庫有一個名為user的表,它包含所有使用者賬號。

user表有一個名為user的列,它儲存使用者登入名。新安裝的伺服器可能只有一個使用者(如這裡所示),過去建立的伺服器可能具有很多使用者.

用多個客戶機進行試驗 試驗對使用者賬號和許可權進行更改的最好辦法是開啟多個數據庫客戶機(如mysql命令列實用程式的多個副本),一個作為管理登入,其他作為被測試的使用者登入。

建立使用者

CREATE USER ben IDENTIFIED by 'ben123456';

這樣就建立了一個使用者。

指定雜湊口令 IDENTIFIED BY指定的口令為純文字,MySQL
將在儲存到user表之前對其進行加密。為了作為雜湊值指定口
令,使用IDENTIFIED BY PASSWORD。
使用GRANT或INSERT GRANT語句(稍後介紹)也可以建立使用者賬號,但一般來說CREATE USER是最清楚和最簡單的句子。此外,也可以通過直接插入行到user表來增加使用者,不過為安全起見,一般不建議這樣做。

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

為重新命名一個使用者賬號,使用RENAME USER語句,如下所示:

RENAME USER ben to zhangsan;
MySQL 5之前 僅MySQL 5或之後的版本支援RENAME USER。為了在以前的MySQL中重新命名一個使用者,可使用UPDATE直接更新user表。

刪除使用者賬號

DROP USER zhangsan;

注意:

MySQL 5之前 自MySQL 5以來,DROP USER刪除使用者賬號和
所有相關的賬號許可權。在MySQL 5以前,DROP USER只能用來
刪除使用者賬號,不能刪除相關的許可權。因此,如果使用舊版
本的MySQL,需要先用REVOKE刪除與賬號相關的許可權,然後
再用DROP USER刪除賬號。

訪問許可權

在建立使用者賬號後,必須接著分配訪問許可權。新建立的使用者賬號沒有訪
問許可權。它們能登入MySQL,但不能看到資料,不能執行任何資料庫操作。

CREATE USER zhangsan IDENTIFIED by 'zhang123456';

為看到賦予使用者賬號的許可權,使用SHOW GRANTS FOR,如下所示:

SHOW GRANTS FOR 'zhangsan';

結果:

GRANT USAGE ON *.* TO 'zhangsan'@'%' IDENTIFIED BY PASSWORD '*557661E2A88A816A3155408E5D15997A8C5C7D25'

顯示沒有任何許可權。

USAGE表 示根本沒有許可權(我知道,這不很直觀),所以,此結果表示在任意資料庫和任意表上對任何東西沒有許可權。

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

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

  1. 要授予的許可權;

  2. 被授予訪問許可權的資料庫或表;

  3. 使用者名稱。

以下例子給出GRANT的用法:

GRANT SELECT ON test.* to zhangsan;

然後:

SHOW GRANTS FOR zhangsan;
GRANT SELECT ON `test`.* TO 'zhangsan'@'%'

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

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

REVOKE SELECT ON test.* FROM zhangsan;

這條REVOKE語句取消剛賦予使用者bforta的SELECT訪問許可權。被撤銷的訪問許可權必須存在,否則會出錯。

GRANT和REVOKE可在幾個層次上控制訪問許可權:

  1. 整個伺服器,使用GRANT ALL和REVOKE ALL;

  2. 整個資料庫,使用ON database.*;

  3. 特定的表,使用ON database.table;

  4. 特定的列;

  5. 特定的儲存過程。

示例:

ALL 除GRANT OPTION外的所有許可權
ALTER 使用ALTER TABLE
ALTER ROUTINE 使用ALTER PROCEDURE和DROP PROCEDURE
CREATE 使用CREATE TABLE
CREATE ROUTINE 使用CREATE PROCEDURE
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 使用CALL和儲存過程
FILE 使用SELECT INTO OUTFILE和LOAD DATA INFILE
GRANT OPTION 使用GRANT和REVOKE
INDEX 使用CREATE INDEX和DROP INDEX
INSERT 使用INSERT
LOCK TABLES 使用LOCK TABLES
PROCESS 使用SHOW FULL PROCESSLIST
RELOAD 使用FLUSH
REPLICATION CLIENT 伺服器位置的訪問
REPLICATION SLAVE 由複製從屬使用
SELECT 使用SELECT
SHOW DATABASES 使用SHOW DATABASES
SHOW VIEW 使用SHOW CREATE VIEW
SHUTDOWN 使用mysqladmin shutdown(用來關閉MySQL)
SUPER 使用CHANGE MASTER、KILL、LOGS、PURGE、MASTER
和SET GLOBAL。還允許mysqladmin除錯登入
UPDATE 使用UPDATE
USAGE 無訪問許可權

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

未來的授權 在使用GRANT和REVOKE時,使用者賬號必須存在,但對所涉及的物件沒有這個要求。

這允許管理員在建立資料庫和表之前設計和實現安全措施。

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

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

GRANT SELECT, INSERT ON test.* to zhangsan;

更改口令

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

SET PASSWORD FOR zhangsan = PASSWORD('zhangsan');

修改當前使用者的口令:

SET PASSWORD  = PASSWORD('root');

下一節資料庫的維護。