數據庫的安全的重要性就不須要我來贅述了。除了作好安全備份外,咱們首先要作的是作好咱們數據庫的權限控制,儘可能保護咱們的數據庫不被******。
本文主要講的是mysql數據庫的權限管理 ,在當前網絡環境中互聯網公司中的關係型數據庫大多采用的是mysql。
首先說一下mysql數據庫管理權限的數據庫是mysql庫 咱們看一下mysql庫中都有哪些表
mysql
mysql> show tables from mysql; +---------------------------+ | Tables_in_mysql | +---------------------------+ | columns_priv | | db | | engine_cost | | event |
| func |
| general_log |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| server_cost |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
web
mysql數據庫中幾個重要的表sql
columns_priv表 記錄受權用戶對錶中字段的訪問權限數據庫
db 表記錄用戶服務器上庫的訪問權限緩存
tables_priv 表 記錄受權用戶對庫中表的訪問權限安全
user 記錄有哪些受權用戶服務器
user 表中的字段網絡
user 是用戶名 root是mysql的管理員用戶ide
host 是容許該用戶從哪一個客戶端訪問mysql服務器 能夠是ip地址 主機名 網段(主機位用%代替) 除本機外的全部網絡地址使用%函數
Select_priv。肯定用戶是否能夠經過SELECT命令選擇數據。
Insert_priv。肯定用戶是否能夠經過INSERT命令插入數據。
Update_priv。肯定用戶是否能夠經過UPDATE命令修改現有數據。
Delete_priv。肯定用戶是否能夠經過DELETE命令刪除現有數據。
Create_priv。肯定用戶是否能夠建立新的數據庫和表。
Drop_priv。肯定用戶是否能夠刪除現有數據庫和表。
Reload_priv。肯定用戶是否能夠執行刷新和從新加載MySQL所用各類內部緩存的特定命令,包括日誌、權限、主機、查詢和表。
Shutdown_priv。肯定用戶是否能夠關閉MySQL服務器。在將此權限提供給root帳戶以外的任何用戶時,都應當很是謹慎。
Process_priv。肯定用戶是否能夠經過SHOW PROCESSLIST命令查看其餘用戶的進程。
File_priv。肯定用戶是否能夠執行SELECT INTO OUTFILE和LOAD DATA INFILE命令。
Grant_priv。肯定用戶是否能夠將已經授予給該用戶本身的權限再授予其餘用戶。例如,若是用戶能夠插入、選擇和刪除foo數據庫中的信息,而且授予了GRANT權限,則該用戶就能夠將其任何或所有權限授予系統中的任何其餘用戶。
References_priv。目前只是某些將來功能的佔位符;如今沒有做用。
Index_priv。肯定用戶是否能夠建立和刪除表索引。
Alter_priv。肯定用戶是否能夠重命名和修改表結構。
Show_db_priv。肯定用戶是否能夠查看服務器上全部數據庫的名字,包括用戶擁有足夠訪問權限的數據庫。能夠考慮對全部用戶禁用這個權限,除非有特別不可抗拒的緣由。
Super_priv。肯定用戶是否能夠執行某些強大的管理功能,例如經過KILL命令刪除用戶進程,使用SET
GLOBAL修改全局MySQL變量,執行關於複製和日誌的各類命令。
Create_tmp_table_priv。肯定用戶是否能夠建立臨時表。
Lock_tables_priv。肯定用戶是否可使用LOCK TABLES命令阻止對錶的訪問/修改。
Execute_priv。肯定用戶是否能夠執行存儲過程。此權限只在MySQL 5.0及更高版本中有意義。
Repl_slave_priv。肯定用戶是否能夠讀取用於維護複製數據庫環境的二進制日誌文件。此用戶位於主系統中,有利於主機和客戶機之間的通訊。
Repl_client_priv。肯定用戶是否能夠肯定複製從服務器和主服務器的位置。
Create_view_priv。肯定用戶是否能夠建立視圖。此權限只在MySQL 5.0及更高版本中有意義。關於視圖的更多信息,參見第34章。
Show_view_priv。肯定用戶是否能夠查看視圖或瞭解視圖如何執行。此權限只在MySQL 5.0及更高版本中有意義。關於視圖的更多信息,參見第34章。
Create_routine_priv。肯定用戶是否能夠更改或放棄存儲過程和函數。此權限是在MySQL 5.0中引入的。
Alter_routine_priv。肯定用戶是否能夠修改或刪除存儲函數及函數。此權限是在MySQL 5.0中引入的。
Create_user_priv。肯定用戶是否能夠執行CREATE USER命令,這個命令用於建立新的MySQL帳戶。
Event_priv。肯定用戶可否建立、修改和刪除事件。這個權限是MySQL 5.1.6新增的。
Trigger_priv。肯定用戶可否建立和刪除觸發器,這個權限是MySQL 5.1.6新增的。
通常咱們在程序中使用的權限都是設置的剛剛夠用就行,不要設置太高的權限從而給數據庫帶來一些安全隱患;
mysql數據庫默認root管理員用戶只能在本機登錄爲了方便管理咱們將咱們添加一個root用戶在管理機的地址,有全部權限,才能遠程管理mysql數據庫
在本機用root用戶登錄mysql
mysql -hlocalhost -uroot -p管理員密碼
若是是新安裝的mysql數據庫服務器(以5.7版本爲例) 默認的root密碼是安裝時隨即生成的能夠在日誌文件中找到 root@localhost:後面是隨機密碼大部分隨機密碼有特殊符號因此登錄的時候密碼要用單引號引發來
[root@A5 ~]# grep 'password' /var/log/mysqld.log
2018-02-23T00:42:30.776575Z 1 [Note] A temporary password is generated for root@localhost: aRaOssg_*774
登錄進入mysql後
mysql> grant all on *.* to root@'遠程管理的客戶端ip' identified by '遠程管理的密碼' with grant option; #with grant option 是給新加的root用戶受權權限
這樣就能夠在你指定的管理機上登錄mysql服務器了
grant 權限列表 on 庫名.表名 to "用戶名"@"客戶端地址" identified by 「密碼」 with grant option; 新受權的權限在指定的客戶端上也能夠受權 with grant option
客戶端地址能夠是指定ip
指定網段主機位用%表示 192.168.4.%
因此ip用%
權限 all 全部權限
庫和表能夠用*來表示全部的意思
查看數據庫服務器上已經有的受權的用戶及權限
select user,host from mysql.user;
show garts for "用戶名"@「客戶端地址」;
顯示當前登錄的用戶
select user();
顯示當前主機名
select @@hostname;
查看登錄用戶的訪問權限
show grants;
權限撤銷
revoke 權限列表 on 庫名.表名 from "用戶名"@"客戶端地址"
刪除受權用戶
drop user "用戶名"@"客戶端地址"; 刪除受權用戶後該用戶的權限也會所有被刪除
修改受權用戶的登錄密碼
set password for "用戶名"@"客戶端地址"=password("新密碼")
受權用戶重置本身的用戶密碼
set password=password("新密碼");
若是說你要給某一個庫據具備全部權限包含能夠受權的權限
你須要添加該用戶在mysql數據庫中的全部表具備插入權限 (若是沒有mysql的插入權限,授予該用戶的with grant option 也沒法給其餘用戶受權) 而且該用戶能給其餘用戶受權的權限不能大於自己具備的權限
恢復數據庫管理員本機管理密碼(忘記的root用戶的管理密碼的請況下在mysql服務器操做系統上)
1.修改配置文件 /etc/my.cnf 文件
在[mysqld] 下面
添加跳過受權表的參數(若是有驗證策略的參數設置須要先註釋已經添加過的驗證策略參數)skip-grant-tables
2.重啓mysql 服務
3.無密碼進入mysql
4.修改mysql root用戶密碼
update mysql.user set authentication_string=password("新密碼") where user=「root」 host=「localhost」;
5.退出,修改回原來的mysql配置
6.重啓mysqld服務
下面提供一些示例
一、修改數據庫管理員從本機登陸的密碼爲123456 數據庫管理員使用新密碼從本機鏈接數據庫服務器mysqladmin -uroot -p654321 password123456; 二、查看當前登錄數據庫服務器的用戶是誰?mysql> select user();三、查看當前登錄數據庫服務器用戶的權限?mysql> show grants for root@localhost;四、查看當前數據庫服務器有哪些受權用戶?mysql> select user,host from mysql.user;五、受權管理員用戶能夠在網絡中的192.168.4.254主機登陸,對全部庫和表有徹底權限且有受權的權限;登錄密碼abc123mysql> grant all on *.* to root@'192.168.4.254' identified by 'abc123' with grant option;六、不容許數據庫管理員在數據庫服務器本機登陸。(在作此操做以前必定要添加一個能夠遠程管理的用戶,不然你就進不了mysql服務器了)drop user root@"localhost"; 七、受權userweb用戶能夠從網絡中的任意主機訪問數據庫服務器,對db3庫下的user表有查看、更新name字段和age字段的權限 , 登陸密碼userweb888。grant select,update(name,age) on db3.user to userweb@'%' identified by 'userweb888'八、驗證以上受權是否成功#mysql -h192.168.4.51 -uuserweb -puserweb888mysql> select * from db3.user;mysql> update db3.user set name="xx",age=20 where name="ss";Query OK, 2 rows affected (0.00 sec)Rows matched: 2 Changed: 2 Warnings: 0mysql> delete from db3.user where name="xx";ERROR 1142 (42000): DELETE command denied to user 'userweb'@'192.168.4.254' for table 'user'九、userweb修改本身的登錄密碼爲123456,並驗證可否使用新密碼登錄mysql> set password=password("123456");Query OK, 0 rows affected, 1 warning (0.00 sec)#mysql -h192.168.4.51 -uuserweb -p123456 十、 數據庫管理員修改受權用戶userweb的登陸密碼爲654321,讓受權用戶userweb 使用新密碼登錄數據庫服務器。set password for userweb@"%"=password("654321");十一、撤銷受權用戶userweb 的全部受權並 使其再也不能使用此用戶鏈接數據庫服務器。mysql> drop user user@"%";十二、受權webadmin用戶能夠從網絡中的全部主機登陸,對bbsdb庫擁有徹底權限,且有受權權限,登陸密碼爲 123456mysql> grant all on bbsdb.* to webadmin@'%' identified by '123456' with grant option;Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> grant insert on mysql.* to webadmin@"%" ;Query OK, 0 rows affected (0.00 sec)1三、在客戶端使用受權用戶webadmin登陸,把本身的權限受權給userone用戶 , 登陸密碼是 123456# mysql -h192.168.4.51 -uwebadmin -p123456mysql> grant all on bbsdb.* to userone@"%" identified by "123456" with grant option;1五、撤銷webadmin用戶的受權權限。mysql> revoke grant option on bbsdb.* from webadmin@"%";Query OK, 0 rows affected (0.00 sec)