天天看點

資料庫系統原理學習筆記十七(安全性與通路控制)

1.安全性與通路控制

  資料庫的安全性是指保護資料庫以防止不合法的使用而造成資料洩露、更改或破壞,是以安全性對于任何一個DBMS來說都是至關重要的。

  MYSQL關鍵字中和資料庫安全性相關的是:WITH GRANT OPTION。

  分為:

    1)身份驗證

    2)資料庫使用者權限确認

2.使用者賬号管理

  2.1 root使用者

  1)查詢資料庫使用者

SELECT user FROM mysql.user;
           

  2)建立新使用者

  · 建立使用者時,隻指定了使用者名,而沒有指定主機名,那麼主機名會預設是“%”,其表示一組主機。

  · 要使用CREATE USER語句,必須擁有MYSQL中mysql資料庫的INSERT權限或全局CREATE USER權限。

  · 建立使用者時會在系統自身的mysql資料庫的user表中增加一條新紀錄。如果建立的帳号已經存在,則語句執行會出現錯誤。

  · 如果兩個使用者具有相同的使用者和不同的主機名,MYSQL會将其視為不同的使用者,并允許為這兩個使用者配置設定不同的權限集合。

  · 如果建立使用者時沒有指定密碼,MYSQL允許使用者不使用密碼登入系統。從安全角度考慮,不推薦使用這種做法。

  · 新建立的使用者權限很少。可以登入到MYSQL,隻允許進行不需要權限的操作。比如使用SHOW語句查詢所有存儲引擎和字元集的清單等。

## 建立新使用者
CREATE USER user[IDENTIFIED BY [PASSWORD]’password’]
## user 指定建立使用者賬号--格式:[email protected]_name
## IDENTIFIED BY 可選項,指定使用者賬号對應的密碼
## PASSWORD 可選項,指定散列密碼
## password 指定使用者賬号的密碼

## 示例1:給localhost建立一個lisi的使用者
create user 'lisi'@'localhost';
## 示例2:給localhost建立一個zhaosi的使用者,并指定密碼為:123
create user 'zhaosi'@'localhost' identified by '123';
## 示例3:給localhost建立一個zhaoyun的使用者,指定密碼為:123,并對密碼123使用PASSWORD()函數加密傳回的散列值
SELECT PASSWORD('123')
create user 'zhaoyun'@'localhost' identified by '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257';
           

  3)使用DROP USER語句删除使用者賬号

  ·  DROP USER 語句可以用于删除一個或多個MYSQL帳戶并消除其權限。

  · 要使用DROP USER語句,必須擁有MYSQL中的mysql資料庫的DELETE權限或全局CREATE USER

  · 在DROP USER語句的使用中,如果沒有明确地給出賬戶的主機名,則該主機名預設是%

  · 使用者的删除不會影響他們之前所建立的表、索引或其他資料庫對象,這是因為MYSQL并沒有記錄是誰建立了這些對象。

## 使用DROP USER語句删除使用者賬号
DROP USER user [,user]…
## user 使用者名
## 示例:删除本地的zhaosi使用者
DROP USER 'zhaosi'@'localhost';
           

  4)使用RENAME USER語句修改使用者賬号

  · 可以修改一個或多個已經存在的MYSQL使用者賬号,多個賬号用逗号分開。

  · 要使用RENAME USER語句,必須擁有MYSQL中的mysql資料庫的UPDATE權限或全局CREATE USER 權限。

  · 倘若系統中舊帳戶不存在或者新賬戶已存在,則語句執行會出現錯誤。

## 使用RENAME USER語句修改使用者賬号
RENAME USER old_user TO new_user [,old_user TO new_user] 
## old_user 指定系統中已經存在的使用者賬号
## new_user 指定新的使用者賬号
## 示例:将zhaosi改成zhangfei
RENAME USER 'lisi'@'localhost' TO 'zhangfei'@'localhost';
           

  5)使用SET PASSWORD語句修改使用者登入密碼

## 使用SET PASSWORD語句修改使用者登入密碼
SET PASSWORD [FOR user]= {PASSWORD(‘new_password’)|’encrypted password’}
## user 可選項,指定欲修改密碼的使用者
## PASSWORD(‘new_password’) 使用函數PASSWORD()設定新密碼new_password
## encrypted password 表示已被函數PASSWORD()加密的密碼值
## 示例:将lisi的密碼修改成123
SET PASSWORD FOR 'zhengpengchuan'@'localhost'=PASSWORD('123');
           

 2.2 賬号權限管理

  1)使用GRANT語句為使用者授權

##使用GRANT語句為使用者授權
GRANT priv_type [(column_list)] [,priv_type [(column_list)]] … ON [object_type] priv_level TO user_specification [,user_specification] … [WITH GRANT OPTION]
## priv_type 用于指定權限的名稱
## column_list 用于指定權限要授予給表中哪些具體的列
## ON 用于指定權限授予的對象和級别
## object_type 用于指定權限授予的對象類型
## priv_level 用于指定權限的級别
## TO 用于設定使用者的密碼,以及指定被授予權限的使用者user
## user_specification ----> user[IDENTIFIED BY [PASSWORD]’password’]
## WITH 可選項,用于實作權限的轉移或限制
## 示例:授予使用者 zhengpengchuan在資料庫test的表class_info上擁有對class_id和class_name的SELECT權限
GRANT SELECT (class_id,class_name) ON test.class_info TO 'zhengpengchuan'@'localhost'

## 示例2:授予目前系統中一個不存在的使用者liming和使用者huang,要求建立這兩個使用者,并設定對應的系統登入密碼,同時授予他們在資料庫test的表class_info上擁有對class_id和class_name的SELECT和UPDATE權限
CREATE USER 'liming'@'localhost' identified by '123';
CREATE USER 'huan'@'localhost' identified by '123';
GRANT SELECT,UPDATE(class_id,class_name) ON test.class_info TO 'liming'@'localhost','huan'@'localhost';

## 示例3:授予目前系統中一個不存在的使用者liming和使用者huang,要求建立這兩個使用者,并設定對應的系統登入密碼,同時授予他們在資料庫test的表class_info上擁有SELECT和UPDATE的權限。
GRANT SELECT,UPDATE ON test.class_info TO 'liming'@'localhost' IDENTIFIED BY '123','huan'@'localhost' IDENTIFIED BY '456';

## 示例4: 授予系統中已存在的zhengpengchuan可以在資料庫test中執行所有資料庫操作的權限。
GRANT ALL ON test.* TO 'zhengpengchuan'@'localhost';

## 示例5:授予系統中已存在的zhengpengchaun擁有建立使用者的權限
GRANT CREATE USER ON *.* TO 'zhengpengchuan'@'localhost';

## 權限的轉移
## 授予目前系統中不存在的使用者zhou在資料庫test的表class_info上擁有SELECT和UPDATE的權限,并允許其可以将自身的這個權限授予給其他使用者。
GRANT SELECT,UPDATE ON test.class_info TO 'zhou'@'localhost' IDENTIFIED BY '123' WITH GRANT OPTION;
           

  2)使用REVOKE語句撤銷使用者權限

  使用REVOKE語句撤銷一個使用者的權限時,必須擁有mysql資料庫的全局create user權限和update權限。

## 使用REVOKE語句撤銷使用者權限
REVOKE priv_type [(column_list)] [,priv_type [(column_list)]] … ON [object_type] priv_level FROM user [,user] …
## 示例1:回收系統中已存在使用者zhou在資料庫test的表class_info上的SELECT權限;
REVOKE SELECT ON test.class_info FROM 'zhou'@'localhost';
           

  3)權限的級别

  列權限:SELECT、 INSERT和UPDATE

  表權限:SELECT、INSERT、DELETE、UPDATE、CREATE、ALTER、INDEX、DROP、ALL、REFERENCES

  資料庫權限:除了可以指定為授予表權限時的所有值之外,還可以是下面這些值:CREATE VIEW、SHOW VIEW……

  使用者權限(最有效率):除了可以指定為授予資料庫權限時的所有值之外,還可以是下面這些值:CREATE USER、SHOW DATABASES

今日心語:

  翻過一座山,還有更高的山。

繼續閱讀