1. mysql 用戶名和口令 * MySQL使用於認證目的的用戶名,與Unix用戶名(登錄名字)或Windows用戶名無關。缺省地,大多數MySQL客戶嘗試使用當前Unix用戶名作為MySQL用戶名登錄,但是這僅僅為了方便,客戶程序允許用-u或--user選項指定一個不同的名字。及與安全的考慮,所有的MySQL用戶名都應該有口令。 * MySQL用戶名最長可以是16各字符;典型地,Unix用戶名限制為8個字符。 * MySQL口令與Unix口令沒關系。 * MySQL加密口令使用了一個Unix登錄期間所用的不同算法,PASSWord()和ENCRYPT() 函數PASSWORD(str) 從純文本口令str計算一個口令字符串。該函數被用於為了在user授權表的Password列中存儲口令而加密MySQL口令。 mysql> select PASSWORD('badpwd'); -> '7f84554057dd964b' PASSWORD()加密是非可逆的。PASSWORD()不以與Unix口令加密的相同的方法執行口令加密。你不應該假定如果你的Unix 口令和你的MySQL口令是一樣的,PASSWORD()將導致與在Unix口令文件存儲的相同的加密值。見ENCRYPT()。 ENCRYPT(str[,salt]) 使用Unix crypt()系統調用加密str。salt參數應該是一個有2個字符的字符串。(MySQL 3.22.16中,salt可以長於2個字符。) mysql> select ENCRYPT("hello"); -> 'VxuFAJXVARROc' 如果crypt()在你的系統上不可用,ENCRYPT()總是返回NULL。ENCRYPT()只保留str起始8個字符而忽略所有其他,至少在某些系統上是這樣。這將由底層的crypt()系統調用的行為決定。 1. 與MySQL服務器連接 語法格式: shell> mysql [-h host_name][-u user_name][-pyour_pass ] -h, -u和-p選項的另一種形式是--host=host_name、--user=user_name和--password=your_pass。 注意:在-p或--password=與跟隨它後面的口令之間沒有空格。(在命令行上指定一個口令是不安全的!) 對於命令行沒有的聯接參數,mysql使用缺省值: * 缺省主機名是localhost。 * 缺省用戶名是你的Unix登錄名。 * 如果沒有-p,則沒有提供口令。 缺省值參數的指定: 在你的主目錄下“.my.cnf”的配置文件的[client]小節裡指定連接參數: [client] host=host_name user=user_name password=your_pass 注:命令行上被指定的值優先於在配置文件和環境變量中指定的值 最安全的方法是讓客戶程序提示口令或在一個適當保護的“.my.cnf”文件中指定口令。 1. MySQL提供的權限 權限 列 上下文 select Select_priv 表 insert Insert_priv 表 update Update_priv 表 delete Delete_priv 表 index Index_priv 表 alter Alter_priv 表 create Create_priv 數據庫、表或索引 drop Drop_priv 數據庫或表 grant Grant_priv 數據庫或表 references References_priv 數據庫或表 reload Reload_priv 服務器管理 shutdown Shutdown_priv 服務器管理 process Process_priv 服務器管理 file File_priv 在服務器上的文件存取 注:grant權限允許你把你自己擁有的那些權限授給其他的用戶。 file權限給予你用LOAD DATA INFILE和SELECT ... INTO OUTFILE語句讀和寫服務器上的文件,任何被授予這個權限的用戶都能讀或寫MySQL服務器能讀或寫的任何文件。 2. 存取控制:連接證實 身份檢查使用user表3個(Host, User和Password)范圍字段。服務器只有在一個user表條目匹配你的主機名和用戶名並且你提供了正確的口令時才接受連接。 注:一個Host值可以是主機名或一個IP數字,或'localhost'指出本地主機。 可以在Host字段裡使用通配符字符“%”和“_”。 Host值'%'匹配任何主機名。當一個連接被嘗試時,服務器浏覽排序的條目並使用找到的第一個匹配。 普遍的誤解是認為,對一個給定的用戶名,當服務器試圖對連接尋找匹配時,明確命名那個用戶的所有條目將首先被使用。這明顯不是事實。 3. 存取控制:請求證實 一旦你建立了一個連接,服務器進入階段2。對在此連接上進來的每個請求,服務器檢查你是否有足夠的權限來執行它,授權表用GRANT和REVOKE命令操作。 GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name * *.* db_name.*} TO user_name [IDENTIFIED BY 'password'] [, user_name [IDENTIFIED BY 'password'] ...] [WITH GRANT OPTION] REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name * *.* db_name.*} FROM user_name [, user_name ...] GRANT在MySQL 3.22.11或以後版本中實現。對於更早MySQL版本,GRANT語句不做任何事情。 GRANT和REVOKE命令允許系統主管在4個權限級別上授權和撤回賦予MySQL用戶的權利: 全局級別 全局權限作用於一個給定服務器上的所有數據庫。這些權限存儲在mysql.user表中。 數據庫級別 數據庫權限作用於一個給定數據庫的所有表。這些權限存儲在mysql.db和mysql.host表中。 表級別 表權限作用於一個給定表的所有列。這些權限存儲在mysql.tables_priv表中。 列級別 列權限作用於在一個給定表的單個列。這些權限存儲在mysql.columns_priv表中。 user表權限是超級用戶權限。只把user表的權限授予超級用戶如服務器或數據庫主管是明智的。對其他用戶,你應該把在user表中的權限設成'N'並且僅在一個特定數據庫的基礎上授權, 使用db和host表。 4. 權限更改何時生效 當mysqld啟動時,所有的授權表內容被讀進存儲器並且從那點生效。 用GRANT、REVOKE或SET PASSWORD對授權表施行的修改會立即被服務器注意到。 如果你手工地修改授權表(使用INSERT、UPDATE等等),你應該執行一個FLUSH PRIVILEGES語句或運行mysqladmin flush-privileges告訴服務器再裝載授權表,否則你的改變將不生效,除非你重啟服務器。 5. 建立初始的MySQL權限 在安裝MySQL後,你通過運行scripts/mysql_install_db安裝初始的存取權限。包含下列權限集合: * MySQL root用戶作為可做任何事情的一個超級用戶。連接必須由本地主機發出。注意:出世的root口令是空的,因此任何人能以root而沒有一個口令進行連接並且被授予所有權限。 * 一個匿名用戶,他可對有一個'test'或以'test_'開始的名字的數據庫做任何時期事情,連接必須由本地主機發出。這意味著任何本地用戶能連接並且視為匿名用戶。 * 其他權限被拒絕。例如,一般用戶不能使用mysqladmin shutdown或mysqladmin processlist。 為MySQL root用戶指定一個口令(注意,你使用PASSWORD()函數指定口令): shell> mysql -u root mysql mysql> UPDATE user SET Password=PASSWORD('new_password') WHERE user='root'; mysql> FLUSH PRIVILEGES; 在MySQL 3.22和以上版本中,你可以使用SET PASSWORD語句: shell> mysql -u root mysql mysql> SET PASSWORD FOR root=PASSWORD('new_password'); 設置口令的另一種方法是使用mysqladmin命令: shell> mysqladmin -u root password new_password 看看scripts/mysql_install_db腳本,看它如何安裝缺省的權限。你可用它作為一個研究如何增加其他用戶的基礎 為了完全重建權限表,刪除在包含mysql數據庫的目錄下所有“*.frm”,“*.MYI”和“*.MYD”文件。(這是在數據庫目錄下面命名為“mysql”的目錄,當你運行mysqld --help時,它被列出。)然後運行mysql_install_db腳本,可能在首先編輯它擁有你想要的權限之後。 1. 向MySQL增加新用戶權限 增加用戶2個不同的方法: 通過使用GRANT語句或通過直接操作MySQL授權表。 比較好的方法是使用GRANT語句,因為他們是更簡明並且好像錯誤少些。 shell> mysql --user=root mysql mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY 'something' WITH GRANT OPTION; mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%" IDENTIFIED BY 'something' WITH GRANT OPTION; mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost; mysql> GRANT USAGE ON *.* TO dummy@localhost; monty 可以從任何地方連接服務器的一個完全的超級用戶,但是必須使用一個口令('something'做這個。注意,我們必須對monty@localhost和monty@"%"發出GRANT語句。如果我們增加localhost條目,對localhost的匿名用戶條目在我們從本地主機連接接時由mysql_install_db創建的條目將優先考慮,因為它有更特定的Host字段值,所以以user表排列順序看更早到來。 admin 可以從localhost沒有一個口令進行連接並且被授予reload和process管理權限的用戶。這允許用戶執行mysqladmin reload、mysqladmin refresh和mysqladmin flush-*命令,還有mysqladmin processlist。沒有授予數據庫有關的權限。他們能在以後通過發出另一個GRANT語句授權。 dummy 可以不用一個口令連接的一個用戶,但是只能從本地主機。全局權限被設置為'N'--USAGE權限類型允許你無需權限就可設置一個用戶。它假定你將在以後授予數據庫相關的權限。 也可以直接通過發出INSERT語句增加同樣的用戶存取信息,然後告訴服務器再次裝入授權表: shell> mysql --user=root mysql mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('something'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y') mysql> INSERT INTO user VALUES('%','monty',PASSWORD('something'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y') mysql> INSERT INTO user SET Host='localhost',User='admin', Reload_priv='Y', Process_priv='Y'; mysql> INSERT INTO user (Host,User,Password) VALUES('localhost','dummy',''); mysql> FLUSH PRIVILEGES; 下列例子增加一個用戶custom,他能從主機localhost、server.domain和whitehouse.gov連接。他只想要從localhost存取bankaccount數據庫,從whitehouse.gov存取eXPenses數據庫和從所有3台主機存取customer數據庫。他想要從所有3台主機上使用口令stupid。 shell> mysql --user=root mysql mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.* TO custom@localhost IDENTIFIED BY 'stupid'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO [email protected] IDENTIFIED BY 'stupid'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO custom@'%' IDENTIFIED BY 'stupid'; 注:設置口令必須使用PASSWORD()函數 WEB 頁面見:http://211.92.88.40/~tony/note/mysqlAccess.htm