مقدمه
Oracle Data Redaction چیست:
Oracle Data Redaction یک فناوری می‌باشد که به شما امکان می دهد داده های موجود در پایگاه داده را مخفی کنید.
به این ترتیب می‌توانید داده‌های جداول خود را به دلخواه خود پنهان کرده و از بروز نقض در داده‌های خود جلوگیری کنید.
Oracle Data Redaction از نظر فیزیکی مانند رمزگذاری (Encryption) داده‌ها را مخفی نمی‌کند.


رمز گذاری انجام شده براساس کاربر خاص و قوانین پکیج “DBMS_REDACT” است.
به عبارت دیگر اطلاعات شما مانند گذشته خام در Buffer Cache ذخیره می شود و هنگامی که داده ای درخواست می‌شود بسته DMBS_REDACT داده‌ها را به روشهای تعیین شده شما، انتقال می‌دهد.
Oracle Data Redaction دارای مجوز (license) جداگانه است (Oracle Advanced Security).

چرا باید از Oracle Data Redaction استفاده کنیم:
کاربران برنامه شما همیشه نیازی به دیدن اطلاعات حساس شما ندارند. به عنوان مثال ممکن است بخواهید اطلاعات شخصی کارت مشتری، قابل مشاهده نباشد.
اطلاعات ممکن است نیاز به تغییر جزئی یا کامل داشته باشد. در این فرآیندها می‌توانید از ویژگی های Oracle Data Redaction استفاده کنید.
همچنین این یک ویژگی بار اضافی برای پایگاه داده ایجاد نمی‌کند.

روش‌های بکارگیری Oracle Data Redaction :
همانطور که در زیر می بینید 4 روش مختلف برای انجام Data Redaction وجود دارد:

Full redaction.

Partial redaction.

Regular expressions.

Random redaction.

Artarad_redaction_1

Full Redaction:
تمام داده های موجود در ستون تحت تأثیر قرار می گیرند. مقدار پیش‌فرض در این روش صفر می‌باشد. اگر نوع دیتا ستون از جنس number باشد، با صفر و اگر از جنس character باشد با فاصله (space) جایگزین می‌شود.

Partial Redaction:
می‌توانید قسمت خاصی از داده‌های موجود را در ستون موردنظر ویرایش کنید. برای مثال می‌توان 8 رقم از ابتدا یا انتهای شماره کارت 16 رقمی را به ‘*’ تغییر داد.

Regular Expression based Data Redaction:
تنها برای اطلاعات از نوع character قابل استفاده می‌باشد. با Regular Expression می‌توانید نام‌های ایمیل را بصورت دلخواه با کاراکترهای دیگر جایگزین کنید.

Random Redaction:
صرف‌نظر از جنس دیتا درون ستون ، اطلاعات در زمان فراخانی بصورت تصادفی نمایش داده می‌شوند. وقتی داده‌ها با این روش فراخوانی می‌شوند ،Data Redaction داده‌ها را بصورت تصادفی تغییر می‌دهد ، بنابراین داده‌ها همیشه منحصر به فرد می‌باشند.

برخی از جزئیات مهم در استفاده از Random Redaction وجود دارد:
زمانی که جنس دیتا از نوع cher باشد، طول داده برگشتی همیشه همان تعداد کاراکتر ستون خواهد بود. به عنوان مثال ، اگر ستون CHAR (25) باشد ، نتیجه خروجی شامل یک رشته 25 کاراکتری تصادفی می باشد.
زمانی که جنس دیتا از نوع VARCHAR2 باشد، طول داده برگشتی برابر با تعداد کاراکترهای ستون است. به عنوان مثال ، اگر یک ستون از نوع داده VARCHAR (25) شامل 10 کاراکتر باشد ، نتیجه Redaction Data شامل 10 کاراکتر تصادفی است.
زمانی که جنس دیتا از نوع NUMBER باشد، خروجی شاما یک عدد مثبت بصورت تصادفی می‌باشد.
زمانی که جنس دیتا از نوع date-time باشد، یک تاریخ تصادفی درخروجی نمایش داده می‌شود.

تفاوت بین Oracle Data Redaction و Oracle Virtual Pricate Database:
در حالی که می توان با Oracle Data Redaction داده‌ها را با عملکرد بیشتری ویرایش کرد، Oracle Virtual Private Database دیتا را بصورت NULL برمیگرداند. زمانی‌که مقدار بصورت NULL برمی‌گردد می‌تواند برای لپلیکیشن مشکل ایجاد کند که با Oracle Data Redaction همچین مشکلی نخواهید داشت.
Oracle Virtual Private Database به محتوای static و dynamic حساس است ولی Data Redaction تنها به محتوای static حساس می‌باشد.
Redaction Data تنها امکان ایجاد یک policy را برروی یک جدول و یا view می دهد درحالی که Oracle Virtual Private Database امکان تعریف تعداد زیادی policy را می‌دهد.

چگونگی اثرگذاری Oracle Data Redaction برروی SYS، SYSTEM و دیگر اسکیماهای پیش‌فرض:
یوزرهای SYS و SYSTEM بصورت پیش‌فرض دارای امتیاز EXEMPT REDACTION POLICY هستند. این دسترسی به این معنی است که Redaction Data Oracle policy برای این کاربران فاقد اعتبار است. به عبارت دیگر آنها همیشه می‌توانند دیتاها را بخوانند مگر اینکه خلافش انجام شود.
بصورت پیش‌فرض کاربران ایجاد شده دارای امتیاز EXEMPT REDACTION POLICY نیستند. برای مثال کاربر HR تحت تاثیر این وضعیت قرار می‌گیرد.
امتیاز EXEMPT REDACTION POLICY از کاربرای مثل SYS و SYSTEM نباید اخذ شود.
کاربران دارای امتیازات SYSDBA و DBA تحت تاثیر این وضعیت قرار نمی گیرند.

محدودیت‌ها:
از عبارت GROUP BY در ستون‌هایی که Oracle Data Redaction برروی آنها اجرا شده است نمی‌توان استفاده کرد زیرا ستون موجود در لیست Select توسط Data Redaction تغییر می کند. زمانی که از GROUP BY برای ستونی با Data Redaction استفاده شود، خطای ORA-00979 بازگردانده می‌شود.
در DISTINCT همان شرایط اعمال شده در عبارت GROUP BY وجود دارد. زمانی که از DISTINCT برای ستونی با Data Redaction استفاده شود، خطای ORA-01791 بازگردانده می‌شود.
Redaction Data را نمی توان روی ستونی با نوع داده JSON اعمال کرد. خطای ORA-28073 بازگردانده می‌شود.
انواع داده های GRAPHIC ، LONG VARGRAPHIC ،VARGRAPHIC و TIME تحت هیچ شرایطی پشتیبانی نمی‌شوند.
انواع XML ، انواع Oracle Spatial ، انواع Oracle Media پشتیبانی نمی‌شوند.
Oracle Data Redaction 19c Examples
در این مقاله برای انجام عملیات از اسکیمای HR و جدول EMPLOYEES استفاده می‌کنیم.

Full Oracle Data Redaction:
در ایتدا این‌کار را برای ستون SALARY انجام می‌دهیم و پس از آن کاربر HR باید قادر به دیدن اطلاعات باشد ولی برای دیگر کاربرها باید بصورت 0 نمایش داده شود.

BEGIN

DBMS_REDACT.add_policy (object_schema => ‘HR’,

object_name => ‘EMPLOYEES’,

column_name => ‘SALARY’,

policy_name => ‘SALARY_KOLONO_ICIN_REDACTION’,

function_type => DBMS_REDACT.full,

expression => ‘1=1’);

END;

/

سپس اجرای کد، نتیجه را با کاربر HR مشاهده می‌کنیم:

SELECT * FROM HR.EMPLOYEES

Artarad_redaction_2

اطلاعات بدرستی مشاهد می‌شوند:

سپس همان دستور را با کاربر دیگری اجرا می کنیم:

SELECT * FROM HR.EMPLOYEES

سایر کاربران مقادیر ستون SALARY را “0” میبینند زیراRedaction Data اعمال شده است:

Artarad_redaction_3

در مثال زیر کد مذکور را برای ستون FIRST_NAME اجرا می‌کنیم:

BEGIN

DBMS_REDACT.alter_policy (object_schema => ‘HR’,

object_name => ‘HR.EMPLOYEES’,

column_name => ‘FIRST_NAME’,

policy_name => ‘SALARY_KOLONO_ICIN_REDACTION’,

function_type => DBMS_REDACT.full,

expression => ‘1=1’);

END;

/

همانطور که مشاهده می کنید ، ستون SALARY از جنس NUMBER به عنوان “0” و ستون FIRST_NAME از جنس VARHCAR به صورت خالی برگردانده شده است.

Artarad_redaction_4

Partial Oracle Data Redaction:
با استفاده از این روش ، می‌توانیم از چپ به راست ارقم را تغییردهیم. به عنوان مثال در اینجا سه رقم اول حقوق 6 رقمی را به “1” تغییر دهیم.

BEGIN

DBMS_REDACT.alter_policy (object_schema => ‘HR’,

object_name => ‘EMPLOYEES’,

policy_name => ‘SALARY_KOLONO_ICIN_REDACTION’,

action => DBMS_REDACT.modify_column,

column_name => ‘SALARY’,

function_type => DBMS_REDACT.partial,

function_parameters => ‘1,1,3’);

END;

/

مقادیر برای کاربر HR بصورت صحیح نمایش داده می‌شوند:

SELECT * FROM HR.EMPLOYEES

Artarad_redaction_5

در صورتی که دستور زیر را با کاربر دیگری اجرا کنیم:

SELECT * FROM HR.EMPLOYEES

دیگر کاربران تنها مقدار ۳ رقم اول هر رکورد را بصورت 1 و دیگر ارقام را بصورت صحیح مشاهده می‌کنند:

Artarad_redaction_6

Random Oracle Data Redaction:
در این مثال از ستون PHONE_NUMBER و دستور زیر را استفاده می‌کنیم:

BEGIN

DBMS_REDACT.alter_policy (object_schema => ‘HR’,

object_name => ‘EMPLOYEES’,

policy_name => ‘SALARY_KOLONO_ICIN_REDACTION’,

action => DBMS_REDACT.add_column,

column_name => ‘PHONE_NUMBER’,

function_type => DBMS_REDACT.RANDOM);

END;

/

مقادیر برای کاربر HR بصورت صحیح نمایش داده می‌شوند:

SELECT * FROM HR.EMPLOYEES

Artarad_redaction_7

در صورتی که دستور زیر را کاربر دیگری اجرا کنیم:
SELECT * FROM HR.EMPLOYEES

ستون PHONE_NUMBER شامل کاراکترهای تصادفی می‌باشد:

Artarad_redaction_8