msh بتاريخ: 8 يناير 2005 تقديم بلاغ مشاركة بتاريخ: 8 يناير 2005 إعداد وتنفيذ الــــ Virtual Private Database أو row-level security الأمن على مستوى السجل ماهو مفهوم VPD وماهي الحاجه منــــــــــــــها :عندما نتكلم عن قواعد البيانات فإن من أهم الأمور التي يجب الإهتمام بها والتركيز عليها موضوع الأمن ونجد بعض الأسئلة التي تطرح نفسها هل بإستطاعة شخص ما إختراق قاعدة البيانات بإستخدام أي طريقة ؟ هل بياناتي في وضع آمن ؟وهل تستخدم بياناتي من تطبيقات أخرى بدون معرفتي ؟ كيف يمكنني زيادة أمن البيانات ؟ وغيرها الكثير من الأسئلة وإحدى الأمور التي تجيب على هذه الأسئلة هي مايسمى بال Virtual Private Database وسنتكلم عن طريقة إعداد هذه التقنية بشرح مختصر ويمكن الرجوع إلى المقالة الرئيسية للكاتب Sameer Wadhwa في موقعه http://www.samoratech.com بدئت هذه التقنية من إصدار أوراكل 8i وأصبحت شائعة الإستخدام ومفيدة في الإصدار ORACLE 9i ومفهوم هذه التقنية هو تطبيق قواعد الأمن عن طريق قاعدة البيانات وليس عن طريق البرنامج أو التطبيق بحيث لانحتاج إلى تطبيق قواعد الأمن على كل تطبيق يستخدم قاعدة البيانات وهذه التقنية تصبح فعالة أكثر إذا كانت البيانات تستخدم من تطبيقات خارج الشركة وفي بيئة غير آمنة مثلا مواقع التجارة الإلكترونية حيث تسمح للعملاء من الدخول على بيانات معينة وتستخدم هذه التقنية في البنوك ، المستشفيات ، المؤسسات المالية لزيادة وتعزيز أمن البيانات.ماهي آلية عمل الــــ Virtual Private Database أو row-level security"بشكل مختصر "عند دخول المستخدم على قاعدة البيانات يبدء عمل database logon trigger والذي يقوم بعمل CALL للــ CONTEXT stored procedure لتحديد ماهو المسموح والغير مسموح تنفيذه من قبل هذا المستخدم عن طريق defined context وبمجرد محاولة المستخدم تنفيذ إستعلام أو تنفيذ جملة DML فإنه يتم تنفيذ السياسات والشروط المعرفة داخل ال CONTEXT .والآن لنبدء بشرح مثال على هذا الموضوع :هذا المثال سوف يستخدم جدول الموظفين EMP الموجود لدى المستخدم SCOTT ، وسنطبق VPD بحيث يستطيع المستخدم مشاهدة البيانات التي تخصه فقط وليس جميع البيانات الموجودة في جدول الموظفين، أيضا سوف نقوم بإنشاء مستخدمين هما JAMES , BLAKE وكل منهما لديه صلاحية SELECT على جدول EMP وسنلاحظ أن أي من المستخدمين سوف يقوم بتنفيذ جملة مثل SELECT * FROM EMP; سوف يتم ترجمتها مباشرة إلى : SELECT "EMPNO","ENAME","JOB","MGR","HIREDATE" ,"SAL","COMM","DEPTNO" FROM "SCOTT"."EMP" "EMP" WHERE (EMPNO=SYS_CONTEXT('SCOTTCTX','EMP_ID')) ولو لاحظنا سنجد أن الجملة الأخيرة (EMPNO=SYS_CONTEXT('SCOTTCTX','EMP_ID')) مضافة من الأوراكل حسب سياسة الأمن التي عرفناها سابقا .خطوات إعداد وتنفيذ الــــ Virtual Private Database أو row-level security1-إنشاء المستخدمين JAMES & BLAKE ومنحهم الصلاحيات على جدول الموظفين عن طريق الدخول على حساب ال SYS وتنفيذ مايلي : CREATE USER JAMES IDENTIFIED BY JAMES123; CREATE USER BLAKE IDENTIFIED BY BLAKE123; GRANT CREATE SESSION TO JAMES, BLAKE; CREATE TABLE SCOTT.EMPIDCONTROLTAB AS SELECT EMPNO, ENAME FROM SCOTT.EMP; GRANT SELECT ON SCOTT.EMP TO JAMES, BLAKE; 2-منح المستخدم SCOTT لصلاحية CONTEXT PRIVILEGE ليتمكن من عمل CONTEXT " تعريف شروط وسياسات الدخول على جدول الموظفين" GRANT CREATE ANY CONTEXT TO SCOTT; 3- إنشاء ال CONTEXT PACKAGE ومنح الصلاحيات عليها ندخل على المستخدم SCOTT ونقوم بإنشاء CONTEXT PACKAGE عن طريق تنفيذ مايلي : CREATE OR REPLACE CONTEXT SCOTTCTX USING SCOTT.CTXPKG; CREATE OR REPLACE PACKAGE SCOTT.CTXPKG AS PROCEDURE CTXPROC; END; والآن نقوم بإنشاء ال PACKAGE BODY والذي سنحدد فيه شروط وسياسات الدخول على البيانات كما يلي : CREATE OR REPLACE PACKAGE BODY SCOTT.CTXPKG IS PROCEDURE CTXPROC IS VEMPNO NUMBER; BEGIN -- set the attribute OWNER=TRUE if user is SCOTT IF SYS_CONTEXT ('USERENV', 'SESSION_USER') = 'SCOTT' THEN DBMS_SESSION.SET_CONTEXT ('SCOTTCTX', 'OWNER', 'TRUE'); ELSE BEGIN SELECT EMPNO INTO VEMPNO FROM SCOTT.EMPIDCONTROLTAB WHERE ENAME = SYS_CONTEXT ('USERENV', 'SESSION_USER'); -- set the attribute EMP_ID with the EMPNO of the -- session user DBMS_SESSION.SET_CONTEXT ('SCOTTCTX', 'EMP_ID', VEMPNO); EXCEPTION WHEN NO_DATA_FOUND THEN /* NO EMPLOYEE ID FOUND, SET A DUMMY ID */ DBMS_SESSION.SET_CONTEXT ('SCOTTCTX', 'EMP_ID', 0); END; END IF; END CTXPROC; END CTXPKG; نلاحظ أنه عندما يكون المستخدم هو SCOTT فإن نعطيه الصلاحيات الكاملة بسبب أنه TABLE OWNER وعندما يكون مستخدم آخر نقوم بالبحث عن رقمه وهو رقم الوظف في حالتنا هذه من جدول EMPIDCONTROLTAB ، إذا تم العثور على رقم الموظف فإننا نسمح له بالدخول على البيانات التي تخصه فقط في جدول الموظفين " السجلات التي تخصه فقط " ، وإذا لم يتم العثور على رقم لهذا الموظف فإننا نحدد رقم صفر له بحيث لايمكنه مشاهدة أي بيانات من جدول الموظفين . الآن نقوم بمنح صلاحية تنفيذ الحزمة السابقة الى جميع المستخدمين : GRANT EXECUTE ON SCOTT.CTXPKG TO PUBLIC; 4- نقوم الآن بإنشاء database logon trigger بحيث يتم تنفيذ ال context package بعد الدخول لقاعدة البيانات : CREATE OR REPLACE TRIGGER SCOTT.VPD_TRG AFTER LOGON ON DATABASE BEGIN SCOTT.CTXPKG.CTXPROC; END; 5- لندخل الآن بالمستخدم james/james123 وننفذ مايلي : col attribute format a10 col value format a10 col attribute format a10 SELECT * FROM SESSION_CONTEXT; ستظهر لنا معلومات عن الـــ CONTEXT المطبق على هذا ال SESSION .6- نقوم بإنشاء سياسات الأمن التي نريد تطبيقها على جدول الموظفين وال FUNCTION التي تقوم بذلك بالدخول على المستخدم SCOTT ومنح الصلاحية عليها الى جميع المستخدمين وتنفيذ مايلي : CREATE OR REPLACE PACKAGE PREDICATE_PCK AS FUNCTION EMP_SELECT (OWNER VARCHAR2, OBJNAME VARCHAR2) RETURN VARCHAR2; END PREDICATE_PCK; CREATE OR REPLACE PACKAGE BODY PREDICATE_PCK IS FUNCTION EMP_SELECT (OWNER VARCHAR2, OBJNAME VARCHAR2) RETURN VARCHAR2 IS PREDICATE VARCHAR2 (2000); BEGIN IF (SYS_CONTEXT ('SCOTTCTX', 'EMP_ID') = 0) THEN PREDICATE := '1=2'; ELSE PREDICATE := 'EMPNO=SYS_CONTEXT(''SCOTTCTX'',''EMP_ID'')'; END IF; IF (SYS_CONTEXT ('SCOTTCTX', 'OWNER') = 'TRUE') THEN PREDICATE := NULL; END IF; RETURN PREDICATE; END EMP_SELECT; END PREDICATE_PCK; grant execute on SCOTT.PREDICATE_PCK to public; لاحظ مما سبق أن هناك ثلاثة قواعد قمنا بتحديدها -- عندما يكون ال EMP_ID=0 فهذا معناه أن المستخدم لايمكنه مشاهدة أي بيانات .-- عندما يوجد رقم للمستخدم في جدول EMPIDCONTROLTAB فهذا معناه أنه يمكن للمستخدم مشاهدة البيانات التي تخصه فقط .-- إذا كان المستخدم هو الذي قام بإنشاء الجدول وهو SCOTT في هذا المثال يمكنه مشاهدة مايريد من المعلومات .بمجرد الإنتهاء من ماسبق نقوم بإضافة ال POLICY إلى الجدول عن طريق DBMS_RLS.ADD_POLICY PROCEDURE وذلك عن طريق الدخول على المستخدم SYS وتنفيذ مايلي : BEGIN DBMS_RLS.ADD_POLICY (OBJECT_SCHEMA => 'SCOTT', OBJECT_NAME => 'EMP', POLICY_NAME => 'EMP_SELECT_POLICY', FUNCTION_SCHEMA => 'SCOTT', POLICY_FUNCTION => 'PREDICATE_PCK.EMP_SELECT', STATEMENT_TYPES => 'SELECT', ENABLE => TRUE ); END; أيضا إذا أردنا إضافة شروط على ال INSERT , UPDATE, DELETE يمكننا ذلك عن طريق تنفيذ مايلي : BEGIN DBMS_RLS.ADD_POLICY (OBJECT_SCHEMA => 'SCOTT', OBJECT_NAME => 'EMP', POLICY_NAME => 'EMP_UPDATE_POLICY', FUNCTION_SCHEMA => 'SCOTT', POLICY_FUNCTION => 'PREDICATE_PCK.EMP_UPDATE', STATEMENT_TYPES => 'UPDATE,INSERT', UPDATE_CHECK => 'TRUE', ENABLE => TRUE ); END; 7-الآن جاء وقت الـتأكد من نتائج الخطوات السابقة وهل تم إعداد VPD بشكل ممتاز ندخل على المستخدم SCOTT ونمنح صلاحية SELECT على جدول الموظفين للمستخدم HR : GRANT SELECT ON EMP TO HR; ندخل على المستخدم HR وننفذ SELECT * FROM SCOTT.EMP; لن تعرض أي بيانات بالطبع لإن المستخدم HR غير موجود في جدول EMPIDCONTROLTAB لنحاول الدخول على المستخدم james/james123 وننفذ SELECT * FROM SCOTT.EMP ; ستكون النتيجة سجل واحد يخص المستخدم james :EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO---------- ---------- --------- ---------- --------- ---------- ---------- ----------7900 JAMES CLERK 7698 03-DEC-81 950 30لنحاول الدخول على المستخدم blake والمستخدم scott ونرى ماهي النتيجة ولماذا ؟خلاصة الموضوع أن تقنية الــــ Virtual Private Database أو row-level security تمكننا من إعداد سياسات الأمن على مستوى السجل وهي أسهل من تنفيذ هذه السياسات عن طريق التطبيقات والبرامج ....تحياتي ولاتنسونا من دعوه صالحة ....منقول من موقع http://www.samoratech.com اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
عبدالله أسعد بتاريخ: 9 يناير 2005 تقديم بلاغ مشاركة بتاريخ: 9 يناير 2005 جزاكم الله كل خير و اثابكم على هذا الموضوع الجميل و ادعو الله ان يجعله فى ميزان حسناتك مشكور جدا اقتباس رابط هذا التعليق شارك المزيد من خيارات المشاركة
Recommended Posts
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.