الانتقال إلى المحتوى

إعداد وتنفيذ الــــ Virtual Private Database


msh

Recommended Posts

ماهو مفهوم 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 security :

1-إنشاء المستخدمين 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;



والآن نقوم بإنشاء ال 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;



-الآن جاء وقت الـتأكد من نتائج الخطوات السابقة وهل تم إعداد 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 تمكننا من إعداد سياسات الأمن على مستوى السجل وهي أسهل من تنفيذ هذه السياسات عن طريق التطبيقات والبرامج ....

والله الموضوع طويل وسامحونا على أي تقصير :D
تحياتي ولاتنسونا من دعوه صالحة .... :)
منقول من موقع http://www.samoratech.com

رابط هذا التعليق
شارك

السلام عليكم ورحمة الله وبركاته،،
أخواني مشكورين على مروركم و جزاكم الله خيرا ، أخي أبو صالح سيتم تثبيت الموضوع ولك خالص تحياتي ....

رابط هذا التعليق
شارك

تسلم اخى فى الله المهندس محمد على الموضوع الجيد جزاك الله عنا كل خير و ادعو الله ان يكون فى ميزان حسناتك
جزاك الله كل خير اخى فى الله

رابط هذا التعليق
شارك

أخى الفاضل المهندس محمد جزاك الله كل الخير
لقد حاولت سابقا التعرض لموضوع الأمن على مستوى السجل
ولم يكن الشرح بهذه البساطة والتنسيق والدقة فى توصيل المعلومه
كنا درسنا فى مايكروزفت الvpn
طريقة تنفيذ VPN

لكن الموضوع لم يكن أكثر من تأمين connection mechanism على البيانات المنقوله عبر الsession أما التطبيق على database مثل أوراكل فكان الموضوع طويل ومحير شوية.
أشكرك على هذا الجهد الرائع .. جعله الله فى ميزان حسناتك

تم تعديل بواسطة Walid Azmy
رابط هذا التعليق
شارك

  • بعد 1 شهر...
  • بعد 3 أسابيع...
  • بعد 4 أسابيع...

بارك الله فيك اخي على هذا الشرح الوافي عن إعداد وتنفيذ الــــ Virtual Private Database, الأمن على مستوى السجل
و جعل الله هذا العمل لك في ميزان حسناتك وندعو من الله تعالى ان ينعنا بعلمك في هذا المنتدى المتميز دائما بوجود المشرفين و مناقشة الاعضاء الكرام

تم تعديل بواسطة omanip21
رابط هذا التعليق
شارك

  • بعد 2 أسابيع...
  • بعد 2 أسابيع...
  • بعد 3 شهور...
  • بعد 2 أسابيع...
  • بعد 6 شهور...

بارك الله فيك اخي MSH افدتني كتيرررررررر
بس ما تطرقت للصعوبات التي تواجه تطبيق الــــ Virtual Private Database من خلال الــAPPLICATION SERVER 10g
ياريت تزيدنا في هذا الموضوع مع طريقة الحلول لتلافي هذه المشكلة ....
تحياتي لشخصك الكريم ...

رابط هذا التعليق
شارك

  • بعد 2 شهور...
  • بعد 2 سنة...
  • بعد 4 شهور...

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية