ป้ายกำกับ: Privilege

Oracle: ข้าม schema ของ userOracle: ข้าม schema ของ user

การจัดการสิทธิ์เพื่อเข้าถึงข้อมูลข้าม User หรือ Schema ใน Oracle Database เป็นเรื่องสำคัญทั้งในแง่ของความปลอดภัยและการจัดการโครงสร้างข้อมูล โดยปกติแล้ว User หนึ่งจะไม่สามารถมองเห็นหรือจัดการ Table ของ User อื่นได้เลย หากไม่ได้รับอนุญาต นี่คือขั้นตอนและวิธีการตั้งค่าเพื่อให้สามารถใช้งานข้าม Schema ได้อย่างถูกต้องครับ


การให้สิทธิ์เข้าถึง ( Granting Privileges )

สมมติว่าเรามี 2 Users คือ User_A ( เจ้าของข้อมูล ) และ User_B ( ผู้ขอใช้งาน ) หาก User_B ต้องการอ่านข้อมูลจาก Table ที่ชื่อ EMPLOYEES ของ User_A จะต้องดำเนินการดังนี้

การให้สิทธิ์รายคำสั่ง

ให้ User_A ( หรือ Admin ) รันคำสั่ง SQL

  • อ่านข้อมูล:
    GRANT SELECT ON User_A.EMPLOYEES TO User_B;
  • เพิ่ม/แก้ไข/ลบ:
    GRANT INSERT, UPDATE, DELETE ON User_A.EMPLOYEES TO User_B;
  • รัน Procedure/Function:
    GRANT EXECUTE ON User_A.MY_PROCEDURE TO User_B;

วิธีการเรียกใช้งาน ( Referencing Objects )

เมื่อได้รับสิทธิ์แล้ว User_B สามารถเข้าถึงข้อมูลได้ 2 วิธีหลัก

  1. การเรียกแบบระบุชื่อ Schema ( Fully Qualified Name )
    User_B ต้องระบุชื่อเจ้าของ Table นำหน้าเสมอ
    SELECT * FROM User_A.EMPLOYEES;
  2. การใช้ Synonym ( เพื่อความสะดวก )
    หากไม่อยากพิมพ์ชื่อ User_A นำหน้าทุกครั้ง User_B สามารถสร้าง Synonym ( ชื่อนามแฝง ) ไว้ใน Schema ของตัวเองได้
    — สร้าง Synonym ส่วนตัวใน User_B
    CREATE SYNONYM EMPLOYEES FOR User_A.EMPLOYEES;
    — คราวนี้เรียกใช้ได้โดยตรง
    SELECT * FROM EMPLOYEES;
  3. การจัดการสิทธิ์ผ่าน Role ( แนะนำสำหรับระบบใหญ่ )
    หากมี User จำนวนมากที่ต้องเข้าถึงข้อมูลชุดเดียวกัน การไล่ GRANT ทีละคนจะจัดการยาก แนะนำให้ใช้ Role แทน
    • สร้าง Role:
      CREATE ROLE READ_ONLY_A;
    • ให้สิทธิ์ Role:
      GRANT SELECT ON User_A.EMPLOYEES TO READ_ONLY_A;
    • มอบ Role ให้ Users:
      GRANT READ_ONLY_A TO User_B, User_C, User_D;

ข้อควรระวังและเทคนิคเพิ่มเติม

  • With Grant Option: หากต้องการให้ User_B สามารถไปให้สิทธิ์คนอื่นต่อได้ ต้องใช้
    GRANT SELECT ON ... TO User_B WITH GRANT OPTION;
  • Public Synonym: หากต้องการให้ ทุก User ใน Database เรียกใช้ Table นี้ได้โดยไม่ต้องระบุชื่อ Schema สามารถสร้าง CREATE PUBLIC SYNONYM ได้ ( แต่ควรใช้อย่างระมัดระวังเรื่องความปลอดภัย )
  • การ Backup: ตามที่คุณเคยจดบันทึกไว้เกี่ยวกับการทำ Backup / Snapshot ก่อนลง Nginx ใหม่ หลักการเดียวกันนี้ใช้กับ Database ได้ครับ ก่อนจะมีการ GRANT สิทธิ์จำนวนมาก หรือเปลี่ยนโครงสร้าง Schema การทำ Export ( expdp ) หรือ Snapshot ของ VM / Database ไว้ก่อนจะช่วยให้กู้คืนระบบได้หากเกิดความผิดพลาดในการจัดการสิทธิ์

คำแนะนำ: การให้สิทธิ์ SELECT ANY TABLE หรือ DBA Role แก่ User ทั่วไปเป็นสิ่งที่ไม่ควรทำอย่างยิ่ง เพราะจะทำให้ User นั้นเข้าถึงข้อมูลได้ทั้ง Database ซึ่งผิดหลักการ Least Privilege ( การให้สิทธิ์เท่าที่จำเป็น ) ครับ


อ่านเพิ่มเติม