ความปลอดภัยสำหรับ Application Developers ที่ทำงานกับ PL / SQL ใน Oracle


13

คุณจะจัดการกับการขาดสิทธิ์ระดับ Schema ใน Oracle ได้อย่างไร สถาปัตยกรรมความปลอดภัยของออราเคิลทำงานได้ดีสำหรับแอปพลิเคชันที่ต้องการเฉพาะสิทธิ์ระดับวัตถุและทำงานได้ดีสำหรับ DBA ที่ต้องการข้อ จำกัด เล็กน้อย อย่างไรก็ตามดูเหมือนว่าจะมีช่องโหว่ขนาดใหญ่ในสถาปัตยกรรมสำหรับโปรแกรมเมอร์ที่ทำการพัฒนาด้วยแอพพลิเคชั่นส่วนหน้าและ PL / SQL ในหลายสคีมา นี่คือตัวเลือกของฉันบางส่วนที่มีข้อเสีย:

  1. ทำให้แต่ละโปรแกรมเมอร์ทำการพัฒนาในสคีมาของตนเอง DBA จะให้สิทธิพิเศษระดับวัตถุแก่โปรแกรมเมอร์ที่ต้องการ การพัฒนาบรรจุภัณฑ์ใด ๆ จะต้องทำโดย DBA ข้อเสียที่สำคัญคือโปรแกรมเมอร์จะใช้ฐานข้อมูลเช่น bit bucket เพื่อลดความเสียหายของประสิทธิภาพของฐานข้อมูล ฉันต้องการโปรแกรมเมอร์ที่จะพัฒนาในฐานข้อมูล แต่วิธีนี้จะทำให้หมดกำลังใจอย่างมาก

  2. ให้ชื่อผู้ใช้ / รหัสผ่านของโปรแกรมเมอร์แก่ schema ที่ต้องการพัฒนามากกว่าสิบตัวอนุญาตให้สคีมาของแอปพลิเคชันเหล่านี้เพื่อสร้างโพรซีเดอร์ตารางและอื่น ๆ ข้อเสียของวิธีการนี้คือโปรแกรมเมอร์ต้องดูแลการเข้าสู่ระบบหลายครั้ง ไม่ค่อยเข้าสู่ระบบในฐานะตัวเอง การพัฒนาข้ามสคีก็ยากเช่นกัน

  3. ให้สิทธิการพิสูจน์ตัวตนพร็อกซีโปรแกรมเมอร์แก่แต่ละสคีมาที่ต้องพัฒนา สิ่งนี้ทำให้พวกเขาล็อกอินด้วยตนเองโดยไม่ต้องให้สิทธิพิเศษนอกเหนือจากสิทธิ์พร็อกซี ข้อเสียรวมถึงโปรแกรมเมอร์ที่ต้องรักษาการเชื่อมต่อแยกกันสำหรับแต่ละสคีมาที่พร็อกซีสำหรับการพัฒนาข้ามสคีมานั้นยุ่งยากกว่าเนื่องจากการเชื่อมต่อจะต้องมีการเปลี่ยนแปลงอยู่ตลอดเวลาและแพ็คเกจที่ใช้การเชื่อมโยงฐานข้อมูลสาธารณะ

  4. ให้สิทธิ์ DBA สำหรับโปรแกรมเมอร์แต่ละคน - ข้อเสียนี่คือความปลอดภัย ไม่มีโปรแกรมเมอร์สคีมาสามารถถูกเก็บออกจากสคีมาใด ๆ และโปรแกรมเมอร์ใด ๆ สามารถเลียนแบบโปรแกรมเมอร์อื่น ๆ (DBA)

ดูเหมือนว่าจะมีตัวเลือกที่ขาดหายไปเพื่อให้โปรแกรมเมอร์แต่ละตัว SELECT / INSERT / CREATE / etc สิทธิพิเศษในสคีมาที่พวกเขาต้องการในการพัฒนาพวกเขาลงชื่อเข้าใช้ด้วยตนเองเพื่อทำงานโดยใช้การเชื่อมต่อเดียว วัตถุใหม่ในสคีมาที่พวกเขาสามารถเข้าถึงได้จะพร้อมใช้งานทันที

ฉันพลาดอะไรไปรึเปล่า? คุณจัดการโปรแกรมเมอร์แอปพลิเคชันที่พัฒนา PL / SQL อย่างไร


3
+1 คำถามที่ยอดเยี่ยม - สิ่งนี้ประกอบกับการขาดการควบคุมแหล่งรวมเป็นปัญหาสำคัญของ Oracle ในสภาพแวดล้อมที่หลากหลายของนักพัฒนา
ScottCher

คำตอบ:


11

ย้อนกลับไปในสมัยที่ฉันทำงานในร้านค้า Oracle เรามีเซิร์ฟเวอร์ 'dev' (การพัฒนา) เฉพาะซึ่งมีข้อ จำกัด ด้านความปลอดภัยที่แตกต่างจากเซิร์ฟเวอร์ 'prod' (การผลิต) นักพัฒนาสามารถทำอะไรก็ได้ที่พวกเขาต้องการจากนั้นเราก็มอบสคริปต์ที่จำเป็นให้กับ DBA เพื่อนำไปใช้กับเซิร์ฟเวอร์ที่ใช้งานจริง

ในกรณีของระบบที่สำคัญของเรา (แบนเนอร์ SCT สำหรับการติดตามชั้นเรียนและนักเรียนและ Oracle Financials) ก็มีเซิร์ฟเวอร์ 'ทดสอบ' และ 'เมล็ด' การทดสอบสำหรับการทดสอบการยอมรับของผู้ใช้ก่อนที่สิ่งต่างๆจะถูกโอนย้ายจาก dev เป็น prod; 'seed' คือการติดตั้งสต็อกซอฟต์แวร์ดังนั้นหากเราพบข้อผิดพลาดเราสามารถตรวจสอบว่าเป็นสิ่งที่เราแนะนำหรือมาจาก SCT หรือซอฟต์แวร์ของ Oracle


+1 ด้วยฐานข้อมูลการใช้งานทั่วไปของเราผู้พัฒนาทำงานในโครงการที่มีความหลากหลายมากดังนั้นหลักการของสิทธิพิเศษน้อยที่สุดจะไม่ทำให้พวกเขาสามารถเข้าถึงเซิร์ฟเวอร์การพัฒนาได้อย่างสมบูรณ์ ( en.wikipedia.org/wiki/Principle_of_least_privilege )
Leigh Riffel

@Leigh - ฉันควรจะชี้แจง ... เซิร์ฟเวอร์ dev ตกอยู่ภายใต้สิ่งที่คุณมีเป็นอันดับ 1 ส่วนใหญ่ไม่ใช่ # 4
Joe

1
ฉันจำได้ว่ามีฐานข้อมูล DEV ที่ลอกแบบมาจากการผลิตจากนั้นมอบความซับซ้อนเพื่อให้นักพัฒนาซอฟต์แวร์สามารถทำงานได้โดยไม่มีข้อ จำกัด ในท้ายที่สุดการให้ฐานข้อมูลและการเข้าถึง DBA ของผู้พัฒนาแต่ละคนง่ายขึ้น จากนั้นจะให้ฟีดการเปลี่ยนแปลงใน Dev ผ่านวัฏจักรการปล่อย ควรง่ายขึ้นในขณะนี้ด้วยระบบเสมือนจริง
Sumnibot

@Sumibot - ง่ายต่อการติดตั้งดูแลรักษาสำรองข้อมูล ฯลฯ ฐานข้อมูลแยกต่างหากสำหรับนักพัฒนาทุกคนกว่าที่จะให้สิทธิ์! นอกจากเวลาที่ต้องใช้ในการทำให้สิ่งเหล่านี้เป็นปัจจุบันแล้วดูเหมือนว่าค่าใช้จ่ายในการออกใบอนุญาตจะมีจำนวนมากหรือคุณไม่ได้ให้รุ่นองค์กรแก่พวกเขา
Leigh Riffel

1
ไม่มีคำตอบที่เป็นรูปธรรมสำหรับฉัน
Michael-O

3

ใช้บทบาทเพื่อเชื่อมโยงคอลเลกชันของวัตถุจากนั้นให้สิทธิ์การเข้าถึงบทบาท

GRANTคำสั่งอนุญาตให้ DBA เพื่อ:

สิทธิ์ของออบเจกต์สำหรับออบเจกต์เฉพาะกับผู้ใช้บทบาทและสาธารณะ ตารางที่ 18-2 แสดงสิทธิ์พิเศษของวัตถุและการดำเนินการที่ได้รับอนุญาต

เนื่องจากสิทธิ์ของออบเจ็กต์สามารถมอบให้กับบทบาทจึงค่อนข้างง่ายที่จะให้สิทธิ์การเข้าถึงบทบาทกับตารางทั้งหมดในสคีมา:

sql> spool privs.sql
sql> select 'Grant select on scott' || table_name || ' ถึง role_select; ' จาก dba_tables โดยที่ owner = 'SCOTT';
SQL> @ privs.sql
sql> ให้ role_select กับ john, sam, peter;

สิ่งนี้รวมกับการGRANT CREATE TABLEออกโดยผู้ใช้ schema ที่เหมาะสมกับบทบาทหมายความว่านักพัฒนาสามารถเลือกและสร้างตารางได้ มันไม่สมบูรณ์แบบในขณะที่ตารางที่สร้างขึ้นต้องการให้สคริปต์ทำงานอีกครั้ง แต่WITH GRANT OPTIONแนะนำว่านักพัฒนาซอฟต์แวร์แต่ละคนสามารถให้สิทธิ์การเข้าถึงตารางที่สร้างขึ้นเพื่อบทบาทที่เหมาะสม

สิ่งนี้ชี้ให้เห็นว่าคุณสามารถสร้างทริกเกอร์ระดับ DDL ที่สามารถดำเนินการตามกระบวนการอนุญาตที่เหมาะสมแม้ว่าจะต้องมีการทดสอบจำนวนมากอย่างเห็นได้ชัด แต่ก็เป็นไปได้ที่จะทำให้คำสั่งสร้างตารางให้สิทธิ์ที่เหมาะสมกับบทบาทที่เหมาะสมโดยอัตโนมัติ

แก้ไข -

ตามGRANTที่CREATE TABLEสิทธิพิเศษ:

สร้างตารางในสคีมาของผู้รับสิทธิ์

ดังนั้นโดยให้พวกเขาสร้างตารางปรับเปลี่ยนตาราง ฯลฯจากผู้ใช้ที่ถูกต้องพวกเขาควรจะสามารถเข้าถึงคีมาของผู้ใช้ราวกับว่าพวกเขาเป็นผู้ใช้ที่เหมาะสม


ฉันเคยเห็นวิธีการที่คุณอ้างอิงพยายามแล้ว แต่ไม่ประสบความสำเร็จ อย่างไรก็ตามฉันเชื่อว่าคุณถูกต้องว่าสามารถทำได้ด้วยการทดสอบอย่างละเอียด ปัญหาคือสิ่งนี้อนุญาตให้นักพัฒนาเลือกการเข้าถึงบนตารางเท่านั้น การให้สิทธิ์สร้างตารางโดยตรงหรือผ่านบทบาทให้สิทธิ์สร้างตารางกับสคีมาของตนเองเท่านั้น พวกเขายังไม่สามารถสร้างตารางโพรซีเดอร์แพ็กเกจทริกเกอร์หรือวัตถุอื่น ๆ ในสคีมาใด ๆ ยกเว้นของตนเองหรือเป็นจุดของคุณที่ควรสร้างวัตถุในสคีมาของตัวเองแม้ในการพัฒนาหรือไม่
Leigh Riffel

@Leigh ปรับปรุงด้วยรายละเอียด
Brian Ballsun-Stanton

นี่ไม่ใช่วิธีการทำงานของ Oracle ลองสิ่งนี้: สร้างผู้ใช้ u1 ที่ระบุโดย "ThisIsMy1Password"; สร้างผู้ใช้ u2 ที่ระบุโดย "ThisIsMy1Password"; ให้สิทธิ์ dba กับ u1; ให้สิทธิ์เชื่อมต่อกับ u2; เชื่อมต่อ u1 / "ThisIsMy1Password" @db; ให้สิทธิ์สร้างตารางถึง u2; เชื่อมต่อ u2 / "ThisIsMy1Password" @db; สร้างตาราง u1.t1 (c1 varchar2 (10)); ขั้นตอนสุดท้ายล้มเหลวโดยมีสิทธิ์ไม่เพียงพอ
Leigh Riffel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.