1. 程式人生 > >MySQL使用者授權與訪問控制

MySQL使用者授權與訪問控制

這本來是一篇講述怎麼在Linux上完成MySQL的安裝、新建使用者並授權的博文,後來查閱了不少資料,看到一篇有意思的文章,思緒就開始氾濫了。

mysql> FLUSH PRIVILEGES;

也許你看到大多數講解MySQL授權的文章最後都讓你使用上面的命令來重新整理MySQL的許可權,但很多情況下可能都是毫無意義的(文末講這個問題)。不求甚解的求知習慣是危險的,如果對一項技術有追求,應該花時間去了解背後的原理和邏輯。檢視更新請訪問我的 個人部落格網站

MySQL安裝

$ sudo apt-get update
$ sudo apt-get install mysql-server

通過mysql_secure_installation安全向導修改root使用者密碼,設定是否允許root遠端登陸以及決定是否刪除匿名賬號和測試資料庫等。[MySQL開發者文件的傳送門]:

$ sudo mysql_secure_installation

在生產環境中,安全起見,建議設定root使用者不允許遠端登陸,如果只是學習測試用就無所謂了。此外,匿名賬號最好刪掉,不然容易出現奇奇怪怪的問題,如StackOverflow中提到的這個已授權的使用者本地登陸後卻出現MySQL Access Denied,高票答案中對這個問題有很詳細的解答,感興趣的讀者可以開啟看看。後來在MySQL的開發者文件中也看到了關於這個問題的說明:

傳送門。這個問題總結起來就是:匿名賬號由於指定了具體的host(localhost),比使用萬用字元(%)的賬號擁有了優先權(在user表中排在前面因此先被檢查),導致實名使用者在本地登陸時實際上是以匿名使用者身份登陸的。host是特定值的賬號之所以在user表中排在前面,是因為這張表遵循了以下排序規則Access Control, Stage 1: Connection Verification:

The server uses sorting rules that order rows with the most-specific Host values first. Literal host names and IP addresses are the most specific. (The specificity of a literal IP address is not affected by whether it has a netmask, so 198.51.100.13 and 198.51.100.0/255.255.255.0 are considered equally specific.) The pattern ‘%’ means “any host” and is least specific. The empty string ” also means “any host” but sorts after ‘%’. Rows with the same Host value are ordered with the most-specific User values first (a blank User value means “any user” and is least specific). For rows with equally-specific Host and User values, the order is nondeterministic.

扯遠了,MySQL安裝完之後一般就啟動了,通過下面的命令檢查MySQL服務的狀態:

$ systemctl status mysql.service
● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2018-08-14 10:14:28 CST; 2min 0s ago
  Process: 990 ExecStartPost=/usr/share/mysql/mysql-systemd-start post (code=exited, status=0/SUCCESS)
  Process: 976 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
 Main PID: 989 (mysqld)
   CGroup: /system.slice/mysql.service
           └─989 /usr/sbin/mysqld

若MySQL沒啟動,通過以下命令啟動:

$ sudo systemctl start mysql

建立新使用者並授權

我們直接看看資料庫中的user表的結構:

mysql> describe mysql.user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                  | Type                              | Null | Key | Default               | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                   | char(60)                          | NO   | PRI |                       |       |
| User                   | char(32)                          | NO   | PRI |                       |       |
......[此處省略多行]......
| max_connections        | int(11) unsigned                  | NO   |     | 0                     |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0                     |       |
| plugin                 | char(64)                          | NO   |     | mysql_native_password |       |
| authentication_string  | text                              | YES  |     | NULL                  |       |
| password_expired       | enum('N','Y')                     | NO   |     | N                     |       |
| password_last_changed  | timestamp                         | YES  |     | NULL                  |       |
| password_lifetime      | smallint(5) unsigned              | YES  |     | NULL                  |       |
| account_locked         | enum('N','Y')                     | NO   |     | N                     |       |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+

HostUser是主鍵可知,一個MySQL賬號是由HostUser共同決定的。
參考 MySQL開發者文件:Adding User Accounts,下面是開發者文件中給出的建立使用者並授權的例子,雖然在下面的例子中,授權總是緊跟著建立使用者的命令,你完全可以先建立使用者但暫時不做任何授權。

mysql> CREATE USER 'finley'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'localhost'
    ->     WITH GRANT OPTION;
mysql> CREATE USER 'finley'@'%' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'%'
    ->     WITH GRANT OPTION;
mysql> CREATE USER 'admin'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';

解釋一下上面例子中的字元含義: localhost表示這個賬號只能在本機登陸,%是萬用字元,表示可以在任意host登陸。由於我們已經知道一個賬號是由User和Host共同決定的,因此上面例子中建立的’finley’@’localhost’和’finley’@’%’其實是兩個不同的賬號。*.*表示任意資料庫的所有許可權,WITH GRANT OPTION表示這個賬號可以將具有的許可權授予其他賬號。可見,上面例子建立的這兩個名為finley的使用者都是超級使用者。官方文件還給出了幾個具體授權的例子:

mysql> CREATE USER 'custom'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ->     ON bankaccount.*
    ->     TO 'custom'@'localhost';
mysql> CREATE USER 'custom'@'host47.example.com' IDENTIFIED BY 'password';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ->     ON expenses.*
    ->     TO 'custom'@'host47.example.com';
mysql> CREATE USER 'custom'@'%.example.com' IDENTIFIED BY 'password';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    ->     ON customer.*
    ->     TO 'custom'@'%.example.com';
mysql> SHOW GRANTS FOR 'admin'@'localhost';

[注: SHOW GRANTS FOR CURRENT_USER可以檢視當前使用者的許可權]

建立一個名為cheung的MySQL使用者並授權:

mysql> CREATE USER 'cheung'@'%' IDENTIFIED BY 'password-for-cheung';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'cheung'@'%';

命令列可成功登陸:

$ mysql -u cheung -p

嘗試在Windows中通過Navicat遠端連線,報錯2003 - Can't connect to MySQL server on '192.168.118.123' (10038)
如果在Linux上遠端連線會得到如下錯誤提示[192.168.118.123是要連線的資料庫所在的host]:

$ mysql -h 192.168.118.123 -u cheung -p
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.118.123' (111)

上面的命令實際上無需在另外一臺Linux伺服器上執行,就在MySQL所在的伺服器執行也會得到一樣的錯誤結果。因為使用ip值192.168.118.123作為host已經不是本地連線[經過了路由]。
通過mysql -h 127.0.0.1 -u cheung -p或者mysql -h localhost -u cheung -p則可以成功連線並登陸。
由於'cheung'@'%',基本可以確定這是MySQL只綁定了本機迴環地址(loopback address)導致的問題。

[email protected]:~$ netstat -anp |grep 3306
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -
$ cd /etc/mysql
$ grep -rn "127.0.0.1"
mysql.conf.d/mysqld.cnf:43:bind-address     = 127.0.0.1

通過上面的grep命令查詢到了MySQL的監聽設定,bind-address設定為127.0.0.1的話,就只能從本機連線MySQL了,所有遠端連線都不被允許,因此註釋掉這一行:

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address       = 127.0.0.1

重啟MySQL服務:

$ sudo service mysql restart

再次檢視3306埠:

$ netstat -anp |grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      -

這個問題終於解決了,網上所有的教程都是這麼做的。如果你瞭解Linux的迴環地址和socket連線的原理的話,幾乎可以馬上反應過來,我們還可以有別的修改方式!我們可以將bind-address的值更換為本機IP(我這裡具體就是192.168.118.123) [注: 如果機器的ip地址變了,就要再次修改bind-address了,因此這種方法還是有缺陷的。]

#bind-address       = 127.0.0.1
bind-address       = 192.168.118.123

這樣的話,通過mysql -u cheung -p/mysql -h 192.168.118.123 -u cheung -p/mysql -h localhost -u cheung -p都可以成功連線,但使用mysql -h 127.0.0.1 -u cheung -p則會報錯ERROR 2003 (HY000): Can’t connect to MySQL server on ‘127.0.0.1’ (111)

刪除使用者

> DROP USER 'smithj'@'localhost';

或者

> DROP USER IF EXISTS 'smithj'@'localhost';

不要濫用FLUSH PRIVILEGES

FLUSH PRIVILEGES的作用是Reload grant tables
濫用FLUSH PRIVILEGES命令的教程太多,一篇國外的文章對此做了詳細的說明,傳送門: Stop using FLUSH PRIVILEGES
總結一句就是,除非涉及直接更改grant tables(如使用INSERT, UPDATE, or DELETE對這張表進行修改),其他情況下使用FLUSH PRIVILEGES都是毫無意義的。使用GRANT, REVOKE, SET PASSWORD, or RENAME USER等命令時,MySQL server都會立即監聽到這些變化並重新載入grant tables到記憶體。

mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;

相關推薦

MySQL使用者授權訪問控制

這本來是一篇講述怎麼在Linux上完成MySQL的安裝、新建使用者並授權的博文,後來查閱了不少資料,看到一篇有意思的文章,思緒就開始氾濫了。 mysql> FLUSH PRIVILEGES; 也許你看到大多數講解MySQL授權的文章最後都讓你使用上

四.Jenkins的授權訪問控制

區別 ima 配置 項目 uil build 存在 檢查 lob 默認的Jenkins不包含任何的安全檢查,任何人可以修改Jenkins設置,job和啟動build等。在多人使用的時候,顯然會存在比較大的安全風險,所以需要配置Jenkins的授權和訪問控制。 【系統管理】-

LAMP-防盜鏈訪問控制

lamp一、防盜鏈 有時候,網站的流量會異常龐大。經過觀察,會發現一些靜態的圖片等元素被盜用了。使用防盜鏈,可以防止元素被外鏈。通過限制referer能實現防盜鏈的功能。1)配置虛擬主機[[email protected]/* */ ~]# vi /usr/local/apache2.4/c

pytho類繼承訪問控制

() 語句塊 logs 順序 ccf 多繼承 自己 -s 私有屬性 類的三要素之一,繼承 從父類繼承,就可以直接擁有了父類的方法和屬性,減少冗余,增加復用,同時子類也可以定義自己的屬性和方法 繼承:class ****(需要繼承的類) 這樣就可以讓其子類獲得父類的方法與

Linux文件權限訪問控制

Linux學習Linux文件權限與訪問控制 訪問文件用戶3類: 文件所有者 同組成員 其他人 權限--- --- --- (rwx) 依次對應3類用戶 file:6rw 4r 0 x1 dir: 7rwx 5r-x 0 默認權限 umask內部命令 用來生成數字 umask+defau

CentOS7.4—nginx應用之統計訪問控制

centos7最新版本nginx功能應用 nginx功能之統計與訪問控制 Nginx功能應用—統計與驗證目錄:第一部分:準備工作第二部分:搭建nginx第三部分:配置nginx的統計功能第四部分:配置nginx的驗證功能(訪問控制) 第一部分 實驗環境一:服務器:Linux系統—CentOS 7.4

編寫自己的登入訪問控制模組

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

MySQL 資料操作事務控制

-- 課後作業 -- 1.使用如下語句,建立學生表student和班級表class create table student (        -- 學生表             xh char(4),             -- 學號             xm va

MongoDB學習筆記(六)——MongoDB配置使用者賬號訪問控制

前面的幾篇博文,大概介紹瞭如何安裝MongoDB,以及介紹了MongoDB shell與MongoDB Compass。 新安裝的MongoDB是沒有賬號設定的,也就是說任何人都可以連線進MongoDB,這是非常不安全的。所以我們需要對MongoDB進行設定賬

初探下一代網路隔離訪問控制

概述 安全域隔離是企業安全裡最常見而且最基礎的話題之一,目前主要的實現方式是網路隔離(特別重要的也會在物理上實現隔離)。對於很小的公司而言,雲上開個VPC就實現了辦公網和生產網的基礎隔離,但對於有自建的IDC、網路基礎設施甚至自己構建雲基礎設施的大型公司而言,網路隔離是一項基礎而複雜的安全建設。基礎在這裡的意

AWS IAM產品詳情_身份認證訪問控制服務

Amazon Web Services 誠聘精英。 Amazon Web Services (AWS) 是 Amazon.com 的一個充滿活力、不斷壯大的業務部門。我們現誠聘軟體開發工程師、產品經理、客戶經理、解決方案架構師、支援工程師、系統工程師以及設計師等人才。請訪問我

AWS IAM常見問題_身份認證訪問控制服務

問:許可權是如何執行的? 將訪問控制策略掛載到使用者、組和角色,以便分配對 AWS 資源的許可權。預設情況下,IAM 使用者、組和角色沒有許可權;擁有充分許可權的使用者必須使用策略授予所需的許可權。 問:如何使

DNS解析Bind的使用(7)——子域授權、轉發及訪問控制列表配置

訪問控制 子域授權 轉發 十四、Bind軟件的子域授權全球網絡的DNS服務器都是由多級所構成的,每一臺主機通過域名服務找到所要訪問的主機IP地址都是通過一層層DNS服務器找到的。而這樣的結構就決定了,上級域名服務器必須具備找到子域的能力,例如tianxia.com.這個域名,在頂級域com.下就必

MySQL訪問控制使用者管理

  MySQL伺服器的安全基礎是使用者應該對他們需要的資料具有適當的訪問權,既不能多也不能少。管理訪問控制需要建立和管理使用者賬號。   使用MySQL Administrator,MySQL Administrator提供了一個圖形使用者介面,可以用來管理使用者及賬號許可權。   防止無意的錯誤,訪問控

老男孩教育每日一題-第106天-MySQL如何授權用戶admin:password遠程訪問權限

每日一題 mysql添加用戶 解答:假定內網網段172.16.1.0,用戶admin,密碼password,數據庫oldboy。只創建用戶:create user [email protected]/* */%‘ identified by ‘password‘;創建用戶並授權數據庫權限,

[Nginx]用Nginx實現應用結合的訪問控制 - 防盜鏈

計算公式 index user use 鏈接 vtk 兩個 link img 應用場景:圖片等資源須要設置權限,如:僅僅有認證過的用戶才幹訪問自己的圖片。 解決的方法:使用Nginx的防盜鏈模塊http_secure_link能夠實現,該模塊默認情況下不包括。故在

訪問控制列表ACL的配置應用

訪問控制列表 標準acl 擴展acl 楊書凡 命名acl 訪問控制列表(Access Control List,ACL)是應用在路由器接口的指令列表(即規則)。這些指令列表用來告訴路由器,哪些數據包可以接收,哪些數據包需要拒絕。其基本原理如下:ACL使用包過濾技術,在路由器上讀取OS

訪問控制封裝

www ont 現在 bsp 必須 pri 數據 源文件 區別 在C++語言中,我們使用訪問說明符加強類的封裝性: ·定義在public說明符之後的成員在整個程序內可被訪問,public成員定義類的接口。 ·定義在private說明符之後的成員可以被

基於角色基於資源的權限訪問控制

由於 同時 style ssi 語句 span 權限 分配 不依賴   基於角色的權限訪問控制RBAC(role-based access control)是以角色為中心進行的訪問控制,也就是判斷主體subject是那個角色的方式進行權限訪問控制,是粗粒度的   基於資源的

security 01: Linux基本防護 、 用戶切換提權 、 SSH訪問控制 、 總結和答疑

add orm ati sgi star 數字簽名 安全 roo 輸入 LINUX安全與監控 6天LINUX安全 3天LINUX監控 3天+++++++++++++++++++++++++什麽安全? 保護維護的服務器不受到攻擊和破壞 攻擊和破壞手段? 技術性非技術