การใช้mySQL
| MySQL เป็นฐานข้อมูลแบบ open source ที่ได้รับความนิยมในการใช้งานสูงสุดโปรแกรมหนึ่งบนเครื่องให้บริการ มีความสามารถในการจัดการกับฐานข้อมูลด้วยภาษา SQL (Structures Query Language) อย่างมีประสิทธิภาพ มีความรวดเร็วในการทำงาน รองรับการทำงานจากผู้ใช้หลายๆ คนและหลายๆ งานได้ในขณะเดียวกัน MySQL ถูกพัฒนาขึ้นโดย MySQL AB โดยมีลิขสิทธิ์การใช้งาน 2 แบบ นั่นคือ ผู้ดูแลระบบสามารถใช้งานซอฟต์แวร์ MySQL ได้โดยไม่มีค่าใช้จ่ายใดๆ ภายใต้ลิขสิทธิ์ของ GNU General Public License (http://www.gnu.org/licenses/) หรืออาจเลือกใช้แบบที่มีลิขสิทธิ์ทางการค้าของ MySQL AB ซึ่งเป็นผู้ผลิตและพัฒนาซอฟต์แวร์โดยตรงก็ได้ หากไม่ต้องการเกี่ยวข้องกับข้อตกลงเรื่อง GPL รายละเอียดเพิ่มเติมเกี่ยวกับโปรแกรม MySQL สามารถหาข้อมูลได้จาก http://www.mysql.com คำอธิบายเพิ่มเติมเกี่ยวกับหน้าที่ ความสามารถและการทำงานของโปรแกรม MySQL มีดังต่อไปนี้ MySQL ถือเป็นระบบจัดการฐานข้อมูล (DataBase Management System (DBMS)) ฐานข้อมูลมีลักษณะเป็นโครงสร้างของการเก็บรวบรวมข้อมูล การที่จะเพิ่มเติม เข้าถึงหรือประมวลผลข้อมูลที่เก็บในฐานข้อมูลจำเป็นจะต้องอาศัยระบบจัดการฐานข้อมูล ซึ่งจะทำหน้าที่เป็นตัวกลางในการจัดการกับข้อมูลในฐานข้อมูลทั้งสำหรับการใช้งานเฉพาะ และรองรับการทำงานของแอพลิเคชันอื่นๆ ที่ต้องการใช้งานข้อมูลในฐานข้อมูล เพื่อให้ได้รับความสะดวกในการจัดการกับข้อมูลจำนวนมาก MySQL ทำหน้าที่เป็นทั้งตัวฐานข้อมูลและระบบจัดการฐานข้อมูล MySQL เป็นระบบจัดการฐานข้อมูลแบบ relational ฐานข้อมูลแบบ relational จะทำการเก็บข้อมูลทั้งหมดในรูปแบบของตารางแทนการเก็บข้อมูลทั้งหมดลงในไฟล์เพียงไฟล์เดียว ทำให้ทำงานได้รวดเร็วและมีความยืดหยุ่น นอกจากนั้น แต่ละตารางที่เก็บข้อมูลสามารถเชื่อมโยงเข้าหากันทำให้สามารถรวมหรือจัดกลุ่มข้อมูลได้ตามต้องการ โดยอาศัยภาษา SQL ที่เป็นส่วนหนึ่งของโปรแกรม MySQL ซึ่งเป็นภาษามาตรฐานในการเข้าถึงฐานข้อมูล MySQL แจกจ่ายให้ใช้งานแบบ open source นั่นคือ ผู้ใช้งาน MySQL ทุกคนสามารถใช้งานและปรับแต่งการทำงานได้ตามต้องการ สามารถดาวน์โหลดโปรแกรม MySQL ได้จากอินเทอร์เน็ตและนำมาใช้งานโดยไม่มีค่าใช้จ่ายใดๆ ในระบบปฏิบัติการ Red Hat Linux นั้น มีโปรแกรมที่สามารถใช้งานเป็นฐานข้อมูลให้ผู้ดูแลระบบสามารถเลือกใช้งานได้หลายโปรแกรม เช่น MySQL และ PostgreSQL ผู้ดูแลระบบสามารถเลือกติดตั้งได้ทั้งในขณะที่ติดตั้งระบบปฏิบัติการ Red Hat Linux หรือจะติดตั้งภายหลังจากที่ติดตั้งระบบปฏิบัติการก็ได้ อย่างไรก็ตาม สาเหตุที่ผู้ใช้งานจำนวนมากนิยมใช้งานโปรแกรม MySQL คือ MySQL สามารถทำงานได้อย่างรวดเร็ว น่าเชื่อถือและใช้งานได้ง่าย เมื่อเปรียบเทียบประสิทธิภาพในการทำงานระหว่างโปรแกรม MySQL และ PostgreSQL โดยพิจารณาจากการประมวลผลแต่ละคำสั่งได้ผลลัพธ์ดังรูปที่ 1 นอกจากนั้น MySQL ถูกออกแบบและพัฒนาขึ้นมาเพื่อทำหน้าเป็นเครื่องให้บริการรองรับการจัดการกับฐานข้อมูลขนาดใหญ่ ซึ่งการพัฒนายังคงดำเนินอยู่อย่างต่อเนื่อง ส่งผลให้มีฟังก์ชันการทำงานใหม่ๆ ที่อำนวยความสะดวกแก่ผู้ใช้งานเพิ่มขึ้นอยู่ตลอดเวลา รวมไปถึงการปรับปรุงด้านความต่อเนื่อง ความเร็วในการทำงาน และความปลอดภัย ทำให้ MySQL เหมาะสมต่อการนำไปใช้งานเพื่อเข้าถึงฐานข้อมูลบนเครือข่ายอินเทอร์เน็ต รูปที่ 1 แสดงผลการเปรียบเทียบการทำงานระหว่างโปรแกรม MySQL และ PostgreSQL ความเสี่ยงและวิธีการสร้างความปลอดภัยให้ฐานข้อมูล ก่อนที่จะกล่าวถึงขั้นตอนการปรับแต่งค่าความปลอดภัยให้กับโปรแกรม MySQL ผู้ดูแลระบบควรจะต้องทราบถึงความเสี่ยงที่เกิดขึ้นจากการใช้งานฐานข้อมูลและหลักปฏิบัติโดยทั่วไปในการสร้างความปลอดภัยให้ฐานข้อมูลก่อน ซึ่งรายละเอียดที่จะอธิบายในหัวข้อนี้จะกล่าวถึงภาพรวม เพื่อให้ผู้ดูแลระบบสามารถนำไปประยุกต์ใช้ได้กับฐานข้อมูลชนิดอื่นๆ ความปลอดภัยของฐานข้อมูลเป็นสิ่งสำคัญมาก เนื่องจากข้อมูลที่เก็บไว้ในฐานข้อมูลถือเป็นองค์ประกอบหลักในการดำเนินงานขององค์กรและมีความอ่อนไหวค่อนข้างสูง ได้แก่ เช่น ข้อมูลทางธุรกิจ ข้อมูลลูกค้า ข้อมูลพนักงาน ข้อมูลลับหรือข้อมูลที่เผยแพร่บนเว็บไซต์ขององค์กร วิธีการสร้างความปลอดภัยให้กับฐานข้อมูลค่อนข้างเป็นเรื่องเฉพาะ และมีความซับซ้อนแตกต่างจากการสร้างความปลอดภัยให้กับเครือข่ายหรือระบบปฏิบัติการ ทั้งนี้ จุดบกพร่องที่ทำให้เกิดความเสี่ยงต่อความไม่ปลอดภัยของฐานข้อมูลมีสาเหตุจาก ความซับซ้อนของระบบฐานข้อมูล การเก็บรหัสผ่านอย่างไม่ปลอดภัย การตั้งค่าการทำงานที่ผิดพลาด หรือ backdoor ของระบบที่ผู้ดูแลระบบไม่ทราบ การลดความเสี่ยงของข้อบกพร่องเหล่านี้ทำได้โดยการกำหนดหลักปฏิบัติในการใช้งานฐานข้อมูลดังนี้ ให้สิทธิ์การใช้งานกับผู้ใช้ตามความจำเป็นเท่านั้น ผู้ใช้งานฐานข้อมูลแต่ละคนควรจะได้รับสิทธิ์การใช้งานเฉพาะที่จำเป็นต่อการดำเนินงานของแต่ละคน ทำการป้องกันในหลายๆ ระดับ เช่น ระดับของการขอเข้าใช้งาน ระดับของสิทธิ์การใช้งาน หรือระดับของขอบเขตของฐานข้อมูลที่ให้ใช้งาน การป้องกันการบุกรุกเป็นสิ่งที่ควรปฏิบัติ แต่ผู้ดูแลจะต้องตรวจสอบการละเมิดความปลอดภัยด้วย นำกระบวนการเข้ารหัสมาใช้งานหากเป็นไปได้ กำหนดนโยบายและขั้นตอนปฏิบัติด้านความปลอดภัยที่ชัดเจน รัดกุม การสร้างความปลอดภัยให้กับฐานข้อมูลจะต้องตั้งอยู่บนพื้นฐานต่อไปนี้ คือ ความลับและความปลอดภัย: ข้อมูลจะต้องไปถูกเปิดเผยต่อผู้ที่ไม่ได้รับสิทธิ์ในการเข้าถึง ความถูกต้อง ความสมบูรณ์และการตรวจสอบตัวตนผู้ใช้งาน: ข้อมูลจะต้องไม่ถูกแก้ไขหรือยักยอกทั้งโดยเจตนาร้ายหรือโดยไม่เจตนาก็ตาม นอกจากนั้น จะต้องพิสูจน์ได้ว่าต้นทางของข้อมูลมาจากที่ใดหรือใคร ความพร้อมใช้และความสามารถในการกู้คืน: ระบบฐานข้อมูลจะต้องถูกปกป้องให้พร้อมใช้งานได้ตลอดเวลา รวมถึงจะต้องกู้คืนได้หากข้อมูลสูญหาย นอกจากนั้น การสร้างความปลอดภัยให้กับฐานข้อมูลจำเป็นต้องมั่นใจว่าได้มีการป้องกันถึงระดับลึก ได้แก่ การสร้างความปลอดภัยให้กับเครือข่าย ซึ่งอาจทำได้โดยการป้องกันที่ไฟร์วอลล์ เราเตอร์ ระบบตรวจจับผู้บุกรุก (IDS) และการสร้างความปลอดภัยให้กับระบบปฏิบัติการ เพื่อให้แน่ใจได้ว่าการเข้าถึงฐานข้อมูลโดยไม่ได้รับอนุญาตจะไม่เป็นผลมาจากการกำหนดค่าที่ผิดพลาดให้กับระบบปฏิบัติการและอุปกรณ์เหล่านั้น หลักการสำคัญในการสร้างความปลอดภัยให้กับฐานข้อมูลนั้น ผู้ดูแลระบบควรจะคำนึงถึงองค์ประกอบต่อไปนี้ เพื่อนำไปพิจารณาประยุกต์ใช้กับระบบฐานข้อมูลของตนเองตามความเหมาะสม การตรวจสอบตัวตนผู้ใช้งาน จะต้องมั่นใจว่ามีการตรวจสอบตัวตนของผู้ใช้งานทุกคนที่ติดต่อกับฐานข้อมูล ในระดับต่ำสุดคือการนำเอารหัสผ่านมาใช้งานสำหรับทุกการติดต่อ ซึ่งรหัสผ่านเหล่านี้จะต้องได้รับการเก็บรักษาอย่างปลอดภัยในฐานข้อมูลและถูกเข้ารหัสอย่างเหมาะสม ควรมีข้อกำหนดนเรื่องการใช้งานรหัสผ่าน ได้แก่ กำหนดความยาวขั้นต่ำของรหัสผ่านที่ใช้ กำหนดว่ารหัสผ่านจะต้องประกอบด้วยตัวอักษรหรือตัวเลขรวมกับอักขระพิเศษ และไม่ให้ใช้งานรหัสผ่านที่เดาได้ง่าย เป็นต้น การควบคุมการเข้าถึงออบเจ็กต์ใดๆ และการตรวจสอบแอพลิเคชันที่อนุญาตให้ใช้งาน ออบเจ็กต์ของฐานข้อมูลประกอบด้วย ตาราง ซินโนนีมม์ (synonymn) วิว (view) อินเด็กซ์ (index) สตอร์โพรซีเจอร์ (store procedure) และทริกเกอร์ (trigger) ซึ่งสามารถควบคุมการอนุญาตให้เข้าถึงออบเจ็กต์เหล่านี้ได้โดยกำหนดไว้ที่สิทธิ์การใช้งานฐานข้อมูล ซึ่งควรได้รับการกำหนดตั้งแต่ขั้นตอนของการออกแบบ ทั้งนี้ผู้ดูแลฐานข้อมูลหรือผู้ออกแบบฐานข้อมูลจะต้องคำนึงถึงหลักการที่จะให้สิทธิ์แก่ผู้ใช้งานแต่ละคนให้น้อยที่สุดเท่าที่จะเป็นไปได้ การควบคุมการเข้าถึงออบเจ็กต์เหล่านี้ มีวิธีการที่แตกต่างกันตามแต่ละชนิดของออบเจ็กต์ เช่น การใช้ซินโนนีมม์จะช่วยให้การอ้างถึงแต่ละตารางในฐานข้อมูลสามารถทำได้โดยไม่จำเป็นต้องทราบว่าเจ้าของตารางดังกล่าวคือใคร เป็นการซ่อนโครงสร้างของฐานข้อมูลจากผู้ใช้งานโดยที่ผู้ดูแลยังสามารถตรวจสอบได้ว่าใครมาใช้ตารางใดในฐานข้อมูลบ้าง การสร้างความปลอดภัยให้กับออบเจ็กต์วิว ทำได้โดยการควบคุมการเข้าถึงในระดับแถวและคอลัมน์ก่อนที่แต่ละตารางจะถูกนำมารวมไว้ด้วยกัน เป็นต้น หรือหากใช้งานสถาปัตยกรรม 3-tier ซึ่งมีแอพลิเคชันเซิร์ฟเวอร์ทำหน้าที่รอรับการเรียกใช้งานแอพลิเคชันทั้งหมดจากเครื่องขอเข้าใช้บริการและติดต่อกับฐานข้อมูล จำเป็นต้องกำหนดให้เครื่องขอใช้งานแสดงตัวตนกับเครื่องแอพลิเคชันเซิร์ฟเวอร์ และให้แอพลิเคชันเซิร์ฟเวอร์แสดงตัวตนกันกับฐานข้อมูลก่อนจึงจะอนุญาตให้เข้าใช้งานตามต้องการได้ นโยบายและขั้นตอนปฏิบัติในการดูแลระบบ ต้องกำหนดนโบายที่ชัดเจนเกี่ยวกับการใช้งานและการดูแลระบบ พร้อมทั้งกำหนดขั้นตอนปฏิบัติต่างๆ มาบังคับใช้ตามนโยบายดังกล่าวเป็นลายลักษณ์อักษร โดยแสดงรายละเอียดถึงข้อบังคับด้านความปลอดภัยและการบริหารความเสี่ยง ภายในต้องประกอบด้วยมาตรฐานการใช้งานบัญชีรายชื่อผู้ใช้ รหัสผ่าน กฎและออบเจ็กต์ รวมถึงการตรวจสอบและการบันทึกล็อก การใช้งานค่า configuration เริ่มต้นที่ปลอดภัย ฐานข้อมูลบางชนิดจะมีชื่อผู้ใช้และรหัสผ่านที่กำหนดไว้เป็นค่าดีฟอลต์เริ่มต้น ซึ่งเป็นที่ทราบกันดีในกลุ่มผู้ใช้ ค่าดังกล่าวนี้ทำให้ผู้ที่ทราบสามารถเข้าถึงฐานข้อมูลได้ในหลายระดับ ดังนั้นผู้ดูแลจึงควรยกเลิกหรือเปลี่ยนแปลงค่ารหัสผ่านทันทีหลังจากเข้าใช้งานครั้งแรก นอกจากนั้น ไฟล์ที่เกี่ยวข้องกับการทำงานของระบบฐานข้อมูลจะต้องได้รับการจำกัดการเข้าถึง ทั้งเพื่ออ่าน เขียนหรือเรียกใช้งานจากผู้ไม่เกี่ยวข้อง เพื่อที่ผู้บุกรุกจะไม่สามารถเปลี่ยนแปลงค่าการทำงานใดๆ ได้ สิ่งที่สำคัญที่สุดก็คือ ผู้ดูแลระบบจะต้องปรับแต่งค่าการทำงานให้เหมาะสมกับระบบและการใช้งานของตน การตรวจสอบการทำงาน การตรวจสอบการทำงานของฐานข้อมูลช่วยให้ผู้ดูแลสามารถตรวจจับกิจกรรมที่เกิดขึ้นโดยไม่ได้รับอนุญาตหรือกิจกรรมที่มีจุดประสงค์ร้าย กิจกรรมที่ควรได้รับการตรวจสอบระบบประกอบด้วย ความพยามยามในการติดต่อฐานข้อมูลที่ไม่ประสบความสำเร็จ การเปิดและปิดฐานข้อมูล การเรียกดู การแก้ไขและการลบข้อมูลออกจากตาราง การสร้างและการลบออบเจ็กต์ การเรียกใช้งานโปรแกรม ผู้ดูแลควรจัดเก็บข้อมูลเหล่านี้ไว้ในรูปของไฟล์ล็อกหรือฐานข้อมูลล็อก ซึ่งข้อมูลที่ควรเก็บบันทึกในล็อกประกอบด้วย ใครเป็นผู้สร้างข้อมูล ใครเป็นผู้แก้ไขข้อมูล และข้อมูลใดที่ถูกเปลี่ยนแปลงแก้ไข เป็นต้น แผนการสำรองข้อมูลและการกู้คืนระบบ ความเสียหายของฐานข้อมูล การถูกทำลายโดยอุบัติเหตุ และกิจกรรมที่เกิดขึ้นโดยไม่ได้รับอนุญาตหรือมีจุดประสงค์ร้ายต่อฐานข้อมูล อาจนำไปสู่ความเสียหายอย่างรุนแรงของฐานข้อมูล หากขาดแผนการสำรองข้อมูลที่เหมาะสม กระบวนการสำรองข้อมูลและการกู้คืนระบบควรจะได้รับการทดสอบในช่วงเวลาปกติ และการเก็บข้อมูลสำรองไว้ภายนอกองค์กรจะช่วยให้การกู้คืนข้อมูลจากความเสียหายทำได้รวดเร็ว กระบวนการสำรองข้อมูลควรจะได้รับการทดสอบให้มั่นใจว่า พนักงานเกิดความเชื่อมั่นต่อวิธีการกู้คืนข้อมูล แผนการสำรองข้อมูลและการกู้คืนระบบได้รับการวิเคราะห์ตรวจสอบอย่างเหมาะสม ผู้ดูแลสามารถอ่านข้อมูลจากเทปสำรองข้อมูลโดยใช้ไดรฟ์อื่นต่างหากจากที่ใช้ในการเขียนข้อมูลได้ นอกจากนั้น แผนการสำรองข้อมูลจะต้องกำหนดถึงวิธีการในการสำรองข้อมูล ซึ่งมีทางเลือกให้ใช้งานได้หลายรูปแบบ ได้แก่ การสำรองข้อมูลแบบ cold คือการสำรองข้อมูลในขณะที่ไม่มีการใช้งานฐานข้อมูล การสำรองข้อมูลแบบ hot คือการสำรองข้อมูลในขณะที่ฐานข้อมูลถูกใช้งาน การสำรองข้อมูลแบบ logical คือการสำรองข้อมูลในช่วงเวลาใดช่วงเวลาหนึ่ง ในขณะที่ฐานข้อมูลถูกใช้งาน การสร้างความปลอดภัยให้โปรแกรม MySQL ผู้ดูแลระบบที่ใช้งานโปรแกรม MySQL เป็นฐานข้อมูลในเครื่องให้บริการใดๆ จำเป็นต้องทราบถึงวิธีการสร้างความปลอดภัยให้กับโปรแกรม MySQL ที่ใช้งาน เนื่องจากการใช้งานฐานข้อมูลทำให้เกิดความเสี่ยงต่อความปลอดภัยของเครื่องตามที่ได้อธิบายแล้วข้างต้น สำหรับหัวข้อนี้จะแสดงรายละเอียดถึงวิธีการในการสร้างความปลอดภัยให้โปรแกรม MySQL บนระบบปฏิบัติการ Red Hat Linux โดยเฉพาะ หากผู้ดูแลระบบติดตั้งโปรแกรม MySQL โดยเลือกติดตั้งในขณะที่ติดตั้งระบบปฏิบัติการ หรือติดตั้งโดยใช้แพ็คเกจชนิด RPM จะมีข้อดีคือ ผู้ดูแลระบบจะสามารถใช้โปรแกรม up2date (ตามที่ได้อธิบายไว้ในบทก่อนหน้านี้) ในการตรวจสอบแก้ไขช่องโหว่ที่เกิดขึ้นกับโปรแกรมได้ ในทางตรงกันข้าม หากผู้ดูแลระบบเลือกติดตั้งโปรแกรมโดยคอมไพล์จากไฟล์ต้นฉบับด้วยตนเอง จะมีข้อดีคือโปรแกรม MySQL ที่ได้จะมีความยืดหยุ่นมากกว่า ผู้ดูแลระบบสามารถเลือกออปชันและไลบรารี่ที่จะใช้งานได้ตามต้องการมากกว่า อย่างไรก็ตาม ไม่มีออปชันใดๆ เกี่ยวข้องกับการสร้างความปลอดภัยที่ควรได้รับการพิจารณาเป็นพิเศษในการติดตั้งโปรแกรม MySQL โดยการคอมไพล์จากไฟล์ต้นฉบับ จึงไม่นำมาอธิบายในที่นี้ สำหรับผู้ดูแลระบบที่ต้องการดาวน์โหลดโปรแกรม MySQL หรือตรวจสอบเวอร์ชันของโปรแกรม MySQL ที่จะใช้งาน สามารถหาข้อมูลได้ที่ http://www.mysql.com/downloads/index.html ก่อนที่จะอธิบายถึงวิธีการสร้างความปลอดภัยให้โปรแกรม MySQL จะขออธิบายถึงการทำงานของโปรแกรม MySQL สักเล็กน้อย โปรแกรม MySQL ทำงานเป็นฐานข้อมูลและระบบจัดการฐานข้อมูลบนเครื่องให้บริการ โดยเปิดให้ผู้ใช้งานติดต่อฐานข้อมูลผ่านพอร์ต 3306 บนโพรโตคอล TCP ของเครื่องให้บริการ (ค่าดีฟอลต์ของโปรแกรม) หลังจากที่สั่งให้โปรแกรม MySQL เริ่มต้นทำงานจะเกิดการสร้างเดมอนชื่อ mysqld ไว้รอรับการติดต่อ ซึ่งการใช้งานฐานข้อมูลทำได้ 2 วิธีคือ การเข้าใช้ฐานข้อมูลโดยตรงผ่านโปรแกรม mysql และการใช้งานผ่านโปรแกรมที่เขียนขึ้นเพื่อใช้ติดต่อฐานข้อมูล เช่น โปรแกรมที่ถูกเขียนขึ้นด้วยภาษา PHP เป็นต้น ผู้ที่จะเข้าใช้งานฐานข้อมูลได้จะต้องได้รับการตรวจสอบสิทธิ์และพิสูจน์ตัวตนผู้ใช้ ซึ่งบัญชีรายชื่อผู้ใช้ของโปรแกรม MySQL นี้แยกจากบัญชีผู้ใช้งานของระบบโดยเด็ดขาด ไม่มีความเกี่ยวข้องกันแต่อย่างใด โดยจะถูกจัดเก็บและจัดการผ่านฐานข้อมูลของ MySQL ที่ใช้งาน นอกจากนั้น ผู้ดูแลระบบควรจะสร้างผู้ใช้งานในระบบชื่อ mysql และกลุ่มผู้ใช้ชื่อ mysql มารองรับการทำงานของโปรแกรม MySQL ซึ่งจะอธิบายถึงการนำไปใช้ในลำดับต่อไป วิธีการสร้างความปลอดภัยให้กับโปรแกรม MySQL ทำได้ในหลายระดับ ซึ่งผู้ดูแลระบบสามารถเลือกนำไปปฏิบัติได้ตามรูปแบบและจุดประสงค์การใช้งาน แบ่งเป็นส่วนๆ ได้ดังนี้ การเริ่มต้นใช้งาน และการเรียกใช้งานโปรแกรม MySQL ระบบและวิธีการตรวจสอบสิทธิ์ของโปรแกรม MySQL ไฟล์ล็อกของโปรแกรม MySQL การจัดการเกี่ยวกับเจ้าของไฟล์ที่เกี่ยวข้องกับโปรแกรม MySQL ในระบบปฏิบัติการ ข้อควรระวังที่เกี่ยวข้องกับความปลอดภัยของโปรแกรม MySQL ซึ่งจะได้อธิบายแต่ละหัวข้อโดยละเอียดในลำดับต่อไป การเริ่มต้นใช้งาน และการเรียกใช้งานโปรแกรม MySQL หลังจากที่ผู้ดูแลระบบติดตั้งโปรแกรม MySQL แล้ว ผู้ดูแลระบบจะต้องสั่งให้โปรแกรม MySQL สร้างฐานข้อมูลเริ่มต้นโดยใช้คำสั่ง # ./mysql_install_db ทำให้เกิดการสร้างฐานข้อมูล 2 ฐานข้อมูล คือ mysql และ test การสั่งให้โปรแกรม MySQL เริ่มต้นทำงานทำได้โดยการสั่ง # ./safe_mysqld –user=mysql & (คำสั่ง safe_mysqld อยู่ในไดเรกทอรี /path_to_mysql/bin/) ซึ่งจะทำให้เกิดการสร้างเดมอนชื่อ mysqld ไว้รอรับการติดต่อที่พอร์ต 3306/TCP ของเครื่อง การกำหนดออปชัน –user=mysql เป็นการกำหนดชื่อเจ้าของโพรเซสชนิดเดมอนชื่อ mysqld ที่จะถูกสร้างขึ้น ซึ่งเจ้าของโพรเซสนี้จะต้องได้รับสิทธิ์ในการเข้าใช้งานไฟล์และไดเรกทอรีของฐานข้อมูล หากไม่กำหนดโพรเซสดังกล่าวจะเป็นของผู้ดูแลระบบ ซึ่งทำให้ความปลอดภัยของระบบลดลง สิ่งแรกที่ผู้ดูแลระบบต้องดำเนินการคือ การกำหนดรหัสผ่านให้กับผู้ดูแลฐานข้อมูล (root) ซึ่งผู้ดูแลฐานข้อมูลนี้จะเป็นผู้จัดการทั้งหมดเกี่ยวกับฐานข้อมูล ได้รับสิทธิ์ให้กระทำการใดๆ ก็ได้กับฐานข้อมูลที่จะมีต่อไป เช่น การสร้างบัญชีชื่อผู้ใช้รายอื่นๆ การสร้างฐานข้อมูลใหม่ และการให้สิทธิ์การใช้งานฐานข้อมูลแก่ผู้ใช้ เป็นต้น เนื่องจากโปรแกรม MySQL ไม่ได้กำหนดค่าดีฟอลต์ของรหัสผ่านของผู้ดูแลฐานข้อมูล นั่นคือ หลังจากที่ติดตั้งโปรแกรม MySQL แล้ว ทันที่ที่สั่งให้โปรแกรม MySQL เริ่มทำงาน ใครก็ได้สามารถติดต่อใช้งานฐานข้อมูลมายังเดมอน mysqld ที่รอรับการติดต่อด้วยสิทธิ์ของผู้ดูแลฐานข้อมูลได้ทันทีโดยไม่ต้องใช้รหัสผ่าน การกำหนดรหัสผ่านของผู้ดูแลฐานข้อมูลทำได้โดยใช้คำสั่ง # ./mysqladmin -u root -h [hostname] -p password ‘password ที่ต้องการ’ (คำสั่ง mysqladmin อยู่ในไดเรกทอรี /path_to_mysql/bin/) หลังจากนั้นเมื่อผู้ดูแลฐานข้อมูลเข้าใช้งานฐานข้อมูล จะได้รับข้อความให้ใส่ค่ารหัสผ่านทุกครั้งที่ใช้งานใดๆ เช่น หากผู้ดูแลระบบใช้งานฐานข้อมูลผ่านโปรแกรม mysql จะต้องสั่ง # ./mysql -u root -p และใส่ค่ารหัสผ่าน มิฉะนั้นจะได้รับข้อความเตือนว่า ERROR 1045: Access denied for user: ‘root@localhost’ (Using password: NO) และไม่อนุญาตให้เข้าใช้งาน ระบบและวิธีการตรวจสอบสิทธิ์ของโปรแกรม MySQL เนื่องจากโปรแกรม MySQL ให้ความสำคัญกับการจัดการเกี่ยวกับสิทธิ์ของผู้ใช้ค่อนข้างมาก ผู้ดูแลระบบและ/หรือผู้ดูแลฐานข้อมูลจึงควรมีความเข้าใจเกี่ยวกับระบบการทำงานดังกล่าว ซึ่งได้นำมาอธิบายไว้ในหัวข้อนี้ ประโยชน์ของระบบการตรวจสอบสิทธิ์ของโปรแกรม MySQL คือการพิสูจน์ตัวตนผู้ใช้ที่ติดต่อขอใช้งานฐานข้อมูลว่ามาจากเครื่องปลายทางที่ได้รับอนุญาตหรือไม่ และการใช้งานฐานข้อมูลเป็นไปตามสิทธิ์ที่กำหนด เช่น SELECT, INSERT, UPDATE และ DELETE หรือไม่ มีจุดประสงค์เพื่อให้ผู้ดูแลระบบมั่นใจว่าผู้ใช้งานทุกคนดำเนินการใดๆ กับฐานข้อมูลตามที่ได้รับอนุญาตให้ทำเท่านั้น ซึ่งการที่ผู้ใช้งานแต่ละคนจะเข้าใช้งานฐานข้อมูลจะต้องแสดงตัวว่าติดต่อมาจากเครื่องคอมพิวเตอร์เครื่องใดและใช้ชื่อผู้ใช้คนใด กระบวนการตรวจสอบสิทธิ์ของโปรแกรม MySQL ประกอบด้วยการตรวจสอบ 2 ขั้นตอนเพื่อควบคุมการเข้าถึง คือ เครื่องให้บริการจะตรวจสอบว่าผู้ใช้ได้รับอนุญาตให้ติดต่อกับฐานข้อมูลหรือไม่ หากได้รับอนุญาต จะตรวจสอบต่อว่าแต่ละคำสั่งที่เรียกใช้งาน เช่น SELECT, INSERT, UPDATE และ DELETE กับออบเจ็กต์ที่ผู้ใช้ต้องการใช้งาน เช่น ฐานข้อมูล ตาราง แถวหรือคอลัมน์ เป็นต้น ตรงกับสิทธิ์ที่ผู้ใช้คนดังกล่าวได้รับอนุญาตให้ใช้งานหรือไม่ จะเห็นได้ว่า การใช้งานฐานข้อมูลจะต้องได้รับการตรวจสอบทั้งในระดับผู้ใช้และสิทธิ์การใช้งานของผู้ใช้แต่ละคน ซึ่งสิทธิ์เหล่านี้ถูกกำหนดโดยผู้ดูแลฐานข้อมูล ดังนั้น การที่ผู้ดูแลฐานข้อมูลจะเพิ่มรายชื่อผู้ใช้งานฐานข้อมูลแต่ละคน ผู้ดูแลฐานข้อมูลจำเป็นจะต้องกำหนดรายละเอียดเหล่านี้ให้ชัดเจน สามารถทำได้ 2 วิธี ดังนี้ ใช้คำสั๋ง GRANT เพื่อกำหนดว่าจะอนุญาตให้ผู้ใช้งานชื่อใดจากเครื่องคอมพิวเตอร์เครื่องใด ติดต่อเข้ามาใช้งานออบเจ็กต์ใดๆ ในฐานข้อมูลได้บ้าง มีรูปแบบคำสั่งดังนี้ GRANT priv_type [(column_list)] [, priv_type [(column_list)] …] ON {tbl_name | * | . | db_name.*} TO user_name [IDENTIFIED BY [PASSWORD] ‘password’] [, user_name [IDENTIFIED BY ‘password’] …] [REQUIRE [{SSL | X509}] [CIPHER cipher [AND]] [ISSUER issuer [AND]] [SUBJECT subject]] [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # | MAX_UPDATES_PER_HOUR # | MAX_CONNECTIONS_PER_HOUR #]] GRANT เป็นคำสั่งที่ใช้ในการกำหนดสิทธิ์ของผู้ใช้แต่ละคนที่จะเข้าใช้งานฐานข้อมูล โดยข้อมูลที่ผู้ขอใช้ต้องแสดงต่อฐานข้อมูลคือ ชื่อผู้ใช้และเครื่องปลายทางของ หลังจากที่เดมอน mysqld ตรวจสอบข้อมูลทั้งสองแล้วพบว่าผู้ใช้คนดังกล่าวได้รับสิทธิ์ให้ใช้งานฐานข้อมูล เดมอน mysqld จะเปิดให้ผู้ใช้ส่งคำสั่งต่างๆ มาทำการ SELECT, INSERT, DELETE หรือ UPDATE ข้อมูลในฐานข้อมูล ทุกครั้งที่เดมอน mysqld ได้รับคำสั่งใดๆ จากผู้ใช้ก็จะนำคำสั่งนั้นมาเปรียบเทียบกับข้อมูลสิทธิ์ที่ได้กำหนดไว้ว่าผู้ใช้คนดังกล่าว ได้รับสิทธิ์ในการใช้งานคำสั่งนั้นกับออบเจ็กต์นั้นหรือไม่ คำสั่ง GRANT จะเป็นตัวกำหนดว่า จะอนุญาตให้ผู้ใช้ (user_name) ใช้งานฟิลด์ใด (column_list) ของตาราง (tbl_name) หรือฐานข้อมูลใด (db_name) (อาจอ้างถึงโดยกำหนดเป็น * เพื่อแทนตารางทั้งหมด) ด้วยคำสั่งใดได้บ้าง (priv_type) ส่วนที่เหลือคือออปชันอื่นๆ ที่ผู้ดูแลสามารถปรับใช้งานได้ตามต้องการ หากผู้ดูแลฐานข้อมูลต้องการยกเลิกการให้สิทธิ์ที่ได้กำหนดไปแล้วด้วยคำสั่ง GRANT สามารถทำได้โดยใช้คำสั่ง REVOKE มีรูปแบบคำสั่งดังนี้ REVOKE priv_type [(column_list)] [, priv_type [(column_list)] …] ON {tbl_name | * | . | db_name.*} FROM user_name [, user_name …] วิธีการนี้เป็นวิธีการที่นิยมใช้งานมากกว่าวิธีการที่สองซึ่งจะกล่าวถึงต่อไป เนื่องจากมีความชัดเจนและมีโอกาสเกิดข้อผิดพลาดได้น้อยกว่า ผู้ดูแลระบบและ/หรือผู้ดูแลจึงควรทำความเข้าใจ และนำคำสั่งทั้ง GRANT และ REVOKE นี้ไปใช้งานเพื่อจัดการกับสิทธิ์ของผู้ใช้งานฐานข้อมูล รายละเอียดเพิ่มเติมเกี่ยวกับคำสั่ง GRANT และ REVOKE สามารถศึกษาได้จาก MySQL Manual | 4.3.1 GRANT and REVOKE Syntax (http://www.mysql.com/doc/G/R/GRANT.html) แก้ไขตาราง grant ของโปรแกรม MySQL โดยตรง ทำได้โดยการ INSERT ข้อมูลและสิทธิ์ของผู้ใช้คนใหม่ลงในตาราง user ซึ่งผู้ที่จะแก้ไขตารางนี้ได้คือผู้ดูแลฐานข้อมูล (root ของฐานข้อมูล) เท่านั้น อย่างไรก็ตาม วิธีดังกล่าวนี้มีความยุ่งยากซับซ้อน และต้องอาศัยความรอบคอบของผู้ดูแลฐานข้อมูล จึงไม่นำมาอธิบายในที่นี้ หากต้องการทราบวิธีการสามารถศึกษาได้ที่ MySQL Manual | 4.3.5 Adding New Users to MySQL (http://www.mysql.com/doc/A/d/Adding_users.html) ไฟล์ล็อกของโปรแกรม mysql โปรแกรม MySQL มีไฟล์ล็อกที่ใช้เก็บบันทึกเหตุการณ์ที่เกิดอยู่หลายไฟล์ ผู้ดูแลระบบและ/หรือผู้ดูแลฐานข้อมูลควรจะมีความเข้าใจเกี่ยวกับไฟล์เหล่านั้น ว่าไฟล์ใดใช้เก็บค่าล็อกที่มีสาเหตุจากอะไร โดยไฟล์ทั้งหมดถูกเก็บไว้ในไดเรกทอรีที่เก็บไฟล์ฐานข้อมูล เช่น /path_to_mysql/var เป็นต้น ไฟล์ล็อกดังกล่าวประกอบด้วย ไฟล์ล็อกของ error เก็บบันทึกปัญหาที่เกิดขึ้นขณะเริ่มทำงาน ขณะใช้งาน หรือการหยุดทำงานของเดมอน mysqld เดมอน mysqld จะบันทึกข้อผิดพลาดทั้งหมดที่เกิดไว้ และให้สคริปต์ safe_mysqld ทำหน้าที่ส่งต่อข้อความไปยังไฟล์ชื่อ ‘hostname’.err ไฟล์ล็อกของ isam เก็บบันทึกการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นกับตาราง ISAM ใช้ประโยชน์ในการดีบักโค้ดของ isam ไฟล์ล็อกของการ query เก็บบันทึกการสร้างการติดต่อและการเรียกใช้ข้อมูล ใช้ในกรณีที่ผู้ดูแลระบบต้องการทราบว่ามีการทำงานใดเกิดอะไรขึ้นกับเดมอน mysqld บ้าง ผู้ดูแลระบบต้องเพิ่มออปชัน –log[=file] ในการสั่งให้โปรแกรม MySQL เริ่มทำงาน โดยค่าดีฟอลต์คือไฟล์ ‘hostname’.log ข้อมูลที่บันทึกในไฟล์ดังกล่าวประกอบด้วยการติดต่อทั้งหมดและการเรียกใช้ข้อมูลในฐานข้อมูล เหมาะสำหรับการใช้เพื่อตรวจสอบแหล่งที่มาของข้อมูลที่ผิดพลาดว่ามาจากที่ใดหรือผู้ใช้คนใด ไฟล์ล็อกของการ update เก็บบันทึกคำสั่งทั้งหมดที่ถูกใช้งานในส่วนเกี่ยวข้องกับการแก้ไขข้อมูลในฐานข้อมูล หากผู้ดูแลระบบสั่งให้โปรแกรม MySQL เริ่มทำงานโดยเพิ่มออปชัน –log-update[=file_name] จะทำให้เดมอน mysqld เก็บบันทึกคำสั่งภาษา SQL ทั้งหมดที่ถูกเรียกใช้งานในการอัพเดตข้อมูล ค่าดีฟอลต์ของไฟล์ที่เก็บล็อกคือ ‘hostname’.### ไฟล์ล็อกของ binary เก็บบันทึกคำสั่งทั้งหมดที่ถูกใช้งานที่เกี่ยวข้องกับการเปลี่ยนแปลงแก้ไขค่าใดๆ ใช้ประโยชน์ในการจำลองเหตุการณ์ทั้งหมดที่เกิดขึ้น ไฟล์ ล็อกชนิดนี้จะเก็บข้อมูลทั้งหมดที่เก็บในไฟล์ล็อกของการ update ที่กล่าวถึงก่อนหน้านี้ในรูปแบบที่มีประสิทธิภาพมากกว่า เช่น มีการบันทึกค่าระยะเวลาในการเรียกใช้ข้อมูลในการอัพเดตฐานข้อมูลด้วย จึงขอแนะนำให้ผู้ดูแลระบบเลือกใช้ไฟล์ล็อกแบบนี้แทนไฟล์ล็อกของการ update ทำได้โดยการเพิ่มออปชัน –log-bin[=file_name] ในการสั่งให้โปรแกรม MySQL เริ่มทำงาน ค่าดีฟอลต์ของไฟล์ที่เก็บล็อกชนิดนี้คือ ‘hostname’-bin ไฟล์ล็อกของ slow เก็บบันทึกการเรียกใช้ข้อมูลที่ใช้เวลาในการเรียกใช้มากกว่าค่าที่กำหนดในตัวแปร long_query_time การเพิ่มออปชัน –low-slow-queries[=file_name] ในขณะที่สั่งให้โปรแกรม MySQL เริ่มทำงานเป็นการกำหนดให้มีการบันทึกล็อกชนิดนี้ ค่าดีฟอลต์ของไฟล์ที่เก็บล็อกคือ ‘hostname’-slow.log การจัดการกับไฟล์ล็อกของโปรแกรม MySQL มีวิธีการคล้ายคลึงกับไฟล์ล็อกอื่นๆ ผู้ดูแลระบบจะต้องคอยตรวจสอบขนาดของไฟล์ที่เกิดขึ้น และหมุนวนไฟล์ที่ใช้เก็บล็อก สำหรับระบบปฏิบัติการ Red Hat Linux หากผู้ดูแลระบบติดตั้งโปรแกรม MySQL โดยใช้แพ็คเกจชนิด RPM จะทำให้สามารถใช้งานสคริปต์ชื่อ mysql-log-rotate ในการหมุนวนไฟล์ล็อก การจัดการเกี่ยวกับเจ้าของไฟล์ที่เกี่ยวข้องกับโปรแกรม MySQL ในระบบปฏิบัติการ สิ่งสำคัญอีกประการหนึ่งเกี่ยวกับการสร้างความปลอดภัยให้กับโปรแกรม MySQL คือการแก้ไขชื่อเจ้าของไฟล์และไดเรกทอรีที่เกี่ยวข้องกับโปรแกรม MySQL ซึ่งตามปกติแล้ว ไฟล์และไดเรกทอรีทั้งหมดจะถูกเก็บไว้ในไดเรกทอรี /path_to_mysql/ ตามที่ผู้ดูแลระบบหรือโปรแกรม MySQL กำหนดในขณะติดตั้ง ประกอบด้วยไดเรกทอรีย่อยที่สำคัญดังต่อไปนี้ / คือไดเรกทอรีที่ติดตั้งโปรแกรม MySQL ทั้งหมด เช่น /usr/local/mysql ทั้งหมด bin (/path_to_mysql/bin) คือไดเรกทอรีเก็บไฟล์คำสั่งที่เกี่ยวข้องกับโปรแกรม MySQL เช่น mysql, mysqlaccess และ safe_mysqld เป็นต้น var (/path_to_mysql/var) คือไดเรกทอรีเก็บไฟล์ของฐานข้อมูลของโปรแกรม MySQL ทั้งหมด และไฟล์ล็อกของโปรแกรม MySQL ผู้ดูแลระบบควรปรับแก้ชื่อเจ้าของไฟล์และไดเรกทอรีที่เกี่ยวข้อง รวมถึงสิทธิ์การเข้าใช้งานโปรแกรม MySQL ดังนี้ /usr/local/ drwxr-xr-x 12 root mysql 4096 Jul 20 17:48 mysql/ /usr/local/mysql/ drwxr-x— 2 root mysql 4096 Jul 19 14:43 bin/ drwx—— 4 mysql mysql 4096 Jul 20 18:32 var/ จะเห็นได้ว่าไดเรกทอรีที่เก็บไฟล์ของฐานข้อมูล MySQL ถูกกำหนดให้เป็นของผู้ใช้ในระบบชื่อ mysql และจำกัดสิทธิ์การใช้งานให้เฉพาะผู้ใช้ชื่อ mysql เท่านั้นจึงจะเข้าถึงไฟล์ได้ เพื่อให้ผู้ใช้คนอื่นไม่สามารถดำเนินการใดๆ กับไฟล์เหล่านั้นได้ ยกเว้นผู้ใช้ชื่อ mysql ซึ่งเป็นเจ้าของเดมอน mysqld เท่านั้น ข้อควรระวังที่เกี่ยวข้องกับความปลอดภัยของโปรแกรม MySQL การใช้งานโปรแกรม MySQL ให้มีความปลอดภัยนั้น ผู้ดูแลจะต้องพิจารณาถึงวิธีการที่ผู้ใช้หรือผู้อื่นๆ จะเข้าถึงข้อมูลต่างๆ ในฐานข้อมูล และจำกัดสิทธิ์การใช้งานของผู้ที่จะเข้าใช้งานให้ได้รับสิทธิ์ให้น้อยที่สุดเท่าที่จะเป็นไปได้เท่าที่จำเป็นต่อการใช้งานเท่านั้น มีข้อควรระวังดังต่อไปนี้ นอกจากผู้ดูแลฐานข้อมูล (root ของโปรแกรม MySQL) ไม่ควรให้ผู้ใช้งานคนอื่นๆ เข้าถึงตาราง user ของฐานข้อมูล ซึ่งเป็นตารางที่เก็บรายชื่อผู้ใช้และรหัสผ่านที่จะเข้าใช้งานฐานข้อมูล เนื่องจากผู้ที่เข้าถึงตารางดังกล่าวนี้ในฐานข้อมูลได้จะสามารถอ่านข้อมูลรายชื่อผู้เข้าใช้งานและรหัสผ่านทั้งหมดได้ทันที โดยไม่จำเป็นต้องถอดรหัส ทั้งนี้ ถึงแม้ว่าไฟล์ของฐานข้อมูลดังกล่าวถูกเก็บในรูปแบบที่ได้รับการเข้ารหัสก็ตาม ผู้ดูแลฐานข้อมูลควรศึกษาถึงระบบการให้สิทธิ์การเข้าถึงฐานข้อมูลโดยละเอียด โดยเฉพาะอย่างยิ่งวิธีการใช้งานคำสั่ง GRANT และ REVOKE ในการให้สิทธิ์และเพิกถอนสิทธิ์ของผู้ใช้ และไม่ควรให้สิทธิ์แก่ผู้ใช้เกินกว่าความจำเป็น ควรทดสอบว่า สามารถใช้งานโดยให้สิทธิ์ของผู้ดูแลฐานข้อมูลโดยไม่ต้องใส่รหัสผ่านได้หรือไม่ โดยสั่ง # ./mysql -u root ถ้าไม่ได้จะต้องปรากฏข้อความตามที่ได้แสดงไว้ในหัวข้อด้านบน ตรวจสอบการให้สิทธิ์โดยใช้คำสั่ง SHOW GRANTS (mysql> SHOW GRANT FOR user@host) ว่าการให้สิทธิ์เป็นไปตามที่ต้องการหรือไม่ รหัสผ่านที่ใช้งานจะต้องเป็นรหัสผ่านที่ดี และการเก็บค่ารหัสผ่านจะต้องได้รับการเข้ารหัส หากอนุญาตให้ผู้ใช้ภายนอกเข้าใช้งานฐานข้อมูลได้ เช่น การใช้งานผ่านเว็บ ซึ่งอนุญาตให้ผู้ใช้ป้อนข้อมูลลงในฐานข้อมูล ผู้ดูแลระบบจะต้องตรวจสอบโปรแกรมที่ใช้เข้าถึงฐานข้อมูลอย่างละเอียด การใช้งานค่าตัวแปรใดๆ กับฐานข้อมูลควรได้รับการกำหนดค่าอย่างชัดเจนเพื่อป้องกันการโจมตี เช่น ใช้คำสั่ง mysql> SELECT * FROM table WHERE ID=’234’ ดีกว่า mysql> SELECT * FROM table WHERE ID=234 และต้องทดสอบการใช้งานในกรณีดังต่อไปนี้ ในกรณีที่ใช้งานผ่านแอพลิเคชันของเว็บ ทดลองใส่ค่า ` ‘ ‘ และ ` “ ‘ เพื่อทดสอบหาความผิดพลาดที่อาจเกิดขึ้น ทดลองแก้ไขค่า URL ที่ใช้งาน โดยใส่ค่า %22 ( " '), %23 ( # ‘) และ %27 (` ‘ ‘) ทดลองแก้ไขค่า URL โดยการป้อนค่าตามข้อก่อนหน้านี้แต่ใช้ค่าอักขระแทนตัวเลข ทดลองใส่ค่าอักขระ ช่องว่าง หรือสัญลักษณ์พิเศษแทนการใส่ค่าตัวเลขในช่องที่กำหนดให้ใส่เฉพาะตัวเลข ซึ่งแอพลิเคชันดังกล่าวจะต้องไม่ส่งค่าเข้าไปยังฐานข้อมูล เพื่อความปลอดภัยของฐานข้อมูล ตรวจสอบขนาดของข้อมูลก่อนที่จะส่งไปยังฐานข้อมูล เพื่อหลีกเลี่ยงการถูกโจมตีโดยวิธี Denial of Service (DoS) กำหนดชื่อผู้ใช้ฐานข้อมูลที่ใช้งานผ่านแอพลิเคชันให้แตกต่างจากผู้ใช้ที่จะจัดการฐานข้อมูล และกำหนดให้ได้รับสิทธิ์เท่าที่จำเป็นเท่านั้น ในกรณีที่ใช้งานผ่าน PHP ยกเลิกการใช้งานฟังก์ชัน addslashes ( ) และ mysql_escape_string ( ) ถ้า |