มี 3 แบบ
- Authentication (มี login เป็นเจ้าของ MySQL)
- Authorization (ยอมให้ Shutdown ? เป็น Global Privileges)
- Access Control (เกี่ยวกับข้อมูล ว่ายอมให้ Read/Write ต่างจาก Global Privileges เพราะเข้าถึงระดับ Table, Column ได้ด้วย)
- Privileges and Permissions
Account
Privileges
- Object-specific privileges สำหรับ grant พวก table, view
- Global Privileges สำหรับสามารถใช้ command ได้บ้างอัน เช่น shutdown, flush, show
The Grant Tables
- เป็นหัวใจของ security system
- grant, revoke, drop user, flush
- grant table สามารถทำได้โดยมีรายละเอียด คือ user, db, host, table_priv, column_priv, procs_priv
How MySQL checks Privileges
หลักการ

Adding, Removing, and Viewing Grants
- Command “SHOW GRANTS;” สำหรับดู Permission ของ users
- ถ้าต้องการเห็น GRANT สำหรับ User ก็ “SHOW GRANTS FOR root;”
- ถ้าต้องการเห็น GRANT สำหรับ User และ Host ก็ “SHOW GRANT FOR root@%;” (any host)
- ถ้าเปลี่ยน Privileges แล้ว จะไม่เปลี่ยนแปลงจนกว่าจะ restart service หรือ run “FLUSH PRIVILEGES;”
Setting Up MySQL Privileges
เอาแค่ Backup User พอ GRANT SELECT, LOCK TABLES, FILE ON . TO ‘backup’@’localhost’ IDENTIFIED BY ‘PASSWORD’;
Privileges and Performance
- Privilege เยอะ ไม่ส่งผลกระทบกับ Performance
- การ Query เพื่อดึงข้อมูลใน Column ที่ Privilege นั้นทำไม่ได้ แนะนำให้ Query จาก View
- ใช้ skip_name_resolve บน my.cnf เพื่อเพิ่ม Speed ในการ connect มากยิ่งขึ้น (ไม่ต้อง resolve จาก DNS ในการ connect กับ host) ลด DOS ไปยัง DNS Server ด้วย
- สามารถใช้ IP แทนก็ได้ หรือจะใช้ IP แบบ Wildcard (192%) ได้ด้วยเช่นกัน
อื่นๆ
- ห้ามเข้าโดยไม่ใส่ password (ใส่ password ใน my.cnf)
- password ใน mysql.user ห้ามว่าง
- ปิด anonymous users
- อย่า GRANT SUPER privilege โดยมั่วซั่ว
Operating System Security
- อย่า Run MySQL ด้วย Privilege Account
- ทำ OS ให้ Up-to-date
- ห้ามให้ Account Admin ของ DB หรือ Server กับ Developer
- มีการ Audit Server
- แยกงาน Production ออกจากงาน Development หรือ Testing ด้วยเครื่องที่ต่างกัน
- ใช้อะไรก็ตามที่ให้ปลอดภัย เช่น chrooting, jails, zones, หรือ Virtual Server เพื่อ Isolate DB
- Backup ข้อมูลในเครื่องที่ต่างกัน
Network Security
- อ่าน Building Internet Firewalls
- อ่าน TCP/IP Network Administration
Localhost-Only Connections
- ปิดการเข้าผ่าน Network ให้ใช้ PHPMyAdmin แทน
- ใน my.cnf ในส่วนของ [mysqld] ให้ใส่ option คือ skip_network และ bind_address=127.0.0.1
Firewalling
Data Encryption
- Encrypted Password ของ Application โดยการ Hashing อาจใช้ MD5 หรือ SHA1
- Encrypted Filesystems
- Encrypted ในระดับ Application Layer เป็นวิธีที่ยืดหยุ่นได้เยอะมาก เช่น Encrypted โดย algorithm ซึ่ง MySQL จะไม่รู้ว่ากำลัง Encrypted หรือใช้ AES_DECRYPT / AES_ENCRYPT ช่วย (Funtion ใน MySQL)
Note
DMZ (Demilitarized Zone) : คือ Zone ที่อันตราย ใครๆก็สามารถเห็น เช่น Web Server, DNS Server