mysql 逃兵筆記


有關資料庫系統, 我是大外行; 不過在 Linux 下, 很多工具都需要用到 mysql, 例如各種 wiki 軟體, 與各種 blog 軟體等等, 因此不得不學一點簡單的 mysql 指令。 這篇筆記主要是為和我一樣的讀者寫的: 並不想認真學 mysql, 只是想知道一些基本設定。

安全第一

不知為什麼, mysql 剛安裝好時, 卻採用非常不安全的設定 -- 最強大的 root 帳號, 竟然完全沒有密碼。 這一節先簡單查看剛安裝好的 mysql, 並且設定好 root 帳號的密碼。

首先, mysql 的帳號/密碼, 與 shell 底下的帳號密碼 無關。 為了方便起見, 如果用 shell 的 ckhung 帳號登入, 進入 mysql 時又不指定帳號, 則內定也是使用 mysql 的 ckhung 帳號; 不過其實只要知道密碼, shell 的任何使用者都可以使用 mysql 的任何帳號。 首先請用 非 root 帳號 (以下假設用 ckhung) 登入 shell, 我們要看看內建的設定有多麼不安全。

  1. 執行 mysql 指令試著進入 mysql, 結果出現類似如下的錯誤訊息: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
  2. 從另外一個終端機 用 root 帳號 進入 shell, 啟動 mysql 伺服器: service mysqld start/etc/rc.d/init.d/mysqld start
  3. 回到剛剛的 ckhung 視窗, 再執行一次 mysql, 成功進入。
  4. 在 mysql 內, 下 \h 救助, 發現可以下 \s 查詢系統狀態。 注意兩個欄位: current user 是 ckhung@localhost ; 而 current database 則是空白。
  5. show databases; 看到有 test 一個資料庫可以用, 便 use test (注意這裡不必有分號), 並再次下 \s, 發現 current database 欄位變成 test。
  6. \q 或按 ^d 離開 mysql, 回到 shell 底下。
  7. 從 shell 底下, 執行 mysql -u root 竟然毫不設防地就成功進入! 用 \s 確認一下 current user 是 root@localhost 。
  8. 這次再 show databases; 看到三個資料庫, 其中的 mysql 就是 mysql 的系統資料庫, 重要的系統資料都放在這裡。
  9. use mysql 切換到系統資料庫, 並下 show tables; 看到十幾個 tables 表格, 其中有一個 table 叫做 user。
  10. select * from user; 發現螢幕太亂了, 改下 select Host,User,Password from user; 只顯示三個 fields 欄位。 注意現在所有人的密碼都是空的。
  11. 再按 ^d 離開 mysql, 回到 shell 底下。

剛剛都只是查看而已; 以下則是重點, 要把 mysql 最主要的幾個安全漏洞封鎖起來:

  1. 再執行 mysql -u root 重新進入 mysql。
  2. 再看一次有那些帳號: select Host,User,Password from mysql.user; 注意這次因為並未先下過 use 指令指定資料庫, 所以每次提及任何 table 名稱時, 必須連姓帶名把資料庫名稱與表格名稱完整寫出。
  3. 刪除 (兩個) 「具有 root 權限的匿名帳號」: delete from mysql.user where User='';
  4. 設定 (兩個) root 帳號的密碼: update mysql.user set Password=password('不要照抄') where User='root'; 這裡的 '不要照抄' 當然要改成你自己的密碼。
  5. 檢查看看是否更改成功: select Host,User,Password from mysql.user; 看到現在 Password 欄位不再是空白。 為什麼出來的數字跟剛才打的密碼不同? 因為已經經過上面的 password 函數加密。
  6. 不過現在只是資料庫更新而已, 還沒有真的反應到系統裡面, 不信開另外一個終端機視窗 (叫做 B 視窗好了), 再用 mysql -u root 一樣可以進去。
  7. 回到原先的終端機視窗 (叫做 A 視窗好了), 下 flush privileges; 再從 B 視窗再試著連線一次, 果然失敗。
  8. 這次要用 mysql -u root -p 連線, 並且會被詢問密碼, 然後就可以登入。

一些常識

資料檔放在那裡? /var/lib/mysql/ 包含密碼檔也放這裡。

一般要用到 mysql 的套件, 可能會問以下問題:

  1. 資料庫名稱?
  2. mysql 的用戶名稱?
  3. 資料表格名稱前面統一加的字串?

這三個東西, 都可以任意自訂, 也未必要相同。 以 xoops 為例, 資料庫名稱可以是 xoops_db, 用戶名稱可以是 xoops_admin, 資料表格名稱前面統一加的字串可以是 xoops_ 。 不過我自己為了容易記憶 (如果你管很多部電腦, 每部電腦都裝很多需要使用 mysql 的套件, ...) 通常前兩者都用套件名稱 (例如 xoops); 第三項則用套件名稱加底線 (例如 xoops_)

建立帳號, 建立資料庫

例一: xoops

比方說要安裝 xoops 吧。 以下指令建立一個專門給 xoops 使用的帳號:

        GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON xoops.* TO
        'xoops'@'localhost' IDENTIFIED BY '不要照抄';
    

然後按 ^d 離開 mysql, 回到 shell 底下; 再重新用 xoops 的帳號登入: mysql -u xoops -p 進入 mysql 之後, 下 create database xoops; 於是大功告成。

例二: mediawiki

mediawiki 也用到 mysql。 最簡單的方式是: 把 mysql 的 root 帳號密碼填入 mediawiki 的設定選單當中, 讓它自己去建立它需要的資料庫。

附帶一提: ConfirmEdit 擴充套件安裝後, 除了照文件設定之外, 還需要把 $wgCaptchaTriggers['edit'] = false; 這句的 false 改為 true 才會生效。

相關文章

  1. Basic Setup of MySQL in GNU/Linux