เว็บแอปพลิเคชันส่วนใหญ่ในปัจจุบันต้องการกลยุทธ์ความปลอดภัยขั้นพื้นฐานเป็นอย่างน้อย ตัวอย่างเช่น ไซต์ที่นำเสนอเนื้อหาที่มีการป้องกันด้วยรหัสผ่าน ไซต์ที่มีเพียงแบ็กเอนด์ของผู้ดูแลระบบ บล็อกและนิตยสารส่วนตัว ไซต์อีคอมเมิร์ซ อินทราเน็ตขององค์กร และอื่นๆ
วิธีการออกแบบทั่วไปที่สุดในการสร้างเว็บแอปพลิเคชันประเภทนี้คือการรวมนโยบายความปลอดภัยเข้ากับตรรกะทางธุรกิจของเว็บแอปพลิเคชัน โดยที่แอปพลิเคชันจะกำหนดว่าผู้ใช้มีสิทธิ์ในการเข้าถึงข้อมูลบางอย่างในฐานข้อมูลหรือไม่ ในสถานการณ์สมมตินี้ บทบาทของฐานข้อมูลเป็นเพียงการจัดเก็บข้อมูลและให้บริการเมื่อมีการร้องขอ กล่าวอีกนัยหนึ่ง หากเว็บแอปพลิเคชันสั่งให้ฐานข้อมูลระบุข้อมูลเฉพาะ ฐานข้อมูลจะดำเนินการคำสั่งโดยตรงโดยไม่ตรวจสอบสิทธิ์ของผู้ใช้
ในบทความนี้ คุณจะได้เรียนรู้วิธีใช้ประโยชน์จากคุณสมบัติความปลอดภัยในตัวของ Oracle เพื่อบังคับใช้กฎความปลอดภัยของแอปพลิเคชันในระดับฐานข้อมูล เพื่อปรับปรุงความปลอดภัยโดยรวมของแอปพลิเคชันของคุณ ข้อดีอีกประการหนึ่งคือการรักษาความปลอดภัยการเข้าถึงข้อมูลโดยตรงในฐานข้อมูลไม่เพียงปรับปรุงความปลอดภัยของแอปพลิเคชัน แต่ยังช่วยลดความซับซ้อนอีกด้วย
แล้วความต้องการความปลอดภัยฝั่งฐานข้อมูล
เพื่อควบคุมการเข้าถึงข้อมูลจากเว็บแอปพลิเคชันล่ะ? ในกรณีส่วนใหญ่ จะไม่มีปัญหา นี่เป็นวิธีแก้ปัญหาที่ดี โดยเฉพาะอย่างยิ่งหากข้อมูลที่เกี่ยวข้องไม่มีความสำคัญต่อภารกิจหรือเป็นความลับสุดยอด วิธีการนี้ใช้ในหนังสือและแหล่งข้อมูลออนไลน์หลายเล่ม ในความเป็นจริง หนังสือ PHP/MySQL ยอดนิยมเล่มหนึ่งไม่สนับสนุนการสร้างบัญชีผู้ใช้ฐานข้อมูลมากกว่าหนึ่งบัญชีต่อแอปพลิเคชันอย่างชัดเจน เนื่องจาก "ผู้ใช้เพิ่มเติมหรือการอนุญาตที่ซับซ้อนอาจต้องมีการตรวจสอบเพิ่มเติมก่อนดำเนินการต่อข้อมูล และทำให้ความเร็วในการดำเนินการของ MySQL ช้าลง" นี่เป็นเรื่องจริง อย่างไรก็ตาม มีบางสิ่งที่คุณอาจต้องการพิจารณาก่อนที่จะล้มเลิกแนวคิดในการบูรณาการความปลอดภัยเข้ากับตรรกะฐานข้อมูลของคุณ ลองดูตัวอย่างต่อไปนี้
สมมติว่าคุณสร้างระบบจัดการเนื้อหา (CMS) ฐานข้อมูลถูกใช้เพื่อจัดเก็บเนื้อหาที่เผยแพร่บนเว็บไซต์ ข้อมูลส่วนใหญ่เป็นข้อมูลสาธารณะ อนุญาตให้ผู้ใช้เว็บที่ไม่ระบุชื่อสามารถอ่านข้อมูลได้ มีเพียงผู้แก้ไขเท่านั้นที่ได้รับอนุญาตให้เปลี่ยนแปลงข้อมูล ใช้บัญชีฐานข้อมูลเดียวเพื่อเข้าถึงและแก้ไขบันทึกในฐานข้อมูล และควบคุมความปลอดภัยด้วยโค้ด PHP โดยการป้องกันด้วยรหัสผ่านในการเข้าถึงเพจเฉพาะผู้ดูแลระบบ
หากด้านสาธารณะของแอปพลิเคชันเว็บได้รับผลกระทบจากการโจมตี เช่น การแทรก SQL บนแบบฟอร์มการค้นหาสาธารณะ (นั่นคือ แบบฟอร์มที่ไม่ได้เข้ารหัสเพียงพอ) ผู้บุกรุกอาจสามารถดำเนินการคำสั่ง SQL โดยพลการบนวัตถุฐานข้อมูลที่ บัญชีสาธารณะสามารถเข้าถึงได้ แน่นอน ในกรณีนี้ การรันคำสั่ง SELECT ไม่ก่อให้เกิดปัญหาใหญ่เนื่องจากข้อมูลเป็นแบบสาธารณะ แต่เนื่องจากสิทธิ์สาธารณะและผู้ดูแลระบบใช้บัญชีฐานข้อมูลเดียวกัน ผู้บุกรุกจึงสามารถดำเนินการคำสั่ง UPDATE และ DELETE หรือแม้แต่ลบตารางออกจากฐานข้อมูลได้
เราจะป้องกันสิ่งนี้ไม่ให้เกิดขึ้นได้อย่างไร? วิธีที่ง่ายที่สุดคือการจำกัดสิทธิ์ของบัญชีฐานข้อมูลสาธารณะในการแก้ไขข้อมูลโดยสมบูรณ์ มาดูกันว่า Oracle แก้ปัญหานี้อย่างไร
ภาพรวมพื้นฐานของ Oracle Security
Oracle Database ช่วยให้นักพัฒนาเว็บสามารถควบคุมการเข้าถึงข้อมูลได้หลายวิธี ตั้งแต่การจัดการการเข้าถึงออบเจ็กต์ฐานข้อมูลเฉพาะ เช่น ตาราง มุมมอง และขั้นตอน ไปจนถึงการควบคุมการเข้าถึงข้อมูลในแต่ละแถวหรือคอลัมน์ แน่นอนว่าการอภิปรายเกี่ยวกับคุณลักษณะหรือตัวเลือกด้านความปลอดภัยทั้งหมดที่มีใน Oracle นั้นอยู่นอกเหนือขอบเขตของบทความนี้ ในที่นี้ เราจะไม่ลงรายละเอียดมากเกินไป แต่เฉพาะประเด็นพื้นฐานที่สุดของความปลอดภัยในการเข้าถึงข้อมูลของ Oracle เท่านั้น:
· การตรวจสอบสิทธิ์และบัญชีผู้ใช้ · สิทธิ์ ·
การตรวจสอบสิทธิ์ตามบทบาทและบัญชีผู้ใช้ เช่นเดียวกับฐานข้อมูลอื่นๆ ผู้ใช้แต่ละราย (บัญชีฐานข้อมูล) ที่ร้องขอการเข้าถึง Oracle จะต้องได้รับการรับรองความถูกต้อง การตรวจสอบความถูกต้องสามารถทำได้โดยฐานข้อมูล ระบบปฏิบัติการ หรือบริการเครือข่าย นอกเหนือจากการตรวจสอบสิทธิ์ขั้นพื้นฐาน (การตรวจสอบสิทธิ์ด้วยรหัสผ่าน) แล้ว Oracle ยังสนับสนุนกลไกการตรวจสอบสิทธิ์ที่เข้มงวด เช่น Kerberos, CyberSafe, RADIUS และอื่นๆ
บทบาท. บทบาทของ Oracle คือชุดสิทธิ์ที่มีชื่อ แม้ว่าคุณจะสามารถให้สิทธิ์บัญชีผู้ใช้ได้โดยตรง แต่การใช้บทบาทจะทำให้การจัดการผู้ใช้ง่ายขึ้นอย่างมาก โดยเฉพาะอย่างยิ่งเมื่อคุณต้องการจัดการผู้ใช้จำนวนมาก มีประสิทธิภาพมากในการสร้างบทบาทเล็กๆ ที่สามารถจัดการได้ จากนั้นให้สิทธิ์ผู้ใช้หนึ่งหรือหลายบทบาทตามระดับความปลอดภัยของพวกเขา ไม่ต้องพูดถึงความง่ายในการปรับเปลี่ยนการอนุญาต เพียงแค่แก้ไขบทบาทที่เกี่ยวข้องกับบทบาท แทนที่จะแก้ไขบัญชีผู้ใช้แต่ละบัญชี
เพื่อให้งานเริ่มแรกในการสร้างผู้ใช้ใหม่ง่ายขึ้น Oracle มาพร้อมกับบทบาทที่กำหนดไว้ล่วงหน้าสามบทบาท:
· บทบาทเชื่อมต่อ - บทบาทนี้อนุญาตให้ผู้ใช้เชื่อมต่อกับฐานข้อมูลและดำเนินการขั้นพื้นฐาน เช่น การสร้างตารางของตนเอง ตามค่าเริ่มต้น บทบาทนี้ไม่สามารถเข้าถึงตารางของผู้ใช้รายอื่นได้
·บทบาททรัพยากร - บทบาททรัพยากรคล้ายกับบทบาทเชื่อมต่อ แต่ช่วยให้ผู้ใช้มีสิทธิ์ระบบมากขึ้น เช่น การสร้างทริกเกอร์หรือขั้นตอนการจัดเก็บ
·บทบาท DBA—อนุญาตให้ผู้ใช้มีสิทธิ์ของระบบทั้งหมด
การอนุญาตและการอนุญาตในการใช้งาน
ในส่วนนี้ เราจะหารือถึงวิธีการใช้การอนุญาตและการอนุญาตของ Oracle เพื่อปรับปรุงความปลอดภัยของตัวอย่าง CMS แบบง่ายที่กล่าวถึงในตอนต้นของบทความนี้ สันนิษฐานว่าเนื้อหาที่ให้กับผู้ใช้แอปพลิเคชันนั้นถูกเก็บไว้ในตาราง WEB_CONTENT
ขั้นแรกให้สร้างตาราง เริ่ม Oracle Database Special Edition และเข้าสู่ระบบในฐานะผู้ดูแลระบบ ปล่อยผู้ใช้ HR ตัวอย่าง หากยังไม่ได้เผยแพร่ ทำตามคำแนะนำในคู่มือการเริ่มต้นใช้งานที่มาพร้อมกับการติดตั้ง Special Edition โปรดทราบว่าตามค่าเริ่มต้น ผู้ใช้ HR จะได้รับมอบหมายบทบาททรัพยากร ที่นี่ มอบบทบาท DBA ให้กับผู้ใช้ เพื่อให้บัญชีสามารถใช้จัดการด้านฐานข้อมูลของแอปพลิเคชัน CMS ได้ แน่นอนว่าบัญชีผู้ใช้ HR จะไม่ใช้สำหรับการเข้าถึงออนไลน์ แต่จะใช้สำหรับการดูแลฐานข้อมูลเท่านั้น
ตอนนี้คุณสามารถสร้างตารางใหม่โดยใช้ Object Browser หรือโดยการรันหน้าต่างคำสั่ง SQL นี่คือรหัสสำหรับสร้างตาราง:
CREATE TABLE WEB_CONTENT (
page_id คีย์หลักหมายเลข
page_content VARCHAR2(255)
);
เนื่องจากตารางถูกสร้างขึ้นโดยใช้บัญชีผู้ใช้ HR ตารางจึงเป็นของบัญชี HR และอยู่ในสคีมา HR และผู้ใช้รายอื่นไม่สามารถเข้าถึงตารางได้จนกว่าจะได้รับอนุญาตอย่างชัดเจนในการเข้าถึงตาราง หากคุณไม่เชื่อ คุณสามารถสร้างผู้ใช้ใหม่และลองใช้ผู้ใช้รายนี้เพื่อเข้าถึงตาราง WEB_CONTENT
ตอนนี้ สร้างผู้ใช้ใหม่สองคน CMS_USER และ CMS_EDITOR สุดท้ายนี้ CMS_USER จะได้รับสิทธิ์แบบอ่านอย่างเดียวในตาราง WEB_CONTENT และผู้ใช้รายนี้จะถูกใช้เป็นบัญชีฐานข้อมูลที่ให้บริการเนื้อหาในฐานะผู้ใช้เว็บที่ไม่ระบุชื่อ บัญชี CMS_EDITOR จะมีสิทธิ์เพิ่มเติมในตารางและจะถูกใช้เป็นบัญชีตัวแก้ไข CMS (บัญชีที่จำเป็นในการเปลี่ยนแปลงและรักษาข้อมูลในตาราง)
ผู้ใช้ใหม่สามารถสร้างขึ้นได้โดยใช้อินเทอร์เฟซแบบกราฟิกของ XE หรือโดยการดำเนินการคำสั่งต่อไปนี้:
CREATE USER cms_user IDENTIFIED BY cms_user;
สร้างผู้ใช้ cms_editor ระบุโดย cms_editor;
(เพื่อความง่าย รหัสผ่านที่นี่สอดคล้องกับชื่อผู้ใช้)
เพื่อให้ทั้งสองบัญชีสามารถเข้าสู่ฐานข้อมูลได้ เราจำเป็นต้องให้บทบาท CONNECT แก่พวกเขา เมื่อต้องการทำเช่นนี้ ให้เลือกช่องทำเครื่องหมาย CONNECT ใต้ข้อมูลผู้ใช้ในส่วนการดูแลระบบ/ผู้ใช้ฐานข้อมูลของอินเทอร์เฟซแบบกราฟิก XE หรือดำเนินการคำสั่งต่อไปนี้:
GRANT CONNECT to cms_user;
ให้สิทธิ์เชื่อมต่อกับ cms_editor
ในตอนนี้ หากคุณพยายามเข้าสู่ระบบในฐานะผู้ใช้ CMS_USER หรือ CMS_EDITOR และลองอ่านข้อมูลจากตาราง WEB_CONTENT (เลือก * จาก hr.web_content;) คุณจะพบข้อผิดพลาดต่อไปนี้:
ORA-00942: ตารางหรือมุมมอง ไม่มี
อยู่ ในการเข้าถึงข้อมูลหรือเพียงแค่ดูตาราง คุณต้องให้สิทธิ์บัญชี CMS_USER และ CMS_EDITOR แบบอ่านอย่างเดียวในตาราง WEB_CONTENT:
GRANT SELECT บน hr.web_content ถึง cms_user;
GRANT SELECT บน hr.web_content ถึง cms_editor
โค้ดด้านบนช่วยให้ทั้งสองบัญชีดำเนินการคำสั่ง SELECT บนตาราง WEB_CONTENT หากคุณพยายามดำเนินการคำสั่งอื่น คุณจะพบข้อผิดพลาด ตัวอย่างเช่น การแทรกแถว:
INSERT INTO hr.web_content (page_id,page_content) VALUES (1,'hello world');
จะสร้างข้อความแสดงข้อผิดพลาด
ORA-01031: สิทธิ์ไม่
เพียงพอ ต้องได้รับสิทธิ์ต่อไปนี้:
GRANT INSERT, UPDATE, DELETE บน hr.web_content ถึง cms_editor;
จากนี้ไป บัญชี CMS_EDITOR สามารถดำเนินการคำสั่ง INSERT, UPDATE และ DELETE บนตาราง WEB_CONTENT
ดูว่าง่ายแค่ไหน! จะเห็นได้ว่าการจัดการสิทธิ์ผ่านบทบาทเป็นวิธีที่มีประสิทธิภาพมากกว่า หากฐานข้อมูล Oracle ที่ใช้ไม่ใช่ XE คุณสามารถดำเนินการต่อไปนี้
สร้างบทบาท:
CREATE ROLE reader;
สร้างผู้เขียนบทบาท
ให้สิทธิ์บทบาท:
ให้สิทธิ์เลือกบน web_content แก่ผู้อ่าน;
GRANT INSERT, อัปเดต, ลบบน web_content ถึงผู้เขียน;
ให้บทบาทผู้ใช้:
GRANT reader ถึง cms_user;
ผู้อ่าน GRANT ถึง cms_editor; (พวกเขาจำเป็นต้องอ่านด้วย)
ผู้เขียน GRANT ถึง cms_editor
โปรดทราบว่าหากคุณเปลี่ยนคำจำกัดความของบทบาท READER การเปลี่ยนแปลงเหล่านี้จะส่งผลต่อบัญชีผู้ใช้ทั้งหมดที่มีบทบาทนั้น หากให้สิทธิ์แก่ผู้ใช้โดยตรง บัญชีผู้ใช้แต่ละบัญชีจะต้องได้รับการอัปเดตเป็นรายบุคคล
หลังจากทำตามขั้นตอนข้างต้นแล้ว คุณสามารถกำหนดค่าแอปพลิเคชัน PHP ของคุณให้ใช้บัญชี CMS_USER สำหรับการเชื่อมต่อฐานข้อมูลทั้งหมดที่ร้องขอโดยผู้ใช้เว็บที่ไม่ระบุชื่อ และบัญชี CMS_EDITOR สำหรับการเชื่อมต่อที่เริ่มต้นโดยหน้าการดูแลระบบที่มีการป้องกันด้วยรหัสผ่าน ในตอนนี้ แม้ว่าเว็บฟอร์มสาธารณะจะถูกโจมตี แต่ผลกระทบต่อฐานข้อมูลก็จะมีเพียงเล็กน้อย เนื่องจากบัญชี CMS_USER มีสิทธิ์อ่านอย่างเดียวเท่านั้น
ในบทความนี้ เราได้แนะนำ
คุณลักษณะพื้นฐานบางประการของการรักษาความปลอดภัยการเข้าถึงข้อมูลของ Oracle ไว้เพียงสั้นๆ เท่านั้น นอกจากนี้ Oracle ยังมีคุณสมบัติอื่นๆ อีกมากมายที่ยกระดับความปลอดภัยของเว็บแอปพลิเคชันของคุณไปอีกระดับ รวมถึง Virtual Private Database (VPD) และความปลอดภัยของแท็ก