มี 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
- ใช้ authorize host (GRANT) ไม่ให้ Hosting เข้ามาใช้งาน (ผ่าน Command Line)
- Limit Port โดย Allow TCP Port 3306 และ Remote (SSH - 22)
- อย่าลืม Set Firewall ด้วย (เพราะ IP อื่นที่อยู่วงเดียวกันจะสามารถเข้ามาได้)
- เอา MySQL ไปไว้ใน DMZ เพราะถ้าติดต่อกับ Web Application ถึงยังไงก็ไม่ปลอดภัย 100% ให้ย้ายไปอยู่ใน Network ของตัวเอง และไม่ให้เข้าจากภายนอก (3306)
ถ้าต้องสื่อสารกับ MySQL ผ่าน Public Network อาจถูก Sniff ได้ ให้ใช้เครื่องมือ เช่น
- VPN
- SSL ใน MySQL (SHOW VARIABLES LIKE ‘have_openssl’;) : มากับ MySQL 4.1 เป็นต้นไป
- SSH tunneling (กรณี MySQL Version ต่ำกว่า 4.1) ให้ login ผ่าน SSH จะช่วย Encrypt
ใช้ TCP Wrappers
- ใช้ Automatic Host Blocking
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


