【正文】
檢查那個運(yùn)行 m。但是,如果服務(wù)器主機(jī)上的其它用戶擁有對服務(wù)器目錄的直接訪問權(quán),那么你的服務(wù)器的數(shù)據(jù)仍舊是不安全的。175 / 29有關(guān)如何用非 root 用戶啟動 MySQL 服務(wù)器的細(xì)節(jié),請見第二章。你可以作為其它 Unix 用戶編輯 啟動腳本 mysqld。mysqld 能以任何用戶運(yùn)行,你也可以創(chuàng)造一個新的 Unix 用戶 mysql 使一切更安全。它對一個直接的因特網(wǎng)連接工作得很好。 創(chuàng)造一個新文件并且用 ODBC 驅(qū)動程序鏈接到 mySQL,就像你通常做的一樣,除了對服務(wù)器用用戶“l(fā)ocalhost”。 用 SSH 登錄到你的服務(wù)器。 點(diǎn)擊“l(fā)ocal forwords ”。其他有用的鏈接: 和 啟動 SSH。 使用 SSH 加密客戶機(jī)連接這是一個關(guān)于怎樣用 SSH 得到一個安全的連接遠(yuǎn)程 MySQL 服務(wù)器的注意事項(xiàng)(David Carlson)。所以你需要讓客戶機(jī)提示你的密碼:shellmysql –u root –p 你也可以使用選項(xiàng)文件提供密碼,但是注意為了安全,不能在選項(xiàng)文件中存儲密碼。你發(fā)現(xiàn)了什么,你發(fā)現(xiàn)密碼清清楚楚的顯示在你的面前。1 可以在命令行上提供密碼shellmysql –u root –pmypass注意,p 選項(xiàng)與密碼之間不可有空格,否則會提示你輸入密碼,并報錯。由于很多情況下,數(shù)據(jù)庫服務(wù)器容許客戶機(jī)從網(wǎng)絡(luò)上連接,因此客戶機(jī)連接的安全對 MySQL 數(shù)據(jù)庫安全有很重要的影響。有些權(quán)限是有危險的,例如 FILE、GRANT、PROCESS,管理員要慎重使用。即,你不能明顯地匹配一個用戶并且然后拒絕連接。然后用戶就擁有的一個新表 ,可以對它進(jìn)行完全訪問。mysqlSELECT * FROM temp INTO OUTFILE “./another_db/”FIELDS ESCAPED BY “” LINES TERMINATED BY “”。mysqlDELETE FROM temp。mysqlLOAD DATA INFILE “./other_db/” INTO TABLE tempFIELDS ESCAPED BY “” LINES TERMINATED BY “”。mysqlSELECT * FROM temp INTO OUTFILE “./another_db/”FIELDS ESCAPED BY “” LINES TERMINATED BY “”。mysqlSELECT * FROM temp。mysql CREATE TABLE temp (b LONGBLOB)。你的數(shù)據(jù)庫目錄和系統(tǒng)的各種文件可能成為全球范圍共享的文件!例如,通過使用 LOAD DATA 裝載“/etc/passwd”進(jìn)一個數(shù)據(jù)庫表,然后它能用 SELECT 被讀入。FILE 權(quán)限也可以被用來讀取任何作為運(yùn)行服務(wù)器的 Unix 用戶可存取的文件。 不要把 FILE 權(quán)限給所有的用戶。)查詢,被允許執(zhí)行那個命令的任何用戶可能看得到。mysqladmin processlist 的輸出顯示出當(dāng)前執(zhí)行的查詢正文,如果另外的用戶發(fā)出一個 UPDATE user SET password=PASSWORD(39。shutdown 權(quán)限通過終止服務(wù)器可以被濫用完全拒絕為其他用戶服務(wù) 。例如,一個用戶 user1 能訪問 table1,但不能訪問 table2。 alter 權(quán)限可以用于通過重新命名表來推翻權(quán)限系統(tǒng)。? 可能會產(chǎn)生安全漏洞的權(quán)限grant 權(quán)限允許用戶放棄他們的權(quán)限給其他用戶。在任何情況下,你應(yīng)該非常小心地使用包含通配符的主機(jī)名! 授予用戶合適的權(quán)限? 授權(quán)用戶足夠使用的權(quán)限,不要賦予額外的權(quán)限。? 如果你不信任你的 DNS,你應(yīng)該在授權(quán)表中使用 IP 數(shù)字而不是主機(jī)名。你可以這樣刪除匿名用戶:shellmysql –u root –p mysqlmysqldelete from user where User=””。? 刪除匿名用戶匿名用戶的存在不僅不僅容易引起存取拒絕錯誤,更會產(chǎn)生嚴(yán)重的安全漏洞,安裝授權(quán)表后,自動安裝匿名用戶。root39。new_password39。對客戶機(jī)/服務(wù)器應(yīng)用程序,客戶可以指定任何用戶名是常見的做法。 關(guān)于用戶、口令及主機(jī)的設(shè)置? 對所有 MySQL 用戶使用口令。更進(jìn)一步,同時刪除其他授權(quán)表中的任何匿名用戶,有 User 列的表有db、tables_priv 和 columns_priv。匿名用戶可對數(shù)據(jù)庫做任何事情,但無管理權(quán)限。(順便說明,MySQL 超級用戶與Unix 超級用戶有相同的名字,他們彼此毫無關(guān)系。當(dāng)你第一次在機(jī)器上安裝 MySQL 時,mysql 數(shù)據(jù)庫中的授權(quán)表是這樣初始化的:? 你可以從本地主機(jī)(localhost)上以 root 連接而不指定口令。在 Windows 上,運(yùn)行分發(fā)中的 Setup 程序初始化數(shù)據(jù)目錄和 mysql 數(shù)據(jù)庫。這個漏洞是存在的,如果你不了解這時授權(quán)表的內(nèi)容你可能會犯錯誤。產(chǎn)生安全漏洞。171 / 29 只有 root 用戶擁有授權(quán)表的改寫權(quán)不要把授權(quán)表的改寫權(quán)授予除 root 用戶之外的其它用戶(當(dāng)然,如果你可以用另一個用戶代替 root 用戶進(jìn)行管理,以增加安全性)。當(dāng)你為了權(quán)限疑惑時,不妨看一下本小節(jié)。 ? 全局權(quán)限的改變和口令改變在下一次客戶連接時生效。 對現(xiàn)有客戶連接的影響情況當(dāng)服務(wù)器注意到授權(quán)表被改變了時,現(xiàn)存的客戶連接有如下影響: ? 表和列權(quán)限在客戶的下一次請求時生效。 被服務(wù)器立即應(yīng)用的情況用 GRANT、REVOKE 或 SET PASSWORD 對授權(quán)表施行的修改會立即被服務(wù)器注意到。一個重要的應(yīng)用就是如何在遺忘 root 用戶密碼的時候修改密碼,使用的方法是啟動MySQL 服務(wù)器時忽略加載授權(quán)表。當(dāng)然,在這里,你也可以重啟 mysqld。 4. 載入權(quán)限表: shell mysqladmin h hostname flushprivileges或者使用 SQL 命令`FLUSH PRIVILEGES39。new password但是它修改的密碼語服務(wù)器匹配的用戶有關(guān)。root39。yourpass39。其實(shí)也可以直接修改授權(quán)表:mysql use mysql。 WITH GRANT OPTION。mysqlGRANT ALL ON *.* TO root% INDENTIFIED BY 39。new password39。mysql h hostname mysql39。Windows 平臺:C:\mysql\binmysqld skipgranttables以上語句,假定都位于正確的目錄。 參數(shù)來啟動 mysqld 。 使用 39。 如果在 windows 平臺上,也可以停止進(jìn)程。 關(guān)閉 MySQL 服務(wù)器 向 mysqld server 發(fā)送 kill 命令關(guān)掉 mysqld server(不是 kill 9),存放進(jìn)程 ID 的文件通常在 MYSQL 的數(shù)據(jù)庫所在的目錄中。你應(yīng)當(dāng)選用withoutgranttables 選項(xiàng)啟動 mysqld 服務(wù),你可以在這時更改授權(quán)表的相關(guān)內(nèi)容,也可以用 mysqlaccess 檢查你的授權(quán)是否到位。 重新設(shè)置一個遺忘的 root 口令如果你遺忘了 root 用戶的口令,那么將會是一件非常麻煩的事。 169 / 29AND host=%.。%.39。bob39。只有具備存取 mysql 數(shù)據(jù)庫的用戶可以這樣做。你將寫成: mysql SET PASSWORD FOR bob%. = PASSWORD(newpass)。和39。例如,如果你有一個條目其 User 和 Host字段是39。只有具備存取 mysql 數(shù)據(jù)庫的用戶可以這樣做。some password39。)。任何非匿名的用戶能改變他自己的口令!連接到服務(wù)器后,你可以這樣改變自己的密碼:mysql SET PASSWORD = PASSWORD(39。some password39。例如,初始化授權(quán)表之后,root用戶的密碼就是空的,你可以這樣為 root 用戶設(shè)立密碼:shellmysqladmin u root password newpassword 使用語句 SET PASSWORD使用 mysqladmin 為用戶修改密碼有一個明顯的缺點(diǎn),就是必須知道用戶原來的密碼,如果是為了給遺忘了密碼的用戶重設(shè)密碼就無能為力了。 使用 myadmin 實(shí)用程序使用 mysqladmin 實(shí)用程序修改密碼的命令行是:shellmysqladmin u user p password newpassword運(yùn)行這個命令,在提示輸入密碼時,數(shù)據(jù)就密碼,則用戶 user 的密碼就被改為newpassword。 ? MySQL 加密口令使用了一個 Unix 登錄期間所用的不同算法。 ? MySQL 口令與 Unix 口令沒關(guān)系。任何人可以試圖用任何名字連接服務(wù)器,而且如果他們指定了沒有口令的任何名字,他們將成功。缺省地,大多數(shù) MySQL 客戶嘗試使用當(dāng)前 Unix 用戶名作為 MySQL用戶名登錄,但是這僅僅為了方便。使用時,注意直接修改授權(quán)表一般需要多個步驟,操作多個表的內(nèi)容。mysqlFLUSH PRIVILEGES。+++| Host | User |+++| localhost | root || localhost | admin || % | root |+++DELETE 語句刪除該用戶的項(xiàng), FLUSH 語句告訴服務(wù)器重新假造授權(quán)表(但是用GRANT 或 REVOKE 語句,而不是直接修改授權(quán)表時,這些表將自動重新加載)。mysqlFLUSH PRIVILEGES。如果你忘記做這個,你會疑惑為什么服務(wù)器不做你想做的事情。記住在你直接修改授權(quán)表時,你將通知服務(wù)器重載授權(quán)表,否則他不知道你的改變。但是,borislocalhost 用戶的條目仍舊留在 user 表中,你可以查看:mysqlSELECT * FROM 。當(dāng)所有為數(shù)據(jù)庫的授權(quán)用 REVOKE 刪除時,這個條目被刪除。例如,如果你為一個數(shù)據(jù)庫授權(quán),如果需要在 表中創(chuàng)建一個條目。要刪除整個用戶,必須用 DELETE 語句將該用戶的記錄從 user 表中直接刪除。用戶的項(xiàng)仍然保留在 user 表中,即使你去笑了改用戶的所有權(quán)限也是如此。Privileges 部分不需要匹配,你可用 GRANT 語句授權(quán),然后用 REVOKE 語句取消啟動的一部分。除了要用 FROM 替換 TO 并且沒有 IDENTIFIED BY 或 WITH GRANT OPTION 子句外語法:REVOKE privileges (columns) ON what FROM user。 撤銷用戶與授權(quán)撤銷用戶和授權(quán)的有兩種方法,一是使用 REVOKE 語句,二是直接修改授權(quán)表。GRANT 語句雖然能夠?yàn)橛脩舴峙錂?quán)限,使用比較方便,但是從安全角度,從增加對系統(tǒng)了解角度,你應(yīng)該盡量使用直接修改授權(quán)表的方法。例如,要對一個表啟用 SELECT 和 INSERT 權(quán)限,你要在相關(guān)的 tables_priv 的記錄中設(shè)置 Table_priv 為Select,Insert。如果你確實(shí)有這些表并且為了某些原因想要手工操作它們,要知道你不能用單獨(dú)的列啟用權(quán)限。要設(shè)置表級或列級權(quán)限,你對 tables_priv 或 columns_priv 使用 INSERT 語句。mysql INSERT INTO db VALUES (localhost,sample_db,boris,Y,Y,Y,Y,Y,Y,N,Y,Y,Y)。 下列 GRANT 語句也創(chuàng)建一個擁有超級用戶身份的用戶,但是只有一個單個的權(quán)限: GRANT RELOAD ON *.* TO flushlocalhost IDENTIFIED BY flushpass本例的 INSERT 語句比前一個簡單,它很容易列出列名并只指定一個權(quán)限列。授權(quán)表的結(jié)構(gòu)已經(jīng)改變而且你在你的 user 表可能沒有 14 個權(quán)限列。下列 GRANT 語句創(chuàng)建一個擁有所有權(quán)的超級用戶。你可以執(zhí)行一個 mysqladmin flushprivileges 或 mysqladmin reload 命令和 FLUSH PRIVILEGES 語句強(qiáng)迫一個重載。165 / 29 直接修改授權(quán)表創(chuàng)建用戶并授權(quán)如果你還記得前面的介紹,你應(yīng)該能即使不用 GRANT 語句也能做 GRANT 做的事情。你應(yīng)該謹(jǐn)慎對待你授予他 grant 權(quán)限的用戶,因?yàn)榫哂胁煌瑱?quán)限的兩個用戶也許能合并權(quán)限! 創(chuàng)建用戶并授權(quán)的實(shí)例創(chuàng)建一個具有超級用戶權(quán)利的用戶:mysqlGRANT ALL ON *.* TO anynamelocalhost IDENTIFIED BY passwdWITH GRANT OPTION該語句將在 user 表中為 anynamelocalhost 創(chuàng)建一個記錄,打開所有權(quán)限。? WITH GRANT OPTION 子句是可選的。 警告:如果你創(chuàng)造一個新用戶但是不指定一個 IDENTIFIED BY 子句,用戶沒有口令。在 MySQL 或以后,如果創(chuàng)建一個新用戶或如果你有全局授予權(quán)限,用戶的口令將被設(shè)置為由 IDENTIFIED BY 子句指定的口令,如果給出一個。? password 分配給該用戶的口令。通過執(zhí)行這個查詢,你可以檢驗(yàn)它是否作用于你: mysql SELECT Host,User