در این آموزش، نحوه استفاده از امنیت در سطح ردیف PostgreSQL برای کنترل دسترسی به ردیفهای جداگانه ROW-LEVEL SECURITY در جدول را خواهید آموخت.
امنیت در سطح ردیف (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 با ما در ارتباط باشد
ما مثالی از ایجاد جدول و نقشها میآوریم که در آن نقشها میتوانند دادهها را از جدولی که ستون مدیر آن با نقش فعلی مطابقت دارد، بازیابی کنند.
یک پایگاه داده جدید به نام 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 هم فقط رکوردهایی را مشاهده می کند که مدیر آن خودش می باشد.