امنیت ردیف و ستون
امنیت ردیف و ستون به شما امکان میدهد مجوزهای دقیق برای گروههای مختلف افراد اعطا کنید. میتوانید دادهای که یک گروه میتواند مشاهده کند، و همچنین دادهای که یک گروه میتواند کوئری کند با query builder را تغییر دهید.
میتوانید از امنیت ردیف و ستون برای تنظیم تحلیل self-service استفاده کنید، تا هر یک از مشتریان شما فقط بتوانند ردیفهایی را که با customer ID آنها تطبیق دارد مشاهده کنند. بهعنوان مثال، اگر یک جدول Accounts با اطلاعات دربارهٔ مشتریان خود دارید، میتوانید مجوزها را به جدول اضافه کنید تا هر مشتری فقط داده مرتبط با خودش را ببیند.
امنیت ردیف و ستون قبلاً data sandboxing نامیده میشد. همان ویژگی است، فقط حالا نام توصیفیتری دارد.
مثالهای امنیت ردیف و ستون
میتوانید تئوری را رد کنید و مستقیماً به مثالهای امنیت ردیف و ستون بروید.
نحوهٔ کار امنیت ردیف و ستون
میتوانید امنیت ردیف و ستون را بهعنوان یک بسته مجوز در نظر بگیرید که شامل موارد زیر است:
- نسخه فیلترشده یک جدول که جدول اصلی شما را جایگزین میکند، در هر جایی که جدول اصلی در متابیس استفاده میشود.
- گروه افرادی که باید نسخه فیلترشده جدول را ببینند.
میتوانید حداکثر یک policy امنیت ردیف و ستون برای هر ترکیب جدول/گروه در متابیس خود تعریف کنید. این به این معنی است که میتوانید نسخههای متفاوت یک جدول را برای گروههای مختلف نمایش دهید، مثل "Accounts for Sales" برای فروشندگان شما، و "Accounts for Managers" برای مدیران فروش.
انواع امنیت ردیف و ستون
امنیت ردیف و ستون داده خاصی را به هر شخص بر اساس ویژگیهای کاربر آنها نمایش میدهد. میتوانید:
- محدود کردن ردیفها
- محدود کردن ستونها و ردیفها برای افراد خاص.
| هدف | Row (فیلتر بر اساس یک ستون در جدول) | Custom (استفاده از یک سؤال SQL ذخیرهشده) |
|---|---|---|
| محدود کردن ردیفها با فیلتر روی یک ستون واحد | ✅ | ✅ |
| محدود کردن ردیفها با فیلتر روی چندین ستون | ❌ | ✅ |
| محدود کردن ستونها | ❌ | ✅ |
| ویرایش ستونها | ❌ | ✅ |
امنیت سطح ردیف: فیلتر بر اساس یک ستون در جدول
میتوانید ردیفها را محدود کنید با فیلتر کردن یک ستون با استفاده از مقدار ویژگی کاربر.
بهعنوان مثال، میتوانید جدول Accounts را برای یک گروه فیلتر کنید تا ویژگی کاربر جدول را فیلتر کند:
- "Basic" ردیفهایی را میبیند که
Plan = "Basic"(ردیفهایی که ستون Plan با مقدار "Basic" تطبیق دارد). - "Premium" ردیفهایی را میبیند که
Plan = "Premium"(ردیفهایی که ستون Plan با مقدار "Premium" تطبیق دارد).
امنیت ردیف و ستون سفارشی: استفاده از یک سؤال SQL برای ایجاد یک "view" سفارشی از یک جدول
برای محدود کردن ردیفها و ستونها، میتوانید از یک سؤال SQL برای فیلتر کردن جدول استفاده کنید. وقتی کسی آن جدول را مشاهده میکند، در عوض نتایج سؤال را میبیند، نه جدول خام.
بهعنوان مثال، فرض کنید جدول Accounts اصلی شما شامل ستونهای زیر است: ID، Email، Plan، و Created At. اگر میخواهید ستون Email را مخفی کنید، میتوانید یک سؤال SQL "Restricted Accounts" با ستونهای زیر ایجاد کنید: ID، Plan، و Created At.
میتوانید از یک سؤال برای موارد زیر استفاده کنید:
پیشنیازهای امنیت ردیف
- یک گروه افراد برای اضافه کردن امنیت ردیف.
- ویژگیهای کاربر برای هر شخص در گروه.
امنیت ردیف یک جدول فیلترشده را، به جای یک جدول اصلی، به یک گروه خاص نمایش میدهد. نحوهٔ فیلتر کردن آن جدول توسط متابیس بستگی به مقدار در ویژگی کاربر هر شخص دارد.
بهعنوان مثال، میتوانید یک امنیت سطح ردیف تنظیم کنید تا ویژگی کاربر plan ردیفهای متفاوتی برای مقادیر متفاوت نشان دهد:
- "Basic" یک نسخه از جدول Accounts با فیلتر
Plan = "Basic"میبیند (یعنی فقط ردیفهایی که ستون Plan با مقدار "Basic" تطبیق دارد). - "Premium" یک نسخه متفاوت از جدول Accounts با فیلتر
Plan = "Premium"اعمالشده میبیند.
انتخاب ویژگیهای کاربر برای امنیت ردیف و ستون
ویژگیهای کاربر برای امنیت ردیف الزامی هستند، و برای امنیت ستون اختیاری. هنگام اضافه کردن یک ویژگی کاربر جدید، یک جفت کلید-مقدار برای هر شخص تنظیم میکنید.
متابیس از کلید ویژگی کاربر برای جستجوی مقدار ویژگی کاربر برای یک شخص خاص استفاده میکند. کلیدهای ویژگی کاربر میتوانند به پارامترها در متابیس نگاشت شوند.
مقدار ویژگی کاربر باید یک تطبیق دقیق و حساس به حروف برای مقدار فیلتر باشد. بهعنوان مثال، اگر امنیت ردیف را به جدول Accounts با فیلتر Plan = "Basic" اضافه میکنید، مطمئن شوید که "Basic" را بهعنوان مقدار ویژگی کاربر وارد میکنید. اگر مقدار ویژگی کاربر را به حروف کوچک "basic" تنظیم کنید (مقداری که در ستون Plan جدول Accounts وجود ندارد)، شخص به جای جدول یک نتیجه خالی دریافت میکند.
مثالهایی از ویژگیهای کاربر در عمل:
اضافه کردن امنیت سطح ردیف
- مطمئن شوید که ابتدا پیشنیازهای امنیت ردیف را انجام دادهاید.
- به Admin settings > Permissions بروید.
- پایگاه داده و جدولی که میخواهید امن کنید را انتخاب کنید.
- گروهی که میخواهید در امنیت قرار دهید را پیدا کنید.
- روی منوی dropdown زیر View data برای آن گروه کلیک کنید.
- "Row and column security" را انتخاب کنید.
- روی منوی dropdown زیر Column کلیک کنید و ستون را برای فیلتر کردن جدول وارد کنید، مثل "Plan".
- روی منوی dropdown زیر User attribute کلیک کنید و کلید ویژگی کاربر را وارد کنید، مثل "Plan".
اگر سؤالهای SQL دارید که داده با امنیت سطح ردیف را کوئری میکنند، مطمئن شوید که همه آن سؤالها را به کلکسیونهای فقط-ادمین منتقل کنید. برای اطلاعات بیشتر، به شما نمیتوانید ردیفها یا ستونهای نتایج SQL را امن کنید مراجعه کنید.
به مثالهای امنیت ردیف و ستون مراجعه کنید.
پیشنیازهای امنیت سطح ستون
- یک گروه افراد.
- یک کلکسیون فقط-ادمین، با مجوزهای کلکسیون تنظیمشده به No access برای همه گروهها به جز Administrators.
- یک سؤال SQL با ردیفها و ستونهایی که باید به افراد در گروه نمایش داده شوند، ذخیرهشده در کلکسیون فقط-ادمین.
- اختیاری: اگر میخواهید ردیفها را نیز محدود کنید، ویژگیهای کاربر را برای هر یک از افراد در گروه تنظیم کنید.
ایجاد یک سؤال SQL برای متابیس برای نمایش به جای یک جدول
متابیس نتایج سؤال را به جای یک جدول اصلی به یک گروه خاص نمایش میدهد.
از یک سؤال SQL استفاده کنید برای تعریف ردیفها و ستونهای دقیق که باید در نمای سفارشی شامل شوند. از استفاده از یک سؤال query builder (GUI) خودداری کنید، چون ممکن است به طور تصادفی داده اضافی را در معرض دید قرار دهید، چون سؤالهای GUI میتوانند داده از سؤالها یا مدلهای دیگر را شامل شوند.
مطمئن شوید که سؤال SQL را در یک کلکسیون فقط-ادمین ذخیره کنید (مجوزهای کلکسیون تنظیمشده به No access برای همه گروهها به جز Administrators). برای اطلاعات بیشتر، به شما نمیتوانید ردیفها یا ستونهای نتایج SQL را امن کنید مراجعه کنید.
نمایش ستونهای ویرایششده
علاوه بر حذف ردیفها و ستونها، همچنین میتوانید ستونهای ویرایششده را نمایش دهید (بدون تغییر ستونها در پایگاه داده شما).
بهعنوان مثال، میتوانید یک سؤال SQL "Edited Accounts" ایجاد کنید که ستون Email را کوتاه میکند تا نامهای کاربری را به جای آدرسهای ایمیل کامل نمایش دهد.
اگر یک ستون را ویرایش میکنید، schema سؤال SQL (سؤالی که میخواهید به جای جدول نمایش دهید) باید با schema جدول اصلی تطبیق داشته باشد. این به این معنی است که سؤال SQL "Edited Accounts" باید همان تعداد ستون و انواع داده متناظر را بهعنوان جدول Accounts اصلی برگرداند.
نمیتوانید ستون اضافه کنید.
تنظیم امنیت ستون
- مطمئن شوید که ابتدا پیشنیازها را انجام دادهاید.
- به Admin settings > Permissions بروید.
- پایگاه داده و جدولی که میخواهید امن کنید را انتخاب کنید.
- گروهی که میخواهید محدود کنید را پیدا کنید.
- روی منوی dropdown زیر Data access برای آن گروه کلیک کنید.
- "Row and column security" را انتخاب کنید.
- "Use a saved question to create a custom view for this table" را انتخاب کنید.
- سؤال ذخیرهشده خود را انتخاب کنید. سؤال باید در SQL نوشته شده باشد. اگر سؤال شامل پارامترها است، آن پارامترها باید الزامی باشند (نمیتوانند اختیاری باشند).
- اختیاری: محدود کردن ردیفها بر اساس ویژگیهای کاربر افراد.
میتوانید تنظیمات نمونه را در مثالهای امنیت ردیف و ستون پیدا کنید.
محدود کردن ردیفها با ویژگیهای کاربر با استفاده از یک متغیر SQL
اگر امنیت ستون را تنظیم میکنید، همچنین میتوانید ردیفهای متفاوتی را برای هر شخص بسته به ویژگیهای کاربر آنها محدود کنید. بهعنوان مثال، میتوانید سؤال "Accounts" را با فیلتر Plan = "Basic" برای یک گروه، و فیلتر Plan = "Premium" برای گروه دیگر نمایش دهید.
- مطمئن شوید که همه پیشنیازهای امنیت سطح ستون را انجام دادهاید.
- به سؤال SQL که به افراد به جای جدول نمایش داده میشود بروید.
- یک بند
WHEREپارامتری به کوئری SQL خود اضافه کنید، مثل{%raw%}WHERE plan = {{ plan_variable }} {%endraw%}. - سؤال SQL را ذخیره کنید.
- به Admin settings > Permissions بروید.
- گروه و جدولی که میخواهید امن کنید را پیدا کنید.
- منوی dropdown زیر View data را باز کنید.
- روی Edit row and column security کلیک کنید.
- به پایین اسکرول کنید و Parameter or variable را به نام پارامتر در سؤال SQL خود تنظیم کنید (مثل "Plan Variable").
- User attribute را به یک کلید ویژگی کاربر تنظیم کنید (مثل کلید "User's Plan"، نه مقدار "Basic").
- روی Save کلیک کنید.
برای یک تنظیم نمونه متغیر SQL و ویژگی کاربر، به مثالهای امنیت ردیف و ستون مراجعه کنید.
نحوهٔ کار محدودیت ردیف با امنیت ستون
یک بند WHERE استاندارد یک جدول را با تنظیم یک ستون به یک مقدار ثابت فیلتر میکند:
WHERE column_name = column_value
در مرحله 2 از تنظیم محدودیت ردیف بالا، یک متغیر SQL اضافه میکنید تا بند WHERE یک مقدار پویا بپذیرد. نوع متغیر SQL باید متن، عدد، یا تاریخ باشد:
WHERE plan = {%raw%}{{ plan_variable }}{%endraw%}
در مراحل 9-10 از تنظیم محدودیت ردیف بالا، به متابیس میگویید که متغیر SQL plan_variable را به یک کلید ویژگی کاربر (مثل "User's Plan") نگاشت کند. متابیس از کلید برای جستجوی مقدار ویژگی کاربر خاص (مثل "Basic") مرتبط با حساب متابیس یک شخص استفاده میکند. وقتی آن شخص به متابیس وارد میشود و از جدول امنشده استفاده میکند، نتیجه کوئری را میبیند که بر اساس این فیلتر شده است:
WHERE plan = "Basic"
توجه داشته باشید که پارامترها باید برای سؤالهای SQL استفادهشده برای ایجاد viewهای سفارشی الزامی باشند. بهعنوان مثال، نمیتوانید از یک پارامتر اختیاری استفاده کنید؛ موارد زیر کار نمیکند:
{%raw%}
[[WHERE plan = {{ plan_variable }}]]
{%endraw%}
بیشتر دربارهٔ پارامترهای SQL بیاموزید
امنیت سطح ردیف پیشرفته: فیلتر کردن جداول برای افرادی که چندین ID دارند
بهعنوان مثال، فرض کنید یک جدول مثل این دارید:
| User_ID | Value |
|---|---|
| 1 | 10 |
| 1 | 50 |
| 2 | 5 |
| 2 | 50 |
| 3 | 5 |
| 3 | 5 |
اگر میخواهید به کسی دسترسی به چندین user ID بدهید (مثلاً شخص باید ردیفهایی را برای هر دو User_ID 1 و 2 ببیند)، میتوانید یک ویژگی کاربر، مثل user_id تنظیم کنید که میتواند مقادیر جدا شده با کاما مثل "1,2" را مدیریت کند.
- یک سؤال SQL ایجاد کنید که رشته جدا شده با کاما را parse میکند و جدول را فیلتر میکند:
{%raw%}
SELECT *
FROM users_with_values
WHERE user_id = ANY(STRING_TO_ARRAY(REGEXP_REPLACE(TRIM({{user_id}}), '\\s*,\\s*', ','), ','))
{% endraw %}
این کوئری:
- فاصلههای خالی را از مقدار ویژگی کاربر trim میکند
- هر فاصله اطراف کاما را با فقط کاما جایگزین میکند
- رشته جدا شده با کاما را به یک آرایه تبدیل میکند
- ردیفهایی را فیلتر میکند که user_id با هر مقدار در آرایه تطبیق دارد
توابع STRING_TO_ARRAY() و REGEXP_REPLACE() خاص PostgreSQL هستند. برای دیدن اینکه کدام توابع پایگاه داده شما پشتیبانی میکند، به مستندات پایگاه داده خود مراجعه کنید.
- امنیت ردیف و ستون را با استفاده از این سؤال SQL تنظیم کنید. به تنظیم امنیت ستون مراجعه کنید.
جلوگیری از تعارضات مجوز امنیت ردیف و ستون
برخی مجوزهای متابیس میتوانند با امنیت ردیف و ستون تعارض داشته باشند تا دسترسی داده مجازتر یا محدودتر از آنچه قصد داشتید بدهند.
فرض کنید امنیت ستون را تنظیم کردهاید که ستون Email را از جدول Accounts مخفی میکند (برای یک گروه خاص).
ستون Email ممکن است برای کسی در معرض دید قرار گیرد اگر:
- شخص به چندین policy امنیت ردیف و ستون تعلق دارد.
- شخص دیگری در یک گروه غیرامن ستون Email را از موارد زیر بهاشتراک میگذارد:
- یک سؤال SQL
- یک لینک عمومی
- یک هشدار، یا اشتراک داشبورد
چندین مجوز امنیت ردیف و ستون
چندین policy امنیت ردیف و ستون روی همان جدول میتواند یک تعارض مجوز ایجاد کند. میتوانید یک شخص را حداکثر به یک policy امنیت ردیف و ستون برای هر جدول (از طریق گروه شخص) اضافه کنید.
بهعنوان مثال، اگر دارید:
- امنیت را برای گروه "Basic Accounts" تنظیم کردهاید که جدول Accounts را بر اساس
Plan = "Basic"فیلتر میکند. - تنظیم دیگری برای گروه "Converted Accounts" که جدول Accounts را بر اساس
Trial Converted = trueفیلتر میکند.
اگر Vincent Accountman را در هر دو گروه قرار دهید، مجوزهای متضادی برای جدول Accounts خواهد داشت، و هر زمان که سعی کند از Accounts در متابیس استفاده کند یک پیام خطا دریافت میکند.
برای حل تعارضات مجوز امنیت ردیف و ستون:
- شخص را از همه گروهها به جز یکی حذف کنید.
- دسترسی View data همه گروهها به جز یکی به پایگاه داده را به "Blocked" تنظیم کنید.
شما نمیتوانید ردیفها یا ستونهای نتایج SQL را امن کنید
مجوزهای امنیت ردیف و ستون به نتایج سؤالهای SQL اعمال نمیشوند. یعنی سؤالهای SQL همیشه نتایج از جدول اصلی را به جای جدول امنشده نمایش میدهند.
فرض کنید امنیت ستون را روی جدول Accounts برای مخفی کردن ستون Email تنظیم کردهاید. اگر کسی یک سؤال SQL ایجاد کند که شامل ستون Email است، هر کسی با مجوزهای کلکسیون برای مشاهده آن سؤال SQL قادر خواهد بود:
- ستون Email را در نتایج سؤال SQL ببیند.
- از سؤال SQL برای شروع یک سؤال جدید که شامل ستون Email است استفاده کند (اگر مجوزهای کوئری داشته باشد).
برای جلوگیری از در معرض دید قرار گرفتن ستون Email از طریق یک سؤال SQL:
- هر سؤال SQL که شامل ستون Email است را در یک کلکسیون جداگانه قرار دهید.
- مجوزهای کلکسیون را به No access برای گروههایی با امنیت ردیف و ستون تنظیمشده برای مخفی کردن ستون Email تنظیم کنید.
مجوزهای کلکسیون باید برای جلوگیری از مشاهده سؤالهای SQL که به جداول امنشده ارجاع میدهند توسط گروههای امنشده استفاده شوند.
اشتراکگذاری عمومی
مجوزهای امنیت ردیف و ستون به سؤالها یا داشبوردهای عمومی اعمال نمیشوند. اگر کسی در یک گروه غیرامن یک لینک عمومی با استفاده از یک جدول اصلی ایجاد کند، جدول اصلی به هر کسی که URL لینک عمومی را دارد نمایش داده میشود.
برای جلوگیری از این اتفاق، باید اشتراکگذاری عمومی را غیرفعال کنید برای متابیس خود.
متابیس فقط میتواند امنیت ردیف و ستون را با استفاده از عضویت گروه یا ویژگیهای کاربر افرادی که وارد شدهاند ایجاد کند. چون لینکهای عمومی نیاز به ورود ندارند، متابیس اطلاعات کافی برای اعمال مجوزها نخواهد داشت.
محدودیتهای امنیت ردیف و ستون
برخی چیزها که باید هنگام استفاده از امنیت ردیف و ستون در نظر داشته باشید.
گروههایی با مجوزهای کوئری native (دسترسی به ویرایشگر SQL) میتوانند امنیت ردیف و ستون را دور بزنند
امنیت ردیف و ستون به query builder محدود است. نمیتوانید مجوزهای کوئری native را برای گروههایی با امنیت ردیف و ستون تنظیم کنید.
برای اعمال مجوزهای سطح ردیف با ویرایشگر کوئری native، به جعل هویت مراجعه کنید.
شما نمیتوانید امنیت ردیف و ستون را به سؤالهای SQL اعمال کنید
چون متابیس نمیتواند کوئریهای SQL را parse کند، نتایج سؤالهای SQL همیشه از جداول اصلی استفاده میکنند.
از مجوزهای کلکسیون استفاده کنید برای جلوگیری از مشاهده سؤالهای SQL ذخیرهشده با داده محدودشده توسط گروهها.
پایگاهدادههای غیر-SQL امنیت ردیف و ستون محدودی دارند
MongoDB فقط از امنیت سطح ردیف پشتیبانی میکند. مجوزهای امنیت ردیف و ستون برای Apache Druid در دسترس نیستند.
انواع داده پیشرفته نیاز به یک راهحل دارند
اگر سعی میکنید امنیت ردیف را روی یک ستون با یک نوع داده پیشرفته (مثل enumها یا آرایهها) تنظیم کنید، باید ابتدا آن داده را به یک نوع پایه تبدیل کنید. گزینهها شامل موارد زیر هستند:
گزینه 1: استفاده از SQL برای cast کردن نوع داده پیشرفته به یک نوع SQL پایه
یک سؤال SQL ایجاد کنید که ستون نوع داده پیشرفته را به یک نوع داده پایه cast میکند، سپس از آن سؤال برای تنظیم امنیت ردیف و ستون خود استفاده کنید.
گزینه 2: ایجاد یک view پایگاه داده
اگر نمیتوانید از SQL casting در متابیس استفاده کنید، یک view در پایگاه داده خود ایجاد کنید که نوع داده پیشرفته را به یک نوع پایه تبدیل میکند، سپس امنیت ردیف و ستون را روی آن view به جای جدول اصلی تنظیم کنید. همچنین باید جدول اصلی را مسدود کنید.