
در بسیاری از سازمانها، پایگاه داده Oracle شامل اطلاعات بسیار حساسی است؛ اطلاعاتی مثل شماره کارت بانکی، شماره موبایل، حقوق کارکنان یا دادههای شخصی مشتریان.
در چنین شرایطی همیشه این سؤال مطرح میشود: آیا همه کاربران دیتابیس باید بتوانند این اطلاعات را بهصورت کامل ببینند؟
پاسخ واضح است: نه.
اوراکل برای حل این مسئله قابلیتی بسیار قدرتمند به نام Data Redaction ارائه کرده که از طریق پکیج DBMS_REDACT در دسترس است.
با استفاده از این قابلیت میتوان دادههای حساس را هنگام اجرای Query بهصورت خودکار ماسک کرد، بدون اینکه داده اصلی در جدول تغییر کند.
در این مقاله آموزش Oracle در بخش آموزش پکیج های اوراکلی، بهصورت کامل یاد میگیریم DBMS_REDACT چیست، چگونه کار میکند و چطور میتوان آن را در Oracle پیادهسازی کرد.
یکی از قابلیتهای قدرتمند و در عین حال کمتر استفادهشدهی آن، اجرای Java داخل خود دیتابیس است. پکیج DBMS_JAVA دقیقاً همان ابزاری است که این قابلیت را مدیریت میکند.
پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
پکیج DBMS_REDACT چیست؟
DBMS_REDACT یک پکیج امنیتی در Oracle Database است که برای پنهانسازی یا ماسک کردن دادههای حساس در زمان اجرای Query استفاده میشود.
نکته مهم این است که:
- داده اصلی در دیتابیس هیچ تغییری نمیکند
- فقط خروجی Query برای کاربران خاص تغییر میکند
به عنوان مثال:
فرض کنید در یک جدول، شماره کارت مشتری ذخیره شده است.
۶۲۱۹۸۶۱۰۳۴۵۶۷۸۹۰
اما برای کاربران عادی به این شکل نمایش داده میشود:
************۷۸۹۰
در حالی که مدیر سیستم یا واحد مالی هنوز مقدار واقعی را میبیند.
مزایای استفاده از DBMS_REDACT
استفاده از Data Redaction در Oracle چند مزیت مهم دارد:
اول اینکه مستقل از برنامه است. یعنی مهم نیست کاربر از چه برنامهای به دیتابیس وصل میشود؛ SQL Developer، Java، APEX یا هر سیستم دیگری.
دوم اینکه داده واقعی تغییر نمیکند و فقط در زمان نمایش ماسک میشود.
سوم اینکه امکان تعریف قوانین بسیار دقیق وجود دارد؛ مثلاً بر اساس:
- نام کاربر
- نقش کاربر
- IP سیستم
- برنامهای که به دیتابیس وصل شده
- زمان اجرا
پیشنیازهای استفاده از پکیج DBMS_REDACT
برای تعریف Redaction Policy باید دسترسیهای لازم در Oracle داده شود.
معمولاً دسترسیهای زیر مورد نیاز است:
GRANT EXECUTE ON DBMS_REDACT TO user_name;
GRANT CREATE ANY POLICY TO user_name;
GRANT ALTER ANY TABLE TO user_name;
در بیشتر سازمانها این دسترسیها توسط کاربر SYS یا DBA داده میشود.
انواع Redaction در Oracle
Oracle چند نوع مختلف از Data Redaction را ارائه میدهد که هر کدام برای سناریوی خاصی مناسب هستند.
۱. FULL Redaction
در این حالت مقدار ستون بهطور کامل مخفی میشود.
مثال:
Salary = 25000000
برای کاربر عادی تبدیل میشود به:
۰
یا در ستون متنی:
XXXX
این روش زمانی استفاده میشود که کاربر نباید هیچ اطلاعاتی از مقدار واقعی ببیند.
۲. PARTIAL Redaction
در این نوع فقط بخشی از داده ماسک میشود.
مثلاً شماره کارت:
۶۲۱۹۸۶۱۰۳۴۵۶۷۸۹۰
نمایش داده میشود به شکل:
************۷۸۹۰
این روش برای اطلاعاتی مثل:
- شماره کارت
- شماره موبایل
- کد ملی
بسیار کاربردی است.
۳. REGEXP Redaction
در این روش از Regular Expression برای ماسک کردن داده استفاده میشود.
این حالت زمانی مفید است که الگوی خاصی برای داده وجود دارد، مثل شماره موبایل یا ایمیل.
مثلاً:
۰۹۱۲۱۲۳۴۵۶۷
تبدیل میشود به:
۰۹۱۲***۴۵۶۷
۴. RANDOM Redaction
در این حالت مقدار واقعی با یک مقدار تصادفی جایگزین میشود.
این روش معمولاً در محیطهای تست یا تحلیل داده استفاده میشود تا اطلاعات واقعی افشا نشود.
مثال: ایجاد یک جدول نمونه
برای درک بهتر مثالها، یک جدول ساده ایجاد میکنیم.
CREATE TABLE customers (
id NUMBER,
fullname VARCHAR2(100),
phone VARCHAR2(20),
salary NUMBER,
credit_card VARCHAR2(20)
);
و چند داده در آن قرار میدهیم:
INSERT INTO customers VALUES
(۱,'Ali Mohammadi','09121234567',24000000,'6219861034567890');
INSERT INTO customers VALUES
(۲,'Sara Ahmadi','09351230042',18500000,'5892101038765432');
COMMIT;
مثال FULL Redaction
فرض کنید فقط واحد منابع انسانی باید حقوق را ببیند.
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => 'HR',
object_name => 'CUSTOMERS',
column_name => 'SALARY',
policy_name => 'salary_redaction',
function_type => DBMS_REDACT.FULL,
expression => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') <> ''HR'''
);
END;
/
در این حالت:
کاربر HR → حقوق واقعی
سایر کاربران → مقدار صفر
مثال PARTIAL Redaction
برای ماسک کردن شماره کارت:
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => 'HR',
object_name => 'CUSTOMERS',
column_name => 'CREDIT_CARD',
policy_name => 'cc_redaction',
function_type => DBMS_REDACT.PARTIAL,
expression => '۱=۱'
);
END;
/
خروجی:
************۷۸۹۰
مثال REGEXP Redaction
برای مخفی کردن وسط شماره موبایل:
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => 'HR',
object_name => 'CUSTOMERS',
column_name => 'PHONE',
policy_name => 'phone_redaction',
function_type => DBMS_REDACT.REGEXP,
regexp_pattern => '(\d{4})(\d{3})(\d{4})',
regexp_replace_string => '\۱***\۳',
expression => '۱=۱'
);
END;
/
خروجی:
۰۹۱۲***۴۵۶۷
تعریف شرط برای Redaction
یکی از ویژگیهای مهم DBMS_REDACT امکان تعریف شرط است.
مثلاً میتوان گفت:
اگر کاربر مدیر نباشد → داده ماسک شود.
مثال:
expression =>
'SYS_CONTEXT(''USERENV'',''SESSION_USER'') <> ''MANAGER'''
یا حتی بر اساس IP:
SYS_CONTEXT('USERENV','IP_ADDRESS')
مدیریت Policy ها در پکیج DBMS_REDACT
گاهی لازم است Policy حذف یا موقتاً غیرفعال شود.
حذف Policy
BEGIN
DBMS_REDACT.DROP_POLICY(
object_schema => 'HR',
object_name => 'CUSTOMERS',
policy_name => 'phone_redaction'
);
END;
/
غیرفعال کردن Policy
BEGIN
DBMS_REDACT.DISABLE_POLICY(
object_schema => 'HR',
object_name => 'CUSTOMERS',
policy_name => 'salary_redaction'
);
END;
/
فعالسازی دوباره Policy
BEGIN
DBMS_REDACT.ENABLE_POLICY(
object_schema => 'HR',
object_name => 'CUSTOMERS',
policy_name => 'salary_redaction'
);
END;
/
نکات مهم هنگام استفاده از پکیج DBMS_REDACT
چند نکته مهم که بهتر است هنگام استفاده از این قابلیت بدانید:
- Redaction فقط روی SELECT اعمال میشود.
- داده واقعی در جدول هیچ تغییری نمیکند.
- روی بعضی انواع ستون مثل LOB محدودیت وجود دارد.
- اگر Expression خیلی پیچیده باشد ممکن است روی Performance تاثیر بگذارد.
سناریوی واقعی در سازمان
فرض کنید یک شرکت خدمات مالی دیتابیسی دارد که شامل اطلاعات مشتریان است.
نیازهای امنیتی به این شکل است:
- فقط واحد مالی بتواند حقوق کارکنان را ببیند
- اپراتورهای پشتیبانی فقط ۴ رقم آخر کارت بانکی را ببینند
- پیمانکاران خارجی شماره موبایل کامل را نبینند
- محیط تست نباید داده واقعی مشتریان را نمایش دهد
همه این نیازها را میتوان با ترکیب Policyهای مختلف DBMS_REDACT پیادهسازی کرد.
سوالات متداول درباره پکیج DBMS_REDACT در اوراکل
DBMS_REDACT یکی از قابلیتهای امنیتی Oracle است که برای ماسک کردن دادههای حساس در زمان اجرای Query استفاده میشود.
با استفاده از این قابلیت میتوان اطلاعاتی مثل شماره کارت بانکی، شماره موبایل، حقوق کارکنان یا دادههای شخصی مشتریان را برای کاربران خاص مخفی کرد.
نکته مهم این است که DBMS_REDACT داده واقعی را در جدول تغییر نمیدهد؛ بلکه فقط هنگام اجرای دستور SELECT مقدار نمایش دادهشده را ماسک میکند. به همین دلیل مدیران سیستم یا کاربران مجاز همچنان میتوانند داده واقعی را مشاهده کنند.
تفاوت اصلی در این است که DBMS_REDACT داده را در زمان نمایش تغییر میدهد اما Data Masking داده واقعی را در دیتابیس تغییر میدهد.
در DBMS_REDACT:
- داده واقعی در جدول باقی میماند
- فقط خروجی Query ماسک میشود
- معمولاً برای محیط Production استفاده میشود
در Data Masking:
- داده اصلی در دیتابیس تغییر میکند
- معمولاً برای محیط Test یا Development استفاده میشود
به همین دلیل DBMS_REDACT گزینه مناسبی برای افزایش امنیت داده در محیط عملیاتی Oracle است.
در بیشتر موارد تاثیر DBMS_REDACT روی Performance بسیار کم است، زیرا عملیات ماسک کردن هنگام نمایش داده انجام میشود.
با این حال اگر:
- تعداد زیادی Policy تعریف شود
- یا Expressionهای پیچیده استفاده شوند
ممکن است کمی روی سرعت اجرای Query تاثیر بگذارد. بنابراین در سیستمهای بزرگ بهتر است Policyها با دقت طراحی شوند.
بله. یکی از ویژگیهای مهم DBMS_REDACT این است که میتوان شرطهای مختلفی برای اعمال Redaction تعریف کرد.
مثلاً میتوان مشخص کرد که:
- فقط کاربران غیر مدیر داده ماسک شده را ببینند
- کاربران با Role خاص داده کامل را ببینند
- یا حتی بر اساس IP یا برنامه اتصال تصمیمگیری شود
این کار معمولاً با استفاده از تابع SYS_CONTEXT انجام میشود.
مثال:
SYS_CONTEXT(‘USERENV’,’SESSION_USER’)
با این روش میتوان سیاستهای امنیتی بسیار دقیقی برای نمایش داده در Oracle تعریف کرد.
جمعبندی
DBMS_REDACT یکی از قدرتمندترین ابزارهای امنیت داده در Oracle است که به کمک آن میتوان دادههای حساس را بدون تغییر در دیتابیس، برای کاربران مختلف به شکلهای متفاوت نمایش داد.
با استفاده از انواع Redaction مانند FULL، PARTIAL، REGEXP و RANDOM میتوان سیاستهای امنیتی بسیار دقیقی تعریف کرد و از افشای اطلاعات مهم جلوگیری کرد.
اگر با پایگاه داده Oracle در محیطهای سازمانی کار میکنید، یادگیری و استفاده از DBMS_REDACT میتواند نقش مهمی در افزایش امنیت دادههای شما داشته باشد.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید