เมื่อใช้ MySQL ปัญหาด้านความปลอดภัยไม่สามารถละเลยได้ ต่อไปนี้คือบันทึกย่อ 23 รายการที่ MySQL แจ้ง:
1. หากการเชื่อมต่อระหว่างไคลเอ็นต์และเซิร์ฟเวอร์จำเป็นต้องขยายและผ่านผ่านเครือข่ายที่ไม่น่าเชื่อถือ คุณจะต้องใช้ทันเนล SSH เพื่อเข้ารหัสการสื่อสารของการเชื่อมต่อ
2. ใช้คำสั่งตั้งรหัสผ่านเพื่อเปลี่ยนรหัสผ่านของผู้ใช้ ในสามขั้นตอน ขั้นแรกให้เข้าสู่ระบบฐานข้อมูลด้วย "mysql -u root" จากนั้น "mysql> อัปเดต mysql.user ตั้งรหัสผ่าน=รหัสผ่าน('newpwd')" และในที่สุดก็ดำเนินการสิทธิ์ "ล้าง" จะทำ
3. การโจมตีที่ต้องได้รับการป้องกัน ได้แก่ การป้องกันการดักฟัง การปลอมแปลง การเล่นซ้ำ การปฏิเสธการให้บริการ ฯลฯ ซึ่งไม่เกี่ยวข้องกับความพร้อมใช้งานและความทนทานต่อข้อผิดพลาด การเชื่อมต่อ การสืบค้น และการดำเนินการอื่นๆ ทั้งหมดเสร็จสมบูรณ์โดยใช้มาตรการรักษาความปลอดภัยตาม ACL (รายการควบคุมการเข้าถึง) มีการรองรับการเชื่อมต่อ SSL ด้วยเช่นกัน
4. ผู้ใช้รายอื่นยกเว้นผู้ใช้รูทจะไม่ได้รับอนุญาตให้เข้าถึงตารางผู้ใช้ในฐานข้อมูลหลัก mysql
เมื่อรหัสผ่านผู้ใช้ที่เข้ารหัสซึ่งจัดเก็บไว้ในตารางผู้ใช้รั่วไหล ผู้อื่นจะสามารถใช้ฐานข้อมูลที่เกี่ยวข้องกับชื่อผู้ใช้/รหัสผ่านได้ตามต้องการ ;
5. ใช้สิทธิ์และเพิกถอนคำสั่งเพื่อดำเนินการควบคุมการเข้าถึงของผู้ใช้
6. ห้ามใช้รหัสผ่านข้อความธรรมดา แต่ใช้
ฟังก์ชันแฮชทางเดียว เช่น md5() และ sha1() เพื่อตั้งรหัสผ่าน
ในอักขระพจนานุกรมเป็นรหัสผ่าน
8. ใช้ไฟร์วอลล์เพื่อกำจัดอันตรายภายนอก 50% และปล่อยให้ระบบฐานข้อมูลทำงานหลังไฟร์วอลล์หรือวางไว้ในพื้นที่ DMZ
9. ใช้ nmap เพื่อสแกนพอร์ต 3306 จากอินเทอร์เน็ต หรือใช้ telnet server_host การทดสอบวิธี 3306 ไม่สามารถอนุญาตการเข้าถึงพอร์ต TCP 3306 ของเซิร์ฟเวอร์ฐานข้อมูลจากเครือข่ายที่ไม่น่าเชื่อถือ ดังนั้นจึงจำเป็นต้องทำการตั้งค่าบนไฟร์วอลล์หรือเราเตอร์
10. เพื่อป้องกันไม่ให้พารามิเตอร์ที่ผิดกฎหมายถูกส่งผ่านเข้ามาอย่างเป็นอันตราย เช่น โดยที่ ID=234, อื่นๆ แต่การป้อนโดยที่ ID=234 OR 1=1 ทำให้ทั้งหมดถูกแสดง ดังนั้นให้ใช้ '' หรือ "" เพื่อใช้สตริงในรูปแบบเว็บ และเพิ่ม %22 ให้กับ URL ไดนามิกเพื่อแสดง เครื่องหมายคำพูดคู่ %23 เพื่อแสดงเครื่องหมายปอนด์ และ %27 แสดงถึงเครื่องหมายคำพูดเดียว การส่งผ่านค่าที่ไม่ได้ตรวจสอบไปยังฐานข้อมูล mysql เป็นอันตรายมาก
11. ตรวจสอบขนาดเมื่อส่งข้อมูลไปยัง mysql
12. แอปพลิเคชันที่ต้องการ ในการเชื่อมต่อกับฐานข้อมูลควรใช้บัญชีผู้ใช้ทั่วไปและเปิดเฉพาะบางบัญชีที่จำเป็นเท่านั้นที่มอบสิทธิ์ให้กับผู้ใช้
13. ใช้ฟังก์ชัน 'escape character' เฉพาะในอินเทอร์เฟซการเขียนโปรแกรมต่างๆ (C C ++ PHP Perl Java JDBC ฯลฯ );
เมื่อใช้ฐานข้อมูล mysql บนอินเทอร์เน็ต ต้องแน่ใจว่าได้ส่งข้อมูลข้อความธรรมดาน้อยลง และใช้การส่งข้อมูลที่เข้ารหัส
14. เรียนรู้การใช้ tcpdump และเครื่องมือสตริงเพื่อตรวจสอบความปลอดภัยของข้อมูลที่ส่ง เช่น tcpdump -l -i eth0 -w -src หรือ dst พอร์ต 3306 สตริง เริ่มบริการฐานข้อมูล mysql ในฐานะผู้ใช้ทั่วไป
15. อย่าใช้สัญลักษณ์ลิงก์ไปที่ตาราง เลือกพารามิเตอร์ --skip-signal-links
16. ตรวจสอบให้แน่ใจว่าเฉพาะผู้ใช้ที่เริ่มบริการฐานข้อมูลในไดเร็กทอรี mysql สามารถอ่านและอ่านไฟล์ได้
17. ไม่อนุญาตให้ใช้กระบวนการหรือสิทธิ์ขั้นสูงแก่ผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบ รายการกระบวนการ mysqladmin สามารถแสดงรายการข้อความค้นหาที่ดำเนินการในปัจจุบันสามารถใช้เพื่อตัดการเชื่อมต่อไคลเอ็นต์ สถานะของพารามิเตอร์การทำงานของเซิร์ฟเวอร์และการควบคุมการคัดลอกและการจำลองข้อมูลเซิร์ฟเวอร์
18. ไม่อนุญาตให้ผู้ใช้รายอื่นนอกเหนือจากผู้ดูแลระบบเพื่อป้องกันปัญหาในการโหลดข้อมูล '/etc/passwd' ลงในตารางแล้วใช้การเลือกเพื่อแสดง 19.
หากคุณไม่ไว้วางใจบริการของบริษัทที่ให้บริการ DNS คุณสามารถตั้งค่าเฉพาะที่อยู่ IP ที่เป็นตัวเลขในตารางการอนุญาตชื่อได้
20. ใช้ตัวแปร max_user_connections เพื่อเปิดใช้งานกระบวนการบริการ mysqld เพื่อจำกัดจำนวนการเชื่อมต่อ บัญชีที่ระบุ
21. คำสั่งให้สิทธิ์ยังสนับสนุนตัวเลือกการควบคุมทรัพยากร
22. เริ่มสวิตช์ตัวเลือกความปลอดภัยของกระบวนการบริการ mysqld --local-infile=0 หรือ 1 หากเป็น 0 โปรแกรมไคลเอนต์จะไม่สามารถใช้โหลดในเครื่องได้ ข้อมูล ตัวอย่างการให้สิทธิ์การแทรก (ผู้ใช้) บน mysql.user ถึง 'user_name'@'host_name' ; หากใช้ - ระบบข้ามตารางจะไม่ใช้การควบคุมการเข้าถึงใด ๆ สำหรับการเข้าถึงของผู้ใช้ แต่คุณสามารถใช้ mysqladmin flush-privileges หรือ mysqladmin reload เพื่อเปิดใช้งานการควบคุมการเข้าถึง โดยค่าเริ่มต้น คำสั่งแสดงฐานข้อมูลจะเปิดสำหรับผู้ใช้ทุกคน และคุณสามารถใช้ --skip-show-databases เพื่อปิดได้
23. เมื่อพบข้อผิดพลาด 1045 (28000) Access Denied สำหรับผู้ใช้ 'root'@'localhost' (การใช้รหัสผ่าน:NO) คุณต้องรีเซ็ตรหัสผ่าน วิธีการเฉพาะคือ: เริ่มแรกด้วย --skip-grant -tables พารามิเตอร์ mysqld จากนั้นดำเนินการ mysql -u root mysql,mysql>update user setpassword=password('newpassword') โดยที่ user='root';mysql>Flush allowance; และสุดท้ายรีสตาร์ท mysql