MariaDB 使用者與許可權管理(12)
MariaDB資料庫管理系統是MySQL的一個分支,主要由開源社群在維護,採用GPL授權許可MariaDB的目的是完全相容MySQL,包括API和命令列,MySQL由於現在閉源了,而能輕鬆成為MySQL的代替品.在儲存引擎方面,使用XtraDB來代替MySQL的InnoDB,MariaDB由MySQL的創始人Michael Widenius主導開發,他早前曾以10億美元的價格,將自己建立的公司MySQL AB賣給了SUN,此後,隨著SUN被甲骨文收購MySQL的所有權也落入Oracle的手中.MariaDB名稱來自MichaelWidenius的女兒Maria的名字.
MariaDB 是一個多使用者資料庫,具有功能強大的訪問控制系統,可以為不同使用者指定允許的許可權.MariaDB使用者可以分為普通使用者和ROOT使用者.ROOT使用者是超級管理員,擁有所有許可權,包括建立使用者、刪除使用者和修改使用者的密碼等管理許可權,普通使用者只擁有被授予的各種許可權.
MariaDB 許可權概述
MariaDB 伺服器通過許可權表來控制使用者對資料庫的訪問,許可權表存放在MariaDB的資料庫中,由MySQL_install_db
指令碼初始化,,儲存賬戶許可權資訊表主要有:user、db、host、table_priv,columns_priv和procs_priv
.
◆USER表◆
user表是MariaDB中最重要的一個許可權表,記錄允許連線到伺服器的賬號資訊,裡面的許可權是全域性的,MariaDB中user表一共有42個欄位,使用者列可分為4類,分別是使用者列,許可權列,安全列和資源控制列,下面我們介紹介個常用列的作用.
欄位名 | 資料型別 | 預設值 |
---|---|---|
Host | char | NULL |
User | char | NULL |
Password | char | NULL |
ssl_cipher | blob | NULL |
x509_issuer | blob | NULL |
x509_subject | blob | NULL |
max_questions | int | 0 |
max_updates | int | 0 |
max_connections | int | 0 |
max_user_connections | int | 0 |
使用者列:
user表的使用者列包括Host、User、Password
,分別表示主機名、使用者名稱和密碼.其中User和Host為User表的聯合主鍵,當用戶與伺服器之間建立連線時,輸入的賬戶資訊中的使用者名稱稱、主機名和密碼必須匹配User表中對應的欄位,只有3個值都匹配的時候,才允許連線建立.這3個欄位的值就是建立賬戶時儲存的賬戶資訊,修改使用者密碼時,實際就是修改user表的Password欄位的值.
許可權列:
許可權列的欄位決定了使用者的許可權,描述了在全域性範圍內允許對資料和資料庫進行的操作.包括查詢許可權、修改許可權等普通許可權,還包括了關閉伺服器、超級許可權和載入使用者等高階許可權,普通許可權用於操作資料庫,高階許可權用於資料庫管理.
安全列:
安全列只有6個欄位,其中兩個是SSL相關的,兩個是 x509 相關的,另外兩個是授權外掛相關的,SSL用於加密, x509 標準可用於標識使用者,Plugin欄位標識可以用於驗證使用者身份的外掛,如果該欄位為空,伺服器使用內建授權驗證機制驗證使用者身份.
資源控制列:
資源控制列用來限制使用者使用的資源,包括以下4個欄位,分別為:
max_questions:使用者每小時允許執行查詢次數.
max_updates:使用者每小時允許執行更新次數.
max_connections:使用者每小時允許執行的連線次數.
max_user_connection:使用者允許同時建立的連線次數.
◆DB許可權表◆
DB表和HOST表,在資料庫中非常重要的許可權表,DB表中儲存了使用者對某個資料庫的操作許可權,決定使用者能從哪個主機存取哪個資料庫.host表中儲存了某個主機對資料庫的操作許可權,配合db許可權表對給定主機上資料庫級操作許可權做更細緻的控制.這個許可權表不受GRANT 和 REVOKE
語句的影響,db表比較常用,host表一般很少使用.db表和host表結構相似,欄位大致可以分為兩類:使用者列和許可權列.
select_priv,Insert_priv,update_priv,delete_priv,Create_priv,Drop_priv,Alter_priv,Grant_priv
欄位名 | 資料型別 | 預設值 |
---|---|---|
Host | char | NULL |
DB | char | NULL |
USER | char | NULL |
select_priv | enum(N,Y) | NO |
insert_priv | enum(N,Y) | NO |
update_priv | enum(N,Y) | NO |
delete_priv | enum(N,Y) | NO |
create_priv | enum(N,Y) | NO |
drop_priv | enum(N,Y) | NO |
alter_priv | enum(N,Y) | NO |
grant_priv | enum(N,Y) | NO |
DB表使用者列有3個欄位,分別是Host、User、Db
標識從某個主機連線某個使用者對某個資料庫的操作許可權,這3個欄位的組合構成了db表的主鍵.host表不儲存使用者名稱稱,使用者列只有2個欄位,分別是Host和DB,表示從某個主機連線的使用者對某個資料庫的操作許可權,其主鍵包括Host和Db
兩個欄位,host很少用到,一般情況下db表就可以滿足許可權控制需求了.
MariaDB 賬戶管理
MariaDB提供了許多語句來管理使用者賬號,這些語句可以用來管理包括登陸和退出MariaDB伺服器,建立使用者,刪除使用者,密碼管理和許可權管理等,MariaDB資料庫的安全性,需要通過賬戶管理來保證.
◆查詢線上使用者◆
本地查詢: 當我們本地登入到資料庫時,可以使用本地查詢,查詢SQL語句如下.
MariaDB [(none)]> show processlist;
+----+---------+-----------+------+---------+------+-------+------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+---------+-----------+------+---------+------+-------+------------------+----------+
| 2 | root | localhost | NULL | Query | 0 | NULL | show processlist | 0.000 |
| 5 | lyshark | localhost | NULL | Sleep | 4 | | NULL | 0.000 |
+----+---------+-----------+------+---------+------+-------+------------------+----------+
2 rows in set (0.08 sec)
遠端查詢: 如果在遠端終端機上查詢遠端資料庫,前提是資料庫開啟了遠端授權我們可以使用以下SQL語句.
[[email protected] ~]# mysqladmin -uroot -p123 processlist
+----+---------+-----------+----+---------+------+-------+------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+---------+-----------+----+---------+------+-------+------------------+----------+
| 5 | lyshark | localhost | | Sleep | 154 | | | 0.000 |
| 11 | root | localhost | | Query | 0 | | show processlist | 0.000 |
+----+---------+-----------+----+---------+------+-------+------------------+----------+
[[email protected] ~]#
查全部使用者: 我們通過構建Select語句查詢指定欄位(Host,User,Password),查詢mysql.user
這個資料表,SQL語句如下.
MariaDB [none]> select Host,User,Password from mysql.user;
+-----------+---------+-------------------------------------------+
| Host | User | Password |
+-----------+---------+-------------------------------------------+
| localhost | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| 127.0.0.1 | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| ::1 | root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| localhost | lyshark | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+-----------+---------+-------------------------------------------+
4 rows in set (0.01 sec)
去重查詢: 通過使用distinct命令使查詢結果不重複,自動過濾重複的記錄.
MariaDB [(none)]> select distinct User,Password from mysql.user;
+---------+-------------------------------------------+
| User | Password |
+---------+-------------------------------------------+
| root | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| lyshark | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+---------+-------------------------------------------+
2 rows in set (0.00 sec)
◆新建普通使用者◆
建立新使用者,必須有相應的許可權來執行建立操作.在MariaDB資料庫中,有兩種方式建立新使用者:一種是使用CREATE USER或GRANT
語句,另一種是直接操作MariaDB授權表,最好的方法是使用GRANT語句,因為這樣更精確,如果使用create語句建立使用者後用戶無許可權,需要手動新增許可權,而直接使用grant語句可以一步到位.
使用create user語句建立新使用者:
1.使用create user
建立一個使用者,名稱為jeffrey
,密碼是mypass
,指定開啟%
遠端許可權.
MariaDB [(none)]> create user 'jeffrey'@'%' identified by 'mypass';
Query OK, 0 rows affected (0.05 sec)
2.接著繼續建立一個新使用者jeffreys
,密碼是mypass
,並指定使用localhost
本地許可權.
MariaDB [(none)]> select password('mypass');
+-------------------------------------------+
| password('mypass') |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
1 row in set (0.00 sec)
MariaDB [(none)]> create user 'jeffreys'@'localhost' identified by password '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';
Query OK, 0 rows affected (0.00 sec)
使用grant user語句建立新使用者:
使用grant
語句建立一個新使用者myuser
,密碼是123123
,並授予使用者對所有表的select和update
許可權,SQL語句如下:
MariaDB [(none)]> grant select,update ON *.* TO 'myuser'@'localhost' identified by '123123';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> select Host,User,Select_priv,Update_priv from mysql.user where user='myuser';
+-----------+--------+-------------+-------------+
| Host | User | Select_priv | Update_priv |
+-----------+--------+-------------+-------------+
| localhost | myuser | Y | Y |
+-----------+--------+-------------+-------------+
1 row in set (0.00 sec)
◆刪除普通使用者◆
使用drop user語句刪除使用者:
MariaDB [(none)]> select distinct User,Host from mysql.user;
+---------+-----------+
| User | Host |
+---------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| lyshark | localhost |
| root | localhost |
+---------+-----------+
4 rows in set (0.07 sec)
MariaDB [(none)]> drop user [email protected]"localhost";
Query OK, 0 rows affected (0.37 sec)
MariaDB [(none)]> select distinct User,Host from mysql.user;
+------+-----------+
| User | Host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| root | localhost |
+------+-----------+
3 rows in set (0.00 sec)
MariaDB [(none)]>
使用delete語句刪除使用者:
MariaDB [(none)]> delete from mysql.user where host='localhost' and user='myuser';
Query OK, 1 row affected (0.01 sec)
◆修改使用者密碼◆
修改自身密碼: 修改自己使用者的使用者名稱和密碼.
MariaDB [(none)]> set password=password("123123");
Query OK, 0 rows affected (0.00 sec)
修改指定使用者的密碼: 修改lyshark使用者
授權方式為localhost
的密碼為123123
MariaDB [(none)]> set password for "lyshark"@"localhost"=password("123123");
Query OK, 0 rows affected (0.00 sec)
◆ROOT密碼找回◆
1.關閉MariaDB資料庫
[[email protected] ~]# systemctl stop mariadb
[[email protected] ~]# systemctl status mariadb
2.修改MariaDB的主配置檔案,在Mysqld區域新增skip-grant-table
語句,儲存退出
[[email protected] etc]# ll /etc/my.cnf
-rw-r--r--. 1 root root 570 6月 8 2017 /etc/my.cnf
[[email protected] etc]#
[[email protected] etc]# vim /etc/my.cnf
[mysqld]
skip-grant-table #新增我就可以了
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
3.重啟MariaDB資料庫
[[email protected] ~]# systemctl restart mariadb
[[email protected] ~]# systemctl status mariadb
4.免密碼登陸資料庫,並執行修改資料庫的SQL語句
[[email protected] ~]# mysql -uroot -p
MariaDB [(none)]> update mysql.user set password=password("123") where user="root";
MariaDB [(none)]> Ctrl-C -- exit!
5.修改完成後將主配置檔案的skip-grant-table
屬性去掉,重啟資料庫即可,下次使用密碼登陸即可
[[email protected] ~]# vim /etc/my.cnf
[[email protected] ~]# systemctl restart mariadb
[[email protected] ~]# mysql -uroot -p123
MariaDB 許可權管理
許可權管理主要是對登入到MariaDB的使用者進行許可權驗證所有使用者的許可權都儲存在MariaDB的許可權表中,不合理的許可權規劃會給MariaDB伺服器帶來安全隱患,資料庫管理員要對所有使用者的許可權進行合理規劃管理.
◆檢視許可權◆
查詢所有許可權: 查詢資料庫中所有使用者列表和許可權資訊.
MariaDB [(none)]> select distinct concat("使用者:",user," 許可權:",host," : ") as query from mysql.user;
+------------------------------------+
| query |
+------------------------------------+
| 使用者:root 許可權:localhost : |
| 使用者:root 許可權:127.0.0.1 : |
| 使用者:root 許可權:::1 : |
| 使用者:lyshark 許可權:localhost : |
| 使用者:lyshark 許可權:% : |
+------------------------------------+
8 rows in set (0.46 sec)
MariaDB [(none)]>
查詢指定許可權: 查詢關於lyshark
的所有許可權資訊
MariaDB [(none)]> show grants for lyshark;
+----------------------------------------------+
| Grants for [email protected]% |
+----------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'lyshark'@'%' |
+----------------------------------------------+
1 row in set (0.00 sec)
MariaDB [(none)]>
查詢指定許可權: 查詢lyshark使用者
的遠端%
許可權,和本地localhost
許可權
MariaDB [(none)]> show grants for "lyshark"@"%";
+----------------------------------------------+
| Grants for [email protected]% |
+----------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'lyshark'@'%' |
+----------------------------------------------+
1 row in set (0.00 sec)
MariaDB [(none)]> show grants for "lyshark"@"localhost";
+----------------------------------------------------------------------------------------------------------------+
| Grants for [email protected] |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'lyshark'@'localhost' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' |
+----------------------------------------------------------------------------------------------------------------+
1 row in set (0.37 sec)
MariaDB [(none)]>
◆授予許可權◆
建立使用者並授權: 建立wang
使用者並給予%
遠端登陸的許可權,並對所有資料庫全部授權
MariaDB [(none)]> grant all on *.* to "wang"@"%" identified by "123";
Query OK, 0 rows affected (0.15 sec)
MariaDB [(none)]> show grants for "wang"@"%";
+--------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]% |
+--------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'wang'@'%' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' |
+--------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
建立使用者並授權: 建立使用者名稱wang1
,並允許localhost
本機訪問,對mysql庫
中的所有表具有select
查詢許可權,密碼為123
MariaDB [(none)]> grant select on mysql.* to "wang1"@"localhost" identified by "123";
Query OK, 0 rows affected (0.36 sec)
MariaDB [(none)]> show grants for "wang1"@"localhost";
+--------------------------------------------------------------------------------------------------------------+
| Grants for [email protected] |
+--------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wang1'@'localhost' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' |
| GRANT SELECT ON `mysql`.* TO 'wang1'@'localhost' |
+--------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
MariaDB [(none)]>
建立使用者並授權: 建立使用者名稱wang2
,且可在任意主機%
登陸,並對所有資料庫有(增刪改查)許可權,密碼為123
MariaDB [(none)]> grant insert,delete,update,select on *.* to "wang2"@"%" identified by "123";
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> show grants for "wang2"@"%";
+-------------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]% |
+-------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'wang2'@'%' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' |
+-------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
MariaDB [(none)]>
建立使用者並授權: 建立使用者名稱wang3
,且只能在192.168.1.59
上登陸,並對mysql資料庫有(查)許可權,密碼為123
MariaDB [(none)]> grant select on mysql.* to "wang3"@"192.168.1.59" identified by "123";
Query OK, 0 rows affected (0.15 sec)
MariaDB [(none)]> show grants for "wang3"@"192.168.1.59";
+-----------------------------------------------------------------------------------------------------------------+
| Grants for [email protected] |
+-----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wang3'@'192.168.1.59' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' |
| GRANT SELECT ON `mysql`.* TO 'wang3'@'192.168.1.59' |
+-----------------------------------------------------------------------------------------------------------------+
2 rows in set (0.50 sec)
MariaDB [(none)]>
建立使用者並授權: 建立一個普通使用者wang4
,且僅有mysql庫的(查)許可權
,密碼為123
MariaDB [(none)]> grant usage,select on mysql.* to "wang4"@"localhost" identified by "123";
Query OK, 0 rows affected (0.35 sec)
只授權使用者許可權: 授權使用者wang4
,對所有資料庫的全部許可權,密碼123
MariaDB [(none)]> grant all privileges on *.* to "wang4"@"localhost" identified by "123";
Query OK, 0 rows affected (0.36 sec)
只授權使用者許可權: 授權一個已存在賬號允許遠端登陸最大許可權
MariaDB [(none)]> grant all on *.* to "root"@"%";
Query OK, 0 rows affected (0.07 sec)
◆收回許可權◆
收回使用者授權: 撤銷lyshark使用者
,對所有資料庫的遠端%
使用者許可權
MariaDB [(none)]> show grants for lyshark;
+----------------------------------------------+
| Grants for [email protected]% |
+----------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'lyshark'@'%' |
+----------------------------------------------+
1 row in set (0.00 sec)
MariaDB [(none)]> revoke all on *.* from "lyshark"@"%";
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> show grants for lyshark;
+-------------------------------------+
| Grants for [email protected]% |
+-------------------------------------+
| GRANT USAGE ON *.* TO 'lyshark'@'%' |
+-------------------------------------+
1 row in set (0.00 sec)
收回使用者授權: 撤銷lyshark使用者
的遠端登陸許可權
MariaDB [(none)]> revoke create on *.* from "lyshark"@"%";
Query OK, 0 rows affected (0.01 sec)
重新整理許可權: 修改完成以後,記得執行許可權的重新整理操作.
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.01 sec)