Wednesday, September 24, 2014

MySQL的用戶連接


所以,我發現自己解釋與MySQL的用戶,以及他們如何進行身份驗證的差異。 首先,這些信息是不是新的,但可以在這裡找到:
我只展示一些真實世界的例子來說明這一點。

MySQL使用的用戶名和登錄時,計算一個用戶的權限。 這就是為什麼最好的做法是刪除匿名用戶。

在這個例子中,我將開始了與以下用戶



MariaDB [(none)]> select user , host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | centos64 |
| root | centos64 |
| | localhost |
| root | localhost |
+---------+-----------+

我可以登錄到該服務器甚至認為我沒有用戶名,因為它的默認值降至匿名@本地。


# mysql -u nobody
MariaDB [(無)]>選擇CURRENT_USER();
+ ---------------- +
| CURRENT_USER()|
+ ---------------- +
| @localhost |
+ ---------------- +
MariaDB [(無)]>節目補助;
+ -------------------------------------- +
|補助金@localhost |
+ -------------------------------------- +
| GRANT USAGE ON * TO'@'localhost'的。|
+ -------------------------------------- +

雖然我不能做很多我還有到數據庫中。

現在,當我通過一個已知的用戶:


# mysql -u root -p
MariaDB [(無)]>選擇CURRENT_USER;
+ ---------------- +
| CURRENT_USER |
+ ---------------- +
|根@本地|
+ ---------------- +
MariaDB [(無)]>節目補助;
+----------------------------------------------------------------------------------------------------------------------------------------+
|補助金根@本地|
+----------------------------------------------------------------------------------------------------------------------------------------+
|於授出日期所有特權* TO'根'@'localhost'的IDENTIFIED BY密碼“* 8CD56861FDADF7A264741F27D502D1A8DAE0A8F7'WITH GRANT OPTION。|
|授予代理開'@''到'根'@'localhost'的WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------+


目前root用戶擁有4個不同的賬戶。

MariaDB [(none)]> select user , host from mysql.user where user = 'root';
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| root | centos64 |
| root | localhost |
+------+-----------+

這些都是不同的賬戶。 我只需要,雖然他們中的一個。 我只通過本地主機連接使用root帳戶。

MariaDB [(none)]> DROP USER 'root'@'127.0.0.1';
Query OK, 0 rows affected (0.33 sec)

MariaDB [(none)]> DROP USER 'root'@'centos64';
Query OK, 0 rows affected (0.02 sec)

MariaDB [(none)]> DROP USER 'root'@'::1';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> select user , host from mysql.user where user = 'root';
+------+-----------+
| user | host |
+------+-----------+
| root | localhost |
+------+-----------+

那麼,什麼沒我說的4種不同的帳戶嗎? 他們都以root用戶帳戶。 不..他們的根和任何主機。 因此,每個帳戶(用戶+主機)可以有不同的權限。

所以我們將做一個例子旁邊,以示區別。
所以在這個例子中,服務器有兩個網絡接口。 因此,我將每創建的所有接入點各有不同的權限,以顯示不同的用戶。 我會設置相同的密碼,但這些可能是不同的。

MariaDB [(none)]> GRANT SELECT ON *.* TO 'anothermysqldba'@'10.0.2.15' IDENTIFIED BY '<cleartext password>';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE , DROP, RELOAD, SHUTDOWN, PROCESS, FILE, INDEX, ALTER ON *.* TO 'anothermysqldba'@'192.168.0.%' IDENTIFIED BY '<cleartext password>';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'anothermysqldba'@'localhost' IDENTIFIED BY '<cleartext password>' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(無)]>選擇用戶,從mysql.user其中user ='anothermysqldba“主持人;
+ ----------------- + ------------- +
|用戶|主機|
+ ----------------- + ------------- +
| anothermysqldba | 10.0.2.15 |
| anothermysqldba | 192.168.0。%|
| anothermysqldba |本地主機|
+ ----------------- + ------------- +

所以,這是什麼意思? 即使用戶名是相同的,因為MySQL使用主機以及驗證用戶的每用戶接入點的不同的權限。

雖然你可能會相信你的一些開發商,這往往是一個好主意,以限制他們的一些訪問,如果他們是遠程或通過他們的劇本工作。 如果他們需要做的事情,不涉及你和他們有ssh到服務器本身並登錄到執行其他任務。 當然,這是依賴於你的業務和/或應用程序之間的關係和工作流程。

使用10.0.2.15的主機,用戶只需選擇接入。

# mysql -h 10.0.2.15 -u anothermysqldba -p
MariaDB [(無)]>選擇CURRENT_USER();
+ --------------------------- +
| CURRENT_USER()|
+ --------------------------- +
| anothermysqldba@10.0.2.15 |
+ --------------------------- +
MariaDB [(無)]>節目補助;
+-------------------------------------------------------------------------------------------------------------------------+
|補助金anothermysqldba@10.0.2.15 |
+-------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT ON * TO'anothermysqldba'@'10.0.2.15'IDENTIFIED BY密碼“* 31360D7EE84BE965C0E759179FC61B6943BCA64F”。|
+-------------------------------------------------------------------------------------------------------------------------+

使用192.168.0.26主機的用戶有更多的機會。 此帳戶也設置192.168.0 / 255(%)子網下過任何訪問。

# mysql -h 192.168.0.26 -u anothermysqldba -p
MariaDB [(無)]>選擇CURRENT_USER();
+ + -----------------------------
| CURRENT_USER()|
+ + -----------------------------
| anothermysqldba@192.168.0.% |
+ + -----------------------------
MariaDB [(無)]>節目補助;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|補助金anothermysqldba@192.168.0.% |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,刷新,關閉,進程,文件,索引,ALTER ON * TO'anothermysqldba'@'192.168.0.%'IDENTIFIED BY密碼“* 31360D7EE84BE965C0E759179FC61B6943BCA64F”。|
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

所以,當你將承擔本地主機用戶具有完全訪問權限的帳戶。

# mysql -u anothermysqldba -p
MariaDB [(無)]>選擇CURRENT_USER();
+ --------------------------- +
| CURRENT_USER()|
+ --------------------------- +
| anothermysqldba @本地|
+ --------------------------- +
1行(0.00秒)

MariaDB [(無)]>節目補助;
+---------------------------------------------------------------------------------------------------------------------------------------------------+
|補助金anothermysqldba @本地|
+---------------------------------------------------------------------------------------------------------------------------------------------------+
|於授出日期所有特權* TO'anothermysqldba'@'localhost'的IDENTIFIED BY密碼“* 31360D7EE84BE965C0E759179FC61B6943BCA64F'WITH GRANT OPTION。|
+---------------------------------------------------------------------------------------------------------------------------------------------------+

現在,當我說這是去掉匿名用戶的最佳實踐之前。 使用mysql_secure_installation安裝將有助於他為好。

為什麼這很重要?

# mysql -u anothremysqldba -p
MariaDB [(無)]>選擇CURRENT_USER();
+ ---------------- +
| CURRENT_USER()|
+ ---------------- +
| @localhost |
+ ---------------- +
1行集(0.00

這個簡單的例子......以上,只是避免簡單的錯誤。 一個錯字允許訪問數據庫,它不應該允許這樣。

所以除去,然後,然後再次測試。

MariaDB [(none)]> DROP USER ''@'localhost';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> DROP USER ''@'centos64';
Query OK, 0 rows affected (0.00 sec)

#mysql的-u anothremysqldba -p
輸入密碼:
ERROR 1045(28000):拒絕訪問用戶anothremysqldba'@'localhost'的(使用密碼:是

如果你的數據庫創建與大多與%為主機名或嚴格的IP地址,並沒有通配符那麼這是什麼意思?

這將是你一個安全和業務決策。 個人既不是在我看來一個有效的選項。 只是一個通配符(%)允許一個強大的接入點,但如果防火牆發生故障,也開啟了訪問遠程網絡外的用戶。 每個用戶嚴格的IP地址也是相當嚴格的,我認為,但它依賴於用戶。 例如,即使已經複製我寧願仍然使用IP地址與%,即創建一個帳戶:192.168.0%。 IP地址不發生變化( 遠程用戶數據庫管理員往往沒有告訴連靜態的變化 ),這通常會導致人來給DBA擁有訪問故障的投訴。

我曾經跟一個人的有限的鎖定到一個靜態IP地址的每個用戶的訪問。 此人必須不斷地改變GRANT語句。 人們必須能夠很容易地和有效地工作,同時可以確保您的最終安全。