1. 程式人生 > >MySQL訪問許可權系統和訪問控制

MySQL訪問許可權系統和訪問控制

6.1一般安全問題
6.1.1安全指南 
     執行MySQL時,請遵循以下準則:
     (1)不要給任何人(MySQL root帳戶除外 )訪問 資料庫中的 user表mysql!這是至關重要的。
    (2)瞭解MySQL訪問許可權系統的工作原理(參見 第6.2節“MySQL訪問許可權系統”)。使用 GRANTand REVOKE語句來控制對MySQL的訪問。不 要授予比必要更多的許可權。不要授予所有主機的許可權。使用該SHOW GRANTS 語句來檢查哪些帳戶可以訪問什麼。然後使用該REVOKE 語句刪除不必要的那些許可權。
     (3)嘗試mysql -u root。如果您能夠成功連線到伺服器而不需要輸入密碼,任何人都可以作為MySQL root使用者以完全許可權連線到MySQL服務 器!
     (4)不要在您的資料庫中儲存明文密碼。如果您的計算機遭到入侵,入侵者可以獲取完整的密碼列表並使用它們.
     (5)MySQL預設使用埠3306。不能從不受信任的主機訪問此埠。作為檢查您的MySQL埠是否開啟的簡單方法,請嘗試從一些遠端計算機        執行以下命令,server_host執行MySQL伺服器的主機名或IP地址在哪裡:
        shell> telnet server_host 3306
        如果telnet掛起或連線被拒絕,埠被阻止,這是你想要的。如果您獲得連線和一些垃圾字元,埠是開啟的,並且應該在防火牆或路由器上關閉,除非您確實有很好的理由
保持開啟狀態.
     (6)不要通過網際網路傳輸普通(未加密)的資料。每個有時間和能力攔截它並將其用於自己目的的人都可以訪問這些資訊。而是使用SSL或        SSH等加密協議。MySQL支援內部SSL連線。另一種技術是使用SSH埠轉發為通訊建立一個加密(和壓縮的)隧道。但是加密傳輸資料會        加大開銷,請綜合考慮。

6.1.2保密密碼
      6.1.2.1終端使用者密碼安全指南
             當您執行客戶端程式以連線到MySQL伺服器時,以不公開的方式指定您的密碼是不合適的,以供其他使用者發現。在執行客戶端程式 時可以使用用於指定密碼的方法,以及對每種方法的風險進行評估。簡而言之,最安全的方法是使客戶端程式提示輸入密碼,或 者在正確保護的選項檔案中指定密碼。
             不安全的方式1:給出明文密碼,如下命令:
             
             shell> mysql -u francis -pfrank db_name
             很方便但不安全。在某些系統上,您的密碼對系統狀態程式(例如可能由其他使用者呼叫以顯示命令列的ps)可見。MySQL客戶端通常在初始化序列期間用零覆蓋命令列密碼引數。然而,仍然有一段短暫的時間間隔,值是可見的。此外,在某些系統上,這種覆 蓋策略是無效的,密碼對於ps是可見的。
             
             不安全的方式2:  
             將您的密碼儲存在MYSQL_PWD 環境變數中             
             這種指定您的MySQL密碼的方法必須被認為是非常不安全的,不應該被使用。ps的某些版本 包括顯示執行程序環境的選項。在某些系統上,如果設定 MYSQL_PWD,
您的密碼將暴露給執行ps的任何其他使用者。

             安全方式1:如下:
             在命令列上 使用-p或--password選項不指定密碼值。在這種情況下,客戶端程式以互動方式請求密碼:
             shell> mysql -u francis -p db_name
             Enter password: ********
             該*字元顯示在您輸入密碼。輸入密碼時不顯示密碼。以這種方式輸入密碼比在其他使用者看不到命令​​行更安全。
             
             安全方式2:如下:
             將您的密碼儲存在選項檔案中。例如,在Unix上,您可以在主目錄[client]中的.my.cnf檔案部分 列出您的密碼 :
             [client]
              password=your_pass
             為了保證密碼的安全,除了你以外,任何人都不應該訪問該檔案。為了確保這一點,將檔案訪問模式設定為400或600。例如:
             shell> chmod 600 .my.cnf
             
             如果您的命令直譯器配置為維護歷史記錄,則儲存命令的任何檔案將包含在命令列中輸入的MySQL密碼。例如, bash使用  ~/.bash_history。任何此類文
件應具有限制性訪問模式。

      6.1.2.2密碼安全管理員指南
              資料庫管理員應使用以下準則來保護密碼安全。
              (1)MySQL儲存mysql.user表中使用者帳戶的密碼 。不得將訪問此表的許可權授予任何非管理性帳戶。
              (2)帳戶密碼可以過期,以便使用者必須重置它們.
              (3)該validate_password外掛可用於對可接受的密碼執行策略.
              (4)應該保護可能寫入密碼的日誌檔案等檔案.
              
      6.1.2.3密碼和記錄
             (1)口令可以寫在SQL語句,如純文字 CREATE USER, GRANT,SET PASSWORD,和語句呼叫該 PASSWORD()函式。如果MySQL伺服器
                以這樣的方式記錄這些語句,則其中的密碼對於訪問日誌的任何人都可以看到。
               在MySQL 5.7中,語句記錄避免了以下語句以明文形式寫入密碼:
               CREATE USER ... IDENTIFIED BY ...
               ALTER USER ... IDENTIFIED BY ...
               GRANT ... IDENTIFIED BY ...
               SET PASSWORD ...
               SLAVE START ... PASSWORD = ...
               CREATE SERVER ... OPTIONS(... PASSWORD ...)
               ALTER SERVER ... OPTIONS(... PASSWORD ...)
               這些語句中的密碼將重寫為不會直接寫入寫入常規查詢日誌,慢查詢日誌和二進位制日誌的語句文字中。重寫不適用於其他宣告              
               (2)INSERT或者 表中引用文字密碼的UPDATE語句 mysql.user是按原樣記錄的,所以你應該避免這樣的語句。(無論如何不​​鼓
                   勵直接操縱授權表),容易造成錯誤,忘記加 where條件。導致把user表的使用者全部密碼一次更改。
      
               (3)對於常規查詢日誌,可以通過啟動具有該--log-raw選項的伺服器來抑制密碼重寫 。出於安全考慮,此選項不建議用於生產
               使用。
               (4)密碼重寫僅在預期使用純文字密碼時進行。對於具有期望密碼雜湊值的語法的語句,不會發生重寫。如果這種語法錯誤地提
                 供純文字密碼,則密碼將按照給定的方式進行記錄,無需重寫。例如,如下所示,記錄以下語句,因為可能需要輸入密碼雜湊值:
                 CREATE USER 'user1'@'localhost' IDENTIFIED BY PASSWORD 'not-so-secret';
                 要防範日誌檔案遭到無理曝光,請將它們放在限制對伺服器和資料庫管理員的訪問的目錄中。如果伺服器記錄到 mysql資料庫中
                 的表,則只將這些表的訪問許可權授予資料庫管理員
6.1.2.4 MySQL中的密碼雜湊


6.1.3使MySQL安全對抗攻擊者
當您連線到MySQL伺服器時,您應該使用密碼。通過連線不會以明文形式傳送密碼。客戶端連線順序中的密碼處理在MySQL 4.1.1中升級到非常安全。
如果您仍然使用4.1.1之前的密碼,則加密演算法不如新演算法那麼強。通過一些努力,可以嗅探客戶端和伺服器之間的流量的聰明的攻擊者可以破解密碼
.如果客戶端和伺服器之間的連線通過不受信任的網路,並且您擔心這一點,您可以使用壓縮協議使流量更難以解密。您還可以使用MySQL的內部SSL支
持來使連線更加安全.
要使MySQL系統安全,您應該強烈地考慮以下建議:
(1)要求所有MySQL帳戶都有密
(2)確保在資料庫目錄中具有讀取或寫入許可權的唯一的Unix使用者帳戶是用於執行mysqld的帳戶
(3)不要以Unix root 使用者身份執行MySQL伺服器。這是非常危險的,因為具有該FILE許可權的任何使用者 都能夠使伺服器建立檔案root(例如~root/.bashrc)
   。為了防止這種情況, mysqld拒絕執行, root除非使用該--user=root選項明確指定.要將 mysqld作為不同的Unix使用者啟動,請新增一個user選
   項,[mysqld]該my.cnf選項指定在您指定伺服器選項的選項檔案組中的 使用者名稱。例如:
   [mysqld]
   user=mysql
(4)不授予FILE非管理使用者的許可權。具有此許可權的任何使用者都可以使用mysqld守護程式的許可權在檔案系統中的任何位置寫入檔案.
(5)不給予非管理使用者PROCESS或 SUPER特權。
(6)不允許使用符號連結到表格。(此功能可通過禁用 --skip-symbolic-links 選項。)
(7)如果您不信任您的DNS,則應在授權表中使用IP地址而不是主機名。無論如何,您應該非常小心使用包含萬用字元的主機名值建立授權表條目。
(8)如果要限制單個帳戶允許的連線數量,可以通過設定mysqld中的 max_user_connections變數來實現。該 宣告還支援資源控制選項,用於限制允
許用於帳戶的伺服器使用範圍


6.1.4安全性相關的mysqld選項和變數
Table 6.1 Security Option/Variable Summary

NameCmd-Line Option FileSystem VarStatus VarVar ScopeDynamic
allow-suspicious-udfsYesYes 
automatic_sp_privilegesYesGlobal Yes
chrootYes Yes 
des-key-fileYesYes 
local_infileYesGlobal Yes
old_passwordsYesBoth Yes
safe-user-createYesYes 
secure-authYesYesGlobalYes
- Variable: secure_authYesGlobal Yes
secure-file-privYesYesGlobalNo
- Variable: secure_file_privYesGlobal No
skip-grant-tablesYesYes 
skip-name-resolveYesYesGlobalNo
- Variable: skip_name_resolveYesGlobal No
skip-networkingYesYesGlobalNo
- Variable: skip_networkingYesGlobal No
skip-show-databaseYesYesGlobalNo
- Variable: skip_show_databaseYesGlobal No


6.1.5如何以正常使用者身份執行MySQL
在Unix(或使用taror tar.gzpackages的Linux安裝 )中,MySQL伺服器mysqld可以由任何使用者啟動和執行。但是,root出於安全考慮,您應該避免以Unix 使用者身份執行伺服器。要將mysqld更改為正常的非特權Unix使用者執行user_name,您必須執行以下操作:
停止伺服器,如果它正在執行(使用mysqladmin shutdown)
更改資料庫目錄和檔案,以便 user_name具有讀取和寫入檔案的許可權(您可能需要以Unix root使用者身份執行此 操作):
shell> chown -R user_name /path/to/mysql/datadir
如果不這樣做,伺服器在執行時將無法訪問資料庫或表 user_name。
如果MySQL資料目錄中的目錄或檔案是符號連結,則chown -R可能不會遵循符號連結。如果沒有,您還需要遵循這些連結並更改他們指向的目錄和檔案。
以使用者身份啟動伺服器user_name。另一個選擇是啟動mysqld作為Unix root使用者並使用該 選項。mysqld啟動,然後 在接受任何連線之前切換到作為Unix使用者執行。 --
user=user_nameuser_name
要在系統啟動時自動將伺服器作為給定使用者啟動,請通過向選項檔案組或伺服器資料目錄中的 選項檔案 新增user選項來 指定使用者名稱 。例如: [mysqld]/etc/my.cnfmy.cnf
[mysqld]
user=user_name
如果您的Unix機器本身沒有安全,您應該root在授權表中為MySQL 帳戶分配密碼。否則,在該機器上具有登入帳戶的任何使用者都可以使用選項執行mysql客戶端 --user=root
並執行任何操作。(在任何情況下,將密碼分配給MySQL帳戶是個好主意,尤其是在伺服器主機上存在其他登入帳戶時)。請參見 第2.10.4節“保護初始MySQL帳戶”。
6.1.6 LOAD DATA LOCAL的安全問題
為避免LOAD DATA問題,客戶應避免使用LOCAL。為了避免連線到不受信任的伺服器,客戶端可以建立安全連線,並使用--ssl-mode=VERIFY_IDENTIFY選項和相應的CA證書進行連線來驗證伺服器身份 。
為了使管理員和應用程式能夠管理本地資料載入功能,LOCAL配置如下:
在伺服器端:
所述local_infile系統變數控制伺服器端LOCAL 的能力。根據 local_infile設定,伺服器拒絕或允許LOCAL在客戶端啟用的客戶端的本地資料載入。預設情況下, local_infile啟用。
要明確導致伺服器拒絕或允許 LOAD DATA LOCAL語句(不論如何客戶程式和庫在構建時或執行時配置),啟動mysqld的與 local_infile分別禁用或啟用。 local_infile也可以在執行時設定。
在客戶端:
對於mysql客戶端,預設情況下禁用本地資料載入。要明確禁用或啟用它,請使用 --local-infile=0或 --local-infile[=1]選項。
對於mysqlimport客戶端,預設情況下禁用本地資料載入。要明確禁用或啟用它,請使用 --local=0或 --local[=1]選項。
如果您LOAD DATA LOCAL在Perl指令碼或[client]從選項檔案讀取組的其他程式中使用,則可以向該組新增 local-infile選項設定。為了防止不了解此選項的程式出現問題,請使用loose- 字首
指定 :
[client]
loose-local-infile=0
要麼:
[client]
loose-local-infile=1
在所有情況下,LOCAL 客戶端成功使用載入操作也要求伺服器允許。
如果LOCAL能力被禁用,在伺服器或客戶端上,嘗試發出LOAD DATA LOCAL語句的客戶端將 收到以下錯誤訊息:
ERROR 1148: The used command is not allowed with this MySQL version



6.2 MySQL訪問特權系統
當您執行連線到伺服器的客戶端程式時,MySQL訪問控制涉及兩個階段:
階段1:伺服器根據您的身份接受或拒絕連線,以及是否可以通過提供正確的密碼來驗證您的身份。
階段2:假設您可以連線,伺服器將檢查您發出的每個語句,以確定您是否具有足夠的許可權來執行它。例如,如果您嘗試從資料庫中的表中選擇行或從資料庫中刪除表,則伺服器將驗證您是否具有 SELECT表的DROP特權或資料庫的 許可權
MySQL許可權系統的主要功能是驗證誰從給定主機連線使用者,並與特權使用者資料庫如聯想 SELECT, INSERT, UPDATE,和 DELETE。附加功能包括具有匿名使用者和授予特定於MySQL的功能(如LOAD DATA INFILE管理操作)的許可權 


6.2.1 MySQL提供的特權
6.2.2授權表
授予MySQL帳戶的特權決定了該帳戶可以執行的操作。MySQL許可權在其應用的上下文和不同操作級別上有所不同:
管理許可權使使用者能夠管理MySQL伺服器的操作。這些許可權是全域性的,因為它們不是特定於特定資料庫的。
資料庫許可權適用於資料庫及其中的所有物件。可以為特定資料庫或全域性授予這些許可權,以便它們適用於所有資料庫。
可以為資料庫中的特定物件(資料庫中的給定型別的所有物件(例如資料庫中的所有表))或全域性的所有物件為資料庫物件(例如表,索引,檢視和儲存例程)授予特​​權所有資料庫中給定型別的物件)。
有關帳戶許可權的資訊儲存在 user,db, tables_priv,columns_priv,和procs_priv在表 mysql系統資料庫.
Table 6.2 Permissible Privileges for GRANT and REVOKE


Privilege       Column                   Context
ALL [PRIVILEGES]Synonym for “all privileges”Server administration
ALTER            Alter_privTables
ALTER ROUTINE       Alter_routine_privStored routines
CREATE  Create_privDatabases, tables, or indexes
CREATE ROUTINECreate_routine_privStored routines
CREATE TABLESPACECreate_tablespace_privServer administration
CREATE TEMPORARY TABLESCreate_tmp_table_privTables
CREATE USERCreate_user_privServer administration
CREATE VIEWCreate_view_privViews
DELETEDelete_privTables
DROPDrop_privDatabases, tables, or views
EVENTEvent_privDatabases
EXECUTEExecute_privStored routines
FILEFile_privFile access on server host
GRANT OPTIONGrant_privDatabases, tables, or stored routines
INDEXIndex_privTables
INSERTInsert_privTables or columns
LOCK TABLESLock_tables_privDatabases
PROCESSProcess_privServer administration
PROXYSee proxies_priv tableServer administration
REFERENCESReferences_privDatabases or tables
RELOADReload_privServer administration
REPLICATION CLIENTRepl_client_privServer administration
REPLICATION SLAVERepl_slave_privServer administration
SELECTSelect_privTables or columns
SHOW DATABASESShow_db_privServer administration
SHOW VIEWShow_view_privViews
SHUTDOWNShutdown_privServer administration
SUPERSuper_privServer administration
TRIGGERTrigger_privTables
UPDATEUpdate_privTables or columns
USAGESynonym for “no privileges”Server administration
以下列表提供了MySQL中可用許可權的一般說明。特定的SQL語句可能具有比此處指示的更特定的許可權要求。如果是這樣,有關陳述的描述提供了細節。
該ALL或 ALL PRIVILEGES 許可權說明符的簡寫。它代表“ 給定許可權級別可用的所有許可權 ” (除外GRANT OPTION)。例如,ALL在全域性或表級授予授予所有全域性許可權或所有表級許可權。
該ALTER許可權允許使用該ALTER TABLE語句來更改表的結構。ALTER TABLE還要求 CREATE和 INSERT特權。重命名錶需要ALTER和 DROP對舊錶, CREATE以及 INSERT對新表。
ALTER ROUTINE需要 該許可權來更改或刪除儲存的例程(過程和函式)。
該CREATE許可權允許建立新的資料庫和表。
將CREATE ROUTINE需要的許可權來建立儲存例程(過程和函式)。
CREATE TABLESPACE建立,更改或刪除表空間和日誌檔案組需要 該許可權。
該CREATE TEMPORARY TABLES 許可權允許使用該CREATE TEMPORARY TABLE 語句建立臨時表 。
會話建立了一個臨時表後,伺服器不會對該表進行進一步的特權檢查。所述建立會話可以在桌子上進行任何操作,例如DROP TABLE, INSERT, UPDATE,或 SELECT。有關詳細資訊,請參見

第13.1.18.3節“CREATE TEMPORARY TABLE語法”。
該CREATE USER許可權允許使用的ALTER USER, CREATE USER, DROP USER, RENAME USER,和 REVOKE ALL PRIVILEGES語句。
該CREATE VIEW許可權允許使用該CREATE VIEW 語句。
該DELETE特權使行從資料庫中的表被刪除。
該DROP特權使您能夠刪除(刪除)現有的資料庫,表和檢視。DROP為了ALTER TABLE ... DROP PARTITION在分割槽表上使用該語句,需要該 許可權。該 DROP也需要特權TRUNCATE TABLE。 如果授予DROP 的特權mysql資料庫使用者,該使用者可以刪除其中的MySQL訪問許可權被儲存在資料庫中。
EVENT需要 該許可權來建立,更改,刪除或檢視事件計劃程式的事件。
EXECUTE需要執行儲存例程(過程和函式) 的許可權。
該FILE許可權允許您使用LOAD DATA INFILE和 SELECT ... INTO OUTFILE語句和 LOAD_FILE()函式在伺服器主機上讀取和寫入檔案。具有該FILE許可權的使用者可以讀取伺服器主機上任何可由MySQL
伺服器讀取或讀取的檔案。(這意味著使用者可以讀取任何資料庫目錄中的任何檔案,因為伺服器可以訪問任何這些檔案。)該 FILE許可權還使使用者能夠在MySQL伺服器具有寫入許可權的任何目錄中

建立新檔案。這包括伺服器的資料目錄,其中包含實現許可權表的檔案。作為安全措施, 伺服器將不會覆蓋現有檔案。FILE從MySQL 5.7.17開始,該許可權需要使用DATA DIRECTORY或者INDEX DIRECTORY表選項來使用該 CREATE TABLE語句。
要限制可以讀取和寫入檔案的位置,請將secure_file_priv 系統設定為特定的目錄。請參見 第5.1.5節“伺服器系統變數”。
該GRANT OPTION許可權使您能夠給予其他使用者或從其他使用者刪除您擁有的這些許可權。
該INDEX許可權使您可以建立或刪除(刪除)索引。 INDEX適用於現有表。如果您具有CREATE 表的特權,則可以在CREATE TABLE語句中包含索引定義。
該INSERT許可權允許將行插入到資料庫中的表中。 INSERT還需要對 ANALYZE TABLE, OPTIMIZE TABLE和 REPAIR TABLE表維護語句。
該LOCK TABLES許可權允許使用顯式LOCK TABLES語句來鎖定具有該SELECT許可權的表。這包括使用寫鎖,這阻止其他會話讀取鎖定表。
該PROCESS許可權屬於顯示有關在伺服器中執行的執行緒的資訊(即有關會話執行的語句的資訊)。該許可權允許使用 SHOW PROCESSLIST或 mysqladmin程序列表來檢視屬於其他帳戶的執行緒; 你可以隨時看到你自己的執行緒。該PROCESS許可權還允許使用的SHOW ENGINE。
該PROXY許可權使使用者能夠模擬或被稱為另一使用者。請參閱 第6.3.10節“代理使用者”。
該REFERENCES許可權在MySQL 5.7.6之前未使用。從5.7.6開始,建立外來鍵約束需要REFERENCES父表的 許可權。
該RELOAD許可權允許使用該FLUSH語句。這也使中mysqladmin等效於命令FLUSH操作: flush-hosts,flush-logs, flush-privileges, flush-status, flush-tables, flush-threads,refresh,和reload。該reload命令告訴伺服器將授權表重新載入到記憶體中。 flush-privileges是同義詞 reload。該refresh 命令關閉並重新開啟日誌檔案並重新整理所有表。其他 命令執行類似於但更具體的功能 ,並且在某些情況下可能是優選的。例如,如果要僅僅重新整理日誌檔案,是一個更好的選擇。 flush-xxxrefreshflush-logsrefresh
該REPLICATION CLIENT 許可權允許使用的SHOW MASTER STATUS,SHOW SLAVE STATUS和SHOW BINARY LOGS語句。
REPLICATION SLAVE應授予從屬伺服器用於連線到當前伺服器作為主伺服器的帳戶 的許可權。沒有此許可權,從站不能請求對主伺服器上的資料庫進行的更新。
該SELECT特權使您能夠從資料庫中的表中選擇行。 SELECT語句SELECT只有在實際從表中檢索行時才需要該 許可權。一些 SELECT語句不訪問表,可以在沒有任何資料庫的許可權的情況下執行。例

如,您可以使用 SELECT簡單的計算器來評估不引用表的表示式:
SELECT 1+1;
SELECT PI()*2;
SELECT讀取列值的其他語句也需要 該許可權。例如,對於 在statement中SELECT的col_name= exprassignment UPDATE或者在or 語句的WHERE子句中 指定的列,右側所引用的列是需要的 。 
DELETEUPDATE
在SELECT還需要用於被與用於表或檢視特權 EXPLAIN,包括檢視任何基礎表。
該SHOW DATABASES許可權使帳戶能夠通過發出SHOW DATABASE語句來檢視資料庫名稱 。沒有此許可權的帳戶只能看到具有某些許可權的資料庫,如果伺服器已啟動該--skip-show-database選項,則無
法使用該語句 。請注意,任何全域性許可權都是資料庫的特權。
該SHOW VIEW許可權允許使用該SHOW CREATE VIEW 語句。與使用的檢視也需要此許可權EXPLAIN。
該SHUTDOWN許可權允許使用該SHUTDOWN語句,mysqladmin shutdown命令和 mysql_shutdown()C API函式。
該SUPER許可權使這些業務和伺服器行為:
通過修改全域性系統變數啟用配置更改。對於某些系統變數,設定會話值也需要 SUPER特權; 如果是,則在變數描述中指示。例項包括 binlog_format, sql_log_bin,和 sql_log_off。
啟用和停止從伺服器上的複製,包括組複製。
使用CHANGE MASTER TO和CHANGE REPLICATION FILTER語句。
通過PURGE BINARY LOGS和 BINLOG語句啟用二進位制日誌控制 。
啟用執行檢視或儲存的程式時設定有效的授權ID。具有此許可權的使用者可以在DEFINER檢視或儲存的程式的屬性中指定任何帳戶 。
允許使用的CREATE SERVER,ALTER SERVER和DROP SERVER語句。
啟用mysqladmin除錯 命令。
啟用InnoDB按鍵旋轉。
啟用該DES_ENCRYPT()功能讀取DES金鑰檔案 。
啟用版本令牌使用者定義的功能。
可以控制不允許非SUPER帳戶的客戶端連線:
允許使用該KILL 語句或mysqladmin kill 命令來終止屬於其他帳戶的執行緒。(你可以隨時殺死自己的執行緒。)
SUPER即使max_connections 達到由系統變數控制的連線限制 ,伺服器也接受客戶端的 一個連線 。
即使read_only啟用了系統變數,也可以進行更新 。這適用於表更新和帳戶管理語句的使用,例如 GRANT和 REVOKE。
客戶端連線init_connect時 ,伺服器不會執行 系統變數內容 SUPER。
離線模式(offline_mode 啟用)的伺服器不會SUPER在下一個客戶端請求時終止 客戶端連線,並接受來自SUPER客戶端的新連線 。
SUPER 如第23.7節“儲存程式的二進位制日誌記錄”所述, 您可能還需要建立或更改儲存函式的許可權,如果啟用 二進位制日誌記錄。
該TRIGGER特權啟用觸發操作。您必須具有此表的許可權才能建立,刪除,執行或顯示該表的觸發器。
當觸發器被啟用(由誰擁有特權執行使用者INSERT, UPDATE或 DELETE與觸發器關聯的表的語句),觸發器執行要求誰定義觸發器的使用者仍然有 TRIGGER特權。

該UPDATE特權使排在資料庫中的表進行更新。
該USAGE許可權說明符表示“ 沒有許可權。“它在全球一級GRANT用於修改帳戶屬性,如資源限制或SSL特性,而無需命名特定帳戶許可權。 SHOW GRANTS顯示 USAGE以指示帳戶在特權級別沒有許可權。
這是一個好主意,只授予一個帳戶所需的特權。在給予FILE和管理特權方面應特別小心:
該FILE許可權可以被濫用來讀取MySQL伺服器可以在伺服器主機上讀取的任何檔案的資料庫表。這包括伺服器資料目錄中的所有世界可讀的檔案和檔案。然後可以使用該表 SELECT將其內容傳輸到
客戶端主機。

該GRANT OPTION許可權使使用者能夠將許可權授予其他使用者。具有不同特權和特權的兩個使用者 GRANT OPTION可以組合許可權。

的ALTER特權可以使用通過重命名錶顛覆許可權系統。

SHUTDOWN可以通過終止伺服器 將特權濫用於完全拒絕其他使用者的服務。

該PROCESS特權可用於檢視當前正在執行的語句的純文字,包括設定或更改密碼的語句。

該SUPER許可權可用於終止其他會話或更改伺服器的執行方式。

授予mysql資料庫本身的特權可用於更改密碼和其他訪問許可權資訊。密碼儲存加密,所以惡意使用者不能簡單地讀取它們來了解純文字密碼。但是,具有對user表 authentication_string列的寫

訪問許可權的使用者 可以更改帳戶的密碼,然後使用該帳戶連線到MySQL伺服器。



6.2.2授權表
注意
using語句,如授權表的直接修改 INSERT, UPDATE或 DELETE不鼓勵,並在您自行承擔風險。伺服器可以自由地忽略由於這種修改而導致格式錯誤的行
這些mysql資料庫表包含授權資訊:

user:使用者帳戶,全域性許可權和其他非特權列
db:資料庫級特權
tables_priv:表級許可權
columns_priv:列級許可權
procs_priv:儲存過程和功能特權
proxies_priv:代理使用者許可權
伺服器以下列方式使用授權表:
的user表範圍列確定是否拒絕或允許傳入連線。對於允許的連線,user表中授予的任何許可權 表示使用者的全域性許可權。此表中授予的任何許可權適用於 伺服器上的所有資料庫。

警告
因為任何全域性特權都被視為所有資料庫的特權,任何全域性許可權都可以讓使用者SHOW DATABASES通過檢查 SCHEMATA表 來檢視所有資料庫名稱INFORMATION_SCHEMA。

該db表範圍列決定哪些使用者可以訪問哪些資料庫從哪個主機。特權列決定允許的操作。在資料庫級授予的許可權適用於資料庫和資料庫中的所有物件,例如表和儲存的程式。

在tables_priv與 columns_priv表類似於 db表,但是更精緻:他們在申請表和列級應用而非在資料庫級。在表級授予的許可權適用於表及其所有列。在列級別授予的許可權僅適用於特定列。
該procs_priv表適用於儲存的例程(過程和函式)。在例程級別授予的許可權僅適用於單個過程或函式。

該proxies_priv表指示哪些使用者可以作為其他使用者的代理,以及使用者是否可以PROXY向其他使用者授予許可權。

伺服器使用user與 db表中的mysql 在兩個訪問控制的第一和第二階段的資料庫(參見6.2節,“MySQL訪問許可權系統”)。中列 user和db表如下所示。
該user表plugin, Password和 authentication_string列儲存身份驗證外掛和證書資訊。在MySQL 5.7.6中,Password列已被刪除,所有憑據都儲存在 authentication_string列中。
password_last_changed通過更新 CREATE USER, ALTER USER和 SET PASSWORD報表,並通過 GRANT創造一個帳戶或更改帳戶密碼的語句。
password_lifetime(新增在MySQL 5.7.4中)表示賬戶密碼的生命週期,以天為單位。如果密碼超過其使用壽命(使用password_last_changed列進行評估 ),則當客戶端使用該帳戶進行連線
時,伺服器會認為密碼已過期。的值N大於零意味著該密碼必須在每次更改 N天。值為0會禁用自動密碼到期。如果該值為NULL(預設值),則全域性過期策略將按default_password_lifetime系
統變數定義 。
account_locked(新增在MySQL 5.7.6中)指示帳戶是否被鎖定(請參見 第6.3.11節“使用者帳戶鎖定”)。
只有user表指定了管理許可權,例如RELOAD和 SHUTDOWN。管理操作是伺服器本身的操作,而不是資料庫特定的,因此沒有理由在其他授權表中列出這些許可權。因此,伺服器只需要查詢 user表來
確定使用者是否可以執行管理操作。
該FILE許可權也僅在指定的user表。它不是這樣的管理許可權,但是使用者在伺服器主機上讀取或寫入檔案的能力與被訪問的資料庫無關。
伺服器啟動時將授權表的內容讀入記憶體。您可以通過發出FLUSH PRIVILEGES 語句或執行mysqladmin flush-privileges或mysqladmin reload 命令來告訴它重新載入表 。授權表的更改如第


6.2.6節“許可權更改生效 時”所示。
當您修改帳戶時,最好驗證您的更改是否具有預期的效果。要檢查給定帳戶的許可權,請使用該SHOW GRANTS 語句。例如,要確定與使用者名稱和主機名值授予一個帳戶的許可權 bob和pc84.example.com使用下面的語句:
SHOW GRANTS FOR 'bob'@'pc84.example.com';
要顯示帳戶的非特權屬性,請使用 SHOW CREATE USER:
SHOW CREATE USER 'bob'@'pc84.example.com'
6.2.3指定賬號
MySQL帳號由使用者名稱和主機名組成。這樣可以為具有相同名稱的使用者建立可以從不同主機進行連線的帳戶。本節介紹如何編寫帳戶名稱,包括特殊值和萬用字元規則。
在SQL語句中,如和CREATE USER,GRANT和 SET PASSWORD帳號名稱遵循以下規則:
帳號名稱是 。 'user_name'@'host_name'
僅由使用者名稱組成的帳戶名稱相當於 。例如,相當於 。 'user_name'@'%''me''me'@'%'
如果使用者名稱和主機名合法,則不需要引用它們作為未引用的識別符號。引用需要指定一個user_name包含特殊字元(如空格或-)的host_name字串或包含特殊字元或萬用字元(如.或%)的字串 
; 例如, 'test-user'@'%.com'。

使用反引號(`),單引號(')或雙引號(")引用使用者名稱和主機名作為識別符號或字串。有關字串引用和識別符號引用的指導原則,請參見 第9.1.1節“字串文字”和 第9.2節“模式物件名稱”。
使用者名稱和主機名部分(如果引用)必須單獨引用。那就是寫 'me'@'localhost',而不是 '
[email protected]
'; 後者實際上相當於'[email protected]'@'%'。
對CURRENT_USER or或CURRENT_USER()函式的引用等效於從字面上指定當前客戶端的使用者名稱和主機名。
使用者名稱和主機名具有一些特殊值或萬用字元約定,如下所述。
帳戶名稱的使用者名稱部分是與入口連線嘗試的使用者名稱字面匹配的非空白值,或與任何使用者名稱匹配的空白值(空字串)。具有空白使用者名稱的帳戶是匿名使用者。要在SQL語句中指定匿名使用者,請使用引用的空使用者名稱部分,例如''@'localhost'。
帳戶名稱的主機名稱部分可以採用多種形式,允許使用萬用字元:
主機值可以是主機名或IP地址(IPv4或IPv6)。該名稱'localhost'指示本地主機。IP地址'127.0.0.1' 表示IPv4環回介面。IP地址 '::1'表示IPv6環回介面。
在%和_萬用字元允許在主機名或IP地址的值。這些具有與LIKE運算子執行的模式匹配操作相同的含義。例如,主機值'%'匹配任何主機名,而一個值 '%.mysql.com'匹配mysql.com域中的任何主機 
。 '192.168.1.%'匹配192.168.1 C類網路中的任何主機。


6.2.4訪問控制,階段1:連線驗證
當您嘗試連線到MySQL伺服器時,伺服器會根據以下條件接受或拒絕連線:
您的身份,以及您是否可以通過提供正確的密碼來驗證您的身份
您的帳戶是否被鎖定或解鎖
伺服器首先檢查憑據,然後檢查帳戶鎖定狀態。任一步驟的故障都會導致伺服器完全拒絕對您的訪問。否則,伺服器接受連線,然後進入第二階段並等待請求。
使用三個執行憑證檢查 user表範圍列(Host,User,和 authentication_string)。鎖定狀態記錄在user表格 account_locked列中。伺服器接受僅在連線Host和 User一些列的user 錶行匹配
客戶端主機名和使用者名稱,客戶端提供該行中指定的密碼,和 account_locked值'N'。第6.2.3節“指定帳戶名稱”中給出了允許Host和 User值 的規則。帳號鎖定可以用語句更改。 ALTER USER
如果User列值為非空,則傳入連線中的使用者名稱必須完全匹配。如果該 User值為空,它將匹配任何使用者名稱
該authentication_string列可以為空。這不是萬用字元,並不意味著任何密碼匹配
如果伺服器使用外掛驗證客戶端,則外掛實現的身份驗證方法可能會使用或不使用該authentication_string 列中的密碼
特別是,不要讓非管理使用者讀取mysql資料庫中的表的訪問許可權 .
下表顯示了表中各種組合User和Host值 如何 user適用於傳入連線。


User 值 Host 值               允許連線
'fred''thomas.loc.gov'fred,連線 thomas.loc.gov
'''thomas.loc.gov'任何使用者,連線 thomas.loc.gov
'fred''%'                fred,從任何主機連線
'''%'                任何使用者,從任何主機連線
'fred''%.loc.gov'       fred,從loc.gov域中的任何主機連線
'fred''x.y.%'               fred,從連線x.y.net, x.y.com,x.y.edu,等; 這可能沒有用
'fred''192.168.10.177'fred,從主機與IP地址進行連線 192.168.10.177
'fred''192.168.10.%'   fred,從192.168.10C類子網中的任何主機連線
'fred''192.168.10.0/255.255.255.0'與上一個例子相同

如果您能夠連線到伺服器,但是您的許可權不是您期望的,那麼您可能會被認證為其他帳戶。要了解伺服器用於驗證您的帳戶,請使用該 CURRENT_USER()功能。(請參見 第12.14節“資訊函式
”。)它返回一個 格式的值 ,表示匹配錶行中的值和 值 。假設 連線併發出以下查詢:
[email protected]
_nameUserHostuserjeffrey

mysql> SELECT CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| @localhost     |
+----------------+
此處顯示的結果表示匹配的 user錶行具有空白 User列值。換句話說,伺服器被jeffrey視為匿名使用者




6.2.5訪問控制,階段2:請求驗證
建立連線後,伺服器進入訪問控制階段2。對於通過該連線發出的每個請求,伺服器確定要執行的操作,然後檢查您是否具有足夠的許可權。這是授權表中的特權列發揮作用的地方。這些許可權可
以來自任何的 user,db, tables_priv,columns_priv,或procs_priv表。(您可能會發現參考6.2.2節“授予表”,其中列出了每個授權表中存在的列。)
該user表授予全域性分配給您的許可權,無論預設資料庫是什麼,它都適用。例如,如果 user表授予您 DELETE許可權,則可以從伺服器主機上的任何資料庫中的任何表中刪除行!將user表中的許可權
授予只需要使用者的許可權(如資料庫管理員)是明智之舉。對於其他使用者,您應該將user表中的所有許可權 設定為'N'並僅在更特定級別授予許可權。您可以授予特定資料庫,表,列或例程的許可權。
伺服器將db表讀入記憶體並在讀取user表的同時進行排序 。伺服器排序 db基於表Host, Db和User範圍列。與user表一樣,排序最先列出最具體的值,最小值最小,當伺服器查詢匹配的行時,

它將使用它找到的第一個匹配項。
伺服器使用排序表來驗證其接收的每個請求。對於需要管理許可權,如請求SHUTDOWN或者 RELOAD,伺服器僅檢查 user錶行,因為這是指定管理許可權的唯一表。如果該行允許請求的操作並拒絕其
他訪問,伺服器將授予訪問許可權。例如,如果要執行mysqladmin shutdown,但是您的user錶行不會SHUTDOWN向您授予許可權,則伺服器即使檢查該db表也會拒絕訪問 。(它不包含 
Shutdown_priv列,所以沒有必要這樣做。)
對於資料庫相關請求(INSERT, UPDATE等等),伺服器首先通過檢視user錶行來檢查使用者的全域性許可權 。如果行允許請求的操作,則允許訪問。如果user表中的全域性許可權不足,則伺服器通過檢


查db表來確定使用者的特定於資料庫的許可權 :


該伺服器會在db表上的匹配Host,Db以及 User列。在Host與 User列對應連線使用者的主機名和MySQL使用者名稱。該Db 列與使用者想要訪問的資料庫相匹配。如果沒有排為Host和 User,訪問被拒絕。
在確定db錶行授予的資料庫特定許可權後 ,伺服器將其新增到user表授予的全域性許可權。如果結果允許請求的操作,則允許訪問。否則,伺服器依次檢查tables_priv和 columns_priv表中的使用者

的表和列許可權,將其新增到使用者的許可權,並根據結果允許或拒絕訪問。對於儲存例程操作,伺服器使用 procs_priv表而不是 tables_priv和 columns_priv。
以布林值表示,上述使用者許可權計算方式的描述可以總結如下:
global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges
OR routine privileges


6.2.6特權更改生效時
當mysqld啟動時,它會將所有授權表內容讀入記憶體。記憶體中的表在此時對訪問控制有效。
如果你修改授權表間接使用賬戶管理語句,如GRANT, REVOKE,SET PASSWORD,或RENAME USER,伺服器注意到這些變化,並立即再次載入授權表到記憶體中。
如果你修改授權表直接使用的語句,例如 INSERT, UPDATE或者 DELETE,你的變化對特權的效果檢查,直到你重新啟動伺服器或告訴它重新載入表。如果您直接更改授權表,但忘記重新載入它們,則在重新啟動伺服器之前,更改將不起作用。這可能會讓你想知道為什麼你的改變似乎沒有什麼區別!
要告訴伺服器重新載入授權表,請執行flush-privileges操作。這可以通過發出 FLUSH PRIVILEGES 語句或執行mysqladmin flush-privileges或mysqladmin reload 命令來完成。授權表重新載入會影響每個現有客戶端連線的許可權,如下所示:
表和列許可權更改將隨客戶端的下一個請求生效。
資料庫特權更改在客戶端下次執行語句時生效。 USE db_name

注意
客戶端應用程式可能會快取資料庫名稱; 因此,在沒有實際改變到不同的資料庫的情況下,這種效果可能不可見。
全域性許可權和密碼不受連線客戶端的影響。這些更改僅對後續連線生效。
如果伺服器使用該--skip-grant-tables選項啟動 ,則它不會讀取授權表或實現任何訪問​​控制。任何人都可以連線和做任何事情,這是不安全的。為了使伺服器開始讀取表並啟用訪問檢查,請
重新整理許可權。
檢查以確保沒有防火牆阻止訪問MySQL
授權表必須正確設定,以便伺服器可以使用它們進行訪問控制
如果您使用SET PASSWORD,INSERT或 更改密碼UPDATE,則必須使用該PASSWORD() 功能對密碼進行加密。如果您不使用 PASSWORD()這些語句,密碼將無法正常工作。例如,以下語句分配密碼
,但無法對其進行加密,因此使用者以後無法連線:
SET PASSWORD FOR 'abe'@'host_name' = 'eagle';
而是像這樣設定密碼:
SET PASSWORD FOR 'abe'@'host_name' = PASSWORD('eagle');
PASSWORD()當使用CREATE USERor GRANT語句或 mysqladmin password命令指定密碼時, 該函式是不必要的 。每個都會自動使用PASSWORD() 密碼加密
localhost 是您的本地主機名的同義詞,如果您沒有明確指定主機,那麼也是客戶端嘗試連線的預設主機。

6.2.7連線MySQL時出現問題的疑難解答

相關推薦

MySQL訪問許可權系統訪問控制

6.1一般安全問題 6.1.1安全指南       執行MySQL時,請遵循以下準則:      (1)不要給任何人(MySQL root帳戶除外 )訪問 資料庫中的 user表mysql!這是至關重要的。     (2)瞭解MySQL訪問許可權系統的工作原理(參見 第6.

jfinalQ開發教程02-許可權系統一對多的處理

許可權系統 1.說明 基於jfinal的全域性Interceptor做的許可權系統, 分為兩塊,一是公開可以訪問的地址,二是簡單的RBAC許可權管理 2.公開訪問地址 需要配置專案中的jfinal-auth.xml檔案,如下: 其中外層可以自己起名字,只

[WebServer] Tomcat 配置訪問限制:訪問白名單訪問黑名單

最近公司的阿里雲伺服器上配置的 Tomcat 伺服器執行 java的環境,但是通過觀察 Tomcat 這幾天的日誌發現,有很多莫名其妙的 IP 訪問主機下莫名其妙的地址,如:/80、/testproxy.php、/cache/global/img/gs.gif、CONNECT

4. Apue檔案系統、檔案型別、訪問許可權目錄相關函式

1、linux檔案系統 windows使用NTFS,而linux使用ext2/ext3 1)ext2檔案系統 一個磁碟分成一個或多個分割槽,每個分割槽包含一個檔案系統。 如下圖所示是一個磁碟分割槽格式化成ext2檔案系統後的儲存佈局 從佈局可以看出,ext2對物理磁

mysql在Linux環境下開啟遠端訪問許可權開放3306埠

一:開啟mysql遠端訪問許可權。        預設mysql的使用者是沒有遠端訪問的許可權的,那麼當程式跟資料庫不在同一臺伺服器上時,我們需要開啟mysql的遠端訪問許可權。一般有改表和授權兩種方

基於Vue-RouterVuex的頁面訪問許可權控制

最近在用Vue做專案的時候,遇到前端頁面的訪問許可權控制問題。參考了網上一些文章的思路,並且自己動手做了一個demo。 應用場景如下:一個網站多個角色,例如admin(管理員),guest(普通客戶),

MySQL遠端訪問許可權,同時允許遠端連線本地連線

1、登陸mysql資料庫        mysql -u root -p mysql> use mysql; Database changed mysql> select host,user,password from user; +--------

mysql 使用者管理許可權設定Mysql初始化root密碼允許遠端訪問

grant 普通資料使用者,查詢、插入、更新、刪除 資料庫中所有表資料的權利。 grant select on testdb.* to [email protected]’%’ grant insert on testdb.* to [email protected]’%’ grant

控制檔案資料夾的訪問許可權-FileIOPermission,CodeAccessPermission 類

隱身的許可權 在授予許可權時,通常有一條隱式的語句也可以賦予其他許可權。例如,如果賦予了訪問C:\的許可權,FileOPerminssion。就有一個也可以訪問C:\子目錄下面的隱式假設。如下面的程式碼: static void Main(string[

許可權系統--通過shiro進行按鈕及頁面訪問url的許可權控制

一:問題的引入 前面雖然基本的功能都有了但是頁面按鈕的控制與url的控制還是沒有處理。這麼一個場景,雖然使用者只能通過點選選單進行各個介面的訪問,假如使用者知道了你的介面的訪問url,直接跳過選單訪問的話,正常來說是不應該跳轉到對應的介面上的。如果不對其進行控制,也會造成許

使用Spring安全表示式控制系統功能訪問許可權

一、SPEL表示式許可權控制 從spring security 3.0開始已經可以使用spring Expression表示式來控制授權,允許在表示式中使用複雜的布林邏輯來控制訪問的許可權。Spring Security可用表示式物件的基類是SecurityExpressionRoot。 表示式函式 描

DRF之訪問許可權控制訪問頻率控制(節流)

# 許可權控制 ## 前言 **使用者驗證使用者許可權,根據不同訪問許可權控制對不同內容的訪問。** 建議瞭解檢視、token驗證的內容。 ## 使用流程 1. 自定義訪問許可權類,繼承`BasePermission`,重寫`has_permission()`方法,如果許可權通過,就返回`True`

四.Jenkins的授權訪問控制

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

vsftpd實例:匿名訪問共享+系統用戶訪問控制

vsftp 匿名訪問 ftp server 實名訪問 FTP環境實例: 某公司由於業務發展需求,現需要在公司內部搭建一臺FTP服務器!該公司有數個部門(IT FD HR)和N名員工(fus1 fus2 fus3 fus4 fus5 fus6 fus7 fus8 fus9)使用該服務器!為了保障

深入理解計算機系統(3.8)------數組分配訪問

2個 說明 add 如果 c++編譯 類型 操作 http 程序   上一篇博客我們講解了匯編語言中過程(函數)的調用實現。理解數據如何在調用者和被調用者之間傳遞,以及在被調用者當中局部變量內存的分配以及釋放是最重要的。那麽這篇博客我們將講解數組的分配和訪問。 1、

聲明訪問控制

聲明 prot pac 修飾符 class ack sys his end 保護和默認成員(protected) 1、保護和默認訪問控制級別幾乎完全相同,但只有一點主要區別,只有當訪問默認成員的類屬於同一個包時,才能訪問默認成員。而對於protected類成員而言,只要繼承

Apache(httpd)配置--防盜鏈配置訪問控制

防盜鏈 訪問控制 一、配置防盜鏈 通過防盜鏈的方式,可以設置限制第三方的站點通過引用的方式獲取服務器上的圖片,數據等,如果想要獲取本站點的圖片數據,只能通過本站點訪問獲取,這樣也有效的減少了服務器的資源。 什麽是referer? referer是http數據包的header的一部分,當瀏覽器其向

86.Apache(httpd)配置--防盜鏈配置訪問控制

Apache(httpd)配置--防盜鏈一、配置防盜鏈 通過防盜鏈的方式,可以設置限制第三方的站點通過引用的方式獲取服務器上的圖片,數據等,如果想要獲取本站點的圖片數據,只能通過本站點訪問獲取,這樣也有效的減少了服務器的資源。什麽是referer? referer是http數據包的header的一部分,當瀏覽

javaSE_day8_構造方法_super關鍵字_final關鍵字_static關鍵字_內部類_訪問許可權修飾符_程式碼塊_自定義資料型別

1.構造方法 作用:用來給類的成員進行初始化操作 定義格式:許可權  方法名(引數列表){ ... } //注意:方法的名字必須和類名完全一致,構造方法不允許寫返回值型別,void也不能寫 構造方法在什麼時候執行呢:在new物件的時候,自動執行,且

1.Mysql 設定密碼,IP訪問許可權

1.免密碼登入 service mysql stop # mysqld_safe --user=mysql --skip-grant-tables --skip-networking & //忘記密碼,設定免密登入 # mysql -u root mysql mysql> UPD