แนะนำระบบสิทธิของ MySQL
ส่วนการทำงานดีที่สุดอย่างหนึ่งของ MySQL คือ สนับสนุนระบบสิทธิชั้นสูง
สิทธิ คือ สิทธิในการกระทำกับ อ๊อบเจค เฉพาะ และสัมพันธ์กับผู้ใช้เฉพาะ
เมื่อสร้างผู้ใช้ภายใน MySQL ต้องให้ชุดของสิทธิดีระบุผู้ใช้รายนั้น สามารถทำ หรือไม่สามารถทำภายในระบบ
คำสั่งผู้ใช้ และสิทธิ
ระบบ MySQL สามารถมีหลายผู้ใช้ โดยทั่วไป root ได้รับการใช้เป็น administration โดยเฉพาะด้วยเหตุผลความปลอดภัย แต่ละผู้ใช้ในระบบต้องมีการตั้งค่า บัญชีชื่อและรหัสผ่าน โดยไม่จำเป็นต้องเหมือนกับชื่อผู้ใช้ และรหัสผ่านภายนอกของ MySQL ( ตัวอย่างเช่น ชื่อผู้ใช้และรหัสผ่านของ UNIX หรือ NT) หลักการเดียวกันประยุกต์กับ root แนวคิดที่ดี คือ ควรมีรหัสผ่านต่างกันสำหรับระบบ และ MySQL โดยเฉพาะอย่างยิ่งเมื่อมากับรหัสผ่านของ root
สำหรับวัตถุประสงค์ของการตั้งค่าฐานข้อมูลเว็บ ความคิดที่ดี คือ ตั้งค่าอย่างน้อย 1 ผู้ใช้ต่อ 1 โปรแกรม ประยุกต์เว็บ
หลักการสิทธิน้อยที่สุด
หลักการสิทธิน้อยที่สุด สามารถใช้ปรับปรุงความปลอดภัยของระบบคอมพิวเตอร์ นี่เป็นเรื่องพื้นฐานแต่สำคัญมากที่มักถูกมองข้าม หลักการนี้ คือ ผู้ใช้ ( ผู้ใช้หรือกระบวนการ ) จะต้องมีระดับต่ำที่สุดของสิทธิตามความต้องการเพื่อ กระทำงานตามที่มอบหมาย
การประยุกต์กับ MySQL ทำได้ทุกที่ ตัวอย่างเช่น เรียกใช้ คิวรี่จากเว็บผู้ใช้ไม่ต้องการสิทธิทั้งหมดเหมือนการดึงของ root ดังนั้น ควรสร้างผู้ใช้อีกรายให้มีสิทธิจำเป็นในการเข้าถึงฐานข้อมูลที่สร้างขึ้น
การตั้งค่าผู้ใช้ : คำสั่ง GRANT
คำสั่ง GRANT และ REVOKE ได้รับการใช้เพื่อให้และถอนสิทธิกับผู้ใช้ MySQL ด้วยสิทธิ 4 ระดับ คือ
- Global
- Database
- Table
- Column
คำสั่ง GRANT ใช้สร้างผู้ใช้และให้สิทธิ รูปแบบทั่วไปของคำสั่ง GRANT คือ
GRANT privileges [ column ]
ON item
TO user_name [IDENTIFIED BY password ' ]
[WITH GRANT OPTION]
คำสั่งในวงเล็บสี่เหลี่ยมเป็นตัวเลือก
- privileges ต้องมีจุลภาคแบ่งรายการสิทธิ
- columns เป็นตัวเลือก สามารถใช้ในการระบุสิทธิกับคอลัมน์ และสามารถใช้ชื่อคอลัมน์เดียว หรือ จุลภาคแบ่งรายการชื่อคอลัมน์
- item คือ ฐานข้อมูล หรือ ตารางข้อมูลในการประยุกต์สิทธิใหม่ การให้สิทธิกับฐานข้อมูลทั้งหมด โดยใช้ *.* ที่ item เรียกว่า การให้สิทธิระดับ global การระบุ ตารางข้อมูลทั้งหมดในฐานข้อมูลใช้ dbname.* หรือ ตารางข้อมูลเดียว ใช้ dbname.tablename และเจาะจงคอลัมน์ใน column สิ่งเหล่านี้แสดง 3 ระดับของสิทธิ คือ ฐานข้อมูล ตารางข้อมูล และคอลัมน์ ถ้ากำลังใช้ฐานข้อมูลที่เจาะจง เมื่อใช้คำสั่ง tablename จะถูกขัดขวางในฐานะตารางข้อมูลในฐานข้อมูลปัจจุบัน
- user_name เป็นชื่อผู้ใช้ที่ต้องการให้เข้าสู่ MySQL ไม่จำเป็นต้องเหมือนกับชื่อเข้าสู่ระบบ user_name ใน MySQL สามารถเก็บชื่อ host ซึ่งสามารถนำไปแยกระหว่าง laura ( ได้รับการแปลเป็น laura@localhost ) และ laura@somewhere.com โดยมีประโยชน์เพราะผู้ใช้จากต่าง domain อาจจะมีชื่อเหมือนกัน รวมถึงการเพิ่มความปลอดภัยเพราะสามารถเจาะจงสถานที่ให้เข้าสู่ระบบ และสามารถให้คนที่มาจากสถานที่เฉพาะให้เข้าถึงตารางข้อมูล หรือฐานข้อมูลเฉพาะได้
- password เป็นรหัสผ่าน ที่ผู้ใช้ผ่านเข้าสู่ระบบ รหัสไม่ควรเดาได้ง่าย ดังนั้นไม่ควรเป็นคำในพจนานุกรม หรือ ชื่อผู้ใช้ ในทางความคิดควรผสมตัวอักษรใหญ่ เล็ก และไม่ใช่พยัญชนะ
ตัวเลือก WITH GRANT OPTION ยอมให้ผู้ใช้ที่ระบุ โอนสิทธิ ให้กับคนอื่น
สิทธิ ได้รับการเก็บใน 4 ตารางข้อมูลระบบในฐานข้อมูล เรียกว่า mysql ตารางข้อมูล 4 ตาราง คือ mysql.user mysql.db mysql.tables_priv และ mysql.column_priv ตารางเหล่านี้สัมพันธ์โดยตรงกับสิทธิ 4 ระดับตามที่กล่าวไปแล้ว ควรแก้ไขสิทธิโดยตรงสามารถทำได้นอกจากคำสั่ง GRANT
ประเภทและระดับของสิทธิ
ประเภทพื้นฐาน 3 ประเภท ของสิทธิใน MySQL คือ สิทธิสำหับผู้ใช้ปกติ สิทธิสำหรับผู้บริหารระบบ และสิทธิสำหรับกรณีพิเศษ ผู้ใช้ทั่วไปสามารถได้รับสิทธิอย่างใดอย่างหนึ่ง แต่ตามปกติมีเหตุผลในการจำกัดประเภทผู้บริหารระบบกับผู้บริหารระบบ ตามหลักการสิทธิน้อยที่สุด
การให้สิทธิกับผู้ใช้เฉพาะกับฐานข้อมูล และตารางข้อมูล ที่ต้องการใช้แต่ไม่ควรให้สิทธิเข้าถึงฐานข้อมูล MySQL ยกเว้นผู้บริหารระบบ เนื่องจากนี่เป็นที่เก็บผู้ใช้ รหัสผ่าน และสิทธิอื่นทั้งหมด
สิทธิ สำหรับผู้ใช้ปกติสัมพันธ์โดยตรงกับประเภทเฉพาะของคำสั่ง SQL และถ้าผู้ใช้ได้รับการยินยอมให้ทำงาน ตารางข้อมูล 8.1 แสดงสิทธิสำหรับผู้ใช้ รายการภายใต้คอลัมน์ การประยุกต์ แสดงอ๊อบเจค ให้กับสิทธิที่สามารถกำหนดได้
ตาราง 8.1 สิทธิของผู้ใช้
สิทธิ |
การประยุกต์ |
คำอธิบาย |
SELECT |
ตารางข้อมูล , คอลัมน์ |
ยอมให้ผู้ใช้ เลือก เรคคอร์ด จากตารางข้อมูล |
INSERT |
ตารางข้อมูล , คอลัมน์ |
ยอมให้ผู้ใช้ เพิ่ม เรคคอร์ด ใหม่เข้าสู่ตารางข้อมูล |
UPDATE |
ตารางข้อมูล , คอลัมน์ |
ยอมให้ผู้ใช้ ปรับปรุงในเรคคอร์ดที่มีอยู่ในตารางข้อมูล |
DELETE |
ตารางข้อมูล |
ยอมให้ผู้ใช้เพื่อลบเรคคอร์ดในตารางข้อมูล |
INDEX |
ตารางข้อมูล |
ยอมให้ผู้ใช้สร้างและลบดัชนีบนตารางข้อมูล |
ALTER |
ตารางข้อมูล |
ยอมให้ผู้ใช้ แก้ไขโครงสร้างของตารางข้อมูล ตัวอย่างเช่น การเพิ่มคอลัมน์ เปลี่ยนชื่อคอลัมน์หรือตารางข้อมูล และเปลี่ยนแปลงประเภทข้อมูลของคอลัมน์ |
CREATE |
ฐานข้อมูล , ตารางข้อมูล |
ยอมให้ผู้ใช้สร้างฐานข้อมูล หรือตารางข้อมูลใหม่ ถ้าฐานข้อมูล หรือตารางข้อมูล ได้รับการระบุ ในคำสั่ง GRANT ผู้ใช้สามารถทำได้เฉพาะการสร้างฐานข้อมูล หรือตารางข้อมูล ถ้ามีอยู่แล้วต้องลบก่อน |
DROP |
ฐานข้อมูล , ตารางข้อมูล |
ยอมให้ผู้ใช้ลบ (DROP) ฐานข้อมูล หรือตารางข้อมูล |
สิทธิส่วนใหญ่ของผู้ใช้ปกติ มีอันตรายน้อยโดยสัมพัทธ์ต่อระบบความปลอดภัย ALTER สามารถใช้ทำงานเกี่ยวกับระบบสิทธิ โดยการเปลี่ยนชื่อตารางข้อมูล แต่จำเป็นมากกับผู้ใช้ ระบบความปลอดภัยต้องมีการเลือกระหว่างการใช้และความปลอดภัย ดังนั้นควรพิจารณาเมื่อมาถึง ALTER แต่ต้องให้สิทธิกับผู้ใช้เสมอ
นอกจากรายการสิทธิในตาราง 8.1 สิทธิ PEFERENCES มีอยู่ แต่ปัจจุบันไม่มีการใช้ และสิทธิ GRANT ได้รับการให้ด้วย WITH GRANT OPTION แทนที่ในรายการสิทธิ
ตาราง 8.2 สิทธิของผู้บริหารระบบ
สิทธิ |
คำอธิบาย |
RELOAD |
ยอมให้ผู้บริหารระบบ โหลดการให้ใหม่ของสิทธิในตารางข้อมูล ล๊อกของ host และตารางข้อมูล |
SHUTDOWN |
ยอมให้ผู้บริหารระบบ ปิด แม่ข่าย MySQL |
PROCESS |
ยอมให้ผู้บริหารระบบดูกระบวนการของแม่ข่าย และลบ |
FILE |
ยอมให้ข้อมูลได้รับการอ่านเข้าสู่ตารางข้อมูลจากไฟล์ และกลับกัน |
มีความเป็นไปได้ในการให้สิทธิเหล่านี้กับผู้ใช้ไม่ใช่ผู้บริหารระบบ แต่ต้องระวังอย่างมาก ถ้ากำลังพิจารณาทำ ผู้ใช้โดยเฉลี่ยไม่จำเป็นใช้สิทธิ RELOAD SHUTDOWN และ PROCESS
สิทธิ FILE มีความแตกต่างเล็กน้อย เนื่องจากมีประโยชน์สำหรับผู้ใช้ เพราะการโหลดข้อมูลจากไฟล์ สามารถประหยัดเวลาในการป้อนข้อมูลใหม่ แต่ละครั้งเพื่อนำข้อมูลเข้าสู่ฐานข้อมูล อย่างไรก็ตามการโหลดไฟล์สามารถใช้โหลดไฟล์ที่แม่ข่าย MySQL มองเห็น รวมถึงฐานข้อมูลของผู้ใช้อื่น และไฟล์รหัสผ่าน ให้สิทธิด้วยความระวัง หรือให้การโหลดข้อมูลสำหรับผู้ใช้
รวมทั้งมีสิทธิพิเศษ 2 อย่าง และแสดงในตาราง 8.3
ตาราง 8.3 สิทธิพิเศษ
สิทธิ |
คำอธิบาย |
ALL |
ให้สิทธิทั้งหมดตามรายการในตาราง 8.1 และ 8.2 รวมถึงสามารถเขียนด้วย ALL PREVILEGES แทนที่ ALL |
USAGE |
ไม่ให้สิทธิ นี่จะเป็นการสร้างผู้ใช้ และยอมให้เข้ามาได้ แต่ไม่ให้ทำอะไร โดยทั่วไปจึงเพิ่มสิทธิมากขึ้นภายหลัง |
คำสั่ง REVOKE
คำสั่ง REVOKE ตรงข้ามกับ GRANT สำหรับใช้ถอนสิทธิจากผู้ใช้ และมีไวยากรณ์คล้ายกับ GRANT
REVOKE privileges [(column)]
ON item
FROM user_name
ถ้าใช้ WITH GRANT OPTION สามารถใช้ REVOKE ด้วยรูปแบบนี้
REVOKE GRANT OPTION
ON item
FROM user_name
ตัวอย่างการใช้ GRANT และ REVOKE
การกำหนด ผู้บริหารระบบ
mysql > grant all
-> on *
-> to somchai identified by qxz254'
-> with grant option
นี่เป็นการให้สิทธิทั้งหมดกับฐานข้อมูลทั้งหมดไปยังผู้ใช้ ชื่อ somchai ด้วยรหัสผ่าน qxz254 และยอมให้ส่งผ่านสิทธิที่กำหนดให้
การถอนสิทธิทำได้ดังนี้
mysql > revoke all
-> on *
-> from somchai
กำหนดผู้ใช้ที่ไม่มีสิทธิ
mysql > grant usage
-> on widebook.*
-> to somsri identified by magic123'
การเพิ่มสิทธิ
mysql > grant select, insert, update, delete, index, alter, create, drop
-> on widebook.*
-> to somsri
หมายเหตุ การขยายสิทธิให้กับผู้ใช้เดิมไม่จำเป็นต้องระบุหัสผ่าน
ถ้าต้องการถอนสิทธิบางส่วนในการทำงานกับฐานข้อมูล สามารถลดสิทธิด้วยคำสั่งนี้
mysql > revoke alter, create, drop
-> on widebook.*
-> from somsri
ถ้าไม่ต้องการให้ผู้ใช้ทำงานกับฐานข้อมูล สามารถถอนสิทธิทั้งหมดได้
mysql > revoke all
-> on widebook.*
-> from somsri
|