مسعود سلطانی راد
مسعود سلطانی راد
خواندن ۳ دقیقه·۶ ماه پیش

امنیت در سطح ردیف PostgreSQL ROW-LEVEL SECURITY


مقدمه :

در این آموزش، نحوه استفاده از امنیت در سطح ردیف PostgreSQL برای کنترل دسترسی به ردیف‌های جداگانه  ROW-LEVEL SECURITY در جدول را خواهید آموخت.

مقدمه ای بر امنیت سطح ردیف PostgreSQL:

امنیت در سطح ردیف (RLS) یک ویژگی است که به شما امکان می دهد ردیف های بازگردانده شده توسط یک پرس و جو را بر اساس کاربری که پرس و جو را اجرا می کند محدود کنید.

RLS به شما امکان می دهد دسترسی به ردیف های جداگانه در جداول را بر اساس کاربر فعلی و شرایط خاص تعریف شده توسط خط مشی ها کنترل کنید. مراحل اساسی برای اجرای امنیت در سطح ردیف به شرح زیر است:

ابتدا با استفاده از عبارت ALTER TABLE، امنیت سطح ردیف را روی یک جدول فعال کنید:

ALTER TABLE table_name

ENABLE ROW LEVEL SECURITY;

دوم، با استفاده از عبارت CREATE POLICY، یک خط‌مشی امنیتی جدید در سطح ردیف برای جدول ایجاد کنید:

CREATE POLICY name ON table_name

USING (condition);

در خط مشی، شرطی را تعریف می کنید که تعیین می کند کدام ردیف ها قابل مشاهده هستند.

توجه داشته باشید که  Superusersو نقش‌هایی با ویژگی BYPASSRLS می‌توانند هنگام دسترسی به جدول، سیستم امنیتی ردیف را دور بزنند.

علاوه بر این، صاحبان جدول امنیت سطح ردیف را نیز دور می زنند. برای اعمال امنیت در سطح ردیف برای صاحبان جدول، می توانید جدول را با استفاده از گزینه FORCE ROW LEVEL SECURITY تغییر دهید:

ALTER TABLE table_name

FORCE ROW LEVEL SECURITY;

مثال امنیت در سطح ردیف PostgreSQL:

ارتباط با ما

جهت دریافت خدمات مشاوره، آموزش و نگهداری پایگاه داده Postgresql با ما در ارتباط باشد

ما مثالی از ایجاد جدول و نقش‌ها می‌آوریم که در آن نقش‌ها می‌توانند داده‌ها را از جدولی که ستون مدیر آن با نقش فعلی مطابقت دارد، بازیابی کنند.

یک پایگاه داده جدید به نام hr ایجاد کنید:

create database hr;

پایگاه داده فعلی را به پایگاه داده hr تغییر دهید:

\c hr

یک جدول جدید به نام departments برای ذخیره داده های بخش ایجاد کنید:

create table departments(

id serial primary key,

name VARCHAR(255) NOT NULL UNIQUE,

manager VARCHAR(255) NOT NULL

);

چند ردیف را در جدول بخش ها وارد کنید:

INSERT INTO departments(name, manager)

VALUES(‘Sales’, ‘alice’),

(‘Marketing’, ‘bob’),

(‘IT’, ‘jack’);

یک نقش گروهی به نام مدیران ایجاد کنید:

CREATE ROLE managers;

امتیازات SELECT تمام جداول در public schema را به مدیران نقش گروه اعطا کنید:

GRANT SELECT ON ALL TABLES

IN SCHEMA public

TO managers;

سه نقش جدید alice, bob, peter ایجاد کنید و آنها را به عنوان اعضای نقش گروه مدیران تعیین کنید:

CREATE ROLE alice WITH LOGIN PASSWORD ‘SecurePass1’

IN ROLE managers;

CREATE ROLE bob WITH LOGIN PASSWORD ‘SecurePass2’

IN ROLE managers;

CREATE ROLE jack WITH LOGIN PASSWORD ‘SecurePass3’

IN ROLE managers;

او در نقش های alice, bob و jack به طور ضمنی امتیازاتی را از مدیران نقش گروه به ارث می برد. به عبارت دیگر، آنها می توانند داده ها را از تمام جداول موجود در public schema بازیابی کنند.

امنیت سطح ردیف را در جدول بخش ها فعال کنید:

ALTER TABLE departments

ENABLE ROW LEVEL SECURITY;

مستند مدیریت افزونه ها در Postgresql

خط مشی ایجاد کنید که کاربر فعلی بتواند به ردیف هایی دسترسی داشته باشد که مقدار آنها در ستون مدیر جدول departments  با نام نقش فعلی مطابقت دارد:

CREATE POLICY department_managers

ON departments

TO managers

USING (manager = current_user);

با استفاده از نقش alice در یک session جداگانه به پایگاه داده hr متصل شوید:

psql -U alice -d hr

حالا داده ها را از جدول فراخوانی کنید:

SELECT * FROM departments;

خروجی :

id | name  | manager

—-+——-+———

۱ | Sales | alice

(۱ row)

خروجی برابر با رکوردهایی است که مدیر آن allice می باشد

حالا مراحل فوق را با کاربر bob انجام دهید:

psql -U bob -d hr

SELECT * FROM departments;

خروجی :

id |   name    | manager

—-+———–+———

۲ | Marketing | bob

(۱ row)

همانند alice کاربر bob هم فقط رکوردهایی را مشاهده می کند که مدیر آن خودش می باشد.

منبع مستند

row level securitypostgresqlمشاوره postgresqlآموزش postgresqlخدمات postgresql
چند سالی هست در حوزه داده ها ( نگهداری و تحلیل آنها) فعالیت دارم و همیشه سعی کردم آموخته هایم رو به اشتراک بگذارم soltanirad@artarad.ir www.artarad.ir
شاید از این پست‌ها خوشتان بیاید